Mercurial > libavcodec.hg
annotate mlp.c @ 10061:09f2db2d7c90 libavcodec
Fix bug caused by difference in stride and picture width.
When a frame is allocated using libschroedinger routines, the frame data size
does not match the actual frame size if the width is not a multiple of 16. So
we cannot do a straightforward memcpy of the frame returned by libschroedinger
into the FFmpeg picture as the stride differs from the width.
Fix this bug by allocating for the libschroedinger frame with the dimensions
in AVCodecContext within libavcodec and passing the frame to libschroedinger.
patch by Anuradha Suraparaju, anuradha rd.bbc.co uk
| author | diego |
|---|---|
| date | Sat, 15 Aug 2009 11:59:53 +0000 |
| parents | 964d08f7b46f |
| children | 41bd795ae40b |
| 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; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
45 static AVCRC crc_63[1024]; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
46 static AVCRC crc_1D[1024]; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
47 static AVCRC crc_2D[1024]; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
48 |
|
8693
18737839ed27
Add missing void keyword to parameterless function declarations.
diego
parents:
8573
diff
changeset
|
49 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
|
50 { |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
51 if (!crc_init) { |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
52 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
|
53 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
|
54 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
|
55 crc_init = 1; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
56 } |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
57 } |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
58 |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
59 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
|
60 { |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
61 uint16_t crc; |
|
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 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
|
64 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
|
65 return crc; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
66 } |
|
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 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
|
69 { |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
70 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
|
71 checksum ^= buf[buf_size-1]; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
72 return checksum; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
73 } |
|
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 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
|
76 { |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
77 int i; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
78 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
|
79 |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
80 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
|
81 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
|
82 crc ^= buf[num_bytes - 1]; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
83 |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
84 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
|
85 crc <<= 1; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
86 if (crc & 0x100) |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
87 crc ^= 0x11D; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
88 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
|
89 } |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
90 |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
91 return crc; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
92 } |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
93 |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
94 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
|
95 { |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
96 uint32_t scratch = 0; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
97 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
|
98 |
|
9857
964d08f7b46f
Fix unaligned accesses by doing bytewise access until aligned, then
heydowns
parents:
8693
diff
changeset
|
99 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
|
100 scratch ^= *buf; |
|
7559
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
101 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
|
102 scratch ^= *((const uint32_t*)buf); |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
103 |
|
7566
d112b4655bbd
mlp: split simple inline function that xors 4 bytes into one.
ramiro
parents:
7559
diff
changeset
|
104 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
|
105 |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
106 for (; buf < buf_end; buf++) |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
107 scratch ^= *buf; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
108 |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
109 return scratch; |
|
fd24c8628221
mlp: Split common code from parser and decoder to be used by encoder.
ramiro
parents:
diff
changeset
|
110 } |
