annotate mjpeg.c @ 229:f418b5c5ff67 libavcodec

PATCH by Rik Snel <rsnel@cube.dyndns.org> this patch enhances the jpeg header writer. It can be asked to omit quantisation and huffman tables and it can write different horizontal and vertical sampling factors. (the last thing is useless for libavcodec itself (because libavcodec only handles YUV420P at ecoder level), but the values are initialized so that operation of libavcodec is not impaired)
author arpi_esp
date Sat, 09 Feb 2002 01:23:41 +0000
parents 5784987c3940
children 5fc0c3af3fe4
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
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
3 * Copyright (c) 2000, 2001 Gerard Lantau.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
4 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
5 * This program is free software; you can redistribute it and/or modify
986e461dc072 Initial revision
glantau
parents:
diff changeset
6 * it under the terms of the GNU General Public License as published by
986e461dc072 Initial revision
glantau
parents:
diff changeset
7 * the Free Software Foundation; either version 2 of the License, or
986e461dc072 Initial revision
glantau
parents:
diff changeset
8 * (at your option) any later version.
986e461dc072 Initial revision
glantau
parents:
diff changeset
9 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
10 * This program is distributed in the hope that it will be useful,
986e461dc072 Initial revision
glantau
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
986e461dc072 Initial revision
glantau
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
986e461dc072 Initial revision
glantau
parents:
diff changeset
13 * GNU General Public License for more details.
986e461dc072 Initial revision
glantau
parents:
diff changeset
14 *
986e461dc072 Initial revision
glantau
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License
986e461dc072 Initial revision
glantau
parents:
diff changeset
16 * along with this program; if not, write to the Free Software
986e461dc072 Initial revision
glantau
parents:
diff changeset
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
986e461dc072 Initial revision
glantau
parents:
diff changeset
18 */
76
0b09bd08ef4b win32 fixes
glantau
parents: 68
diff changeset
19 //#define DEBUG
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
20 #include "avcodec.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
21 #include "dsputil.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
22 #include "mpegvideo.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
23
986e461dc072 Initial revision
glantau
parents:
diff changeset
24 typedef struct MJpegContext {
986e461dc072 Initial revision
glantau
parents:
diff changeset
25 UINT8 huff_size_dc_luminance[12];
986e461dc072 Initial revision
glantau
parents:
diff changeset
26 UINT16 huff_code_dc_luminance[12];
986e461dc072 Initial revision
glantau
parents:
diff changeset
27 UINT8 huff_size_dc_chrominance[12];
986e461dc072 Initial revision
glantau
parents:
diff changeset
28 UINT16 huff_code_dc_chrominance[12];
986e461dc072 Initial revision
glantau
parents:
diff changeset
29
986e461dc072 Initial revision
glantau
parents:
diff changeset
30 UINT8 huff_size_ac_luminance[256];
986e461dc072 Initial revision
glantau
parents:
diff changeset
31 UINT16 huff_code_ac_luminance[256];
986e461dc072 Initial revision
glantau
parents:
diff changeset
32 UINT8 huff_size_ac_chrominance[256];
986e461dc072 Initial revision
glantau
parents:
diff changeset
33 UINT16 huff_code_ac_chrominance[256];
986e461dc072 Initial revision
glantau
parents:
diff changeset
34 } MJpegContext;
986e461dc072 Initial revision
glantau
parents:
diff changeset
35
986e461dc072 Initial revision
glantau
parents:
diff changeset
36 #define SOF0 0xc0
986e461dc072 Initial revision
glantau
parents:
diff changeset
37 #define SOI 0xd8
986e461dc072 Initial revision
glantau
parents:
diff changeset
38 #define EOI 0xd9
986e461dc072 Initial revision
glantau
parents:
diff changeset
39 #define DQT 0xdb
986e461dc072 Initial revision
glantau
parents:
diff changeset
40 #define DHT 0xc4
986e461dc072 Initial revision
glantau
parents:
diff changeset
41 #define SOS 0xda
986e461dc072 Initial revision
glantau
parents:
diff changeset
42
986e461dc072 Initial revision
glantau
parents:
diff changeset
43 #if 0
986e461dc072 Initial revision
glantau
parents:
diff changeset
44 /* These are the sample quantization tables given in JPEG spec section K.1.
986e461dc072 Initial revision
glantau
parents:
diff changeset
45 * The spec says that the values given produce "good" quality, and
986e461dc072 Initial revision
glantau
parents:
diff changeset
46 * when divided by 2, "very good" quality.
986e461dc072 Initial revision
glantau
parents:
diff changeset
47 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
48 static const unsigned char std_luminance_quant_tbl[64] = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
49 16, 11, 10, 16, 24, 40, 51, 61,
986e461dc072 Initial revision
glantau
parents:
diff changeset
50 12, 12, 14, 19, 26, 58, 60, 55,
986e461dc072 Initial revision
glantau
parents:
diff changeset
51 14, 13, 16, 24, 40, 57, 69, 56,
986e461dc072 Initial revision
glantau
parents:
diff changeset
52 14, 17, 22, 29, 51, 87, 80, 62,
986e461dc072 Initial revision
glantau
parents:
diff changeset
53 18, 22, 37, 56, 68, 109, 103, 77,
986e461dc072 Initial revision
glantau
parents:
diff changeset
54 24, 35, 55, 64, 81, 104, 113, 92,
986e461dc072 Initial revision
glantau
parents:
diff changeset
55 49, 64, 78, 87, 103, 121, 120, 101,
986e461dc072 Initial revision
glantau
parents:
diff changeset
56 72, 92, 95, 98, 112, 100, 103, 99
986e461dc072 Initial revision
glantau
parents:
diff changeset
57 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
58 static const unsigned char std_chrominance_quant_tbl[64] = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
59 17, 18, 24, 47, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
60 18, 21, 26, 66, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
61 24, 26, 56, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
62 47, 66, 99, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
63 99, 99, 99, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
64 99, 99, 99, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
65 99, 99, 99, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
66 99, 99, 99, 99, 99, 99, 99, 99
986e461dc072 Initial revision
glantau
parents:
diff changeset
67 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
68 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
69
986e461dc072 Initial revision
glantau
parents:
diff changeset
70 /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
986e461dc072 Initial revision
glantau
parents:
diff changeset
71 /* IMPORTANT: these are only valid for 8-bit data precision! */
986e461dc072 Initial revision
glantau
parents:
diff changeset
72 static const UINT8 bits_dc_luminance[17] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
73 { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
74 static const UINT8 val_dc_luminance[] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
75 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
76
986e461dc072 Initial revision
glantau
parents:
diff changeset
77 static const UINT8 bits_dc_chrominance[17] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
78 { /* 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
79 static const UINT8 val_dc_chrominance[] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
80 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
81
986e461dc072 Initial revision
glantau
parents:
diff changeset
82 static const UINT8 bits_ac_luminance[17] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
83 { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
986e461dc072 Initial revision
glantau
parents:
diff changeset
84 static const UINT8 val_ac_luminance[] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
85 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
86 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
986e461dc072 Initial revision
glantau
parents:
diff changeset
87 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
986e461dc072 Initial revision
glantau
parents:
diff changeset
88 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
986e461dc072 Initial revision
glantau
parents:
diff changeset
89 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
986e461dc072 Initial revision
glantau
parents:
diff changeset
90 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
986e461dc072 Initial revision
glantau
parents:
diff changeset
91 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
986e461dc072 Initial revision
glantau
parents:
diff changeset
92 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
986e461dc072 Initial revision
glantau
parents:
diff changeset
93 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
986e461dc072 Initial revision
glantau
parents:
diff changeset
94 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
986e461dc072 Initial revision
glantau
parents:
diff changeset
95 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
986e461dc072 Initial revision
glantau
parents:
diff changeset
96 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
986e461dc072 Initial revision
glantau
parents:
diff changeset
97 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
986e461dc072 Initial revision
glantau
parents:
diff changeset
98 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
99 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
986e461dc072 Initial revision
glantau
parents:
diff changeset
100 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
986e461dc072 Initial revision
glantau
parents:
diff changeset
101 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
986e461dc072 Initial revision
glantau
parents:
diff changeset
102 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
986e461dc072 Initial revision
glantau
parents:
diff changeset
103 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
986e461dc072 Initial revision
glantau
parents:
diff changeset
104 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
105 0xf9, 0xfa
986e461dc072 Initial revision
glantau
parents:
diff changeset
106 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
107
986e461dc072 Initial revision
glantau
parents:
diff changeset
108 static const UINT8 bits_ac_chrominance[17] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
109 { /* 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
110
986e461dc072 Initial revision
glantau
parents:
diff changeset
111 static const UINT8 val_ac_chrominance[] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
112 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
986e461dc072 Initial revision
glantau
parents:
diff changeset
113 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
986e461dc072 Initial revision
glantau
parents:
diff changeset
114 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
986e461dc072 Initial revision
glantau
parents:
diff changeset
115 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
986e461dc072 Initial revision
glantau
parents:
diff changeset
116 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
986e461dc072 Initial revision
glantau
parents:
diff changeset
117 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
986e461dc072 Initial revision
glantau
parents:
diff changeset
118 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
986e461dc072 Initial revision
glantau
parents:
diff changeset
119 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
986e461dc072 Initial revision
glantau
parents:
diff changeset
120 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
986e461dc072 Initial revision
glantau
parents:
diff changeset
121 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
986e461dc072 Initial revision
glantau
parents:
diff changeset
122 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
986e461dc072 Initial revision
glantau
parents:
diff changeset
123 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
986e461dc072 Initial revision
glantau
parents:
diff changeset
124 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
986e461dc072 Initial revision
glantau
parents:
diff changeset
125 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
986e461dc072 Initial revision
glantau
parents:
diff changeset
126 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
986e461dc072 Initial revision
glantau
parents:
diff changeset
127 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
986e461dc072 Initial revision
glantau
parents:
diff changeset
128 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
986e461dc072 Initial revision
glantau
parents:
diff changeset
129 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
986e461dc072 Initial revision
glantau
parents:
diff changeset
130 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
986e461dc072 Initial revision
glantau
parents:
diff changeset
131 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
132 0xf9, 0xfa
986e461dc072 Initial revision
glantau
parents:
diff changeset
133 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
134
986e461dc072 Initial revision
glantau
parents:
diff changeset
135
986e461dc072 Initial revision
glantau
parents:
diff changeset
136 /* isn't this function nicer than the one in the libjpeg ? */
986e461dc072 Initial revision
glantau
parents:
diff changeset
137 static void build_huffman_codes(UINT8 *huff_size, UINT16 *huff_code,
986e461dc072 Initial revision
glantau
parents:
diff changeset
138 const UINT8 *bits_table, const UINT8 *val_table)
986e461dc072 Initial revision
glantau
parents:
diff changeset
139 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
140 int i, j, k,nb, code, sym;
986e461dc072 Initial revision
glantau
parents:
diff changeset
141
986e461dc072 Initial revision
glantau
parents:
diff changeset
142 code = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
143 k = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
144 for(i=1;i<=16;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
145 nb = bits_table[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
146 for(j=0;j<nb;j++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
147 sym = val_table[k++];
986e461dc072 Initial revision
glantau
parents:
diff changeset
148 huff_size[sym] = i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
149 huff_code[sym] = code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
150 code++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
151 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
152 code <<= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
153 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
154 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
155
986e461dc072 Initial revision
glantau
parents:
diff changeset
156 int mjpeg_init(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
157 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
158 MJpegContext *m;
986e461dc072 Initial revision
glantau
parents:
diff changeset
159
986e461dc072 Initial revision
glantau
parents:
diff changeset
160 m = malloc(sizeof(MJpegContext));
986e461dc072 Initial revision
glantau
parents:
diff changeset
161 if (!m)
986e461dc072 Initial revision
glantau
parents:
diff changeset
162 return -1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
163
986e461dc072 Initial revision
glantau
parents:
diff changeset
164 /* build all the huffman tables */
986e461dc072 Initial revision
glantau
parents:
diff changeset
165 build_huffman_codes(m->huff_size_dc_luminance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
166 m->huff_code_dc_luminance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
167 bits_dc_luminance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
168 val_dc_luminance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
169 build_huffman_codes(m->huff_size_dc_chrominance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
170 m->huff_code_dc_chrominance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
171 bits_dc_chrominance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
172 val_dc_chrominance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
173 build_huffman_codes(m->huff_size_ac_luminance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
174 m->huff_code_ac_luminance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
175 bits_ac_luminance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
176 val_ac_luminance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
177 build_huffman_codes(m->huff_size_ac_chrominance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
178 m->huff_code_ac_chrominance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
179 bits_ac_chrominance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
180 val_ac_chrominance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
181
986e461dc072 Initial revision
glantau
parents:
diff changeset
182 s->mjpeg_ctx = m;
986e461dc072 Initial revision
glantau
parents:
diff changeset
183 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
184 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
185
986e461dc072 Initial revision
glantau
parents:
diff changeset
186 void mjpeg_close(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
187 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
188 free(s->mjpeg_ctx);
986e461dc072 Initial revision
glantau
parents:
diff changeset
189 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
190
986e461dc072 Initial revision
glantau
parents:
diff changeset
191 static inline void put_marker(PutBitContext *p, int code)
986e461dc072 Initial revision
glantau
parents:
diff changeset
192 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
193 put_bits(p, 8, 0xff);
986e461dc072 Initial revision
glantau
parents:
diff changeset
194 put_bits(p, 8, code);
986e461dc072 Initial revision
glantau
parents:
diff changeset
195 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
196
986e461dc072 Initial revision
glantau
parents:
diff changeset
197 /* table_class: 0 = DC coef, 1 = AC coefs */
986e461dc072 Initial revision
glantau
parents:
diff changeset
198 static int put_huffman_table(MpegEncContext *s, int table_class, int table_id,
986e461dc072 Initial revision
glantau
parents:
diff changeset
199 const UINT8 *bits_table, const UINT8 *value_table)
986e461dc072 Initial revision
glantau
parents:
diff changeset
200 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
201 PutBitContext *p = &s->pb;
986e461dc072 Initial revision
glantau
parents:
diff changeset
202 int n, i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
203
986e461dc072 Initial revision
glantau
parents:
diff changeset
204 put_bits(p, 4, table_class);
986e461dc072 Initial revision
glantau
parents:
diff changeset
205 put_bits(p, 4, table_id);
986e461dc072 Initial revision
glantau
parents:
diff changeset
206
986e461dc072 Initial revision
glantau
parents:
diff changeset
207 n = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
208 for(i=1;i<=16;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
209 n += bits_table[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
210 put_bits(p, 8, bits_table[i]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
211 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
212
986e461dc072 Initial revision
glantau
parents:
diff changeset
213 for(i=0;i<n;i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
214 put_bits(p, 8, value_table[i]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
215
986e461dc072 Initial revision
glantau
parents:
diff changeset
216 return n + 17;
986e461dc072 Initial revision
glantau
parents:
diff changeset
217 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
218
986e461dc072 Initial revision
glantau
parents:
diff changeset
219 static void jpeg_table_header(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
220 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
221 PutBitContext *p = &s->pb;
37
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
222 int i, j, size;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
223 UINT8 *ptr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
224
986e461dc072 Initial revision
glantau
parents:
diff changeset
225 /* quant matrixes */
986e461dc072 Initial revision
glantau
parents:
diff changeset
226 put_marker(p, DQT);
986e461dc072 Initial revision
glantau
parents:
diff changeset
227 put_bits(p, 16, 2 + 1 * (1 + 64));
986e461dc072 Initial revision
glantau
parents:
diff changeset
228 put_bits(p, 4, 0); /* 8 bit precision */
986e461dc072 Initial revision
glantau
parents:
diff changeset
229 put_bits(p, 4, 0); /* table 0 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
230 for(i=0;i<64;i++) {
37
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
231 j = zigzag_direct[i];
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
232 put_bits(p, 8, s->intra_matrix[j]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
233 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
234 #if 0
986e461dc072 Initial revision
glantau
parents:
diff changeset
235 put_bits(p, 4, 0); /* 8 bit precision */
986e461dc072 Initial revision
glantau
parents:
diff changeset
236 put_bits(p, 4, 1); /* table 1 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
237 for(i=0;i<64;i++) {
37
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
238 j = zigzag_direct[i];
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
239 put_bits(p, 8, s->chroma_intra_matrix[j]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
240 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
241 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
242
986e461dc072 Initial revision
glantau
parents:
diff changeset
243 /* huffman table */
986e461dc072 Initial revision
glantau
parents:
diff changeset
244 put_marker(p, DHT);
986e461dc072 Initial revision
glantau
parents:
diff changeset
245 flush_put_bits(p);
986e461dc072 Initial revision
glantau
parents:
diff changeset
246 ptr = p->buf_ptr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
247 put_bits(p, 16, 0); /* patched later */
986e461dc072 Initial revision
glantau
parents:
diff changeset
248 size = 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
249 size += put_huffman_table(s, 0, 0, bits_dc_luminance, val_dc_luminance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
250 size += put_huffman_table(s, 0, 1, bits_dc_chrominance, val_dc_chrominance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
251
986e461dc072 Initial revision
glantau
parents:
diff changeset
252 size += put_huffman_table(s, 1, 0, bits_ac_luminance, val_ac_luminance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
253 size += put_huffman_table(s, 1, 1, bits_ac_chrominance, val_ac_chrominance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
254 ptr[0] = size >> 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
255 ptr[1] = size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
256 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
257
986e461dc072 Initial revision
glantau
parents:
diff changeset
258 void mjpeg_picture_header(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
259 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
260 put_marker(&s->pb, SOI);
986e461dc072 Initial revision
glantau
parents:
diff changeset
261
229
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 226
diff changeset
262 if (s->mjpeg_write_tables) jpeg_table_header(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
263
986e461dc072 Initial revision
glantau
parents:
diff changeset
264 put_marker(&s->pb, SOF0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
265
986e461dc072 Initial revision
glantau
parents:
diff changeset
266 put_bits(&s->pb, 16, 17);
986e461dc072 Initial revision
glantau
parents:
diff changeset
267 put_bits(&s->pb, 8, 8); /* 8 bits/component */
986e461dc072 Initial revision
glantau
parents:
diff changeset
268 put_bits(&s->pb, 16, s->height);
986e461dc072 Initial revision
glantau
parents:
diff changeset
269 put_bits(&s->pb, 16, s->width);
986e461dc072 Initial revision
glantau
parents:
diff changeset
270 put_bits(&s->pb, 8, 3); /* 3 components */
986e461dc072 Initial revision
glantau
parents:
diff changeset
271
986e461dc072 Initial revision
glantau
parents:
diff changeset
272 /* Y component */
986e461dc072 Initial revision
glantau
parents:
diff changeset
273 put_bits(&s->pb, 8, 1); /* component number */
229
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 226
diff changeset
274 put_bits(&s->pb, 4, s->mjpeg_hsample[0]); /* H factor */
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 226
diff changeset
275 put_bits(&s->pb, 4, s->mjpeg_vsample[0]); /* V factor */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
276 put_bits(&s->pb, 8, 0); /* select matrix */
986e461dc072 Initial revision
glantau
parents:
diff changeset
277
986e461dc072 Initial revision
glantau
parents:
diff changeset
278 /* Cb component */
986e461dc072 Initial revision
glantau
parents:
diff changeset
279 put_bits(&s->pb, 8, 2); /* component number */
229
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 226
diff changeset
280 put_bits(&s->pb, 4, s->mjpeg_hsample[1]); /* H factor */
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 226
diff changeset
281 put_bits(&s->pb, 4, s->mjpeg_vsample[1]); /* V factor */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
282 put_bits(&s->pb, 8, 0); /* select matrix */
986e461dc072 Initial revision
glantau
parents:
diff changeset
283
986e461dc072 Initial revision
glantau
parents:
diff changeset
284 /* Cr component */
986e461dc072 Initial revision
glantau
parents:
diff changeset
285 put_bits(&s->pb, 8, 3); /* component number */
229
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 226
diff changeset
286 put_bits(&s->pb, 4, s->mjpeg_hsample[2]); /* H factor */
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 226
diff changeset
287 put_bits(&s->pb, 4, s->mjpeg_vsample[2]); /* V factor */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
288 put_bits(&s->pb, 8, 0); /* select matrix */
986e461dc072 Initial revision
glantau
parents:
diff changeset
289
986e461dc072 Initial revision
glantau
parents:
diff changeset
290 /* scan header */
986e461dc072 Initial revision
glantau
parents:
diff changeset
291 put_marker(&s->pb, SOS);
986e461dc072 Initial revision
glantau
parents:
diff changeset
292 put_bits(&s->pb, 16, 12); /* length */
986e461dc072 Initial revision
glantau
parents:
diff changeset
293 put_bits(&s->pb, 8, 3); /* 3 components */
986e461dc072 Initial revision
glantau
parents:
diff changeset
294
986e461dc072 Initial revision
glantau
parents:
diff changeset
295 /* Y component */
986e461dc072 Initial revision
glantau
parents:
diff changeset
296 put_bits(&s->pb, 8, 1); /* index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
297 put_bits(&s->pb, 4, 0); /* DC huffman table index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
298 put_bits(&s->pb, 4, 0); /* AC huffman table index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
299
986e461dc072 Initial revision
glantau
parents:
diff changeset
300 /* Cb component */
986e461dc072 Initial revision
glantau
parents:
diff changeset
301 put_bits(&s->pb, 8, 2); /* index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
302 put_bits(&s->pb, 4, 1); /* DC huffman table index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
303 put_bits(&s->pb, 4, 1); /* AC huffman table index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
304
986e461dc072 Initial revision
glantau
parents:
diff changeset
305 /* Cr component */
986e461dc072 Initial revision
glantau
parents:
diff changeset
306 put_bits(&s->pb, 8, 3); /* index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
307 put_bits(&s->pb, 4, 1); /* DC huffman table index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
308 put_bits(&s->pb, 4, 1); /* AC huffman table index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
309
986e461dc072 Initial revision
glantau
parents:
diff changeset
310 put_bits(&s->pb, 8, 0); /* Ss (not used) */
986e461dc072 Initial revision
glantau
parents:
diff changeset
311 put_bits(&s->pb, 8, 63); /* Se (not used) */
986e461dc072 Initial revision
glantau
parents:
diff changeset
312 put_bits(&s->pb, 8, 0); /* (not used) */
986e461dc072 Initial revision
glantau
parents:
diff changeset
313 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
314
986e461dc072 Initial revision
glantau
parents:
diff changeset
315 void mjpeg_picture_trailer(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
316 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
317 jflush_put_bits(&s->pb);
986e461dc072 Initial revision
glantau
parents:
diff changeset
318 put_marker(&s->pb, EOI);
986e461dc072 Initial revision
glantau
parents:
diff changeset
319 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
320
986e461dc072 Initial revision
glantau
parents:
diff changeset
321 static inline void encode_dc(MpegEncContext *s, int val,
986e461dc072 Initial revision
glantau
parents:
diff changeset
322 UINT8 *huff_size, UINT16 *huff_code)
986e461dc072 Initial revision
glantau
parents:
diff changeset
323 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
324 int mant, nbits;
986e461dc072 Initial revision
glantau
parents:
diff changeset
325
986e461dc072 Initial revision
glantau
parents:
diff changeset
326 if (val == 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
327 jput_bits(&s->pb, huff_size[0], huff_code[0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
328 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
329 mant = val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
330 if (val < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
331 val = -val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
332 mant--;
986e461dc072 Initial revision
glantau
parents:
diff changeset
333 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
334
986e461dc072 Initial revision
glantau
parents:
diff changeset
335 /* compute the log (XXX: optimize) */
986e461dc072 Initial revision
glantau
parents:
diff changeset
336 nbits = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
337 while (val != 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
338 val = val >> 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
339 nbits++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
340 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
341
986e461dc072 Initial revision
glantau
parents:
diff changeset
342 jput_bits(&s->pb, huff_size[nbits], huff_code[nbits]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
343
986e461dc072 Initial revision
glantau
parents:
diff changeset
344 jput_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
986e461dc072 Initial revision
glantau
parents:
diff changeset
345 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
346 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
347
986e461dc072 Initial revision
glantau
parents:
diff changeset
348 static void encode_block(MpegEncContext *s, DCTELEM *block, int n)
986e461dc072 Initial revision
glantau
parents:
diff changeset
349 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
350 int mant, nbits, code, i, j;
986e461dc072 Initial revision
glantau
parents:
diff changeset
351 int component, dc, run, last_index, val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
352 MJpegContext *m = s->mjpeg_ctx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
353 UINT8 *huff_size_ac;
986e461dc072 Initial revision
glantau
parents:
diff changeset
354 UINT16 *huff_code_ac;
986e461dc072 Initial revision
glantau
parents:
diff changeset
355
986e461dc072 Initial revision
glantau
parents:
diff changeset
356 /* DC coef */
986e461dc072 Initial revision
glantau
parents:
diff changeset
357 component = (n <= 3 ? 0 : n - 4 + 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
358 dc = block[0]; /* overflow is impossible */
986e461dc072 Initial revision
glantau
parents:
diff changeset
359 val = dc - s->last_dc[component];
986e461dc072 Initial revision
glantau
parents:
diff changeset
360 if (n < 4) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
361 encode_dc(s, val, m->huff_size_dc_luminance, m->huff_code_dc_luminance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
362 huff_size_ac = m->huff_size_ac_luminance;
986e461dc072 Initial revision
glantau
parents:
diff changeset
363 huff_code_ac = m->huff_code_ac_luminance;
986e461dc072 Initial revision
glantau
parents:
diff changeset
364 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
365 encode_dc(s, val, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
366 huff_size_ac = m->huff_size_ac_chrominance;
986e461dc072 Initial revision
glantau
parents:
diff changeset
367 huff_code_ac = m->huff_code_ac_chrominance;
986e461dc072 Initial revision
glantau
parents:
diff changeset
368 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
369 s->last_dc[component] = dc;
986e461dc072 Initial revision
glantau
parents:
diff changeset
370
986e461dc072 Initial revision
glantau
parents:
diff changeset
371 /* AC coefs */
986e461dc072 Initial revision
glantau
parents:
diff changeset
372
986e461dc072 Initial revision
glantau
parents:
diff changeset
373 run = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
374 last_index = s->block_last_index[n];
986e461dc072 Initial revision
glantau
parents:
diff changeset
375 for(i=1;i<=last_index;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
376 j = zigzag_direct[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
377 val = block[j];
986e461dc072 Initial revision
glantau
parents:
diff changeset
378 if (val == 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
379 run++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
380 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
381 while (run >= 16) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
382 jput_bits(&s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
383 run -= 16;
986e461dc072 Initial revision
glantau
parents:
diff changeset
384 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
385 mant = val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
386 if (val < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
387 val = -val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
388 mant--;
986e461dc072 Initial revision
glantau
parents:
diff changeset
389 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
390
986e461dc072 Initial revision
glantau
parents:
diff changeset
391 /* compute the log (XXX: optimize) */
986e461dc072 Initial revision
glantau
parents:
diff changeset
392 nbits = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
393 while (val != 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
394 val = val >> 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
395 nbits++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
396 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
397 code = (run << 4) | nbits;
986e461dc072 Initial revision
glantau
parents:
diff changeset
398
986e461dc072 Initial revision
glantau
parents:
diff changeset
399 jput_bits(&s->pb, huff_size_ac[code], huff_code_ac[code]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
400
986e461dc072 Initial revision
glantau
parents:
diff changeset
401 jput_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
986e461dc072 Initial revision
glantau
parents:
diff changeset
402 run = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
403 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
404 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
405
986e461dc072 Initial revision
glantau
parents:
diff changeset
406 /* output EOB only if not already 64 values */
986e461dc072 Initial revision
glantau
parents:
diff changeset
407 if (last_index < 63 || run != 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
408 jput_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
409 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
410
986e461dc072 Initial revision
glantau
parents:
diff changeset
411 void mjpeg_encode_mb(MpegEncContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
412 DCTELEM block[6][64])
986e461dc072 Initial revision
glantau
parents:
diff changeset
413 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
414 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
415 for(i=0;i<6;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
416 encode_block(s, block[i], i);
986e461dc072 Initial revision
glantau
parents:
diff changeset
417 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
418 }
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
419
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
420 /******************************************/
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
421 /* decoding */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
422
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
423 /* compressed picture size */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
424 #define PICTURE_BUFFER_SIZE 100000
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
425
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
426 #define MAX_COMPONENTS 4
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
427
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
428 typedef struct MJpegDecodeContext {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
429 GetBitContext gb;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
430 UINT32 header_state;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
431 int start_code; /* current start code */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
432 UINT8 *buf_ptr;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
433 int buffer_size;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
434 int mpeg_enc_ctx_allocated; /* true if decoding context allocated */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
435 INT16 quant_matrixes[4][64];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
436 VLC vlcs[2][4];
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
437
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
438 int org_width, org_height; /* size given at codec init */
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
439 int first_picture; /* true if decoding first picture */
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
440 int interlaced; /* true if interlaced */
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
441 int bottom_field; /* true if bottom field */
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
442
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
443 int width, height;
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
444 int nb_components;
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
445 int component_id[MAX_COMPONENTS];
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
446 int h_count[MAX_COMPONENTS]; /* horizontal and vertical count for each component */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
447 int v_count[MAX_COMPONENTS];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
448 int h_max, v_max; /* maximum h and v counts */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
449 int quant_index[4]; /* quant table index for each component */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
450 int last_dc[MAX_COMPONENTS]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
451 UINT8 *current_picture[MAX_COMPONENTS]; /* picture structure */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
452 int linesize[MAX_COMPONENTS];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
453 DCTELEM block[64] __align8;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
454 UINT8 buffer[PICTURE_BUFFER_SIZE];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
455 } MJpegDecodeContext;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
456
29
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
457 static void build_vlc(VLC *vlc, const UINT8 *bits_table, const UINT8 *val_table,
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
458 int nb_codes)
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
459 {
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
460 UINT8 huff_size[256];
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
461 UINT16 huff_code[256];
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
462
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
463 memset(huff_size, 0, sizeof(huff_size));
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
464 build_huffman_codes(huff_size, huff_code, bits_table, val_table);
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
465
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
466 init_vlc(vlc, 9, nb_codes, huff_size, 1, 1, huff_code, 2, 2);
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
467 }
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
468
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
469 static int mjpeg_decode_init(AVCodecContext *avctx)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
470 {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
471 MJpegDecodeContext *s = avctx->priv_data;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
472
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
473 s->header_state = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
474 s->mpeg_enc_ctx_allocated = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
475 s->buffer_size = PICTURE_BUFFER_SIZE - 1; /* minus 1 to take into
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
476 account FF 00 case */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
477 s->start_code = -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
478 s->buf_ptr = s->buffer;
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
479 s->first_picture = 1;
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
480 s->org_width = avctx->width;
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
481 s->org_height = avctx->height;
29
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
482
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
483 build_vlc(&s->vlcs[0][0], bits_dc_luminance, val_dc_luminance, 12);
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
484 build_vlc(&s->vlcs[0][1], bits_dc_chrominance, val_dc_chrominance, 12);
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
485 build_vlc(&s->vlcs[1][0], bits_ac_luminance, val_ac_luminance, 251);
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
486 build_vlc(&s->vlcs[1][1], bits_ac_chrominance, val_ac_chrominance, 251);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
487 return 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
488 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
489
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
490 /* quantize tables */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
491 static int mjpeg_decode_dqt(MJpegDecodeContext *s,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
492 UINT8 *buf, int buf_size)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
493 {
37
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
494 int len, index, i, j;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
495 init_get_bits(&s->gb, buf, buf_size);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
496
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
497 len = get_bits(&s->gb, 16);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
498 len -= 2;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
499
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
500 while (len >= 65) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
501 /* only 8 bit precision handled */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
502 if (get_bits(&s->gb, 4) != 0)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
503 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
504 index = get_bits(&s->gb, 4);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
505 if (index >= 4)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
506 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
507 dprintf("index=%d\n", index);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
508 /* read quant table */
37
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
509 for(i=0;i<64;i++) {
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
510 j = zigzag_direct[i];
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
511 s->quant_matrixes[index][j] = get_bits(&s->gb, 8);
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
512 }
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
513 len -= 65;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
514 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
515 return 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
516 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
517
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
518 /* decode huffman tables and build VLC decoders */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
519 static int mjpeg_decode_dht(MJpegDecodeContext *s,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
520 UINT8 *buf, int buf_size)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
521 {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
522 int len, index, i, class, n, v, code_max;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
523 UINT8 bits_table[17];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
524 UINT8 val_table[256];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
525
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
526 init_get_bits(&s->gb, buf, buf_size);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
527
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
528 len = get_bits(&s->gb, 16);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
529 len -= 2;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
530
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
531 while (len > 0) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
532 if (len < 17)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
533 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
534 class = get_bits(&s->gb, 4);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
535 if (class >= 2)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
536 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
537 index = get_bits(&s->gb, 4);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
538 if (index >= 4)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
539 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
540 n = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
541 for(i=1;i<=16;i++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
542 bits_table[i] = get_bits(&s->gb, 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
543 n += bits_table[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
544 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
545 len -= 17;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
546 if (len < n || n > 256)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
547 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
548
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
549 code_max = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
550 for(i=0;i<n;i++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
551 v = get_bits(&s->gb, 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
552 if (v > code_max)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
553 code_max = v;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
554 val_table[i] = v;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
555 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
556 len -= n;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
557
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
558 /* build VLC and flush previous vlc if present */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
559 free_vlc(&s->vlcs[class][index]);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
560 dprintf("class=%d index=%d nb_codes=%d\n",
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
561 class, index, code_max + 1);
29
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
562 build_vlc(&s->vlcs[class][index], bits_table, val_table, code_max + 1);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
563 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
564 return 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
565 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
566
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
567 static int mjpeg_decode_sof0(MJpegDecodeContext *s,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
568 UINT8 *buf, int buf_size)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
569 {
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
570 int len, nb_components, i, width, height;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
571
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
572 init_get_bits(&s->gb, buf, buf_size);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
573
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
574 /* XXX: verify len field validity */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
575 len = get_bits(&s->gb, 16);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
576 /* only 8 bits/component accepted */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
577 if (get_bits(&s->gb, 8) != 8)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
578 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
579 height = get_bits(&s->gb, 16);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
580 width = get_bits(&s->gb, 16);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
581
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
582 nb_components = get_bits(&s->gb, 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
583 if (nb_components <= 0 ||
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
584 nb_components > MAX_COMPONENTS)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
585 return -1;
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
586 s->nb_components = nb_components;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
587 s->h_max = 1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
588 s->v_max = 1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
589 for(i=0;i<nb_components;i++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
590 /* component id */
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
591 s->component_id[i] = get_bits(&s->gb, 8) - 1;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
592 s->h_count[i] = get_bits(&s->gb, 4);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
593 s->v_count[i] = get_bits(&s->gb, 4);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
594 /* compute hmax and vmax (only used in interleaved case) */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
595 if (s->h_count[i] > s->h_max)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
596 s->h_max = s->h_count[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
597 if (s->v_count[i] > s->v_max)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
598 s->v_max = s->v_count[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
599 s->quant_index[i] = get_bits(&s->gb, 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
600 if (s->quant_index[i] >= 4)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
601 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
602 dprintf("component %d %d:%d\n", i, s->h_count[i], s->v_count[i]);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
603 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
604
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
605 /* if different size, realloc/alloc picture */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
606 /* XXX: also check h_count and v_count */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
607 if (width != s->width || height != s->height) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
608 for(i=0;i<MAX_COMPONENTS;i++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
609 free(s->current_picture[i]);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
610 s->current_picture[i] = NULL;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
611 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
612 s->width = width;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
613 s->height = height;
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
614 /* test interlaced mode */
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
615 if (s->first_picture &&
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
616 s->org_height != 0 &&
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
617 s->height < ((s->org_height * 3) / 4)) {
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
618 s->interlaced = 1;
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
619 s->bottom_field = 0;
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
620 }
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
621
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
622 for(i=0;i<nb_components;i++) {
226
5784987c3940 width or height %16 != 0 bugfix
michaelni
parents: 76
diff changeset
623 int w, h;
5784987c3940 width or height %16 != 0 bugfix
michaelni
parents: 76
diff changeset
624 w = (s->width + 8 * s->h_max - 1) / (8 * s->h_max);
5784987c3940 width or height %16 != 0 bugfix
michaelni
parents: 76
diff changeset
625 h = (s->height + 8 * s->v_max - 1) / (8 * s->v_max);
5784987c3940 width or height %16 != 0 bugfix
michaelni
parents: 76
diff changeset
626 w = w * 8 * s->h_count[i];
5784987c3940 width or height %16 != 0 bugfix
michaelni
parents: 76
diff changeset
627 h = h * 8 * s->v_count[i];
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
628 if (s->interlaced)
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
629 w *= 2;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
630 s->linesize[i] = w;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
631 /* memory test is done in mjpeg_decode_sos() */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
632 s->current_picture[i] = av_mallocz(w * h);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
633 }
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
634 s->first_picture = 0;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
635 }
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
636
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
637 return 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
638 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
639
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
640 static inline int decode_dc(MJpegDecodeContext *s, int dc_index)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
641 {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
642 VLC *dc_vlc;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
643 int code, diff;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
644
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
645 dc_vlc = &s->vlcs[0][dc_index];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
646 code = get_vlc(&s->gb, dc_vlc);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
647 if (code < 0)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
648 return 0xffff;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
649 if (code == 0) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
650 diff = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
651 } else {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
652 diff = get_bits(&s->gb, code);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
653 if ((diff & (1 << (code - 1))) == 0)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
654 diff = (-1 << code) | (diff + 1);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
655 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
656 return diff;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
657 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
658
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
659 /* decode block and dequantize */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
660 static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
661 int component, int dc_index, int ac_index, int quant_index)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
662 {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
663 int nbits, code, i, j, level;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
664 int run, val;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
665 VLC *ac_vlc;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
666 INT16 *quant_matrix;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
667
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
668 quant_matrix = s->quant_matrixes[quant_index];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
669 /* DC coef */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
670 val = decode_dc(s, dc_index);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
671 if (val == 0xffff) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
672 dprintf("error dc\n");
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
673 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
674 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
675 val = val * quant_matrix[0] + s->last_dc[component];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
676 s->last_dc[component] = val;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
677 block[0] = val;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
678 /* AC coefs */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
679 ac_vlc = &s->vlcs[1][ac_index];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
680 i = 1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
681 for(;;) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
682 code = get_vlc(&s->gb, ac_vlc);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
683 if (code < 0) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
684 dprintf("error ac\n");
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
685 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
686 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
687 /* EOB */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
688 if (code == 0)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
689 break;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
690 if (code == 0xf0) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
691 i += 16;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
692 } else {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
693 run = code >> 4;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
694 nbits = code & 0xf;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
695 level = get_bits(&s->gb, nbits);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
696 if ((level & (1 << (nbits - 1))) == 0)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
697 level = (-1 << nbits) | (level + 1);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
698 i += run;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
699 if (i >= 64) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
700 dprintf("error count: %d\n", i);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
701 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
702 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
703 j = zigzag_direct[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
704 block[j] = level * quant_matrix[j];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
705 i++;
28
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
706 if (i >= 64)
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
707 break;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
708 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
709 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
710 return 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
711 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
712
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
713 static int mjpeg_decode_sos(MJpegDecodeContext *s,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
714 UINT8 *buf, int buf_size)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
715 {
47
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
716 int len, nb_components, i, j, n, h, v, ret;
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
717 int mb_width, mb_height, mb_x, mb_y, vmax, hmax, index, id;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
718 int comp_index[4];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
719 int dc_index[4];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
720 int ac_index[4];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
721 int nb_blocks[4];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
722 int h_count[4];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
723 int v_count[4];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
724
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
725 init_get_bits(&s->gb, buf, buf_size);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
726 /* XXX: verify len field validity */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
727 len = get_bits(&s->gb, 16);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
728 nb_components = get_bits(&s->gb, 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
729 /* XXX: only interleaved scan accepted */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
730 if (nb_components != 3)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
731 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
732 vmax = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
733 hmax = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
734 for(i=0;i<nb_components;i++) {
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
735 id = get_bits(&s->gb, 8) - 1;
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
736 /* find component index */
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
737 for(index=0;index<s->nb_components;index++)
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
738 if (id == s->component_id[index])
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
739 break;
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
740 if (index == s->nb_components)
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
741 return -1;
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
742
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
743 comp_index[i] = index;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
744 nb_blocks[i] = s->h_count[index] * s->v_count[index];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
745 h_count[i] = s->h_count[index];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
746 v_count[i] = s->v_count[index];
28
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
747
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
748 dc_index[i] = get_bits(&s->gb, 4);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
749 if (dc_index[i] >= 4)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
750 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
751 ac_index[i] = get_bits(&s->gb, 4);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
752 if (ac_index[i] >= 4)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
753 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
754 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
755 get_bits(&s->gb, 8); /* Ss */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
756 get_bits(&s->gb, 8); /* Se */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
757 get_bits(&s->gb, 8); /* not used */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
758
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
759 for(i=0;i<nb_components;i++)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
760 s->last_dc[i] = 1024;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
761
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
762 if (nb_components > 1) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
763 /* interleaved stream */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
764 mb_width = (s->width + s->h_max * 8 - 1) / (s->h_max * 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
765 mb_height = (s->height + s->v_max * 8 - 1) / (s->v_max * 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
766 } else {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
767 h = s->h_max / s->h_count[comp_index[0]];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
768 v = s->v_max / s->v_count[comp_index[0]];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
769 mb_width = (s->width + h * 8 - 1) / (h * 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
770 mb_height = (s->height + v * 8 - 1) / (v * 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
771 nb_blocks[0] = 1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
772 h_count[0] = 1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
773 v_count[0] = 1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
774 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
775
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
776 for(mb_y = 0; mb_y < mb_height; mb_y++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
777 for(mb_x = 0; mb_x < mb_width; mb_x++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
778 for(i=0;i<nb_components;i++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
779 UINT8 *ptr;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
780 int x, y, c;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
781 n = nb_blocks[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
782 c = comp_index[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
783 h = h_count[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
784 v = v_count[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
785 x = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
786 y = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
787 for(j=0;j<n;j++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
788 memset(s->block, 0, sizeof(s->block));
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
789 if (decode_block(s, s->block, i,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
790 dc_index[i], ac_index[i],
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
791 s->quant_index[c]) < 0) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
792 dprintf("error %d %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
793 ret = -1;
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
794 goto the_end;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
795 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
796 ff_idct (s->block);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
797 ptr = s->current_picture[c] +
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
798 (s->linesize[c] * (v * mb_y + y) * 8) +
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
799 (h * mb_x + x) * 8;
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
800 if (s->interlaced && s->bottom_field)
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
801 ptr += s->linesize[c] >> 1;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
802 put_pixels_clamped(s->block, ptr, s->linesize[c]);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
803 if (++x == h) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
804 x = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
805 y++;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
806 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
807 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
808 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
809 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
810 }
47
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
811 ret = 0;
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
812 the_end:
44
92d51f683931 added forgotten emms() - fix various segmentation faults when using mjpeg
glantau
parents: 37
diff changeset
813 emms_c();
47
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
814 return ret;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
815 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
816
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
817 /* return the 8 bit start code value and update the search
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
818 state. Return -1 if no start code found */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
819 static int find_marker(UINT8 **pbuf_ptr, UINT8 *buf_end,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
820 UINT32 *header_state)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
821 {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
822 UINT8 *buf_ptr;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
823 unsigned int state, v;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
824 int val;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
825
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
826 state = *header_state;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
827 buf_ptr = *pbuf_ptr;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
828 if (state) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
829 /* get marker */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
830 found:
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
831 if (buf_ptr < buf_end) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
832 val = *buf_ptr++;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
833 state = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
834 } else {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
835 val = -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
836 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
837 } else {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
838 while (buf_ptr < buf_end) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
839 v = *buf_ptr++;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
840 if (v == 0xff) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
841 state = 1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
842 goto found;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
843 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
844 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
845 val = -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
846 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
847 *pbuf_ptr = buf_ptr;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
848 *header_state = state;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
849 return val;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
850 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
851
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
852 static int mjpeg_decode_frame(AVCodecContext *avctx,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
853 void *data, int *data_size,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
854 UINT8 *buf, int buf_size)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
855 {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
856 MJpegDecodeContext *s = avctx->priv_data;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
857 UINT8 *buf_end, *buf_ptr, *buf_start;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
858 int len, code, start_code, input_size, i;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
859 AVPicture *picture = data;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
860
68
99cc25b48e24 fix got_picture output
glantau
parents: 64
diff changeset
861 *data_size = 0;
99cc25b48e24 fix got_picture output
glantau
parents: 64
diff changeset
862
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
863 /* no supplementary picture */
68
99cc25b48e24 fix got_picture output
glantau
parents: 64
diff changeset
864 if (buf_size == 0)
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
865 return 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
866
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
867 buf_ptr = buf;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
868 buf_end = buf + buf_size;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
869 while (buf_ptr < buf_end) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
870 buf_start = buf_ptr;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
871 /* find start next marker */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
872 code = find_marker(&buf_ptr, buf_end, &s->header_state);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
873 /* copy to buffer */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
874 len = buf_ptr - buf_start;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
875 if (len + (s->buf_ptr - s->buffer) > s->buffer_size) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
876 /* data too big : flush */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
877 s->buf_ptr = s->buffer;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
878 if (code > 0)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
879 s->start_code = code;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
880 } else {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
881 memcpy(s->buf_ptr, buf_start, len);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
882 s->buf_ptr += len;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
883 /* if we got FF 00, we copy FF to the stream to unescape FF 00 */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
884 if (code == 0) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
885 s->buf_ptr--;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
886 } else if (code > 0) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
887 /* prepare data for next start code */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
888 input_size = s->buf_ptr - s->buffer;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
889 start_code = s->start_code;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
890 s->buf_ptr = s->buffer;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
891 s->start_code = code;
44
92d51f683931 added forgotten emms() - fix various segmentation faults when using mjpeg
glantau
parents: 37
diff changeset
892 dprintf("marker=%x\n", start_code);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
893 switch(start_code) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
894 case SOI:
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
895 /* nothing to do on SOI */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
896 break;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
897 case DQT:
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
898 mjpeg_decode_dqt(s, s->buffer, input_size);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
899 break;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
900 case DHT:
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
901 mjpeg_decode_dht(s, s->buffer, input_size);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
902 break;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
903 case SOF0:
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
904 mjpeg_decode_sof0(s, s->buffer, input_size);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
905 break;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
906 case SOS:
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
907 mjpeg_decode_sos(s, s->buffer, input_size);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
908 if (s->start_code == EOI) {
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
909 int l;
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
910 if (s->interlaced) {
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
911 s->bottom_field ^= 1;
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
912 /* if not bottom field, do not output image yet */
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
913 if (s->bottom_field)
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
914 goto the_end;
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
915 }
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
916 for(i=0;i<3;i++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
917 picture->data[i] = s->current_picture[i];
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
918 l = s->linesize[i];
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
919 if (s->interlaced)
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
920 l >>= 1;
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
921 picture->linesize[i] = l;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
922 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
923 *data_size = sizeof(AVPicture);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
924 avctx->height = s->height;
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
925 if (s->interlaced)
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
926 avctx->height *= 2;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
927 avctx->width = s->width;
28
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
928 /* XXX: not complete test ! */
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
929 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
930 case 0x11:
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
931 avctx->pix_fmt = PIX_FMT_YUV444P;
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
932 break;
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
933 case 0x21:
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
934 avctx->pix_fmt = PIX_FMT_YUV422P;
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
935 break;
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
936 default:
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
937 case 0x22:
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
938 avctx->pix_fmt = PIX_FMT_YUV420P;
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
939 break;
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
940 }
47
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
941 /* dummy quality */
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
942 /* XXX: infer it with matrix */
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
943 avctx->quality = 3;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
944 goto the_end;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
945 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
946 break;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
947 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
948 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
949 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
950 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
951 the_end:
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
952 return buf_ptr - buf;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
953 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
954
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
955 static int mjpeg_decode_end(AVCodecContext *avctx)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
956 {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
957 MJpegDecodeContext *s = avctx->priv_data;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
958 int i, j;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
959
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
960 for(i=0;i<MAX_COMPONENTS;i++)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
961 free(s->current_picture[i]);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
962 for(i=0;i<2;i++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
963 for(j=0;j<4;j++)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
964 free_vlc(&s->vlcs[i][j]);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
965 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
966 return 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
967 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
968
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
969 AVCodec mjpeg_decoder = {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
970 "mjpeg",
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
971 CODEC_TYPE_VIDEO,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
972 CODEC_ID_MJPEG,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
973 sizeof(MJpegDecodeContext),
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
974 mjpeg_decode_init,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
975 NULL,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
976 mjpeg_decode_end,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
977 mjpeg_decode_frame,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
978 };