annotate mjpeg.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 7dd2a45249a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
2 * MJPEG encoder and decoder
8629
04423b2f6e0b cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 7136
diff changeset
3 * Copyright (c) 2000, 2001 Fabrice Bellard
2181
3b84b5fea968 new copyrights
alex
parents: 2173
diff changeset
4 * Copyright (c) 2003 Alex Beregszaszi
3b84b5fea968 new copyrights
alex
parents: 2173
diff changeset
5 * Copyright (c) 2003-2004 Michael Niedermayer
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
6 *
5214
470601203f44 Group all copyright and author notices together.
diego
parents: 5021
diff changeset
7 * Support for external huffman table, various fixes (AVID workaround),
470601203f44 Group all copyright and author notices together.
diego
parents: 5021
diff changeset
8 * aspecting, new decode_frame mechanism and apple mjpeg-b support
470601203f44 Group all copyright and author notices together.
diego
parents: 5021
diff changeset
9 * by Alex Beregszaszi
470601203f44 Group all copyright and author notices together.
diego
parents: 5021
diff changeset
10 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3929
diff changeset
11 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3929
diff changeset
12 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3929
diff changeset
13 * FFmpeg is free software; you can redistribute it and/or
427
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
14 * modify it under the terms of the GNU Lesser General Public
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
15 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3929
diff changeset
16 * version 2.1 of the License, or (at your option) any later version.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
17 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3929
diff changeset
18 * FFmpeg is distributed in the hope that it will be useful,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
427
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
21 * Lesser General Public License for more details.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
22 *
427
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
23 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3929
diff changeset
24 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
26 */
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1092
diff changeset
27
1e39f273ecd6 per file doxy
michaelni
parents: 1092
diff changeset
28 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 8718
diff changeset
29 * @file
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1092
diff changeset
30 * MJPEG encoder and decoder.
1e39f273ecd6 per file doxy
michaelni
parents: 1092
diff changeset
31 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2885
diff changeset
32
5003
ddb28de352bb split jpeg_ls into jpeglsdec, jpeglsenc and jpegls
aurel
parents: 4994
diff changeset
33 #include "mjpeg.h"
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
34
986e461dc072 Initial revision
glantau
parents:
diff changeset
35
986e461dc072 Initial revision
glantau
parents:
diff changeset
36 #if 0
986e461dc072 Initial revision
glantau
parents:
diff changeset
37 /* These are the sample quantization tables given in JPEG spec section K.1.
986e461dc072 Initial revision
glantau
parents:
diff changeset
38 * The spec says that the values given produce "good" quality, and
986e461dc072 Initial revision
glantau
parents:
diff changeset
39 * when divided by 2, "very good" quality.
986e461dc072 Initial revision
glantau
parents:
diff changeset
40 */
5020
eb0ad6423405 split mjpeg.c into an encoder and a decoder file
aurel
parents: 5005
diff changeset
41 const unsigned char std_luminance_quant_tbl[64] = {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
42 16, 11, 10, 16, 24, 40, 51, 61,
986e461dc072 Initial revision
glantau
parents:
diff changeset
43 12, 12, 14, 19, 26, 58, 60, 55,
986e461dc072 Initial revision
glantau
parents:
diff changeset
44 14, 13, 16, 24, 40, 57, 69, 56,
986e461dc072 Initial revision
glantau
parents:
diff changeset
45 14, 17, 22, 29, 51, 87, 80, 62,
986e461dc072 Initial revision
glantau
parents:
diff changeset
46 18, 22, 37, 56, 68, 109, 103, 77,
986e461dc072 Initial revision
glantau
parents:
diff changeset
47 24, 35, 55, 64, 81, 104, 113, 92,
986e461dc072 Initial revision
glantau
parents:
diff changeset
48 49, 64, 78, 87, 103, 121, 120, 101,
986e461dc072 Initial revision
glantau
parents:
diff changeset
49 72, 92, 95, 98, 112, 100, 103, 99
986e461dc072 Initial revision
glantau
parents:
diff changeset
50 };
5020
eb0ad6423405 split mjpeg.c into an encoder and a decoder file
aurel
parents: 5005
diff changeset
51 const unsigned char std_chrominance_quant_tbl[64] = {
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
52 17, 18, 24, 47, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
53 18, 21, 26, 66, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
54 24, 26, 56, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
55 47, 66, 99, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
56 99, 99, 99, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
57 99, 99, 99, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
58 99, 99, 99, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
59 99, 99, 99, 99, 99, 99, 99, 99
986e461dc072 Initial revision
glantau
parents:
diff changeset
60 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
61 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
62
986e461dc072 Initial revision
glantau
parents:
diff changeset
63 /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
986e461dc072 Initial revision
glantau
parents:
diff changeset
64 /* IMPORTANT: these are only valid for 8-bit data precision! */
5021
d73237575709 add proper prefix to new mjpeg extern func/var
aurel
parents: 5020
diff changeset
65 const uint8_t ff_mjpeg_bits_dc_luminance[17] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
66 { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
7136
7a73d76aaaa0 remove duplicate tables
stefang
parents: 5214
diff changeset
67 const uint8_t ff_mjpeg_val_dc[12] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
68 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
69
5021
d73237575709 add proper prefix to new mjpeg extern func/var
aurel
parents: 5020
diff changeset
70 const uint8_t ff_mjpeg_bits_dc_chrominance[17] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
71 { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
72
5021
d73237575709 add proper prefix to new mjpeg extern func/var
aurel
parents: 5020
diff changeset
73 const uint8_t ff_mjpeg_bits_ac_luminance[17] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
74 { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
5021
d73237575709 add proper prefix to new mjpeg extern func/var
aurel
parents: 5020
diff changeset
75 const uint8_t ff_mjpeg_val_ac_luminance[] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
76 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
77 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
986e461dc072 Initial revision
glantau
parents:
diff changeset
78 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
986e461dc072 Initial revision
glantau
parents:
diff changeset
79 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
986e461dc072 Initial revision
glantau
parents:
diff changeset
80 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
986e461dc072 Initial revision
glantau
parents:
diff changeset
81 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
986e461dc072 Initial revision
glantau
parents:
diff changeset
82 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
986e461dc072 Initial revision
glantau
parents:
diff changeset
83 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
986e461dc072 Initial revision
glantau
parents:
diff changeset
84 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
986e461dc072 Initial revision
glantau
parents:
diff changeset
85 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
986e461dc072 Initial revision
glantau
parents:
diff changeset
86 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
986e461dc072 Initial revision
glantau
parents:
diff changeset
87 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
986e461dc072 Initial revision
glantau
parents:
diff changeset
88 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
986e461dc072 Initial revision
glantau
parents:
diff changeset
89 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
90 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
986e461dc072 Initial revision
glantau
parents:
diff changeset
91 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
986e461dc072 Initial revision
glantau
parents:
diff changeset
92 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
986e461dc072 Initial revision
glantau
parents:
diff changeset
93 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
986e461dc072 Initial revision
glantau
parents:
diff changeset
94 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
986e461dc072 Initial revision
glantau
parents:
diff changeset
95 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2885
diff changeset
96 0xf9, 0xfa
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
97 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
98
5021
d73237575709 add proper prefix to new mjpeg extern func/var
aurel
parents: 5020
diff changeset
99 const uint8_t ff_mjpeg_bits_ac_chrominance[17] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
100 { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
101
5021
d73237575709 add proper prefix to new mjpeg extern func/var
aurel
parents: 5020
diff changeset
102 const uint8_t ff_mjpeg_val_ac_chrominance[] =
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
103 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
986e461dc072 Initial revision
glantau
parents:
diff changeset
104 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
986e461dc072 Initial revision
glantau
parents:
diff changeset
105 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
986e461dc072 Initial revision
glantau
parents:
diff changeset
106 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
986e461dc072 Initial revision
glantau
parents:
diff changeset
107 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
986e461dc072 Initial revision
glantau
parents:
diff changeset
108 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
986e461dc072 Initial revision
glantau
parents:
diff changeset
109 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
986e461dc072 Initial revision
glantau
parents:
diff changeset
110 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
986e461dc072 Initial revision
glantau
parents:
diff changeset
111 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
986e461dc072 Initial revision
glantau
parents:
diff changeset
112 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
986e461dc072 Initial revision
glantau
parents:
diff changeset
113 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
986e461dc072 Initial revision
glantau
parents:
diff changeset
114 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
986e461dc072 Initial revision
glantau
parents:
diff changeset
115 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
986e461dc072 Initial revision
glantau
parents:
diff changeset
116 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
986e461dc072 Initial revision
glantau
parents:
diff changeset
117 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
986e461dc072 Initial revision
glantau
parents:
diff changeset
118 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
986e461dc072 Initial revision
glantau
parents:
diff changeset
119 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
986e461dc072 Initial revision
glantau
parents:
diff changeset
120 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
986e461dc072 Initial revision
glantau
parents:
diff changeset
121 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
986e461dc072 Initial revision
glantau
parents:
diff changeset
122 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2885
diff changeset
123 0xf9, 0xfa
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
124 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
125
986e461dc072 Initial revision
glantau
parents:
diff changeset
126 /* isn't this function nicer than the one in the libjpeg ? */
5021
d73237575709 add proper prefix to new mjpeg extern func/var
aurel
parents: 5020
diff changeset
127 void ff_mjpeg_build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code,
d73237575709 add proper prefix to new mjpeg extern func/var
aurel
parents: 5020
diff changeset
128 const uint8_t *bits_table,
d73237575709 add proper prefix to new mjpeg extern func/var
aurel
parents: 5020
diff changeset
129 const uint8_t *val_table)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
130 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
131 int i, j, k,nb, code, sym;
986e461dc072 Initial revision
glantau
parents:
diff changeset
132
986e461dc072 Initial revision
glantau
parents:
diff changeset
133 code = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
134 k = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
135 for(i=1;i<=16;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
136 nb = bits_table[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
137 for(j=0;j<nb;j++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
138 sym = val_table[k++];
986e461dc072 Initial revision
glantau
parents:
diff changeset
139 huff_size[sym] = i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
140 huff_code[sym] = code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
141 code++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
142 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
143 code <<= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
144 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
145 }