2 * MJPEG encoder and decoder
3 * Copyright (c) 2000, 2001 Fabrice Bellard.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 * Support for external huffman table, various fixes (AVID workaround),
20 * aspecting, new decode_frame mechanism and apple mjpeg-b support
21 * by Alex Beregszaszi <alex@naxine.org>
26 * MJPEG encoder and decoder.
34 #include "mpegvideo.h"
36 /* use two quantizer tables (one for luminance and one for chrominance) */
40 typedef struct MJpegContext
{
41 uint8_t huff_size_dc_luminance
[12]; //FIXME use array [3] instead of lumi / chrom, for easier addressing
42 uint16_t huff_code_dc_luminance
[12];
43 uint8_t huff_size_dc_chrominance
[12];
44 uint16_t huff_code_dc_chrominance
[12];
46 uint8_t huff_size_ac_luminance
[256];
47 uint16_t huff_code_ac_luminance
[256];
48 uint8_t huff_size_ac_chrominance
[256];
49 uint16_t huff_code_ac_chrominance
[256];
52 /* JPEG marker codes */
55 SOF0
= 0xc0, /* baseline */
56 SOF1
= 0xc1, /* extended sequential, huffman */
57 SOF2
= 0xc2, /* progressive, huffman */
58 SOF3
= 0xc3, /* lossless, huffman */
60 SOF5
= 0xc5, /* differential sequential, huffman */
61 SOF6
= 0xc6, /* differential progressive, huffman */
62 SOF7
= 0xc7, /* differential lossless, huffman */
63 JPG
= 0xc8, /* reserved for JPEG extension */
64 SOF9
= 0xc9, /* extended sequential, arithmetic */
65 SOF10
= 0xca, /* progressive, arithmetic */
66 SOF11
= 0xcb, /* lossless, arithmetic */
68 SOF13
= 0xcd, /* differential sequential, arithmetic */
69 SOF14
= 0xce, /* differential progressive, arithmetic */
70 SOF15
= 0xcf, /* differential lossless, arithmetic */
72 DHT
= 0xc4, /* define huffman tables */
74 DAC
= 0xcc, /* define arithmetic-coding conditioning */
76 /* restart with modulo 8 count "m" */
86 SOI
= 0xd8, /* start of image */
87 EOI
= 0xd9, /* end of image */
88 SOS
= 0xda, /* start of scan */
89 DQT
= 0xdb, /* define quantization tables */
90 DNL
= 0xdc, /* define number of lines */
91 DRI
= 0xdd, /* define restart interval */
92 DHP
= 0xde, /* define hierarchical progression */
93 EXP
= 0xdf, /* expand reference components */
127 COM
= 0xfe, /* comment */
129 TEM
= 0x01, /* temporary private use for arithmetic coding */
131 /* 0x02 -> 0xbf reserved */
135 /* These are the sample quantization tables given in JPEG spec section K.1.
136 * The spec says that the values given produce "good" quality, and
137 * when divided by 2, "very good" quality.
139 static const unsigned char std_luminance_quant_tbl
[64] = {
140 16, 11, 10, 16, 24, 40, 51, 61,
141 12, 12, 14, 19, 26, 58, 60, 55,
142 14, 13, 16, 24, 40, 57, 69, 56,
143 14, 17, 22, 29, 51, 87, 80, 62,
144 18, 22, 37, 56, 68, 109, 103, 77,
145 24, 35, 55, 64, 81, 104, 113, 92,
146 49, 64, 78, 87, 103, 121, 120, 101,
147 72, 92, 95, 98, 112, 100, 103, 99
149 static const unsigned char std_chrominance_quant_tbl
[64] = {
150 17, 18, 24, 47, 99, 99, 99, 99,
151 18, 21, 26, 66, 99, 99, 99, 99,
152 24, 26, 56, 99, 99, 99, 99, 99,
153 47, 66, 99, 99, 99, 99, 99, 99,
154 99, 99, 99, 99, 99, 99, 99, 99,
155 99, 99, 99, 99, 99, 99, 99, 99,
156 99, 99, 99, 99, 99, 99, 99, 99,
157 99, 99, 99, 99, 99, 99, 99, 99
161 /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
162 /* IMPORTANT: these are only valid for 8-bit data precision! */
163 static const uint8_t bits_dc_luminance
[17] =
164 { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
165 static const uint8_t val_dc_luminance
[] =
166 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
168 static const uint8_t bits_dc_chrominance
[17] =
169 { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
170 static const uint8_t val_dc_chrominance
[] =
171 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
173 static const uint8_t bits_ac_luminance
[17] =
174 { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
175 static const uint8_t val_ac_luminance
[] =
176 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
177 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
178 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
179 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
180 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
181 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
182 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
183 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
184 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
185 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
186 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
187 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
188 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
189 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
190 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
191 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
192 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
193 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
194 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
195 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
199 static const uint8_t bits_ac_chrominance
[17] =
200 { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
202 static const uint8_t val_ac_chrominance
[] =
203 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
204 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
205 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
206 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
207 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
208 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
209 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
210 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
211 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
212 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
213 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
214 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
215 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
216 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
217 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
218 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
219 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
220 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
221 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
222 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
226 /* isn't this function nicer than the one in the libjpeg ? */
227 static void build_huffman_codes(uint8_t *huff_size
, uint16_t *huff_code
,
228 const uint8_t *bits_table
, const uint8_t *val_table
)
230 int i
, j
, k
,nb
, code
, sym
;
237 sym
= val_table
[k
++];
239 huff_code
[sym
] = code
;
246 #ifdef CONFIG_ENCODERS
247 int mjpeg_init(MpegEncContext
*s
)
251 m
= av_malloc(sizeof(MJpegContext
));
258 /* build all the huffman tables */
259 build_huffman_codes(m
->huff_size_dc_luminance
,
260 m
->huff_code_dc_luminance
,
263 build_huffman_codes(m
->huff_size_dc_chrominance
,
264 m
->huff_code_dc_chrominance
,
267 build_huffman_codes(m
->huff_size_ac_luminance
,
268 m
->huff_code_ac_luminance
,
271 build_huffman_codes(m
->huff_size_ac_chrominance
,
272 m
->huff_code_ac_chrominance
,
280 void mjpeg_close(MpegEncContext
*s
)
282 av_free(s
->mjpeg_ctx
);
284 #endif //CONFIG_ENCODERS
286 #define PREDICT(ret, topleft, top, left, predictor)\
288 case 1: ret= left; break;\
289 case 2: ret= top; break;\
290 case 3: ret= topleft; break;\
291 case 4: ret= left + top - topleft; break;\
292 case 5: ret= left + ((top - topleft)>>1); break;\
293 case 6: ret= top + ((left - topleft)>>1); break;\
295 case 7: ret= (left + top)>>1; break;\
298 #ifdef CONFIG_ENCODERS
299 static inline void put_marker(PutBitContext
*p
, int code
)
301 put_bits(p
, 8, 0xff);
302 put_bits(p
, 8, code
);
305 /* table_class: 0 = DC coef, 1 = AC coefs */
306 static int put_huffman_table(MpegEncContext
*s
, int table_class
, int table_id
,
307 const uint8_t *bits_table
, const uint8_t *value_table
)
309 PutBitContext
*p
= &s
->pb
;
312 put_bits(p
, 4, table_class
);
313 put_bits(p
, 4, table_id
);
318 put_bits(p
, 8, bits_table
[i
]);
322 put_bits(p
, 8, value_table
[i
]);
327 static void jpeg_table_header(MpegEncContext
*s
)
329 PutBitContext
*p
= &s
->pb
;
336 put_bits(p
, 16, 2 + 2 * (1 + 64));
338 put_bits(p
, 16, 2 + 1 * (1 + 64));
340 put_bits(p
, 4, 0); /* 8 bit precision */
341 put_bits(p
, 4, 0); /* table 0 */
343 j
= s
->intra_scantable
.permutated
[i
];
344 put_bits(p
, 8, s
->intra_matrix
[j
]);
347 put_bits(p
, 4, 0); /* 8 bit precision */
348 put_bits(p
, 4, 1); /* table 1 */
350 j
= s
->intra_scantable
.permutated
[i
];
351 put_bits(p
, 8, s
->chroma_intra_matrix
[j
]);
359 put_bits(p
, 16, 0); /* patched later */
361 size
+= put_huffman_table(s
, 0, 0, bits_dc_luminance
, val_dc_luminance
);
362 size
+= put_huffman_table(s
, 0, 1, bits_dc_chrominance
, val_dc_chrominance
);
364 size
+= put_huffman_table(s
, 1, 0, bits_ac_luminance
, val_ac_luminance
);
365 size
+= put_huffman_table(s
, 1, 1, bits_ac_chrominance
, val_ac_chrominance
);
370 static void jpeg_put_comments(MpegEncContext
*s
)
372 PutBitContext
*p
= &s
->pb
;
376 if (s
->aspect_ratio_info
/* && !lossless */)
381 put_string(p
, "JFIF"); /* this puts the trailing zero-byte too */
382 put_bits(p
, 16, 0x0201); /* v 1.02 */
383 put_bits(p
, 8, 0); /* units type: 0 - aspect ratio */
384 put_bits(p
, 16, s
->avctx
->sample_aspect_ratio
.num
);
385 put_bits(p
, 16, s
->avctx
->sample_aspect_ratio
.den
);
386 put_bits(p
, 8, 0); /* thumbnail width */
387 put_bits(p
, 8, 0); /* thumbnail height */
391 if(!(s
->flags
& CODEC_FLAG_BITEXACT
)){
395 put_bits(p
, 16, 0); /* patched later */
396 put_string(p
, LIBAVCODEC_IDENT
);
397 size
= strlen(LIBAVCODEC_IDENT
)+3;
403 void mjpeg_picture_header(MpegEncContext
*s
)
405 const int lossless
= s
->avctx
->codec_id
== CODEC_ID_LJPEG
;
407 put_marker(&s
->pb
, SOI
);
409 if (!s
->mjpeg_data_only_frames
)
411 jpeg_put_comments(s
);
413 if (s
->mjpeg_write_tables
) jpeg_table_header(s
);
415 put_marker(&s
->pb
, lossless ? SOF3
: SOF0
);
417 put_bits(&s
->pb
, 16, 17);
418 if(lossless
&& s
->avctx
->pix_fmt
== PIX_FMT_RGBA32
)
419 put_bits(&s
->pb
, 8, 9); /* 9 bits/component RCT */
421 put_bits(&s
->pb
, 8, 8); /* 8 bits/component */
422 put_bits(&s
->pb
, 16, s
->height
);
423 put_bits(&s
->pb
, 16, s
->width
);
424 put_bits(&s
->pb
, 8, 3); /* 3 components */
427 put_bits(&s
->pb
, 8, 1); /* component number */
428 put_bits(&s
->pb
, 4, s
->mjpeg_hsample
[0]); /* H factor */
429 put_bits(&s
->pb
, 4, s
->mjpeg_vsample
[0]); /* V factor */
430 put_bits(&s
->pb
, 8, 0); /* select matrix */
433 put_bits(&s
->pb
, 8, 2); /* component number */
434 put_bits(&s
->pb
, 4, s
->mjpeg_hsample
[1]); /* H factor */
435 put_bits(&s
->pb
, 4, s
->mjpeg_vsample
[1]); /* V factor */
437 put_bits(&s
->pb
, 8, lossless ?
0 : 1); /* select matrix */
439 put_bits(&s
->pb
, 8, 0); /* select matrix */
443 put_bits(&s
->pb
, 8, 3); /* component number */
444 put_bits(&s
->pb
, 4, s
->mjpeg_hsample
[2]); /* H factor */
445 put_bits(&s
->pb
, 4, s
->mjpeg_vsample
[2]); /* V factor */
447 put_bits(&s
->pb
, 8, lossless ?
0 : 1); /* select matrix */
449 put_bits(&s
->pb
, 8, 0); /* select matrix */
454 put_marker(&s
->pb
, SOS
);
455 put_bits(&s
->pb
, 16, 12); /* length */
456 put_bits(&s
->pb
, 8, 3); /* 3 components */
459 put_bits(&s
->pb
, 8, 1); /* index */
460 put_bits(&s
->pb
, 4, 0); /* DC huffman table index */
461 put_bits(&s
->pb
, 4, 0); /* AC huffman table index */
464 put_bits(&s
->pb
, 8, 2); /* index */
465 put_bits(&s
->pb
, 4, 1); /* DC huffman table index */
466 put_bits(&s
->pb
, 4, lossless ?
0 : 1); /* AC huffman table index */
469 put_bits(&s
->pb
, 8, 3); /* index */
470 put_bits(&s
->pb
, 4, 1); /* DC huffman table index */
471 put_bits(&s
->pb
, 4, lossless ?
0 : 1); /* AC huffman table index */
473 put_bits(&s
->pb
, 8, lossless ? s
->avctx
->prediction_method
+1 : 0); /* Ss (not used) */
474 put_bits(&s
->pb
, 8, lossless ?
0 : 63); /* Se (not used) */
475 put_bits(&s
->pb
, 8, 0); /* Ah/Al (not used) */
478 static void escape_FF(MpegEncContext
*s
, int start
)
480 int size
= get_bit_count(&s
->pb
) - start
*8;
482 uint8_t *buf
= s
->pb
.buf
+ start
;
483 int align
= (-(size_t)(buf
))&3;
485 assert((size
&7) == 0);
489 for(i
=0; i
<size
&& i
<align
; i
++){
490 if(buf
[i
]==0xFF) ff_count
++;
492 for(; i
<size
-15; i
+=16){
495 v
= *(uint32_t*)(&buf
[i
]);
496 acc
= (((v
& (v
>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
497 v
= *(uint32_t*)(&buf
[i
+4]);
498 acc
+=(((v
& (v
>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
499 v
= *(uint32_t*)(&buf
[i
+8]);
500 acc
+=(((v
& (v
>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
501 v
= *(uint32_t*)(&buf
[i
+12]);
502 acc
+=(((v
& (v
>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
510 if(buf
[i
]==0xFF) ff_count
++;
513 if(ff_count
==0) return;
516 for(i
=0; i
<ff_count
-3; i
+=4)
517 put_bits(&s
->pb
, 32, 0);
518 put_bits(&s
->pb
, (ff_count
-i
)*8, 0);
519 flush_put_bits(&s
->pb
);
521 for(i
=size
-1; ff_count
; i
--){
525 //printf("%d %d\n", i, ff_count);
534 void mjpeg_picture_trailer(MpegEncContext
*s
)
536 int pad
= (-get_bit_count(&s
->pb
))&7;
538 put_bits(&s
->pb
, pad
,0xFF>>(8-pad
));
539 flush_put_bits(&s
->pb
);
541 assert((s
->header_bits
&7)==0);
543 escape_FF(s
, s
->header_bits
>>3);
545 put_marker(&s
->pb
, EOI
);
548 static inline void mjpeg_encode_dc(MpegEncContext
*s
, int val
,
549 uint8_t *huff_size
, uint16_t *huff_code
)
554 put_bits(&s
->pb
, huff_size
[0], huff_code
[0]);
562 nbits
= av_log2_16bit(val
) + 1;
564 put_bits(&s
->pb
, huff_size
[nbits
], huff_code
[nbits
]);
566 put_bits(&s
->pb
, nbits
, mant
& ((1 << nbits
) - 1));
570 static void encode_block(MpegEncContext
*s
, DCTELEM
*block
, int n
)
572 int mant
, nbits
, code
, i
, j
;
573 int component
, dc
, run
, last_index
, val
;
574 MJpegContext
*m
= s
->mjpeg_ctx
;
575 uint8_t *huff_size_ac
;
576 uint16_t *huff_code_ac
;
579 component
= (n
<= 3 ?
0 : n
- 4 + 1);
580 dc
= block
[0]; /* overflow is impossible */
581 val
= dc
- s
->last_dc
[component
];
583 mjpeg_encode_dc(s
, val
, m
->huff_size_dc_luminance
, m
->huff_code_dc_luminance
);
584 huff_size_ac
= m
->huff_size_ac_luminance
;
585 huff_code_ac
= m
->huff_code_ac_luminance
;
587 mjpeg_encode_dc(s
, val
, m
->huff_size_dc_chrominance
, m
->huff_code_dc_chrominance
);
588 huff_size_ac
= m
->huff_size_ac_chrominance
;
589 huff_code_ac
= m
->huff_code_ac_chrominance
;
591 s
->last_dc
[component
] = dc
;
596 last_index
= s
->block_last_index
[n
];
597 for(i
=1;i
<=last_index
;i
++) {
598 j
= s
->intra_scantable
.permutated
[i
];
604 put_bits(&s
->pb
, huff_size_ac
[0xf0], huff_code_ac
[0xf0]);
613 nbits
= av_log2(val
) + 1;
614 code
= (run
<< 4) | nbits
;
616 put_bits(&s
->pb
, huff_size_ac
[code
], huff_code_ac
[code
]);
618 put_bits(&s
->pb
, nbits
, mant
& ((1 << nbits
) - 1));
623 /* output EOB only if not already 64 values */
624 if (last_index
< 63 || run
!= 0)
625 put_bits(&s
->pb
, huff_size_ac
[0], huff_code_ac
[0]);
628 void mjpeg_encode_mb(MpegEncContext
*s
,
629 DCTELEM block
[6][64])
633 encode_block(s
, block
[i
], i
);
637 static int encode_picture_lossless(AVCodecContext
*avctx
, unsigned char *buf
, int buf_size
, void *data
){
638 MpegEncContext
* const s
= avctx
->priv_data
;
639 MJpegContext
* const m
= s
->mjpeg_ctx
;
640 AVFrame
*pict
= data
;
641 const int width
= s
->width
;
642 const int height
= s
->height
;
643 AVFrame
* const p
= (AVFrame
*)&s
->current_picture
;
644 const int predictor
= avctx
->prediction_method
+1;
646 init_put_bits(&s
->pb
, buf
, buf_size
);
649 p
->pict_type
= FF_I_TYPE
;
652 mjpeg_picture_header(s
);
654 s
->header_bits
= get_bit_count(&s
->pb
);
656 if(avctx
->pix_fmt
== PIX_FMT_RGBA32
){
658 const int linesize
= p
->linesize
[0];
659 uint16_t buffer
[2048][4];
660 int left
[3], top
[3], topleft
[3];
663 buffer
[0][i
]= 1 << (9 - 1);
666 for(y
= 0; y
< height
; y
++) {
667 const int modified_predictor
= y ? predictor
: 1;
668 uint8_t *ptr
= p
->data
[0] + (linesize
* y
);
671 top
[i
]= left
[i
]= topleft
[i
]= buffer
[0][i
];
673 for(x
= 0; x
< width
; x
++) {
674 buffer
[x
][1] = ptr
[4*x
+0] - ptr
[4*x
+1] + 0x100;
675 buffer
[x
][2] = ptr
[4*x
+2] - ptr
[4*x
+1] + 0x100;
676 buffer
[x
][0] = (ptr
[4*x
+0] + 2*ptr
[4*x
+1] + ptr
[4*x
+2])>>2;
681 PREDICT(pred
, topleft
[i
], top
[i
], left
[i
], modified_predictor
);
684 top
[i
]= buffer
[x
+1][i
];
686 left
[i
]= buffer
[x
][i
];
688 diff
= ((left
[i
] - pred
+ 0x100)&0x1FF) - 0x100;
691 mjpeg_encode_dc(s
, diff
, m
->huff_size_dc_luminance
, m
->huff_code_dc_luminance
); //FIXME ugly
693 mjpeg_encode_dc(s
, diff
, m
->huff_size_dc_chrominance
, m
->huff_code_dc_chrominance
);
699 const int mb_width
= (width
+ s
->mjpeg_hsample
[0] - 1) / s
->mjpeg_hsample
[0];
700 const int mb_height
= (height
+ s
->mjpeg_vsample
[0] - 1) / s
->mjpeg_vsample
[0];
702 for(mb_y
= 0; mb_y
< mb_height
; mb_y
++) {
703 for(mb_x
= 0; mb_x
< mb_width
; mb_x
++) {
704 if(mb_x
==0 || mb_y
==0){
707 int x
, y
, h
, v
, linesize
;
708 h
= s
->mjpeg_hsample
[i
];
709 v
= s
->mjpeg_vsample
[i
];
710 linesize
= p
->linesize
[i
];
716 ptr
= p
->data
[i
] + (linesize
* (v
* mb_y
+ y
)) + (h
* mb_x
+ x
); //FIXME optimize this crap
725 pred
= ptr
[-linesize
];
727 PREDICT(pred
, ptr
[-linesize
-1], ptr
[-linesize
], ptr
[-1], predictor
);
732 mjpeg_encode_dc(s
, (int8_t)(*ptr
- pred
), m
->huff_size_dc_luminance
, m
->huff_code_dc_luminance
); //FIXME ugly
734 mjpeg_encode_dc(s
, (int8_t)(*ptr
- pred
), m
->huff_size_dc_chrominance
, m
->huff_code_dc_chrominance
);
741 int x
, y
, h
, v
, linesize
;
742 h
= s
->mjpeg_hsample
[i
];
743 v
= s
->mjpeg_vsample
[i
];
744 linesize
= p
->linesize
[i
];
750 ptr
= p
->data
[i
] + (linesize
* (v
* mb_y
+ y
)) + (h
* mb_x
+ x
); //FIXME optimize this crap
751 //printf("%d %d %d %d %8X\n", mb_x, mb_y, x, y, ptr);
752 PREDICT(pred
, ptr
[-linesize
-1], ptr
[-linesize
], ptr
[-1], predictor
);
755 mjpeg_encode_dc(s
, (int8_t)(*ptr
- pred
), m
->huff_size_dc_luminance
, m
->huff_code_dc_luminance
); //FIXME ugly
757 mjpeg_encode_dc(s
, (int8_t)(*ptr
- pred
), m
->huff_size_dc_chrominance
, m
->huff_code_dc_chrominance
);
768 mjpeg_picture_trailer(s
);
771 flush_put_bits(&s
->pb
);
772 return pbBufPtr(&s
->pb
) - s
->pb
.buf
;
773 // return (get_bit_count(&f->pb)+7)/8;
776 #endif //CONFIG_ENCODERS
778 /******************************************/
781 #define MAX_COMPONENTS 4
783 typedef struct MJpegDecodeContext
{
784 AVCodecContext
*avctx
;
786 int mpeg_enc_ctx_allocated
; /* true if decoding context allocated */
788 int start_code
; /* current start code */
792 int16_t quant_matrixes
[4][64];
794 int qscale
[4]; ///< quantizer scale calculated from quant_matrixes
796 int org_width
, org_height
; /* size given at codec init */
797 int first_picture
; /* true if decoding first picture */
798 int interlaced
; /* true if interlaced */
799 int bottom_field
; /* true if bottom field */
802 int rct
; /* standard rct */
803 int pegasus_rct
; /* pegasus reversible colorspace transform */
804 int bits
; /* bits per component */
807 int mb_width
, mb_height
;
809 int component_id
[MAX_COMPONENTS
];
810 int h_count
[MAX_COMPONENTS
]; /* horizontal and vertical count for each component */
811 int v_count
[MAX_COMPONENTS
];
812 int comp_index
[MAX_COMPONENTS
];
813 int dc_index
[MAX_COMPONENTS
];
814 int ac_index
[MAX_COMPONENTS
];
815 int nb_blocks
[MAX_COMPONENTS
];
816 int h_scount
[MAX_COMPONENTS
];
817 int v_scount
[MAX_COMPONENTS
];
818 int h_max
, v_max
; /* maximum h and v counts */
819 int quant_index
[4]; /* quant table index for each component */
820 int last_dc
[MAX_COMPONENTS
]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */
821 AVFrame picture
; /* picture structure */
822 int linesize
[MAX_COMPONENTS
]; ///< linesize << interlaced
823 uint8_t *qscale_table
;
824 DCTELEM block
[64] __align8
;
826 void (*idct_put
)(uint8_t *dest
/*align 8*/, int line_size
, DCTELEM
*block
/*align 16*/);
828 int restart_interval
;
832 int interlace_polarity
;
833 } MJpegDecodeContext
;
835 static int mjpeg_decode_dht(MJpegDecodeContext
*s
);
837 static int build_vlc(VLC
*vlc
, const uint8_t *bits_table
, const uint8_t *val_table
,
840 uint8_t huff_size
[256];
841 uint16_t huff_code
[256];
843 memset(huff_size
, 0, sizeof(huff_size
));
844 build_huffman_codes(huff_size
, huff_code
, bits_table
, val_table
);
846 return init_vlc(vlc
, 9, nb_codes
, huff_size
, 1, 1, huff_code
, 2, 2);
849 static int mjpeg_decode_init(AVCodecContext
*avctx
)
851 MJpegDecodeContext
*s
= avctx
->priv_data
;
856 /* ugly way to get the idct & scantable FIXME */
857 memset(&s2
, 0, sizeof(MpegEncContext
));
858 s2
.flags
= avctx
->flags
;
860 // s2->out_format = FMT_MJPEG;
863 if (MPV_common_init(&s2
) < 0)
865 s
->scantable
= s2
.intra_scantable
;
866 s
->idct_put
= s2
.dsp
.idct_put
;
869 s
->mpeg_enc_ctx_allocated
= 0;
870 s
->buffer_size
= 102400; /* smaller buffer should be enough,
871 but photojpg files could ahive bigger sizes */
872 s
->buffer
= av_malloc(s
->buffer_size
);
876 s
->first_picture
= 1;
877 s
->org_width
= avctx
->width
;
878 s
->org_height
= avctx
->height
;
880 build_vlc(&s
->vlcs
[0][0], bits_dc_luminance
, val_dc_luminance
, 12);
881 build_vlc(&s
->vlcs
[0][1], bits_dc_chrominance
, val_dc_chrominance
, 12);
882 build_vlc(&s
->vlcs
[1][0], bits_ac_luminance
, val_ac_luminance
, 251);
883 build_vlc(&s
->vlcs
[1][1], bits_ac_chrominance
, val_ac_chrominance
, 251);
885 if (avctx
->flags
& CODEC_FLAG_EXTERN_HUFF
)
887 printf("mjpeg: using external huffman table\n");
888 init_get_bits(&s
->gb
, avctx
->extradata
, avctx
->extradata_size
*8);
890 /* should check for error - but dunno */
896 /* quantize tables */
897 static int mjpeg_decode_dqt(MJpegDecodeContext
*s
)
899 int len
, index
, i
, j
;
901 len
= get_bits(&s
->gb
, 16) - 2;
904 /* only 8 bit precision handled */
905 if (get_bits(&s
->gb
, 4) != 0)
907 dprintf("dqt: 16bit precision\n");
910 index
= get_bits(&s
->gb
, 4);
913 dprintf("index=%d\n", index
);
914 /* read quant table */
916 j
= s
->scantable
.permutated
[i
];
917 s
->quant_matrixes
[index
][j
] = get_bits(&s
->gb
, 8);
920 //XXX FIXME finetune, and perhaps add dc too
921 s
->qscale
[index
]= FFMAX(
922 s
->quant_matrixes
[index
][s
->scantable
.permutated
[1]],
923 s
->quant_matrixes
[index
][s
->scantable
.permutated
[8]]) >> 1;
924 dprintf("qscale[%d]: %d\n", index
, s
->qscale
[index
]);
931 /* decode huffman tables and build VLC decoders */
932 static int mjpeg_decode_dht(MJpegDecodeContext
*s
)
934 int len
, index
, i
, class, n
, v
, code_max
;
935 uint8_t bits_table
[17];
936 uint8_t val_table
[256];
938 len
= get_bits(&s
->gb
, 16) - 2;
943 class = get_bits(&s
->gb
, 4);
946 index
= get_bits(&s
->gb
, 4);
951 bits_table
[i
] = get_bits(&s
->gb
, 8);
955 if (len
< n
|| n
> 256)
960 v
= get_bits(&s
->gb
, 8);
967 /* build VLC and flush previous vlc if present */
968 free_vlc(&s
->vlcs
[class][index
]);
969 dprintf("class=%d index=%d nb_codes=%d\n",
970 class, index
, code_max
+ 1);
971 if(build_vlc(&s
->vlcs
[class][index
], bits_table
, val_table
, code_max
+ 1) < 0){
978 static int mjpeg_decode_sof(MJpegDecodeContext
*s
)
980 int len
, nb_components
, i
, width
, height
;
982 /* XXX: verify len field validity */
983 len
= get_bits(&s
->gb
, 16);
984 s
->bits
= get_bits(&s
->gb
, 8);
986 if(s
->pegasus_rct
) s
->bits
=9;
987 if(s
->bits
==9 && !s
->pegasus_rct
) s
->rct
=1; //FIXME ugly
989 if (s
->bits
!= 8 && !s
->lossless
){
990 printf("only 8 bits/component accepted\n");
993 height
= get_bits(&s
->gb
, 16);
994 width
= get_bits(&s
->gb
, 16);
995 dprintf("sof0: picture: %dx%d\n", width
, height
);
997 nb_components
= get_bits(&s
->gb
, 8);
998 if (nb_components
<= 0 ||
999 nb_components
> MAX_COMPONENTS
)
1001 s
->nb_components
= nb_components
;
1004 for(i
=0;i
<nb_components
;i
++) {
1006 s
->component_id
[i
] = get_bits(&s
->gb
, 8) - 1;
1007 s
->h_count
[i
] = get_bits(&s
->gb
, 4);
1008 s
->v_count
[i
] = get_bits(&s
->gb
, 4);
1009 /* compute hmax and vmax (only used in interleaved case) */
1010 if (s
->h_count
[i
] > s
->h_max
)
1011 s
->h_max
= s
->h_count
[i
];
1012 if (s
->v_count
[i
] > s
->v_max
)
1013 s
->v_max
= s
->v_count
[i
];
1014 s
->quant_index
[i
] = get_bits(&s
->gb
, 8);
1015 if (s
->quant_index
[i
] >= 4)
1017 dprintf("component %d %d:%d id: %d quant:%d\n", i
, s
->h_count
[i
],
1018 s
->v_count
[i
], s
->component_id
[i
], s
->quant_index
[i
]);
1021 if(s
->v_max
==1 && s
->h_max
==1 && s
->lossless
==1) s
->rgb
=1;
1023 /* if different size, realloc/alloc picture */
1024 /* XXX: also check h_count and v_count */
1025 if (width
!= s
->width
|| height
!= s
->height
) {
1026 av_freep(&s
->qscale_table
);
1030 /* test interlaced mode */
1031 if (s
->first_picture
&&
1032 s
->org_height
!= 0 &&
1033 s
->height
< ((s
->org_height
* 3) / 4)) {
1035 // s->bottom_field = (s->interlace_polarity) ? 1 : 0;
1036 s
->bottom_field
= 0;
1039 s
->qscale_table
= av_mallocz((s
->width
+15)/16);
1041 s
->first_picture
= 0;
1044 if(s
->interlaced
&& s
->bottom_field
)
1047 /* XXX: not complete test ! */
1048 switch((s
->h_count
[0] << 4) | s
->v_count
[0]) {
1051 s
->avctx
->pix_fmt
= PIX_FMT_RGBA32
;
1053 s
->avctx
->pix_fmt
= PIX_FMT_YUV444P
;
1056 s
->avctx
->pix_fmt
= PIX_FMT_YUV422P
;
1060 s
->avctx
->pix_fmt
= PIX_FMT_YUV420P
;
1064 if(s
->picture
.data
[0])
1065 s
->avctx
->release_buffer(s
->avctx
, &s
->picture
);
1067 s
->picture
.reference
= 0;
1068 if(s
->avctx
->get_buffer(s
->avctx
, &s
->picture
) < 0){
1069 fprintf(stderr
, "get_buffer() failed\n");
1072 s
->picture
.pict_type
= I_TYPE
;
1073 s
->picture
.key_frame
= 1;
1076 s
->linesize
[i
]= s
->picture
.linesize
[i
] << s
->interlaced
;
1079 // printf("%d %d %d %d %d %d\n", s->width, s->height, s->linesize[0], s->linesize[1], s->interlaced, s->avctx->height);
1081 if (len
!= (8+(3*nb_components
)))
1083 dprintf("decode_sof0: error, len(%d) mismatch\n", len
);
1089 static inline int mjpeg_decode_dc(MJpegDecodeContext
*s
, int dc_index
)
1092 code
= get_vlc2(&s
->gb
, s
->vlcs
[0][dc_index
].table
, 9, 2);
1095 dprintf("mjpeg_decode_dc: bad vlc: %d:%d (%p)\n", 0, dc_index
,
1096 &s
->vlcs
[0][dc_index
]);
1101 return get_xbits(&s
->gb
, code
);
1106 /* decode block and dequantize */
1107 static int decode_block(MJpegDecodeContext
*s
, DCTELEM
*block
,
1108 int component
, int dc_index
, int ac_index
, int quant_index
)
1110 int code
, i
, j
, level
, val
;
1112 int16_t *quant_matrix
;
1115 val
= mjpeg_decode_dc(s
, dc_index
);
1116 if (val
== 0xffff) {
1117 dprintf("error dc\n");
1120 quant_matrix
= s
->quant_matrixes
[quant_index
];
1121 val
= val
* quant_matrix
[0] + s
->last_dc
[component
];
1122 s
->last_dc
[component
] = val
;
1125 ac_vlc
= &s
->vlcs
[1][ac_index
];
1128 code
= get_vlc2(&s
->gb
, s
->vlcs
[1][ac_index
].table
, 9, 2);
1131 dprintf("error ac\n");
1140 level
= get_xbits(&s
->gb
, code
& 0xf);
1143 dprintf("error count: %d\n", i
);
1146 j
= s
->scantable
.permutated
[i
];
1147 block
[j
] = level
* quant_matrix
[j
];
1156 static int ljpeg_decode_rgb_scan(MJpegDecodeContext
*s
, int predictor
, int point_transform
){
1158 uint16_t buffer
[2048][4];
1159 int left
[3], top
[3], topleft
[3];
1160 const int linesize
= s
->linesize
[0];
1161 const int mask
= (1<<s
->bits
)-1;
1164 buffer
[0][i
]= 1 << (s
->bits
+ point_transform
- 1);
1166 for(mb_y
= 0; mb_y
< s
->mb_height
; mb_y
++) {
1167 const int modified_predictor
= mb_y ? predictor
: 1;
1168 uint8_t *ptr
= s
->picture
.data
[0] + (linesize
* mb_y
);
1170 if (s
->interlaced
&& s
->bottom_field
)
1171 ptr
+= linesize
>> 1;
1174 top
[i
]= left
[i
]= topleft
[i
]= buffer
[0][i
];
1176 for(mb_x
= 0; mb_x
< s
->mb_width
; mb_x
++) {
1177 if (s
->restart_interval
&& !s
->restart_count
)
1178 s
->restart_count
= s
->restart_interval
;
1184 top
[i
]= buffer
[mb_x
][i
];
1186 PREDICT(pred
, topleft
[i
], top
[i
], left
[i
], modified_predictor
);
1189 buffer
[mb_x
][i
]= mask
& (pred
+ (mjpeg_decode_dc(s
, s
->dc_index
[i
]) << point_transform
));
1192 if (s
->restart_interval
&& !--s
->restart_count
) {
1193 align_get_bits(&s
->gb
);
1194 skip_bits(&s
->gb
, 16); /* skip RSTn */
1199 for(mb_x
= 0; mb_x
< s
->mb_width
; mb_x
++) {
1200 ptr
[4*mb_x
+1] = buffer
[mb_x
][0] - ((buffer
[mb_x
][1] + buffer
[mb_x
][2] - 0x200)>>2);
1201 ptr
[4*mb_x
+0] = buffer
[mb_x
][1] + ptr
[4*mb_x
+1];
1202 ptr
[4*mb_x
+2] = buffer
[mb_x
][2] + ptr
[4*mb_x
+1];
1204 }else if(s
->pegasus_rct
){
1205 for(mb_x
= 0; mb_x
< s
->mb_width
; mb_x
++) {
1206 ptr
[4*mb_x
+1] = buffer
[mb_x
][0] - ((buffer
[mb_x
][1] + buffer
[mb_x
][2])>>2);
1207 ptr
[4*mb_x
+0] = buffer
[mb_x
][1] + ptr
[4*mb_x
+1];
1208 ptr
[4*mb_x
+2] = buffer
[mb_x
][2] + ptr
[4*mb_x
+1];
1211 for(mb_x
= 0; mb_x
< s
->mb_width
; mb_x
++) {
1212 ptr
[4*mb_x
+0] = buffer
[mb_x
][0];
1213 ptr
[4*mb_x
+1] = buffer
[mb_x
][1];
1214 ptr
[4*mb_x
+2] = buffer
[mb_x
][2];
1221 static int ljpeg_decode_yuv_scan(MJpegDecodeContext
*s
, int predictor
, int point_transform
){
1223 const int nb_components
=3;
1225 for(mb_y
= 0; mb_y
< s
->mb_height
; mb_y
++) {
1226 for(mb_x
= 0; mb_x
< s
->mb_width
; mb_x
++) {
1227 if (s
->restart_interval
&& !s
->restart_count
)
1228 s
->restart_count
= s
->restart_interval
;
1230 if(mb_x
==0 || mb_y
==0 || s
->interlaced
){
1231 for(i
=0;i
<nb_components
;i
++) {
1233 int n
, h
, v
, x
, y
, c
, j
, linesize
;
1234 n
= s
->nb_blocks
[i
];
1235 c
= s
->comp_index
[i
];
1240 linesize
= s
->linesize
[c
];
1242 for(j
=0; j
<n
; j
++) {
1245 ptr
= s
->picture
.data
[c
] + (linesize
* (v
* mb_y
+ y
)) + (h
* mb_x
+ x
); //FIXME optimize this crap
1246 if(y
==0 && mb_y
==0){
1247 if(x
==0 && mb_x
==0){
1248 pred
= 128 << point_transform
;
1253 if(x
==0 && mb_x
==0){
1254 pred
= ptr
[-linesize
];
1256 PREDICT(pred
, ptr
[-linesize
-1], ptr
[-linesize
], ptr
[-1], predictor
);
1260 if (s
->interlaced
&& s
->bottom_field
)
1261 ptr
+= linesize
>> 1;
1262 *ptr
= pred
+ (mjpeg_decode_dc(s
, s
->dc_index
[i
]) << point_transform
);
1271 for(i
=0;i
<nb_components
;i
++) {
1273 int n
, h
, v
, x
, y
, c
, j
, linesize
;
1274 n
= s
->nb_blocks
[i
];
1275 c
= s
->comp_index
[i
];
1280 linesize
= s
->linesize
[c
];
1282 for(j
=0; j
<n
; j
++) {
1285 ptr
= s
->picture
.data
[c
] + (linesize
* (v
* mb_y
+ y
)) + (h
* mb_x
+ x
); //FIXME optimize this crap
1286 PREDICT(pred
, ptr
[-linesize
-1], ptr
[-linesize
], ptr
[-1], predictor
);
1287 *ptr
= pred
+ (mjpeg_decode_dc(s
, s
->dc_index
[i
]) << point_transform
);
1295 if (s
->restart_interval
&& !--s
->restart_count
) {
1296 align_get_bits(&s
->gb
);
1297 skip_bits(&s
->gb
, 16); /* skip RSTn */
1304 static int mjpeg_decode_scan(MJpegDecodeContext
*s
){
1306 const int nb_components
=3;
1308 for(mb_y
= 0; mb_y
< s
->mb_height
; mb_y
++) {
1309 for(mb_x
= 0; mb_x
< s
->mb_width
; mb_x
++) {
1310 if (s
->restart_interval
&& !s
->restart_count
)
1311 s
->restart_count
= s
->restart_interval
;
1313 for(i
=0;i
<nb_components
;i
++) {
1315 int n
, h
, v
, x
, y
, c
, j
;
1316 n
= s
->nb_blocks
[i
];
1317 c
= s
->comp_index
[i
];
1323 memset(s
->block
, 0, sizeof(s
->block
));
1324 if (decode_block(s
, s
->block
, i
,
1325 s
->dc_index
[i
], s
->ac_index
[i
],
1326 s
->quant_index
[c
]) < 0) {
1327 dprintf("error y=%d x=%d\n", mb_y
, mb_x
);
1330 // dprintf("mb: %d %d processed\n", mb_y, mb_x);
1331 ptr
= s
->picture
.data
[c
] +
1332 (s
->linesize
[c
] * (v
* mb_y
+ y
) * 8) +
1334 if (s
->interlaced
&& s
->bottom_field
)
1335 ptr
+= s
->linesize
[c
] >> 1;
1336 //printf("%d %d %d %d %d %d %d %d \n", mb_x, mb_y, x, y, c, s->bottom_field, (v * mb_y + y) * 8, (h * mb_x + x) * 8);
1337 s
->idct_put(ptr
, s
->linesize
[c
], s
->block
);
1344 /* (< 1350) buggy workaround for Spectralfan.mov, should be fixed */
1345 if (s
->restart_interval
&& (s
->restart_interval
< 1350) &&
1346 !--s
->restart_count
) {
1347 align_get_bits(&s
->gb
);
1348 skip_bits(&s
->gb
, 16); /* skip RSTn */
1349 for (i
=0; i
<nb_components
; i
++) /* reset dc */
1350 s
->last_dc
[i
] = 1024;
1357 static int mjpeg_decode_sos(MJpegDecodeContext
*s
)
1359 int len
, nb_components
, i
, h
, v
, predictor
, point_transform
;
1360 int vmax
, hmax
, index
, id
;
1361 const int block_size
= s
->lossless ?
1 : 8;
1363 /* XXX: verify len field validity */
1364 len
= get_bits(&s
->gb
, 16);
1365 nb_components
= get_bits(&s
->gb
, 8);
1366 if (len
!= 6+2*nb_components
)
1368 dprintf("decode_sos: invalid len (%d)\n", len
);
1371 /* XXX: only interleaved scan accepted */
1372 if (nb_components
!= 3)
1374 dprintf("decode_sos: components(%d) mismatch\n", nb_components
);
1379 for(i
=0;i
<nb_components
;i
++) {
1380 id
= get_bits(&s
->gb
, 8) - 1;
1381 dprintf("component: %d\n", id
);
1382 /* find component index */
1383 for(index
=0;index
<s
->nb_components
;index
++)
1384 if (id
== s
->component_id
[index
])
1386 if (index
== s
->nb_components
)
1388 dprintf("decode_sos: index(%d) out of components\n", index
);
1392 s
->comp_index
[i
] = index
;
1394 s
->nb_blocks
[i
] = s
->h_count
[index
] * s
->v_count
[index
];
1395 s
->h_scount
[i
] = s
->h_count
[index
];
1396 s
->v_scount
[i
] = s
->v_count
[index
];
1398 s
->dc_index
[i
] = get_bits(&s
->gb
, 4);
1399 s
->ac_index
[i
] = get_bits(&s
->gb
, 4);
1401 if (s
->dc_index
[i
] < 0 || s
->ac_index
[i
] < 0 ||
1402 s
->dc_index
[i
] >= 4 || s
->ac_index
[i
] >= 4)
1405 switch(s
->start_code
)
1408 if (dc_index
[i
] > 1 || ac_index
[i
] > 1)
1413 if (dc_index
[i
] > 3 || ac_index
[i
] > 3)
1417 if (dc_index
[i
] > 3 || ac_index
[i
] != 0)
1424 predictor
= get_bits(&s
->gb
, 8); /* lossless predictor or start of spectral (Ss) */
1425 skip_bits(&s
->gb
, 8); /* Se */
1426 skip_bits(&s
->gb
, 4); /* Ah */
1427 point_transform
= get_bits(&s
->gb
, 4); /* Al */
1429 for(i
=0;i
<nb_components
;i
++)
1430 s
->last_dc
[i
] = 1024;
1432 if (nb_components
> 1) {
1433 /* interleaved stream */
1434 s
->mb_width
= (s
->width
+ s
->h_max
* block_size
- 1) / (s
->h_max
* block_size
);
1435 s
->mb_height
= (s
->height
+ s
->v_max
* block_size
- 1) / (s
->v_max
* block_size
);
1437 h
= s
->h_max
/ s
->h_scount
[s
->comp_index
[0]];
1438 v
= s
->v_max
/ s
->v_scount
[s
->comp_index
[0]];
1439 s
->mb_width
= (s
->width
+ h
* block_size
- 1) / (h
* block_size
);
1440 s
->mb_height
= (s
->height
+ v
* block_size
- 1) / (v
* block_size
);
1441 s
->nb_blocks
[0] = 1;
1446 if(s
->avctx
->debug
& FF_DEBUG_PICT_INFO
)
1447 printf("%s %s p:%d >>:%d\n", s
->lossless ?
"lossless" : "sequencial DCT", s
->rgb ?
"RGB" : "", predictor
, point_transform
);
1451 if(ljpeg_decode_rgb_scan(s
, predictor
, point_transform
) < 0)
1454 if(ljpeg_decode_yuv_scan(s
, predictor
, point_transform
) < 0)
1458 if(mjpeg_decode_scan(s
) < 0)
1464 dprintf("decode_sos: ac/dc index out of range\n");
1468 static int mjpeg_decode_dri(MJpegDecodeContext
*s
)
1470 if (get_bits(&s
->gb
, 16) != 4)
1472 s
->restart_interval
= get_bits(&s
->gb
, 16);
1473 dprintf("restart interval: %d\n", s
->restart_interval
);
1478 static int mjpeg_decode_app(MJpegDecodeContext
*s
)
1482 /* XXX: verify len field validity */
1483 len
= get_bits(&s
->gb
, 16);
1487 id
= (get_bits(&s
->gb
, 16) << 16) | get_bits(&s
->gb
, 16);
1491 if(s
->avctx
->debug
& FF_DEBUG_STARTCODE
){
1492 printf("APPx %8X\n", id
);
1495 /* buggy AVID, it puts EOI only at every 10th frame */
1496 /* also this fourcc is used by non-avid files too, it holds some
1497 informations, but it's always present in AVID creates files */
1498 if (id
== ff_get_fourcc("AVI1"))
1505 4bytes field_size_less_padding
1508 // if (s->first_picture)
1509 // printf("mjpeg: workarounding buggy AVID\n");
1510 s
->interlace_polarity
= get_bits(&s
->gb
, 8);
1512 skip_bits(&s
->gb
, 8);
1513 skip_bits(&s
->gb
, 32);
1514 skip_bits(&s
->gb
, 32);
1517 // if (s->interlace_polarity)
1518 // printf("mjpeg: interlace polarity: %d\n", s->interlace_polarity);
1524 if (id
== ff_get_fourcc("JFIF"))
1527 skip_bits(&s
->gb
, 8); /* the trailing zero-byte */
1528 printf("mjpeg: JFIF header found (version: %x.%x)\n",
1529 get_bits(&s
->gb
, 8), get_bits(&s
->gb
, 8));
1530 skip_bits(&s
->gb
, 8);
1532 s
->avctx
->sample_aspect_ratio
.num
= get_bits(&s
->gb
, 16);
1533 s
->avctx
->sample_aspect_ratio
.den
= get_bits(&s
->gb
, 16);
1535 t_w
= get_bits(&s
->gb
, 8);
1536 t_h
= get_bits(&s
->gb
, 8);
1539 /* skip thumbnail */
1540 if (len
-10-(t_w
*t_h
*3) > 0)
1547 if (id
== ff_get_fourcc("Adob") && (get_bits(&s
->gb
, 8) == 'e'))
1549 printf("mjpeg: Adobe header found\n");
1550 skip_bits(&s
->gb
, 16); /* version */
1551 skip_bits(&s
->gb
, 16); /* flags0 */
1552 skip_bits(&s
->gb
, 16); /* flags1 */
1553 skip_bits(&s
->gb
, 8); /* transform */
1558 if (id
== ff_get_fourcc("LJIF")){
1559 printf("Pegasus lossless jpeg header found\n");
1560 skip_bits(&s
->gb
, 16); /* version ? */
1561 skip_bits(&s
->gb
, 16); /* unknwon always 0? */
1562 skip_bits(&s
->gb
, 16); /* unknwon always 0? */
1563 skip_bits(&s
->gb
, 16); /* unknwon always 0? */
1564 switch( get_bits(&s
->gb
, 8)){
1574 printf("unknown colorspace\n");
1581 if ((s
->start_code
== APP1
) && (len
> (0x28 - 8)))
1583 id
= (get_bits(&s
->gb
, 16) << 16) | get_bits(&s
->gb
, 16);
1586 if (id
== ff_get_fourcc("mjpg")) /* Apple MJPEG-A */
1589 skip_bits(&s
->gb
, 32); /* field size */
1590 skip_bits(&s
->gb
, 32); /* pad field size */
1591 skip_bits(&s
->gb
, 32); /* next off */
1592 skip_bits(&s
->gb
, 32); /* quant off */
1593 skip_bits(&s
->gb
, 32); /* huff off */
1594 skip_bits(&s
->gb
, 32); /* image off */
1595 skip_bits(&s
->gb
, 32); /* scan off */
1596 skip_bits(&s
->gb
, 32); /* data off */
1598 if (s
->first_picture
)
1599 printf("mjpeg: Apple MJPEG-A header found\n");
1604 /* slow but needed for extreme adobe jpegs */
1606 printf("mjpeg: error, decode_app parser read over the end\n");
1608 skip_bits(&s
->gb
, 8);
1613 static int mjpeg_decode_com(MJpegDecodeContext
*s
)
1615 /* XXX: verify len field validity */
1616 int len
= get_bits(&s
->gb
, 16);
1617 if (len
>= 2 && len
< 32768) {
1618 /* XXX: any better upper bound */
1619 uint8_t *cbuf
= av_malloc(len
- 1);
1622 for (i
= 0; i
< len
- 2; i
++)
1623 cbuf
[i
] = get_bits(&s
->gb
, 8);
1624 if (i
> 0 && cbuf
[i
-1] == '\n')
1629 printf("mjpeg comment: '%s'\n", cbuf
);
1631 /* buggy avid, it puts EOI only at every 10th frame */
1632 if (!strcmp(cbuf
, "AVID"))
1635 // if (s->first_picture)
1636 // printf("mjpeg: workarounding buggy AVID\n");
1647 static int valid_marker_list
[] =
1649 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f */
1650 /* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1651 /* 1 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1652 /* 2 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1653 /* 3 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1654 /* 4 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1655 /* 5 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1656 /* 6 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1657 /* 7 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1658 /* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1659 /* 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1660 /* a */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1661 /* b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1662 /* c */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1663 /* d */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1664 /* e */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1665 /* f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1669 /* return the 8 bit start code value and update the search
1670 state. Return -1 if no start code found */
1671 static int find_marker(uint8_t **pbuf_ptr
, uint8_t *buf_end
)
1680 buf_ptr
= *pbuf_ptr
;
1681 while (buf_ptr
< buf_end
) {
1684 if ((v
== 0xff) && (v2
>= 0xc0) && (v2
<= 0xfe)) {
1695 dprintf("find_marker skipped %d bytes\n", skipped
);
1697 *pbuf_ptr
= buf_ptr
;
1701 static int mjpeg_decode_frame(AVCodecContext
*avctx
,
1702 void *data
, int *data_size
,
1703 uint8_t *buf
, int buf_size
)
1705 MJpegDecodeContext
*s
= avctx
->priv_data
;
1706 uint8_t *buf_end
, *buf_ptr
;
1708 AVFrame
*picture
= data
;
1712 /* no supplementary picture */
1717 buf_end
= buf
+ buf_size
;
1718 while (buf_ptr
< buf_end
) {
1719 /* find start next marker */
1720 start_code
= find_marker(&buf_ptr
, buf_end
);
1723 if (start_code
< 0) {
1726 dprintf("marker=%x avail_size_in_buf=%d\n", start_code
, buf_end
- buf_ptr
);
1728 if ((buf_end
- buf_ptr
) > s
->buffer_size
)
1731 s
->buffer_size
= buf_end
-buf_ptr
;
1732 s
->buffer
= av_malloc(s
->buffer_size
);
1733 dprintf("buffer too small, expanding to %d bytes\n",
1737 /* unescape buffer of SOS */
1738 if (start_code
== SOS
)
1740 uint8_t *src
= buf_ptr
;
1741 uint8_t *dst
= s
->buffer
;
1745 uint8_t x
= *(src
++);
1750 while(*src
== 0xff) src
++;
1753 if (x
>= 0xd0 && x
<= 0xd7)
1759 init_get_bits(&s
->gb
, s
->buffer
, (dst
- s
->buffer
)*8);
1761 dprintf("escaping removed %d bytes\n",
1762 (buf_end
- buf_ptr
) - (dst
- s
->buffer
));
1765 init_get_bits(&s
->gb
, buf_ptr
, (buf_end
- buf_ptr
)*8);
1767 s
->start_code
= start_code
;
1768 if(s
->avctx
->debug
& FF_DEBUG_STARTCODE
){
1769 printf("startcode: %X\n", start_code
);
1772 /* process markers */
1773 if (start_code
>= 0xd0 && start_code
<= 0xd7) {
1774 dprintf("restart marker: %d\n", start_code
&0x0f);
1775 } else if (s
->first_picture
) {
1777 if (start_code
>= 0xe0 && start_code
<= 0xef)
1778 mjpeg_decode_app(s
);
1780 else if (start_code
== COM
)
1781 mjpeg_decode_com(s
);
1784 switch(start_code
) {
1786 s
->restart_interval
= 0;
1787 /* nothing to do on SOI */
1790 mjpeg_decode_dqt(s
);
1793 if(mjpeg_decode_dht(s
) < 0){
1794 fprintf(stderr
, "huffman table decode error\n");
1800 if (mjpeg_decode_sof(s
) < 0)
1805 if (mjpeg_decode_sof(s
) < 0)
1809 if ((s
->buggy_avid
&& !s
->interlaced
) || s
->restart_interval
)
1813 if (s
->interlaced
) {
1814 s
->bottom_field
^= 1;
1815 /* if not bottom field, do not output image yet */
1816 if (s
->bottom_field
)
1819 *picture
= s
->picture
;
1820 *data_size
= sizeof(AVFrame
);
1821 avctx
->height
= s
->height
;
1824 avctx
->width
= s
->width
;
1827 picture
->quality
= FFMAX(FFMAX(s
->qscale
[0], s
->qscale
[1]), s
->qscale
[2]);
1828 picture
->qstride
= 0;
1829 picture
->qscale_table
= s
->qscale_table
;
1830 memset(picture
->qscale_table
, picture
->quality
, (s
->width
+15)/16);
1831 if(avctx
->debug
& FF_DEBUG_QP
)
1832 printf("QP: %d\n", picture
->quality
);
1833 picture
->quality
*= FF_QP2LAMBDA
;
1840 mjpeg_decode_sos(s
);
1841 /* buggy avid puts EOI every 10-20th frame */
1842 /* if restart period is over process EOI */
1843 if ((s
->buggy_avid
&& !s
->interlaced
) || s
->restart_interval
)
1847 mjpeg_decode_dri(s
);
1861 printf("mjpeg: unsupported coding type (%x)\n", start_code
);
1864 // printf("mjpeg: unsupported marker (%x)\n", start_code);
1869 /* eof process start code */
1870 buf_ptr
+= (get_bits_count(&s
->gb
)+7)/8;
1871 dprintf("marker parser used %d bytes (%d bits)\n",
1872 (get_bits_count(&s
->gb
)+7)/8, get_bits_count(&s
->gb
));
1877 dprintf("mjpeg decode frame unused %d bytes\n", buf_end
- buf_ptr
);
1878 // return buf_end - buf_ptr;
1879 return buf_ptr
- buf
;
1882 static int mjpegb_decode_frame(AVCodecContext
*avctx
,
1883 void *data
, int *data_size
,
1884 uint8_t *buf
, int buf_size
)
1886 MJpegDecodeContext
*s
= avctx
->priv_data
;
1887 uint8_t *buf_end
, *buf_ptr
;
1888 AVFrame
*picture
= data
;
1889 GetBitContext hgb
; /* for the header */
1890 uint32_t dqt_offs
, dht_offs
, sof_offs
, sos_offs
, second_field_offs
;
1891 uint32_t field_size
;
1895 /* no supplementary picture */
1900 buf_end
= buf
+ buf_size
;
1903 /* reset on every SOI */
1904 s
->restart_interval
= 0;
1906 init_get_bits(&hgb
, buf_ptr
, /*buf_size*/(buf_end
- buf_ptr
)*8);
1908 skip_bits(&hgb
, 32); /* reserved zeros */
1910 if (get_bits(&hgb
, 32) != be2me_32(ff_get_fourcc("mjpg")))
1912 dprintf("not mjpeg-b (bad fourcc)\n");
1916 field_size
= get_bits(&hgb
, 32); /* field size */
1917 dprintf("field size: 0x%x\n", field_size
);
1918 skip_bits(&hgb
, 32); /* padded field size */
1919 second_field_offs
= get_bits(&hgb
, 32);
1920 dprintf("second field offs: 0x%x\n", second_field_offs
);
1921 if (second_field_offs
)
1924 dqt_offs
= get_bits(&hgb
, 32);
1925 dprintf("dqt offs: 0x%x\n", dqt_offs
);
1928 init_get_bits(&s
->gb
, buf
+dqt_offs
, (buf_end
- (buf
+dqt_offs
))*8);
1929 s
->start_code
= DQT
;
1930 mjpeg_decode_dqt(s
);
1933 dht_offs
= get_bits(&hgb
, 32);
1934 dprintf("dht offs: 0x%x\n", dht_offs
);
1937 init_get_bits(&s
->gb
, buf
+dht_offs
, (buf_end
- (buf
+dht_offs
))*8);
1938 s
->start_code
= DHT
;
1939 mjpeg_decode_dht(s
);
1942 sof_offs
= get_bits(&hgb
, 32);
1943 dprintf("sof offs: 0x%x\n", sof_offs
);
1946 init_get_bits(&s
->gb
, buf
+sof_offs
, (buf_end
- (buf
+sof_offs
))*8);
1947 s
->start_code
= SOF0
;
1948 if (mjpeg_decode_sof(s
) < 0)
1952 sos_offs
= get_bits(&hgb
, 32);
1953 dprintf("sos offs: 0x%x\n", sos_offs
);
1956 // init_get_bits(&s->gb, buf+sos_offs, (buf_end - (buf+sos_offs))*8);
1957 init_get_bits(&s
->gb
, buf
+sos_offs
, field_size
*8);
1958 s
->start_code
= SOS
;
1959 mjpeg_decode_sos(s
);
1962 skip_bits(&hgb
, 32); /* start of data offset */
1964 if (s
->interlaced
) {
1965 s
->bottom_field
^= 1;
1966 /* if not bottom field, do not output image yet */
1967 if (s
->bottom_field
&& second_field_offs
)
1969 buf_ptr
= buf
+ second_field_offs
;
1970 second_field_offs
= 0;
1975 //XXX FIXME factorize, this looks very similar to the EOI code
1977 *picture
= s
->picture
;
1978 *data_size
= sizeof(AVFrame
);
1979 avctx
->height
= s
->height
;
1982 avctx
->width
= s
->width
;
1985 picture
->quality
= FFMAX(FFMAX(s
->qscale
[0], s
->qscale
[1]), s
->qscale
[2]);
1986 picture
->qstride
= 0;
1987 picture
->qscale_table
= s
->qscale_table
;
1988 memset(picture
->qscale_table
, picture
->quality
, (s
->width
+15)/16);
1989 if(avctx
->debug
& FF_DEBUG_QP
)
1990 printf("QP: %d\n", picture
->quality
);
1991 picture
->quality
*= FF_QP2LAMBDA
;
1994 return buf_ptr
- buf
;
1999 static int sp5x_decode_frame(AVCodecContext
*avctx
,
2000 void *data
, int *data_size
,
2001 uint8_t *buf
, int buf_size
)
2004 MJpegDecodeContext
*s
= avctx
->priv_data
;
2006 const int qscale
= 5;
2007 uint8_t *buf_ptr
, *buf_end
, *recoded
;
2012 /* no supplementary picture */
2016 if (!avctx
->width
|| !avctx
->height
)
2020 buf_end
= buf
+ buf_size
;
2023 recoded
= av_mallocz(buf_size
+ 1024);
2028 recoded
[j
++] = 0xFF;
2029 recoded
[j
++] = 0xD8;
2031 memcpy(recoded
+j
, &sp5x_data_dqt
[0], sizeof(sp5x_data_dqt
));
2032 memcpy(recoded
+j
+5, &sp5x_quant_table
[qscale
* 2], 64);
2033 memcpy(recoded
+j
+70, &sp5x_quant_table
[(qscale
* 2) + 1], 64);
2034 j
+= sizeof(sp5x_data_dqt
);
2036 memcpy(recoded
+j
, &sp5x_data_dht
[0], sizeof(sp5x_data_dht
));
2037 j
+= sizeof(sp5x_data_dht
);
2039 memcpy(recoded
+j
, &sp5x_data_sof
[0], sizeof(sp5x_data_sof
));
2040 recoded
[j
+5] = (avctx
->height
>> 8) & 0xFF;
2041 recoded
[j
+6] = avctx
->height
& 0xFF;
2042 recoded
[j
+7] = (avctx
->width
>> 8) & 0xFF;
2043 recoded
[j
+8] = avctx
->width
& 0xFF;
2044 j
+= sizeof(sp5x_data_sof
);
2046 memcpy(recoded
+j
, &sp5x_data_sos
[0], sizeof(sp5x_data_sos
));
2047 j
+= sizeof(sp5x_data_sos
);
2049 for (i
= 14; i
< buf_size
&& j
< buf_size
+1024-2; i
++)
2051 recoded
[j
++] = buf
[i
];
2057 recoded
[j
++] = 0xFF;
2058 recoded
[j
++] = 0xD9;
2060 i
= mjpeg_decode_frame(avctx
, data
, data_size
, recoded
, j
);
2067 s
->width
= avctx
->width
;
2068 s
->height
= avctx
->height
;
2069 s
->nb_components
= 3;
2070 s
->component_id
[0] = 0;
2073 s
->quant_index
[0] = 0;
2074 s
->component_id
[1] = 1;
2077 s
->quant_index
[1] = 1;
2078 s
->component_id
[2] = 2;
2081 s
->quant_index
[2] = 1;
2085 s
->qscale_table
= av_mallocz((s
->width
+15)/16);
2086 avctx
->pix_fmt
= PIX_FMT_YUV420P
;
2089 s
->picture
.reference
= 0;
2090 if (avctx
->get_buffer(avctx
, &s
->picture
) < 0)
2092 fprintf(stderr
, "get_buffer() failed\n");
2096 s
->picture
.pict_type
= I_TYPE
;
2097 s
->picture
.key_frame
= 1;
2099 for (i
= 0; i
< 3; i
++)
2100 s
->linesize
[i
] = s
->picture
.linesize
[i
] << s
->interlaced
;
2103 for (i
= 0; i
< 64; i
++)
2105 j
= s
->scantable
.permutated
[i
];
2106 s
->quant_matrixes
[0][j
] = sp5x_quant_table
[(qscale
* 2) + i
];
2108 s
->qscale
[0] = FFMAX(
2109 s
->quant_matrixes
[0][s
->scantable
.permutated
[1]],
2110 s
->quant_matrixes
[0][s
->scantable
.permutated
[8]]) >> 1;
2112 for (i
= 0; i
< 64; i
++)
2114 j
= s
->scantable
.permutated
[i
];
2115 s
->quant_matrixes
[1][j
] = sp5x_quant_table
[(qscale
* 2) + 1 + i
];
2117 s
->qscale
[1] = FFMAX(
2118 s
->quant_matrixes
[1][s
->scantable
.permutated
[1]],
2119 s
->quant_matrixes
[1][s
->scantable
.permutated
[8]]) >> 1;
2124 s
->comp_index
[0] = 0;
2125 s
->nb_blocks
[0] = s
->h_count
[0] * s
->v_count
[0];
2126 s
->h_scount
[0] = s
->h_count
[0];
2127 s
->v_scount
[0] = s
->v_count
[0];
2131 s
->comp_index
[1] = 1;
2132 s
->nb_blocks
[1] = s
->h_count
[1] * s
->v_count
[1];
2133 s
->h_scount
[1] = s
->h_count
[1];
2134 s
->v_scount
[1] = s
->v_count
[1];
2138 s
->comp_index
[2] = 2;
2139 s
->nb_blocks
[2] = s
->h_count
[2] * s
->v_count
[2];
2140 s
->h_scount
[2] = s
->h_count
[2];
2141 s
->v_scount
[2] = s
->v_count
[2];
2145 for (i
= 0; i
< 3; i
++)
2146 s
->last_dc
[i
] = 1024;
2148 s
->mb_width
= (s
->width
* s
->h_max
* 8 -1) / (s
->h_max
* 8);
2149 s
->mb_height
= (s
->height
* s
->v_max
* 8 -1) / (s
->v_max
* 8);
2151 init_get_bits(&s
->gb
, buf
, buf_size
*8);
2153 return mjpeg_decode_scan(s
);
2159 static int mjpeg_decode_end(AVCodecContext
*avctx
)
2161 MJpegDecodeContext
*s
= avctx
->priv_data
;
2165 av_free(s
->qscale_table
);
2166 avcodec_default_free_buffers(avctx
);
2170 free_vlc(&s
->vlcs
[i
][j
]);
2175 AVCodec mjpeg_decoder
= {
2179 sizeof(MJpegDecodeContext
),
2188 AVCodec mjpegb_decoder
= {
2192 sizeof(MJpegDecodeContext
),
2196 mjpegb_decode_frame
,
2201 AVCodec sp5x_decoder
= {
2205 sizeof(MJpegDecodeContext
),
2214 #ifdef CONFIG_ENCODERS
2215 AVCodec ljpeg_encoder
= { //FIXME avoid MPV_* lossless jpeg shouldnt need them
2219 sizeof(MpegEncContext
),
2221 encode_picture_lossless
,