annotate mlp.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 41bd795ae40b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
1 /*
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
2 * MLP codec common code
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
3 * Copyright (c) 2007-2008 Ian Caulfield
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
4 *
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
5 * This file is part of FFmpeg.
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
6 *
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
11 *
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
15 * Lesser General Public License for more details.
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
16 *
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
20 */
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
21
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
22 #include <stdint.h>
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
23
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
24 #include "libavutil/crc.h"
8573
2acf0ae7b041 Fix build: Add intreadwrite.h and bswap.h #includes where necessary.
diego
parents: 8248
diff changeset
25 #include "libavutil/intreadwrite.h"
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
26 #include "mlp.h"
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
27
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
28 const uint8_t ff_mlp_huffman_tables[3][18][2] = {
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
29 { /* Huffman table 0, -7 - +10 */
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
30 {0x01, 9}, {0x01, 8}, {0x01, 7}, {0x01, 6}, {0x01, 5}, {0x01, 4}, {0x01, 3},
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
31 {0x04, 3}, {0x05, 3}, {0x06, 3}, {0x07, 3},
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
32 {0x03, 3}, {0x05, 4}, {0x09, 5}, {0x11, 6}, {0x21, 7}, {0x41, 8}, {0x81, 9},
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
33 }, { /* Huffman table 1, -7 - +8 */
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
34 {0x01, 9}, {0x01, 8}, {0x01, 7}, {0x01, 6}, {0x01, 5}, {0x01, 4}, {0x01, 3},
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
35 {0x02, 2}, {0x03, 2},
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
36 {0x03, 3}, {0x05, 4}, {0x09, 5}, {0x11, 6}, {0x21, 7}, {0x41, 8}, {0x81, 9},
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
37 }, { /* Huffman table 2, -7 - +7 */
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
38 {0x01, 9}, {0x01, 8}, {0x01, 7}, {0x01, 6}, {0x01, 5}, {0x01, 4}, {0x01, 3},
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
39 {0x01, 1},
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
40 {0x03, 3}, {0x05, 4}, {0x09, 5}, {0x11, 6}, {0x21, 7}, {0x41, 8}, {0x81, 9},
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
41 }
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
42 };
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
43
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
44 static int crc_init = 0;
10414
41bd795ae40b mlp: Use smaller CRC tables if CONFIG_SMALL.
ramiro
parents: 9857
diff changeset
45 #if CONFIG_SMALL
41bd795ae40b mlp: Use smaller CRC tables if CONFIG_SMALL.
ramiro
parents: 9857
diff changeset
46 #define CRC_TABLE_SIZE 257
41bd795ae40b mlp: Use smaller CRC tables if CONFIG_SMALL.
ramiro
parents: 9857
diff changeset
47 #else
41bd795ae40b mlp: Use smaller CRC tables if CONFIG_SMALL.
ramiro
parents: 9857
diff changeset
48 #define CRC_TABLE_SIZE 1024
41bd795ae40b mlp: Use smaller CRC tables if CONFIG_SMALL.
ramiro
parents: 9857
diff changeset
49 #endif
41bd795ae40b mlp: Use smaller CRC tables if CONFIG_SMALL.
ramiro
parents: 9857
diff changeset
50 static AVCRC crc_63[CRC_TABLE_SIZE];
41bd795ae40b mlp: Use smaller CRC tables if CONFIG_SMALL.
ramiro
parents: 9857
diff changeset
51 static AVCRC crc_1D[CRC_TABLE_SIZE];
41bd795ae40b mlp: Use smaller CRC tables if CONFIG_SMALL.
ramiro
parents: 9857
diff changeset
52 static AVCRC crc_2D[CRC_TABLE_SIZE];
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
53
8693
18737839ed27 Add missing void keyword to parameterless function declarations.
diego
parents: 8573
diff changeset
54 av_cold void ff_mlp_init_crc(void)
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
55 {
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
56 if (!crc_init) {
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
57 av_crc_init(crc_63, 0, 8, 0x63, sizeof(crc_63));
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
58 av_crc_init(crc_1D, 0, 8, 0x1D, sizeof(crc_1D));
8248
45cfe1d44e86 mlp: initialize all CRC tables in a common function.
ramiro
parents: 7566
diff changeset
59 av_crc_init(crc_2D, 0, 16, 0x002D, sizeof(crc_2D));
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
60 crc_init = 1;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
61 }
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
62 }
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
63
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
64 uint16_t ff_mlp_checksum16(const uint8_t *buf, unsigned int buf_size)
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
65 {
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
66 uint16_t crc;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
67
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
68 crc = av_crc(crc_2D, 0, buf, buf_size - 2);
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
69 crc ^= AV_RL16(buf + buf_size - 2);
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
70 return crc;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
71 }
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
72
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
73 uint8_t ff_mlp_checksum8(const uint8_t *buf, unsigned int buf_size)
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
74 {
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
75 uint8_t checksum = av_crc(crc_63, 0x3c, buf, buf_size - 1); // crc_63[0xa2] == 0x3c
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
76 checksum ^= buf[buf_size-1];
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
77 return checksum;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
78 }
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
79
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
80 uint8_t ff_mlp_restart_checksum(const uint8_t *buf, unsigned int bit_size)
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
81 {
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
82 int i;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
83 int num_bytes = (bit_size + 2) / 8;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
84
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
85 int crc = crc_1D[buf[0] & 0x3f];
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
86 crc = av_crc(crc_1D, crc, buf + 1, num_bytes - 2);
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
87 crc ^= buf[num_bytes - 1];
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
88
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
89 for (i = 0; i < ((bit_size + 2) & 7); i++) {
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
90 crc <<= 1;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
91 if (crc & 0x100)
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
92 crc ^= 0x11D;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
93 crc ^= (buf[num_bytes] >> (7 - i)) & 1;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
94 }
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
95
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
96 return crc;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
97 }
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
98
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
99 uint8_t ff_mlp_calculate_parity(const uint8_t *buf, unsigned int buf_size)
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
100 {
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
101 uint32_t scratch = 0;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
102 const uint8_t *buf_end = buf + buf_size;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
103
9857
964d08f7b46f Fix unaligned accesses by doing bytewise access until aligned, then
heydowns
parents: 8693
diff changeset
104 for (; ((intptr_t) buf & 3) && buf < buf_end; buf++)
964d08f7b46f Fix unaligned accesses by doing bytewise access until aligned, then
heydowns
parents: 8693
diff changeset
105 scratch ^= *buf;
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
106 for (; buf < buf_end - 3; buf += 4)
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
107 scratch ^= *((const uint32_t*)buf);
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
108
7566
d112b4655bbd mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents: 7559
diff changeset
109 scratch = xor_32_to_8(scratch);
7559
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
110
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
111 for (; buf < buf_end; buf++)
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
112 scratch ^= *buf;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
113
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
114 return scratch;
fd24c8628221 mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff changeset
115 }