Mercurial > libavcodec.hg
annotate mjpeg.c @ 625:bb6a69f9d409 libavcodec
slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG)
per context DCT selection
author | michaelni |
---|---|
date | Thu, 29 Aug 2002 23:55:32 +0000 |
parents | 03e395b31197 |
children | 8c9edc20599a |
rev | line source |
---|---|
0 | 1 /* |
23 | 2 * MJPEG encoder and decoder |
427 | 3 * Copyright (c) 2000, 2001 Fabrice Bellard. |
0 | 4 * |
427 | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2 of the License, or (at your option) any later version. | |
0 | 9 * |
427 | 10 * This library is distributed in the hope that it will be useful, |
0 | 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
427 | 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 * Lesser General Public License for more details. | |
0 | 14 * |
427 | 15 * You should have received a copy of the GNU Lesser General Public |
16 * License along with this library; if not, write to the Free Software | |
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
18 * |
354 | 19 * Support for external huffman table and various fixes (AVID workaround) by |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
20 * Alex Beregszaszi <alex@naxine.org> |
0 | 21 */ |
76 | 22 //#define DEBUG |
0 | 23 #include "avcodec.h" |
24 #include "dsputil.h" | |
25 #include "mpegvideo.h" | |
26 | |
354 | 27 #ifdef USE_FASTMEMCPY |
28 #include "fastmemcpy.h" | |
29 #endif | |
30 | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
31 /* use two quantizer table (one for luminance and one for chrominance) */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
32 /* not yet working */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
33 #undef TWOMATRIXES |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
34 |
0 | 35 typedef struct MJpegContext { |
36 UINT8 huff_size_dc_luminance[12]; | |
37 UINT16 huff_code_dc_luminance[12]; | |
38 UINT8 huff_size_dc_chrominance[12]; | |
39 UINT16 huff_code_dc_chrominance[12]; | |
40 | |
41 UINT8 huff_size_ac_luminance[256]; | |
42 UINT16 huff_code_ac_luminance[256]; | |
43 UINT8 huff_size_ac_chrominance[256]; | |
44 UINT16 huff_code_ac_chrominance[256]; | |
45 } MJpegContext; | |
46 | |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
47 /* JPEG marker codes */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
48 typedef enum { |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
49 /* start of frame */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
50 SOF0 = 0xc0, /* baseline */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
51 SOF1 = 0xc1, /* extended sequential, huffman */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
52 SOF2 = 0xc2, /* progressive, huffman */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
53 SOF3 = 0xc3, /* lossless, huffman */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
54 |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
55 SOF5 = 0xc5, /* differential sequential, huffman */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
56 SOF6 = 0xc6, /* differential progressive, huffman */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
57 SOF7 = 0xc7, /* differential lossless, huffman */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
58 JPG = 0xc8, /* reserved for JPEG extension */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
59 SOF9 = 0xc9, /* extended sequential, arithmetic */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
60 SOF10 = 0xca, /* progressive, arithmetic */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
61 SOF11 = 0xcb, /* lossless, arithmetic */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
62 |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
63 SOF13 = 0xcd, /* differential sequential, arithmetic */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
64 SOF14 = 0xce, /* differential progressive, arithmetic */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
65 SOF15 = 0xcf, /* differential lossless, arithmetic */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
66 |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
67 DHT = 0xc4, /* define huffman tables */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
68 |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
69 DAC = 0xcc, /* define arithmetic-coding conditioning */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
70 |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
71 /* restart with modulo 8 count "m" */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
72 RST0 = 0xd0, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
73 RST1 = 0xd1, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
74 RST2 = 0xd2, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
75 RST3 = 0xd3, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
76 RST4 = 0xd4, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
77 RST5 = 0xd5, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
78 RST6 = 0xd6, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
79 RST7 = 0xd7, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
80 |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
81 SOI = 0xd8, /* start of image */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
82 EOI = 0xd9, /* end of image */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
83 SOS = 0xda, /* start of scan */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
84 DQT = 0xdb, /* define quantization tables */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
85 DNL = 0xdc, /* define number of lines */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
86 DRI = 0xdd, /* define restart interval */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
87 DHP = 0xde, /* define hierarchical progression */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
88 EXP = 0xdf, /* expand reference components */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
89 |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
90 APP0 = 0xe0, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
91 APP1 = 0xe1, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
92 APP2 = 0xe2, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
93 APP3 = 0xe3, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
94 APP4 = 0xe4, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
95 APP5 = 0xe5, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
96 APP6 = 0xe6, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
97 APP7 = 0xe7, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
98 APP8 = 0xe8, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
99 APP9 = 0xe9, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
100 APP10 = 0xea, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
101 APP11 = 0xeb, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
102 APP12 = 0xec, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
103 APP13 = 0xed, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
104 APP14 = 0xee, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
105 APP15 = 0xef, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
106 |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
107 JPG0 = 0xf0, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
108 JPG1 = 0xf1, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
109 JPG2 = 0xf2, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
110 JPG3 = 0xf3, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
111 JPG4 = 0xf4, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
112 JPG5 = 0xf5, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
113 JPG6 = 0xf6, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
114 JPG7 = 0xf7, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
115 JPG8 = 0xf8, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
116 JPG9 = 0xf9, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
117 JPG10 = 0xfa, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
118 JPG11 = 0xfb, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
119 JPG12 = 0xfc, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
120 JPG13 = 0xfd, |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
121 |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
122 COM = 0xfe, /* comment */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
123 |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
124 TEM = 0x01, /* temporary private use for arithmetic coding */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
125 |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
126 /* 0x02 -> 0xbf reserved */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
127 } JPEG_MARKER; |
0 | 128 |
129 #if 0 | |
130 /* These are the sample quantization tables given in JPEG spec section K.1. | |
131 * The spec says that the values given produce "good" quality, and | |
132 * when divided by 2, "very good" quality. | |
133 */ | |
134 static const unsigned char std_luminance_quant_tbl[64] = { | |
135 16, 11, 10, 16, 24, 40, 51, 61, | |
136 12, 12, 14, 19, 26, 58, 60, 55, | |
137 14, 13, 16, 24, 40, 57, 69, 56, | |
138 14, 17, 22, 29, 51, 87, 80, 62, | |
139 18, 22, 37, 56, 68, 109, 103, 77, | |
140 24, 35, 55, 64, 81, 104, 113, 92, | |
141 49, 64, 78, 87, 103, 121, 120, 101, | |
142 72, 92, 95, 98, 112, 100, 103, 99 | |
143 }; | |
144 static const unsigned char std_chrominance_quant_tbl[64] = { | |
145 17, 18, 24, 47, 99, 99, 99, 99, | |
146 18, 21, 26, 66, 99, 99, 99, 99, | |
147 24, 26, 56, 99, 99, 99, 99, 99, | |
148 47, 66, 99, 99, 99, 99, 99, 99, | |
149 99, 99, 99, 99, 99, 99, 99, 99, | |
150 99, 99, 99, 99, 99, 99, 99, 99, | |
151 99, 99, 99, 99, 99, 99, 99, 99, | |
152 99, 99, 99, 99, 99, 99, 99, 99 | |
153 }; | |
154 #endif | |
155 | |
156 /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */ | |
157 /* IMPORTANT: these are only valid for 8-bit data precision! */ | |
158 static const UINT8 bits_dc_luminance[17] = | |
159 { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 }; | |
160 static const UINT8 val_dc_luminance[] = | |
161 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; | |
162 | |
163 static const UINT8 bits_dc_chrominance[17] = | |
164 { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; | |
165 static const UINT8 val_dc_chrominance[] = | |
166 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 }; | |
167 | |
168 static const UINT8 bits_ac_luminance[17] = | |
169 { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d }; | |
170 static const UINT8 val_ac_luminance[] = | |
171 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, | |
172 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, | |
173 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, | |
174 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, | |
175 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, | |
176 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, | |
177 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, | |
178 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, | |
179 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, | |
180 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, | |
181 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, | |
182 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, | |
183 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, | |
184 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, | |
185 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, | |
186 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, | |
187 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, | |
188 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, | |
189 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, | |
190 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, | |
191 0xf9, 0xfa | |
192 }; | |
193 | |
194 static const UINT8 bits_ac_chrominance[17] = | |
195 { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 }; | |
196 | |
197 static const UINT8 val_ac_chrominance[] = | |
198 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, | |
199 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, | |
200 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, | |
201 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, | |
202 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, | |
203 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, | |
204 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, | |
205 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, | |
206 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, | |
207 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, | |
208 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, | |
209 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, | |
210 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, | |
211 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, | |
212 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, | |
213 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, | |
214 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, | |
215 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, | |
216 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, | |
217 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, | |
218 0xf9, 0xfa | |
219 }; | |
220 | |
221 /* isn't this function nicer than the one in the libjpeg ? */ | |
222 static void build_huffman_codes(UINT8 *huff_size, UINT16 *huff_code, | |
223 const UINT8 *bits_table, const UINT8 *val_table) | |
224 { | |
225 int i, j, k,nb, code, sym; | |
226 | |
227 code = 0; | |
228 k = 0; | |
229 for(i=1;i<=16;i++) { | |
230 nb = bits_table[i]; | |
231 for(j=0;j<nb;j++) { | |
232 sym = val_table[k++]; | |
233 huff_size[sym] = i; | |
234 huff_code[sym] = code; | |
235 code++; | |
236 } | |
237 code <<= 1; | |
238 } | |
239 } | |
240 | |
241 int mjpeg_init(MpegEncContext *s) | |
242 { | |
243 MJpegContext *m; | |
244 | |
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
375
diff
changeset
|
245 m = av_malloc(sizeof(MJpegContext)); |
0 | 246 if (!m) |
247 return -1; | |
344 | 248 |
249 s->min_qcoeff=-1023; | |
250 s->max_qcoeff= 1023; | |
357 | 251 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x |
0 | 252 |
253 /* build all the huffman tables */ | |
254 build_huffman_codes(m->huff_size_dc_luminance, | |
255 m->huff_code_dc_luminance, | |
256 bits_dc_luminance, | |
257 val_dc_luminance); | |
258 build_huffman_codes(m->huff_size_dc_chrominance, | |
259 m->huff_code_dc_chrominance, | |
260 bits_dc_chrominance, | |
261 val_dc_chrominance); | |
262 build_huffman_codes(m->huff_size_ac_luminance, | |
263 m->huff_code_ac_luminance, | |
264 bits_ac_luminance, | |
265 val_ac_luminance); | |
266 build_huffman_codes(m->huff_size_ac_chrominance, | |
267 m->huff_code_ac_chrominance, | |
268 bits_ac_chrominance, | |
269 val_ac_chrominance); | |
270 | |
271 s->mjpeg_ctx = m; | |
272 return 0; | |
273 } | |
274 | |
275 void mjpeg_close(MpegEncContext *s) | |
276 { | |
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
375
diff
changeset
|
277 av_free(s->mjpeg_ctx); |
0 | 278 } |
279 | |
280 static inline void put_marker(PutBitContext *p, int code) | |
281 { | |
282 put_bits(p, 8, 0xff); | |
283 put_bits(p, 8, code); | |
284 } | |
285 | |
286 /* table_class: 0 = DC coef, 1 = AC coefs */ | |
287 static int put_huffman_table(MpegEncContext *s, int table_class, int table_id, | |
288 const UINT8 *bits_table, const UINT8 *value_table) | |
289 { | |
290 PutBitContext *p = &s->pb; | |
291 int n, i; | |
292 | |
293 put_bits(p, 4, table_class); | |
294 put_bits(p, 4, table_id); | |
295 | |
296 n = 0; | |
297 for(i=1;i<=16;i++) { | |
298 n += bits_table[i]; | |
299 put_bits(p, 8, bits_table[i]); | |
300 } | |
301 | |
302 for(i=0;i<n;i++) | |
303 put_bits(p, 8, value_table[i]); | |
304 | |
305 return n + 17; | |
306 } | |
307 | |
308 static void jpeg_table_header(MpegEncContext *s) | |
309 { | |
310 PutBitContext *p = &s->pb; | |
37 | 311 int i, j, size; |
0 | 312 UINT8 *ptr; |
313 | |
314 /* quant matrixes */ | |
315 put_marker(p, DQT); | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
316 #ifdef TWOMATRIXES |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
317 put_bits(p, 16, 2 + 2 * (1 + 64)); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
318 #else |
0 | 319 put_bits(p, 16, 2 + 1 * (1 + 64)); |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
320 #endif |
0 | 321 put_bits(p, 4, 0); /* 8 bit precision */ |
322 put_bits(p, 4, 0); /* table 0 */ | |
323 for(i=0;i<64;i++) { | |
37 | 324 j = zigzag_direct[i]; |
325 put_bits(p, 8, s->intra_matrix[j]); | |
0 | 326 } |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
327 #ifdef TWOMATRIXES |
0 | 328 put_bits(p, 4, 0); /* 8 bit precision */ |
329 put_bits(p, 4, 1); /* table 1 */ | |
330 for(i=0;i<64;i++) { | |
37 | 331 j = zigzag_direct[i]; |
332 put_bits(p, 8, s->chroma_intra_matrix[j]); | |
0 | 333 } |
334 #endif | |
335 | |
336 /* huffman table */ | |
337 put_marker(p, DHT); | |
338 flush_put_bits(p); | |
234
5fc0c3af3fe4
alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents:
229
diff
changeset
|
339 ptr = pbBufPtr(p); |
0 | 340 put_bits(p, 16, 0); /* patched later */ |
341 size = 2; | |
342 size += put_huffman_table(s, 0, 0, bits_dc_luminance, val_dc_luminance); | |
343 size += put_huffman_table(s, 0, 1, bits_dc_chrominance, val_dc_chrominance); | |
344 | |
345 size += put_huffman_table(s, 1, 0, bits_ac_luminance, val_ac_luminance); | |
346 size += put_huffman_table(s, 1, 1, bits_ac_chrominance, val_ac_chrominance); | |
347 ptr[0] = size >> 8; | |
348 ptr[1] = size; | |
349 } | |
350 | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
351 static void jpeg_put_comments(MpegEncContext *s) |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
352 { |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
353 PutBitContext *p = &s->pb; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
354 int size; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
355 UINT8 *ptr; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
356 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
357 #if 0 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
358 /* JFIF header */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
359 put_marker(p, APP0); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
360 put_bits(p, 16, 16); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
361 put_string(p, "JFIF"); /* this puts the trailing zero-byte too */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
362 put_bits(p, 16, 0x101); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
363 put_bits(p, 8, 0); /* units type: 0 - aspect ratio */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
364 put_bits(p, 16, 1); /* aspect: 1:1 */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
365 put_bits(p, 16, 1); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
366 put_bits(p, 8, 0); /* thumbnail width */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
367 put_bits(p, 8, 0); /* thumbnail height */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
368 #endif |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
369 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
370 /* comment */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
371 put_marker(p, COM); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
372 flush_put_bits(p); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
373 ptr = pbBufPtr(p); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
374 put_bits(p, 16, 0); /* patched later */ |
527 | 375 #define MJPEG_VERSION "FFmpeg" LIBAVCODEC_VERSION "b" LIBAVCODEC_BUILD_STR |
376 put_string(p, MJPEG_VERSION); | |
377 size = strlen(MJPEG_VERSION)+3; | |
378 #undef MJPEG_VERSION | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
379 ptr[0] = size >> 8; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
380 ptr[1] = size; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
381 } |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
382 |
0 | 383 void mjpeg_picture_header(MpegEncContext *s) |
384 { | |
385 put_marker(&s->pb, SOI); | |
386 | |
370
0eca28d16cbd
clamp intra matrix to 8bit for mjpeg (workaround for qscale>=25)
al3x
parents:
369
diff
changeset
|
387 if (!s->mjpeg_data_only_frames) |
0eca28d16cbd
clamp intra matrix to 8bit for mjpeg (workaround for qscale>=25)
al3x
parents:
369
diff
changeset
|
388 { |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
389 jpeg_put_comments(s); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
390 |
229 | 391 if (s->mjpeg_write_tables) jpeg_table_header(s); |
0 | 392 |
393 put_marker(&s->pb, SOF0); | |
394 | |
395 put_bits(&s->pb, 16, 17); | |
396 put_bits(&s->pb, 8, 8); /* 8 bits/component */ | |
397 put_bits(&s->pb, 16, s->height); | |
398 put_bits(&s->pb, 16, s->width); | |
399 put_bits(&s->pb, 8, 3); /* 3 components */ | |
400 | |
401 /* Y component */ | |
402 put_bits(&s->pb, 8, 1); /* component number */ | |
229 | 403 put_bits(&s->pb, 4, s->mjpeg_hsample[0]); /* H factor */ |
404 put_bits(&s->pb, 4, s->mjpeg_vsample[0]); /* V factor */ | |
0 | 405 put_bits(&s->pb, 8, 0); /* select matrix */ |
406 | |
407 /* Cb component */ | |
408 put_bits(&s->pb, 8, 2); /* component number */ | |
229 | 409 put_bits(&s->pb, 4, s->mjpeg_hsample[1]); /* H factor */ |
410 put_bits(&s->pb, 4, s->mjpeg_vsample[1]); /* V factor */ | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
411 #ifdef TWOMATRIXES |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
412 put_bits(&s->pb, 8, 1); /* select matrix */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
413 #else |
0 | 414 put_bits(&s->pb, 8, 0); /* select matrix */ |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
415 #endif |
0 | 416 |
417 /* Cr component */ | |
418 put_bits(&s->pb, 8, 3); /* component number */ | |
229 | 419 put_bits(&s->pb, 4, s->mjpeg_hsample[2]); /* H factor */ |
420 put_bits(&s->pb, 4, s->mjpeg_vsample[2]); /* V factor */ | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
421 #ifdef TWOMATRIXES |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
422 put_bits(&s->pb, 8, 1); /* select matrix */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
423 #else |
0 | 424 put_bits(&s->pb, 8, 0); /* select matrix */ |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
425 #endif |
370
0eca28d16cbd
clamp intra matrix to 8bit for mjpeg (workaround for qscale>=25)
al3x
parents:
369
diff
changeset
|
426 } |
0 | 427 |
428 /* scan header */ | |
429 put_marker(&s->pb, SOS); | |
430 put_bits(&s->pb, 16, 12); /* length */ | |
431 put_bits(&s->pb, 8, 3); /* 3 components */ | |
432 | |
433 /* Y component */ | |
434 put_bits(&s->pb, 8, 1); /* index */ | |
435 put_bits(&s->pb, 4, 0); /* DC huffman table index */ | |
436 put_bits(&s->pb, 4, 0); /* AC huffman table index */ | |
437 | |
438 /* Cb component */ | |
439 put_bits(&s->pb, 8, 2); /* index */ | |
440 put_bits(&s->pb, 4, 1); /* DC huffman table index */ | |
441 put_bits(&s->pb, 4, 1); /* AC huffman table index */ | |
442 | |
443 /* Cr component */ | |
444 put_bits(&s->pb, 8, 3); /* index */ | |
445 put_bits(&s->pb, 4, 1); /* DC huffman table index */ | |
446 put_bits(&s->pb, 4, 1); /* AC huffman table index */ | |
447 | |
448 put_bits(&s->pb, 8, 0); /* Ss (not used) */ | |
449 put_bits(&s->pb, 8, 63); /* Se (not used) */ | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
450 put_bits(&s->pb, 8, 0); /* Ah/Al (not used) */ |
0 | 451 } |
452 | |
453 void mjpeg_picture_trailer(MpegEncContext *s) | |
454 { | |
455 jflush_put_bits(&s->pb); | |
456 put_marker(&s->pb, EOI); | |
457 } | |
458 | |
440
000aeeac27a2
* started to cleanup name clashes for onetime compilation
kabi
parents:
427
diff
changeset
|
459 static inline void mjpeg_encode_dc(MpegEncContext *s, int val, |
000aeeac27a2
* started to cleanup name clashes for onetime compilation
kabi
parents:
427
diff
changeset
|
460 UINT8 *huff_size, UINT16 *huff_code) |
0 | 461 { |
462 int mant, nbits; | |
463 | |
464 if (val == 0) { | |
465 jput_bits(&s->pb, huff_size[0], huff_code[0]); | |
466 } else { | |
467 mant = val; | |
468 if (val < 0) { | |
469 val = -val; | |
470 mant--; | |
471 } | |
472 | |
473 /* compute the log (XXX: optimize) */ | |
474 nbits = 0; | |
475 while (val != 0) { | |
476 val = val >> 1; | |
477 nbits++; | |
478 } | |
479 | |
480 jput_bits(&s->pb, huff_size[nbits], huff_code[nbits]); | |
481 | |
482 jput_bits(&s->pb, nbits, mant & ((1 << nbits) - 1)); | |
483 } | |
484 } | |
485 | |
486 static void encode_block(MpegEncContext *s, DCTELEM *block, int n) | |
487 { | |
488 int mant, nbits, code, i, j; | |
489 int component, dc, run, last_index, val; | |
490 MJpegContext *m = s->mjpeg_ctx; | |
491 UINT8 *huff_size_ac; | |
492 UINT16 *huff_code_ac; | |
493 | |
494 /* DC coef */ | |
495 component = (n <= 3 ? 0 : n - 4 + 1); | |
496 dc = block[0]; /* overflow is impossible */ | |
497 val = dc - s->last_dc[component]; | |
498 if (n < 4) { | |
440
000aeeac27a2
* started to cleanup name clashes for onetime compilation
kabi
parents:
427
diff
changeset
|
499 mjpeg_encode_dc(s, val, m->huff_size_dc_luminance, m->huff_code_dc_luminance); |
0 | 500 huff_size_ac = m->huff_size_ac_luminance; |
501 huff_code_ac = m->huff_code_ac_luminance; | |
502 } else { | |
440
000aeeac27a2
* started to cleanup name clashes for onetime compilation
kabi
parents:
427
diff
changeset
|
503 mjpeg_encode_dc(s, val, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance); |
0 | 504 huff_size_ac = m->huff_size_ac_chrominance; |
505 huff_code_ac = m->huff_code_ac_chrominance; | |
506 } | |
507 s->last_dc[component] = dc; | |
508 | |
509 /* AC coefs */ | |
510 | |
511 run = 0; | |
512 last_index = s->block_last_index[n]; | |
513 for(i=1;i<=last_index;i++) { | |
514 j = zigzag_direct[i]; | |
515 val = block[j]; | |
516 if (val == 0) { | |
517 run++; | |
518 } else { | |
519 while (run >= 16) { | |
520 jput_bits(&s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]); | |
521 run -= 16; | |
522 } | |
523 mant = val; | |
524 if (val < 0) { | |
525 val = -val; | |
526 mant--; | |
527 } | |
528 | |
529 /* compute the log (XXX: optimize) */ | |
530 nbits = 0; | |
531 while (val != 0) { | |
532 val = val >> 1; | |
533 nbits++; | |
534 } | |
535 code = (run << 4) | nbits; | |
536 | |
537 jput_bits(&s->pb, huff_size_ac[code], huff_code_ac[code]); | |
538 | |
539 jput_bits(&s->pb, nbits, mant & ((1 << nbits) - 1)); | |
540 run = 0; | |
541 } | |
542 } | |
543 | |
544 /* output EOB only if not already 64 values */ | |
545 if (last_index < 63 || run != 0) | |
546 jput_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]); | |
547 } | |
548 | |
549 void mjpeg_encode_mb(MpegEncContext *s, | |
550 DCTELEM block[6][64]) | |
551 { | |
552 int i; | |
553 for(i=0;i<6;i++) { | |
554 encode_block(s, block[i], i); | |
555 } | |
556 } | |
23 | 557 |
558 /******************************************/ | |
559 /* decoding */ | |
560 | |
561 /* compressed picture size */ | |
562 #define PICTURE_BUFFER_SIZE 100000 | |
563 | |
564 #define MAX_COMPONENTS 4 | |
565 | |
566 typedef struct MJpegDecodeContext { | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
567 AVCodecContext *avctx; |
23 | 568 GetBitContext gb; |
569 UINT32 header_state; | |
570 int start_code; /* current start code */ | |
571 UINT8 *buf_ptr; | |
572 int buffer_size; | |
573 int mpeg_enc_ctx_allocated; /* true if decoding context allocated */ | |
574 INT16 quant_matrixes[4][64]; | |
575 VLC vlcs[2][4]; | |
53 | 576 |
577 int org_width, org_height; /* size given at codec init */ | |
578 int first_picture; /* true if decoding first picture */ | |
579 int interlaced; /* true if interlaced */ | |
580 int bottom_field; /* true if bottom field */ | |
581 | |
23 | 582 int width, height; |
26 | 583 int nb_components; |
584 int component_id[MAX_COMPONENTS]; | |
23 | 585 int h_count[MAX_COMPONENTS]; /* horizontal and vertical count for each component */ |
586 int v_count[MAX_COMPONENTS]; | |
587 int h_max, v_max; /* maximum h and v counts */ | |
588 int quant_index[4]; /* quant table index for each component */ | |
589 int last_dc[MAX_COMPONENTS]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */ | |
590 UINT8 *current_picture[MAX_COMPONENTS]; /* picture structure */ | |
591 int linesize[MAX_COMPONENTS]; | |
592 DCTELEM block[64] __align8; | |
593 UINT8 buffer[PICTURE_BUFFER_SIZE]; | |
354 | 594 |
595 int buggy_avid; | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
596 int restart_interval; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
597 int restart_count; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
598 int interleaved_rows; |
23 | 599 } MJpegDecodeContext; |
600 | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
601 #define SKIP_REMAINING(gb, len) { \ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
602 dprintf("reamining %d bytes in marker\n", len); \ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
603 if (len) while (--len) \ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
604 skip_bits(gb, 8); \ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
605 } |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
606 |
375 | 607 static int mjpeg_decode_dht(MJpegDecodeContext *s, UINT8 *buf, int buf_size); |
608 | |
29 | 609 static void build_vlc(VLC *vlc, const UINT8 *bits_table, const UINT8 *val_table, |
610 int nb_codes) | |
611 { | |
612 UINT8 huff_size[256]; | |
613 UINT16 huff_code[256]; | |
614 | |
615 memset(huff_size, 0, sizeof(huff_size)); | |
616 build_huffman_codes(huff_size, huff_code, bits_table, val_table); | |
617 | |
618 init_vlc(vlc, 9, nb_codes, huff_size, 1, 1, huff_code, 2, 2); | |
619 } | |
620 | |
23 | 621 static int mjpeg_decode_init(AVCodecContext *avctx) |
622 { | |
623 MJpegDecodeContext *s = avctx->priv_data; | |
624 | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
625 s->avctx = avctx; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
626 |
23 | 627 s->header_state = 0; |
628 s->mpeg_enc_ctx_allocated = 0; | |
629 s->buffer_size = PICTURE_BUFFER_SIZE - 1; /* minus 1 to take into | |
630 account FF 00 case */ | |
631 s->start_code = -1; | |
632 s->buf_ptr = s->buffer; | |
53 | 633 s->first_picture = 1; |
634 s->org_width = avctx->width; | |
635 s->org_height = avctx->height; | |
29 | 636 |
637 build_vlc(&s->vlcs[0][0], bits_dc_luminance, val_dc_luminance, 12); | |
638 build_vlc(&s->vlcs[0][1], bits_dc_chrominance, val_dc_chrominance, 12); | |
639 build_vlc(&s->vlcs[1][0], bits_ac_luminance, val_ac_luminance, 251); | |
640 build_vlc(&s->vlcs[1][1], bits_ac_chrominance, val_ac_chrominance, 251); | |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
641 |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
642 if (avctx->flags & CODEC_FLAG_EXTERN_HUFF) |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
643 { |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
644 printf("mjpeg: using external huffman table\n"); |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
645 mjpeg_decode_dht(s, avctx->extradata, avctx->extradata_size); |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
646 /* should check for error - but dunno */ |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
647 } |
23 | 648 return 0; |
649 } | |
650 | |
651 /* quantize tables */ | |
652 static int mjpeg_decode_dqt(MJpegDecodeContext *s, | |
653 UINT8 *buf, int buf_size) | |
654 { | |
37 | 655 int len, index, i, j; |
23 | 656 init_get_bits(&s->gb, buf, buf_size); |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
657 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
658 len = get_bits(&s->gb, 16) - 2; |
23 | 659 |
660 while (len >= 65) { | |
661 /* only 8 bit precision handled */ | |
662 if (get_bits(&s->gb, 4) != 0) | |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
663 { |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
664 dprintf("dqt: 16bit precision\n"); |
23 | 665 return -1; |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
666 } |
23 | 667 index = get_bits(&s->gb, 4); |
668 if (index >= 4) | |
669 return -1; | |
670 dprintf("index=%d\n", index); | |
671 /* read quant table */ | |
37 | 672 for(i=0;i<64;i++) { |
673 j = zigzag_direct[i]; | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
674 s->quant_matrixes[index][j] = get_bits(&s->gb, 8); |
37 | 675 } |
23 | 676 len -= 65; |
677 } | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
678 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
679 SKIP_REMAINING(&s->gb, len); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
680 |
23 | 681 return 0; |
682 } | |
683 | |
684 /* decode huffman tables and build VLC decoders */ | |
685 static int mjpeg_decode_dht(MJpegDecodeContext *s, | |
686 UINT8 *buf, int buf_size) | |
687 { | |
688 int len, index, i, class, n, v, code_max; | |
689 UINT8 bits_table[17]; | |
690 UINT8 val_table[256]; | |
691 | |
692 init_get_bits(&s->gb, buf, buf_size); | |
693 | |
694 len = get_bits(&s->gb, 16); | |
695 len -= 2; | |
696 | |
697 while (len > 0) { | |
698 if (len < 17) | |
699 return -1; | |
700 class = get_bits(&s->gb, 4); | |
701 if (class >= 2) | |
702 return -1; | |
703 index = get_bits(&s->gb, 4); | |
704 if (index >= 4) | |
705 return -1; | |
706 n = 0; | |
707 for(i=1;i<=16;i++) { | |
708 bits_table[i] = get_bits(&s->gb, 8); | |
709 n += bits_table[i]; | |
710 } | |
711 len -= 17; | |
712 if (len < n || n > 256) | |
713 return -1; | |
714 | |
715 code_max = 0; | |
716 for(i=0;i<n;i++) { | |
717 v = get_bits(&s->gb, 8); | |
718 if (v > code_max) | |
719 code_max = v; | |
720 val_table[i] = v; | |
721 } | |
722 len -= n; | |
723 | |
724 /* build VLC and flush previous vlc if present */ | |
725 free_vlc(&s->vlcs[class][index]); | |
726 dprintf("class=%d index=%d nb_codes=%d\n", | |
727 class, index, code_max + 1); | |
29 | 728 build_vlc(&s->vlcs[class][index], bits_table, val_table, code_max + 1); |
23 | 729 } |
730 return 0; | |
731 } | |
732 | |
733 static int mjpeg_decode_sof0(MJpegDecodeContext *s, | |
734 UINT8 *buf, int buf_size) | |
735 { | |
26 | 736 int len, nb_components, i, width, height; |
23 | 737 |
738 init_get_bits(&s->gb, buf, buf_size); | |
739 | |
740 /* XXX: verify len field validity */ | |
741 len = get_bits(&s->gb, 16); | |
742 /* only 8 bits/component accepted */ | |
743 if (get_bits(&s->gb, 8) != 8) | |
744 return -1; | |
745 height = get_bits(&s->gb, 16); | |
746 width = get_bits(&s->gb, 16); | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
747 dprintf("sof0: picture: %dx%d\n", width, height); |
23 | 748 |
749 nb_components = get_bits(&s->gb, 8); | |
750 if (nb_components <= 0 || | |
751 nb_components > MAX_COMPONENTS) | |
752 return -1; | |
26 | 753 s->nb_components = nb_components; |
23 | 754 s->h_max = 1; |
755 s->v_max = 1; | |
756 for(i=0;i<nb_components;i++) { | |
757 /* component id */ | |
26 | 758 s->component_id[i] = get_bits(&s->gb, 8) - 1; |
23 | 759 s->h_count[i] = get_bits(&s->gb, 4); |
760 s->v_count[i] = get_bits(&s->gb, 4); | |
761 /* compute hmax and vmax (only used in interleaved case) */ | |
762 if (s->h_count[i] > s->h_max) | |
763 s->h_max = s->h_count[i]; | |
764 if (s->v_count[i] > s->v_max) | |
765 s->v_max = s->v_count[i]; | |
766 s->quant_index[i] = get_bits(&s->gb, 8); | |
767 if (s->quant_index[i] >= 4) | |
768 return -1; | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
769 dprintf("component %d %d:%d id: %d quant:%d\n", i, s->h_count[i], |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
770 s->v_count[i], s->component_id[i], s->quant_index[i]); |
23 | 771 } |
772 | |
773 /* if different size, realloc/alloc picture */ | |
774 /* XXX: also check h_count and v_count */ | |
775 if (width != s->width || height != s->height) { | |
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
375
diff
changeset
|
776 for(i=0;i<MAX_COMPONENTS;i++) |
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
375
diff
changeset
|
777 av_freep(&s->current_picture[i]); |
23 | 778 s->width = width; |
779 s->height = height; | |
53 | 780 /* test interlaced mode */ |
781 if (s->first_picture && | |
782 s->org_height != 0 && | |
783 s->height < ((s->org_height * 3) / 4)) { | |
784 s->interlaced = 1; | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
785 s->bottom_field = 0; |
53 | 786 } |
787 | |
23 | 788 for(i=0;i<nb_components;i++) { |
226 | 789 int w, h; |
790 w = (s->width + 8 * s->h_max - 1) / (8 * s->h_max); | |
791 h = (s->height + 8 * s->v_max - 1) / (8 * s->v_max); | |
792 w = w * 8 * s->h_count[i]; | |
793 h = h * 8 * s->v_count[i]; | |
53 | 794 if (s->interlaced) |
795 w *= 2; | |
23 | 796 s->linesize[i] = w; |
797 /* memory test is done in mjpeg_decode_sos() */ | |
798 s->current_picture[i] = av_mallocz(w * h); | |
799 } | |
53 | 800 s->first_picture = 0; |
23 | 801 } |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
802 |
354 | 803 if (len != (8+(3*nb_components))) |
804 { | |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
805 dprintf("decode_sof0: error, len(%d) mismatch\n", len); |
354 | 806 } |
53 | 807 |
23 | 808 return 0; |
809 } | |
810 | |
440
000aeeac27a2
* started to cleanup name clashes for onetime compilation
kabi
parents:
427
diff
changeset
|
811 static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index) |
23 | 812 { |
813 int code, diff; | |
814 | |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
815 code = get_vlc(&s->gb, &s->vlcs[0][dc_index]); |
23 | 816 if (code < 0) |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
817 { |
440
000aeeac27a2
* started to cleanup name clashes for onetime compilation
kabi
parents:
427
diff
changeset
|
818 dprintf("mjpeg_decode_dc: bad vlc: %d:%d (%p)\n", 0, dc_index, |
427 | 819 &s->vlcs[0][dc_index]); |
23 | 820 return 0xffff; |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
821 } |
23 | 822 if (code == 0) { |
823 diff = 0; | |
824 } else { | |
825 diff = get_bits(&s->gb, code); | |
826 if ((diff & (1 << (code - 1))) == 0) | |
827 diff = (-1 << code) | (diff + 1); | |
828 } | |
829 return diff; | |
830 } | |
831 | |
832 /* decode block and dequantize */ | |
833 static int decode_block(MJpegDecodeContext *s, DCTELEM *block, | |
834 int component, int dc_index, int ac_index, int quant_index) | |
835 { | |
836 int nbits, code, i, j, level; | |
837 int run, val; | |
838 VLC *ac_vlc; | |
839 INT16 *quant_matrix; | |
840 | |
841 /* DC coef */ | |
440
000aeeac27a2
* started to cleanup name clashes for onetime compilation
kabi
parents:
427
diff
changeset
|
842 val = mjpeg_decode_dc(s, dc_index); |
23 | 843 if (val == 0xffff) { |
844 dprintf("error dc\n"); | |
845 return -1; | |
846 } | |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
847 quant_matrix = s->quant_matrixes[quant_index]; |
23 | 848 val = val * quant_matrix[0] + s->last_dc[component]; |
849 s->last_dc[component] = val; | |
850 block[0] = val; | |
851 /* AC coefs */ | |
852 ac_vlc = &s->vlcs[1][ac_index]; | |
853 i = 1; | |
854 for(;;) { | |
855 code = get_vlc(&s->gb, ac_vlc); | |
856 if (code < 0) { | |
857 dprintf("error ac\n"); | |
858 return -1; | |
859 } | |
860 /* EOB */ | |
861 if (code == 0) | |
862 break; | |
863 if (code == 0xf0) { | |
864 i += 16; | |
865 } else { | |
866 run = code >> 4; | |
867 nbits = code & 0xf; | |
868 level = get_bits(&s->gb, nbits); | |
869 if ((level & (1 << (nbits - 1))) == 0) | |
870 level = (-1 << nbits) | (level + 1); | |
871 i += run; | |
872 if (i >= 64) { | |
873 dprintf("error count: %d\n", i); | |
874 return -1; | |
875 } | |
876 j = zigzag_direct[i]; | |
877 block[j] = level * quant_matrix[j]; | |
878 i++; | |
28
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
879 if (i >= 64) |
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
880 break; |
23 | 881 } |
882 } | |
883 return 0; | |
884 } | |
885 | |
886 static int mjpeg_decode_sos(MJpegDecodeContext *s, | |
887 UINT8 *buf, int buf_size) | |
888 { | |
47
bd0dd8d0b759
return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents:
44
diff
changeset
|
889 int len, nb_components, i, j, n, h, v, ret; |
26 | 890 int mb_width, mb_height, mb_x, mb_y, vmax, hmax, index, id; |
23 | 891 int comp_index[4]; |
892 int dc_index[4]; | |
893 int ac_index[4]; | |
894 int nb_blocks[4]; | |
895 int h_count[4]; | |
896 int v_count[4]; | |
897 | |
898 init_get_bits(&s->gb, buf, buf_size); | |
899 /* XXX: verify len field validity */ | |
900 len = get_bits(&s->gb, 16); | |
901 nb_components = get_bits(&s->gb, 8); | |
902 /* XXX: only interleaved scan accepted */ | |
903 if (nb_components != 3) | |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
904 { |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
905 dprintf("decode_sos: components(%d) mismatch\n", nb_components); |
23 | 906 return -1; |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
907 } |
23 | 908 vmax = 0; |
909 hmax = 0; | |
910 for(i=0;i<nb_components;i++) { | |
26 | 911 id = get_bits(&s->gb, 8) - 1; |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
912 dprintf("component: %d\n", id); |
26 | 913 /* find component index */ |
914 for(index=0;index<s->nb_components;index++) | |
915 if (id == s->component_id[index]) | |
916 break; | |
917 if (index == s->nb_components) | |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
918 { |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
919 dprintf("decode_sos: index(%d) out of components\n", index); |
23 | 920 return -1; |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
921 } |
26 | 922 |
23 | 923 comp_index[i] = index; |
924 nb_blocks[i] = s->h_count[index] * s->v_count[index]; | |
925 h_count[i] = s->h_count[index]; | |
926 v_count[i] = s->v_count[index]; | |
28
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
927 |
23 | 928 dc_index[i] = get_bits(&s->gb, 4); |
929 ac_index[i] = get_bits(&s->gb, 4); | |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
930 |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
931 if (dc_index[i] < 0 || ac_index[i] < 0 || |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
932 dc_index[i] >= 4 || ac_index[i] >= 4) |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
933 goto out_of_range; |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
934 switch(s->start_code) |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
935 { |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
936 case SOF0: |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
937 if (dc_index[i] > 1 || ac_index[i] > 1) |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
938 goto out_of_range; |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
939 break; |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
940 case SOF1: |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
941 case SOF2: |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
942 if (dc_index[i] > 3 || ac_index[i] > 3) |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
943 goto out_of_range; |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
944 break; |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
945 case SOF3: |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
946 if (dc_index[i] > 3 || ac_index[i] != 0) |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
947 goto out_of_range; |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
948 break; |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
949 } |
23 | 950 } |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
951 skip_bits(&s->gb, 8); /* Ss */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
952 skip_bits(&s->gb, 8); /* Se */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
953 skip_bits(&s->gb, 8); /* Ah and Al (each are 4 bits) */ |
23 | 954 |
955 for(i=0;i<nb_components;i++) | |
956 s->last_dc[i] = 1024; | |
957 | |
958 if (nb_components > 1) { | |
959 /* interleaved stream */ | |
960 mb_width = (s->width + s->h_max * 8 - 1) / (s->h_max * 8); | |
961 mb_height = (s->height + s->v_max * 8 - 1) / (s->v_max * 8); | |
962 } else { | |
963 h = s->h_max / s->h_count[comp_index[0]]; | |
964 v = s->v_max / s->v_count[comp_index[0]]; | |
965 mb_width = (s->width + h * 8 - 1) / (h * 8); | |
966 mb_height = (s->height + v * 8 - 1) / (v * 8); | |
967 nb_blocks[0] = 1; | |
968 h_count[0] = 1; | |
969 v_count[0] = 1; | |
970 } | |
971 | |
972 for(mb_y = 0; mb_y < mb_height; mb_y++) { | |
973 for(mb_x = 0; mb_x < mb_width; mb_x++) { | |
974 for(i=0;i<nb_components;i++) { | |
975 UINT8 *ptr; | |
976 int x, y, c; | |
977 n = nb_blocks[i]; | |
978 c = comp_index[i]; | |
979 h = h_count[i]; | |
980 v = v_count[i]; | |
981 x = 0; | |
982 y = 0; | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
983 if (s->restart_interval && !s->restart_count) |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
984 s->restart_count = s->restart_interval; |
23 | 985 for(j=0;j<n;j++) { |
986 memset(s->block, 0, sizeof(s->block)); | |
987 if (decode_block(s, s->block, i, | |
988 dc_index[i], ac_index[i], | |
989 s->quant_index[c]) < 0) { | |
427 | 990 dprintf("error y=%d x=%d\n", mb_y, mb_x); |
47
bd0dd8d0b759
return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents:
44
diff
changeset
|
991 ret = -1; |
bd0dd8d0b759
return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents:
44
diff
changeset
|
992 goto the_end; |
23 | 993 } |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
994 // dprintf("mb: %d %d processed\n", mb_y, mb_x); |
23 | 995 ptr = s->current_picture[c] + |
996 (s->linesize[c] * (v * mb_y + y) * 8) + | |
997 (h * mb_x + x) * 8; | |
53 | 998 if (s->interlaced && s->bottom_field) |
999 ptr += s->linesize[c] >> 1; | |
477 | 1000 ff_idct_put(ptr, s->linesize[c], s->block); |
23 | 1001 if (++x == h) { |
1002 x = 0; | |
1003 y++; | |
1004 } | |
1005 } | |
1006 } | |
584
03e395b31197
handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents:
541
diff
changeset
|
1007 if (s->restart_interval && !--s->restart_count) { |
03e395b31197
handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents:
541
diff
changeset
|
1008 align_get_bits(&s->gb); |
03e395b31197
handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents:
541
diff
changeset
|
1009 skip_bits(&s->gb, 16); /* skip RSTn */ |
03e395b31197
handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents:
541
diff
changeset
|
1010 for (j=0; j<nb_components; j++) /* reset dc */ |
03e395b31197
handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents:
541
diff
changeset
|
1011 s->last_dc[j] = 1024; |
03e395b31197
handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents:
541
diff
changeset
|
1012 } |
23 | 1013 } |
1014 } | |
47
bd0dd8d0b759
return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents:
44
diff
changeset
|
1015 ret = 0; |
bd0dd8d0b759
return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents:
44
diff
changeset
|
1016 the_end: |
44
92d51f683931
added forgotten emms() - fix various segmentation faults when using mjpeg
glantau
parents:
37
diff
changeset
|
1017 emms_c(); |
47
bd0dd8d0b759
return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents:
44
diff
changeset
|
1018 return ret; |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
1019 out_of_range: |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
1020 dprintf("decode_sos: ac/dc index out of range\n"); |
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
1021 return -1; |
23 | 1022 } |
1023 | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1024 static int mjpeg_decode_dri(MJpegDecodeContext *s, |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1025 UINT8 *buf, int buf_size) |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1026 { |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1027 init_get_bits(&s->gb, buf, buf_size); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1028 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1029 if (get_bits(&s->gb, 16) != 4) |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1030 return -1; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1031 s->restart_interval = get_bits(&s->gb, 16); |
507
b5b91e89b88c
* turned into debug message - it's annoying when watching mjpeg files
kabi
parents:
477
diff
changeset
|
1032 dprintf("restart interval: %d\n", s->restart_interval); |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1033 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1034 return 0; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1035 } |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1036 |
354 | 1037 #define FOURCC(a,b,c,d) ((a << 24) | (b << 16) | (c << 8) | d) |
1038 static int mjpeg_decode_app(MJpegDecodeContext *s, | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1039 UINT8 *buf, int buf_size, int start_code) |
354 | 1040 { |
1041 int len, id; | |
1042 | |
1043 init_get_bits(&s->gb, buf, buf_size); | |
1044 | |
1045 /* XXX: verify len field validity */ | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1046 len = get_bits(&s->gb, 16); |
354 | 1047 if (len < 5) |
1048 return -1; | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1049 |
354 | 1050 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16); |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1051 len -= 6; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1052 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1053 /* buggy AVID, it puts EOI only at every 10th frame */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1054 /* also this fourcc is used by non-avid files too, it means |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1055 interleaving, but it's always present in AVID files */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1056 if (id == FOURCC('A','V','I','1')) |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1057 { |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1058 /* structure: |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1059 4bytes AVI1 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1060 1bytes polarity |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1061 1bytes always zero |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1062 4bytes field_size |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1063 4bytes field_size_less_padding |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1064 */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1065 s->buggy_avid = 1; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1066 if (s->first_picture) |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1067 printf("mjpeg: workarounding buggy AVID\n"); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1068 s->interleaved_rows = get_bits(&s->gb, 8); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1069 #if 0 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1070 skip_bits(&s->gb, 8); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1071 skip_bits(&s->gb, 32); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1072 skip_bits(&s->gb, 32); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1073 len -= 10; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1074 #endif |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1075 if (s->interleaved_rows) |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1076 printf("mjpeg: interleaved rows: %d\n", s->interleaved_rows); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1077 goto out; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1078 } |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1079 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1080 len -= 2; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1081 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1082 if (id == FOURCC('J','F','I','F')) |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1083 { |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1084 skip_bits(&s->gb, 8); /* the trailing zero-byte */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1085 printf("mjpeg: JFIF header found (version: %x.%x)\n", |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1086 get_bits(&s->gb, 8), get_bits(&s->gb, 8)); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1087 goto out; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1088 } |
354 | 1089 |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1090 /* Apple MJPEG-A */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1091 if ((start_code == APP1) && (len > (0x28 - 8))) |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1092 { |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1093 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1094 len -= 4; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1095 if (id == FOURCC('m','j','p','g')) /* Apple MJPEG-A */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1096 { |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1097 #if 0 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1098 skip_bits(&s->gb, 32); /* field size */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1099 skip_bits(&s->gb, 32); /* pad field size */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1100 skip_bits(&s->gb, 32); /* next off */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1101 skip_bits(&s->gb, 32); /* quant off */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1102 skip_bits(&s->gb, 32); /* huff off */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1103 skip_bits(&s->gb, 32); /* image off */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1104 skip_bits(&s->gb, 32); /* scan off */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1105 skip_bits(&s->gb, 32); /* data off */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1106 #endif |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1107 if (s->first_picture) |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1108 printf("mjpeg: Apple MJPEG-A header found\n"); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1109 } |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1110 } |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1111 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1112 out: |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1113 /* should check for further values.. */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1114 SKIP_REMAINING(&s->gb, len); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1115 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1116 return 0; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1117 } |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1118 #undef FOURCC |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1119 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1120 static int mjpeg_decode_com(MJpegDecodeContext *s, |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1121 UINT8 *buf, int buf_size) |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1122 { |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1123 int len, i; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1124 UINT8 *cbuf; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1125 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1126 init_get_bits(&s->gb, buf, buf_size); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1127 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1128 /* XXX: verify len field validity */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1129 len = get_bits(&s->gb, 16)-2; |
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
375
diff
changeset
|
1130 cbuf = av_malloc(len+1); |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1131 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1132 for (i = 0; i < len; i++) |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1133 cbuf[i] = get_bits(&s->gb, 8); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1134 if (cbuf[i-1] == '\n') |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1135 cbuf[i-1] = 0; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1136 else |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1137 cbuf[i] = 0; |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1138 |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1139 printf("mjpeg comment: '%s'\n", cbuf); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1140 |
354 | 1141 /* buggy avid, it puts EOI only at every 10th frame */ |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1142 if (!strcmp(cbuf, "AVID")) |
354 | 1143 { |
1144 s->buggy_avid = 1; | |
1145 if (s->first_picture) | |
1146 printf("mjpeg: workarounding buggy AVID\n"); | |
1147 } | |
1148 | |
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
375
diff
changeset
|
1149 av_free(cbuf); |
354 | 1150 |
1151 return 0; | |
1152 } | |
1153 | |
23 | 1154 /* return the 8 bit start code value and update the search |
1155 state. Return -1 if no start code found */ | |
1156 static int find_marker(UINT8 **pbuf_ptr, UINT8 *buf_end, | |
1157 UINT32 *header_state) | |
1158 { | |
1159 UINT8 *buf_ptr; | |
1160 unsigned int state, v; | |
1161 int val; | |
1162 | |
1163 state = *header_state; | |
1164 buf_ptr = *pbuf_ptr; | |
584
03e395b31197
handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents:
541
diff
changeset
|
1165 retry: |
23 | 1166 if (state) { |
1167 /* get marker */ | |
1168 found: | |
1169 if (buf_ptr < buf_end) { | |
1170 val = *buf_ptr++; | |
1171 state = 0; | |
584
03e395b31197
handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents:
541
diff
changeset
|
1172 if ((val >= RST0) && (val <= RST7)) |
03e395b31197
handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents:
541
diff
changeset
|
1173 goto retry; |
23 | 1174 } else { |
1175 val = -1; | |
1176 } | |
1177 } else { | |
1178 while (buf_ptr < buf_end) { | |
1179 v = *buf_ptr++; | |
1180 if (v == 0xff) { | |
1181 state = 1; | |
1182 goto found; | |
1183 } | |
1184 } | |
1185 val = -1; | |
1186 } | |
1187 *pbuf_ptr = buf_ptr; | |
1188 *header_state = state; | |
1189 return val; | |
1190 } | |
1191 | |
1192 static int mjpeg_decode_frame(AVCodecContext *avctx, | |
1193 void *data, int *data_size, | |
1194 UINT8 *buf, int buf_size) | |
1195 { | |
1196 MJpegDecodeContext *s = avctx->priv_data; | |
1197 UINT8 *buf_end, *buf_ptr, *buf_start; | |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
1198 int len, code, input_size, i; |
23 | 1199 AVPicture *picture = data; |
349
34f6c77ff01a
Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents:
344
diff
changeset
|
1200 unsigned int start_code; |
23 | 1201 |
68 | 1202 *data_size = 0; |
1203 | |
23 | 1204 /* no supplementary picture */ |
68 | 1205 if (buf_size == 0) |
23 | 1206 return 0; |
1207 | |
1208 buf_ptr = buf; | |
1209 buf_end = buf + buf_size; | |
1210 while (buf_ptr < buf_end) { | |
1211 buf_start = buf_ptr; | |
1212 /* find start next marker */ | |
1213 code = find_marker(&buf_ptr, buf_end, &s->header_state); | |
1214 /* copy to buffer */ | |
1215 len = buf_ptr - buf_start; | |
1216 if (len + (s->buf_ptr - s->buffer) > s->buffer_size) { | |
1217 /* data too big : flush */ | |
1218 s->buf_ptr = s->buffer; | |
1219 if (code > 0) | |
1220 s->start_code = code; | |
1221 } else { | |
1222 memcpy(s->buf_ptr, buf_start, len); | |
1223 s->buf_ptr += len; | |
427 | 1224 if (code < 0) { |
1225 /* nothing to do: wait next marker */ | |
1226 } else if (code == 0 || code == 0xff) { | |
1227 /* if we got FF 00, we copy FF to the stream to unescape FF 00 */ | |
1228 /* valid marker code is between 00 and ff - alex */ | |
23 | 1229 s->buf_ptr--; |
354 | 1230 } else { |
23 | 1231 /* prepare data for next start code */ |
1232 input_size = s->buf_ptr - s->buffer; | |
1233 start_code = s->start_code; | |
1234 s->buf_ptr = s->buffer; | |
1235 s->start_code = code; | |
44
92d51f683931
added forgotten emms() - fix various segmentation faults when using mjpeg
glantau
parents:
37
diff
changeset
|
1236 dprintf("marker=%x\n", start_code); |
23 | 1237 switch(start_code) { |
1238 case SOI: | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1239 s->restart_interval = 0; |
23 | 1240 /* nothing to do on SOI */ |
1241 break; | |
1242 case DQT: | |
1243 mjpeg_decode_dqt(s, s->buffer, input_size); | |
1244 break; | |
1245 case DHT: | |
1246 mjpeg_decode_dht(s, s->buffer, input_size); | |
1247 break; | |
1248 case SOF0: | |
1249 mjpeg_decode_sof0(s, s->buffer, input_size); | |
1250 break; | |
1251 case SOS: | |
1252 mjpeg_decode_sos(s, s->buffer, input_size); | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1253 if (s->start_code == EOI || s->buggy_avid || s->restart_interval) { |
53 | 1254 int l; |
1255 if (s->interlaced) { | |
1256 s->bottom_field ^= 1; | |
1257 /* if not bottom field, do not output image yet */ | |
1258 if (s->bottom_field) | |
540
4cee7ce37e10
don't exit decoder after decoding first field -> fixes angels.avi interlacing
arpi_esp
parents:
527
diff
changeset
|
1259 goto not_the_end; |
53 | 1260 } |
23 | 1261 for(i=0;i<3;i++) { |
1262 picture->data[i] = s->current_picture[i]; | |
53 | 1263 l = s->linesize[i]; |
1264 if (s->interlaced) | |
1265 l >>= 1; | |
1266 picture->linesize[i] = l; | |
23 | 1267 } |
1268 *data_size = sizeof(AVPicture); | |
1269 avctx->height = s->height; | |
53 | 1270 if (s->interlaced) |
1271 avctx->height *= 2; | |
23 | 1272 avctx->width = s->width; |
28
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
1273 /* XXX: not complete test ! */ |
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
1274 switch((s->h_count[0] << 4) | s->v_count[0]) { |
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
1275 case 0x11: |
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
1276 avctx->pix_fmt = PIX_FMT_YUV444P; |
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
1277 break; |
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
1278 case 0x21: |
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
1279 avctx->pix_fmt = PIX_FMT_YUV422P; |
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
1280 break; |
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
1281 default: |
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
1282 case 0x22: |
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
1283 avctx->pix_fmt = PIX_FMT_YUV420P; |
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
1284 break; |
b611fafddf9e
added 422P and 444P support - fixed block parsing error
glantau
parents:
26
diff
changeset
|
1285 } |
47
bd0dd8d0b759
return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents:
44
diff
changeset
|
1286 /* dummy quality */ |
bd0dd8d0b759
return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents:
44
diff
changeset
|
1287 /* XXX: infer it with matrix */ |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1288 avctx->quality = 3; |
23 | 1289 goto the_end; |
1290 } | |
1291 break; | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1292 case DRI: |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1293 mjpeg_decode_dri(s, s->buffer, input_size); |
354 | 1294 break; |
1295 case SOF1: | |
1296 case SOF2: | |
1297 case SOF3: | |
1298 case SOF5: | |
1299 case SOF6: | |
1300 case SOF7: | |
1301 case SOF9: | |
1302 case SOF10: | |
1303 case SOF11: | |
1304 case SOF13: | |
1305 case SOF14: | |
1306 case SOF15: | |
1307 case JPG: | |
1308 printf("mjpeg: unsupported coding type (%x)\n", start_code); | |
1309 return -1; | |
23 | 1310 } |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1311 #if 1 |
427 | 1312 if (start_code >= 0xd0 && start_code <= 0xd7) { |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1313 dprintf("restart marker: %d\n", start_code&0x0f); |
427 | 1314 } else if (s->first_picture) { |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1315 /* APP fields */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1316 if (start_code >= 0xe0 && start_code <= 0xef) |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1317 mjpeg_decode_app(s, s->buffer, input_size, start_code); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1318 /* Comment */ |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1319 else if (start_code == COM) |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1320 mjpeg_decode_com(s, s->buffer, input_size); |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1321 } |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1322 #endif |
23 | 1323 } |
1324 } | |
540
4cee7ce37e10
don't exit decoder after decoding first field -> fixes angels.avi interlacing
arpi_esp
parents:
527
diff
changeset
|
1325 not_the_end: |
541 | 1326 ; |
23 | 1327 } |
1328 the_end: | |
1329 return buf_ptr - buf; | |
1330 } | |
1331 | |
1332 static int mjpeg_decode_end(AVCodecContext *avctx) | |
1333 { | |
1334 MJpegDecodeContext *s = avctx->priv_data; | |
1335 int i, j; | |
1336 | |
1337 for(i=0;i<MAX_COMPONENTS;i++) | |
396
fce0a2520551
removed useless header includes - use av memory functions
glantau
parents:
375
diff
changeset
|
1338 av_free(s->current_picture[i]); |
23 | 1339 for(i=0;i<2;i++) { |
1340 for(j=0;j<4;j++) | |
1341 free_vlc(&s->vlcs[i][j]); | |
1342 } | |
1343 return 0; | |
1344 } | |
1345 | |
1346 AVCodec mjpeg_decoder = { | |
1347 "mjpeg", | |
1348 CODEC_TYPE_VIDEO, | |
1349 CODEC_ID_MJPEG, | |
1350 sizeof(MJpegDecodeContext), | |
1351 mjpeg_decode_init, | |
1352 NULL, | |
1353 mjpeg_decode_end, | |
1354 mjpeg_decode_frame, | |
369
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1355 0, |
c60869851bb4
added support for various app headers, and writin FFmpeg comment
al3x
parents:
357
diff
changeset
|
1356 NULL |
23 | 1357 }; |