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 #include "mpegvideo.h"
28 /* use two quantizer tables (one for luminance and one for chrominance) */
32 typedef struct MJpegContext {
33 UINT8 huff_size_dc_luminance[12];
34 UINT16 huff_code_dc_luminance[12];
35 UINT8 huff_size_dc_chrominance[12];
36 UINT16 huff_code_dc_chrominance[12];
38 UINT8 huff_size_ac_luminance[256];
39 UINT16 huff_code_ac_luminance[256];
40 UINT8 huff_size_ac_chrominance[256];
41 UINT16 huff_code_ac_chrominance[256];
44 /* JPEG marker codes */
47 SOF0 = 0xc0, /* baseline */
48 SOF1 = 0xc1, /* extended sequential, huffman */
49 SOF2 = 0xc2, /* progressive, huffman */
50 SOF3 = 0xc3, /* lossless, huffman */
52 SOF5 = 0xc5, /* differential sequential, huffman */
53 SOF6 = 0xc6, /* differential progressive, huffman */
54 SOF7 = 0xc7, /* differential lossless, huffman */
55 JPG = 0xc8, /* reserved for JPEG extension */
56 SOF9 = 0xc9, /* extended sequential, arithmetic */
57 SOF10 = 0xca, /* progressive, arithmetic */
58 SOF11 = 0xcb, /* lossless, arithmetic */
60 SOF13 = 0xcd, /* differential sequential, arithmetic */
61 SOF14 = 0xce, /* differential progressive, arithmetic */
62 SOF15 = 0xcf, /* differential lossless, arithmetic */
64 DHT = 0xc4, /* define huffman tables */
66 DAC = 0xcc, /* define arithmetic-coding conditioning */
68 /* restart with modulo 8 count "m" */
78 SOI = 0xd8, /* start of image */
79 EOI = 0xd9, /* end of image */
80 SOS = 0xda, /* start of scan */
81 DQT = 0xdb, /* define quantization tables */
82 DNL = 0xdc, /* define number of lines */
83 DRI = 0xdd, /* define restart interval */
84 DHP = 0xde, /* define hierarchical progression */
85 EXP = 0xdf, /* expand reference components */
119 COM = 0xfe, /* comment */
121 TEM = 0x01, /* temporary private use for arithmetic coding */
123 /* 0x02 -> 0xbf reserved */
127 /* These are the sample quantization tables given in JPEG spec section K.1.
128 * The spec says that the values given produce "good" quality, and
129 * when divided by 2, "very good" quality.
131 static const unsigned char std_luminance_quant_tbl[64] = {
132 16, 11, 10, 16, 24, 40, 51, 61,
133 12, 12, 14, 19, 26, 58, 60, 55,
134 14, 13, 16, 24, 40, 57, 69, 56,
135 14, 17, 22, 29, 51, 87, 80, 62,
136 18, 22, 37, 56, 68, 109, 103, 77,
137 24, 35, 55, 64, 81, 104, 113, 92,
138 49, 64, 78, 87, 103, 121, 120, 101,
139 72, 92, 95, 98, 112, 100, 103, 99
141 static const unsigned char std_chrominance_quant_tbl[64] = {
142 17, 18, 24, 47, 99, 99, 99, 99,
143 18, 21, 26, 66, 99, 99, 99, 99,
144 24, 26, 56, 99, 99, 99, 99, 99,
145 47, 66, 99, 99, 99, 99, 99, 99,
146 99, 99, 99, 99, 99, 99, 99, 99,
147 99, 99, 99, 99, 99, 99, 99, 99,
148 99, 99, 99, 99, 99, 99, 99, 99,
149 99, 99, 99, 99, 99, 99, 99, 99
153 /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
154 /* IMPORTANT: these are only valid for 8-bit data precision! */
155 static const UINT8 bits_dc_luminance[17] =
156 { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
157 static const UINT8 val_dc_luminance[] =
158 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
160 static const UINT8 bits_dc_chrominance[17] =
161 { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
162 static const UINT8 val_dc_chrominance[] =
163 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
165 static const UINT8 bits_ac_luminance[17] =
166 { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
167 static const UINT8 val_ac_luminance[] =
168 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
169 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
170 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
171 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
172 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
173 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
174 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
175 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
176 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
177 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
178 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
179 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
180 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
181 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
182 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
183 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
184 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
185 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
186 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
187 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
191 static const UINT8 bits_ac_chrominance[17] =
192 { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
194 static const UINT8 val_ac_chrominance[] =
195 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
196 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
197 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
198 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
199 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
200 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
201 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
202 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
203 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
204 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
205 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
206 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
207 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
208 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
209 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
210 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
211 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
212 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
213 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
214 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
218 /* isn't this function nicer than the one in the libjpeg ? */
219 static void build_huffman_codes(UINT8 *huff_size, UINT16 *huff_code,
220 const UINT8 *bits_table, const UINT8 *val_table)
222 int i, j, k,nb, code, sym;
229 sym = val_table[k++];
231 huff_code[sym] = code;
238 int mjpeg_init(MpegEncContext *s)
242 m = av_malloc(sizeof(MJpegContext));
248 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
250 /* build all the huffman tables */
251 build_huffman_codes(m->huff_size_dc_luminance,
252 m->huff_code_dc_luminance,
255 build_huffman_codes(m->huff_size_dc_chrominance,
256 m->huff_code_dc_chrominance,
259 build_huffman_codes(m->huff_size_ac_luminance,
260 m->huff_code_ac_luminance,
263 build_huffman_codes(m->huff_size_ac_chrominance,
264 m->huff_code_ac_chrominance,
272 void mjpeg_close(MpegEncContext *s)
274 av_free(s->mjpeg_ctx);
277 static inline void put_marker(PutBitContext *p, int code)
279 put_bits(p, 8, 0xff);
280 put_bits(p, 8, code);
283 /* table_class: 0 = DC coef, 1 = AC coefs */
284 static int put_huffman_table(MpegEncContext *s, int table_class, int table_id,
285 const UINT8 *bits_table, const UINT8 *value_table)
287 PutBitContext *p = &s->pb;
290 put_bits(p, 4, table_class);
291 put_bits(p, 4, table_id);
296 put_bits(p, 8, bits_table[i]);
300 put_bits(p, 8, value_table[i]);
305 static void jpeg_table_header(MpegEncContext *s)
307 PutBitContext *p = &s->pb;
314 put_bits(p, 16, 2 + 2 * (1 + 64));
316 put_bits(p, 16, 2 + 1 * (1 + 64));
318 put_bits(p, 4, 0); /* 8 bit precision */
319 put_bits(p, 4, 0); /* table 0 */
321 j = s->intra_scantable.permutated[i];
322 put_bits(p, 8, s->intra_matrix[j]);
325 put_bits(p, 4, 0); /* 8 bit precision */
326 put_bits(p, 4, 1); /* table 1 */
328 j = s->intra_scantable.permutated[i];
329 put_bits(p, 8, s->chroma_intra_matrix[j]);
337 put_bits(p, 16, 0); /* patched later */
339 size += put_huffman_table(s, 0, 0, bits_dc_luminance, val_dc_luminance);
340 size += put_huffman_table(s, 0, 1, bits_dc_chrominance, val_dc_chrominance);
342 size += put_huffman_table(s, 1, 0, bits_ac_luminance, val_ac_luminance);
343 size += put_huffman_table(s, 1, 1, bits_ac_chrominance, val_ac_chrominance);
348 static void jpeg_put_comments(MpegEncContext *s)
350 PutBitContext *p = &s->pb;
354 if (s->aspect_ratio_info)
359 put_string(p, "JFIF"); /* this puts the trailing zero-byte too */
360 put_bits(p, 16, 0x0201); /* v 1.02 */
361 put_bits(p, 8, 0); /* units type: 0 - aspect ratio */
362 switch(s->aspect_ratio_info)
364 case FF_ASPECT_4_3_625:
365 case FF_ASPECT_4_3_525:
369 case FF_ASPECT_16_9_625:
370 case FF_ASPECT_16_9_525:
374 case FF_ASPECT_EXTENDED:
375 put_bits(p, 16, s->aspected_width);
376 put_bits(p, 16, s->aspected_height);
378 case FF_ASPECT_SQUARE:
380 put_bits(p, 16, 1); /* aspect: 1:1 */
384 put_bits(p, 8, 0); /* thumbnail width */
385 put_bits(p, 8, 0); /* thumbnail height */
393 put_bits(p, 16, 0); /* patched later */
394 #define MJPEG_VERSION "FFmpeg" LIBAVCODEC_VERSION "b" LIBAVCODEC_BUILD_STR
395 put_string(p, MJPEG_VERSION);
396 size = strlen(MJPEG_VERSION)+3;
403 void mjpeg_picture_header(MpegEncContext *s)
405 put_marker(&s->pb, SOI);
407 if (!s->mjpeg_data_only_frames)
409 jpeg_put_comments(s);
411 if (s->mjpeg_write_tables) jpeg_table_header(s);
413 put_marker(&s->pb, SOF0);
415 put_bits(&s->pb, 16, 17);
416 put_bits(&s->pb, 8, 8); /* 8 bits/component */
417 put_bits(&s->pb, 16, s->height);
418 put_bits(&s->pb, 16, s->width);
419 put_bits(&s->pb, 8, 3); /* 3 components */
422 put_bits(&s->pb, 8, 1); /* component number */
423 put_bits(&s->pb, 4, s->mjpeg_hsample[0]); /* H factor */
424 put_bits(&s->pb, 4, s->mjpeg_vsample[0]); /* V factor */
425 put_bits(&s->pb, 8, 0); /* select matrix */
428 put_bits(&s->pb, 8, 2); /* component number */
429 put_bits(&s->pb, 4, s->mjpeg_hsample[1]); /* H factor */
430 put_bits(&s->pb, 4, s->mjpeg_vsample[1]); /* V factor */
432 put_bits(&s->pb, 8, 1); /* select matrix */
434 put_bits(&s->pb, 8, 0); /* select matrix */
438 put_bits(&s->pb, 8, 3); /* component number */
439 put_bits(&s->pb, 4, s->mjpeg_hsample[2]); /* H factor */
440 put_bits(&s->pb, 4, s->mjpeg_vsample[2]); /* V factor */
442 put_bits(&s->pb, 8, 1); /* select matrix */
444 put_bits(&s->pb, 8, 0); /* select matrix */
449 put_marker(&s->pb, SOS);
450 put_bits(&s->pb, 16, 12); /* length */
451 put_bits(&s->pb, 8, 3); /* 3 components */
454 put_bits(&s->pb, 8, 1); /* index */
455 put_bits(&s->pb, 4, 0); /* DC huffman table index */
456 put_bits(&s->pb, 4, 0); /* AC huffman table index */
459 put_bits(&s->pb, 8, 2); /* index */
460 put_bits(&s->pb, 4, 1); /* DC huffman table index */
461 put_bits(&s->pb, 4, 1); /* AC huffman table index */
464 put_bits(&s->pb, 8, 3); /* index */
465 put_bits(&s->pb, 4, 1); /* DC huffman table index */
466 put_bits(&s->pb, 4, 1); /* AC huffman table index */
468 put_bits(&s->pb, 8, 0); /* Ss (not used) */
469 put_bits(&s->pb, 8, 63); /* Se (not used) */
470 put_bits(&s->pb, 8, 0); /* Ah/Al (not used) */
473 static void escape_FF(MpegEncContext *s, int start)
475 int size= get_bit_count(&s->pb) - start*8;
477 uint8_t *buf= s->pb.buf + start;
478 int align= (-(int)(buf))&3;
480 assert((size&7) == 0);
484 for(i=0; i<size && i<align; i++){
485 if(buf[i]==0xFF) ff_count++;
487 for(; i<size-15; i+=16){
490 v= *(uint32_t*)(&buf[i]);
491 acc= (((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
492 v= *(uint32_t*)(&buf[i+4]);
493 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
494 v= *(uint32_t*)(&buf[i+8]);
495 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
496 v= *(uint32_t*)(&buf[i+12]);
497 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
505 if(buf[i]==0xFF) ff_count++;
508 if(ff_count==0) return;
511 for(i=0; i<ff_count-3; i+=4)
512 put_bits(&s->pb, 32, 0);
513 put_bits(&s->pb, (ff_count-i)*8, 0);
514 flush_put_bits(&s->pb);
516 for(i=size-1; ff_count; i--){
520 //printf("%d %d\n", i, ff_count);
529 void mjpeg_picture_trailer(MpegEncContext *s)
531 int pad= (-get_bit_count(&s->pb))&7;
533 put_bits(&s->pb, pad,0xFF>>(8-pad));
534 flush_put_bits(&s->pb);
536 assert((s->header_bits&7)==0);
538 escape_FF(s, s->header_bits>>3);
540 put_marker(&s->pb, EOI);
543 static inline void mjpeg_encode_dc(MpegEncContext *s, int val,
544 UINT8 *huff_size, UINT16 *huff_code)
549 put_bits(&s->pb, huff_size[0], huff_code[0]);
557 /* compute the log (XXX: optimize) */
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;
576 UINT16 *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 /* compute the log (XXX: optimize) */
619 code = (run << 4) | nbits;
621 put_bits(&s->pb, huff_size_ac[code], huff_code_ac[code]);
623 put_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
628 /* output EOB only if not already 64 values */
629 if (last_index < 63 || run != 0)
630 put_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]);
633 void mjpeg_encode_mb(MpegEncContext *s,
634 DCTELEM block[6][64])
638 encode_block(s, block[i], i);
642 /******************************************/
645 #define MAX_COMPONENTS 4
647 typedef struct MJpegDecodeContext {
648 AVCodecContext *avctx;
650 int mpeg_enc_ctx_allocated; /* true if decoding context allocated */
652 int start_code; /* current start code */
656 INT16 quant_matrixes[4][64];
659 int org_width, org_height; /* size given at codec init */
660 int first_picture; /* true if decoding first picture */
661 int interlaced; /* true if interlaced */
662 int bottom_field; /* true if bottom field */
666 int component_id[MAX_COMPONENTS];
667 int h_count[MAX_COMPONENTS]; /* horizontal and vertical count for each component */
668 int v_count[MAX_COMPONENTS];
669 int h_max, v_max; /* maximum h and v counts */
670 int quant_index[4]; /* quant table index for each component */
671 int last_dc[MAX_COMPONENTS]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */
672 UINT8 *current_picture[MAX_COMPONENTS]; /* picture structure */
673 int linesize[MAX_COMPONENTS];
674 DCTELEM block[64] __align8;
676 void (*idct_put)(UINT8 *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/);
678 int restart_interval;
682 int interlace_polarity;
683 } MJpegDecodeContext;
685 static int mjpeg_decode_dht(MJpegDecodeContext *s);
687 static void build_vlc(VLC *vlc, const UINT8 *bits_table, const UINT8 *val_table,
690 UINT8 huff_size[256];
691 UINT16 huff_code[256];
693 memset(huff_size, 0, sizeof(huff_size));
694 build_huffman_codes(huff_size, huff_code, bits_table, val_table);
696 init_vlc(vlc, 9, nb_codes, huff_size, 1, 1, huff_code, 2, 2);
699 static int mjpeg_decode_init(AVCodecContext *avctx)
701 MJpegDecodeContext *s = avctx->priv_data;
706 /* ugly way to get the idct & scantable */
707 memset(&s2, 0, sizeof(MpegEncContext));
708 s2.flags= avctx->flags;
710 // s2->out_format = FMT_MJPEG;
713 if (MPV_common_init(&s2) < 0)
715 s->scantable= s2.intra_scantable;
716 s->idct_put= s2.idct_put;
719 s->mpeg_enc_ctx_allocated = 0;
720 s->buffer_size = 102400; /* smaller buffer should be enough,
721 but photojpg files could ahive bigger sizes */
722 s->buffer = av_malloc(s->buffer_size);
726 s->first_picture = 1;
727 s->org_width = avctx->width;
728 s->org_height = avctx->height;
730 build_vlc(&s->vlcs[0][0], bits_dc_luminance, val_dc_luminance, 12);
731 build_vlc(&s->vlcs[0][1], bits_dc_chrominance, val_dc_chrominance, 12);
732 build_vlc(&s->vlcs[1][0], bits_ac_luminance, val_ac_luminance, 251);
733 build_vlc(&s->vlcs[1][1], bits_ac_chrominance, val_ac_chrominance, 251);
735 if (avctx->flags & CODEC_FLAG_EXTERN_HUFF)
737 printf("mjpeg: using external huffman table\n");
738 init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8);
740 /* should check for error - but dunno */
746 /* quantize tables */
747 static int mjpeg_decode_dqt(MJpegDecodeContext *s)
749 int len, index, i, j;
751 len = get_bits(&s->gb, 16) - 2;
754 /* only 8 bit precision handled */
755 if (get_bits(&s->gb, 4) != 0)
757 dprintf("dqt: 16bit precision\n");
760 index = get_bits(&s->gb, 4);
763 dprintf("index=%d\n", index);
764 /* read quant table */
766 j = s->scantable.permutated[i];
767 s->quant_matrixes[index][j] = get_bits(&s->gb, 8);
775 /* decode huffman tables and build VLC decoders */
776 static int mjpeg_decode_dht(MJpegDecodeContext *s)
778 int len, index, i, class, n, v, code_max;
779 UINT8 bits_table[17];
780 UINT8 val_table[256];
782 len = get_bits(&s->gb, 16) - 2;
787 class = get_bits(&s->gb, 4);
790 index = get_bits(&s->gb, 4);
795 bits_table[i] = get_bits(&s->gb, 8);
799 if (len < n || n > 256)
804 v = get_bits(&s->gb, 8);
811 /* build VLC and flush previous vlc if present */
812 free_vlc(&s->vlcs[class][index]);
813 dprintf("class=%d index=%d nb_codes=%d\n",
814 class, index, code_max + 1);
815 build_vlc(&s->vlcs[class][index], bits_table, val_table, code_max + 1);
820 static int mjpeg_decode_sof0(MJpegDecodeContext *s)
822 int len, nb_components, i, width, height;
824 /* XXX: verify len field validity */
825 len = get_bits(&s->gb, 16);
826 /* only 8 bits/component accepted */
827 if (get_bits(&s->gb, 8) != 8)
829 height = get_bits(&s->gb, 16);
830 width = get_bits(&s->gb, 16);
831 dprintf("sof0: picture: %dx%d\n", width, height);
833 nb_components = get_bits(&s->gb, 8);
834 if (nb_components <= 0 ||
835 nb_components > MAX_COMPONENTS)
837 s->nb_components = nb_components;
840 for(i=0;i<nb_components;i++) {
842 s->component_id[i] = get_bits(&s->gb, 8) - 1;
843 s->h_count[i] = get_bits(&s->gb, 4);
844 s->v_count[i] = get_bits(&s->gb, 4);
845 /* compute hmax and vmax (only used in interleaved case) */
846 if (s->h_count[i] > s->h_max)
847 s->h_max = s->h_count[i];
848 if (s->v_count[i] > s->v_max)
849 s->v_max = s->v_count[i];
850 s->quant_index[i] = get_bits(&s->gb, 8);
851 if (s->quant_index[i] >= 4)
853 dprintf("component %d %d:%d id: %d quant:%d\n", i, s->h_count[i],
854 s->v_count[i], s->component_id[i], s->quant_index[i]);
857 /* if different size, realloc/alloc picture */
858 /* XXX: also check h_count and v_count */
859 if (width != s->width || height != s->height) {
860 for(i=0;i<MAX_COMPONENTS;i++)
861 av_freep(&s->current_picture[i]);
864 /* test interlaced mode */
865 if (s->first_picture &&
866 s->org_height != 0 &&
867 s->height < ((s->org_height * 3) / 4)) {
869 // s->bottom_field = (s->interlace_polarity) ? 1 : 0;
873 for(i=0;i<nb_components;i++) {
875 w = (s->width + 8 * s->h_max - 1) / (8 * s->h_max);
876 h = (s->height + 8 * s->v_max - 1) / (8 * s->v_max);
877 w = w * 8 * s->h_count[i];
878 h = h * 8 * s->v_count[i];
882 s->current_picture[i] = av_mallocz(w * h);
883 if (!s->current_picture[i])
885 dprintf("error: no picture buffers allocated\n");
889 s->first_picture = 0;
892 if (len != (8+(3*nb_components)))
894 dprintf("decode_sof0: error, len(%d) mismatch\n", len);
900 static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
904 code = get_vlc2(&s->gb, s->vlcs[0][dc_index].table, 9, 2);
906 code = get_vlc(&s->gb, &s->vlcs[0][dc_index]);
910 dprintf("mjpeg_decode_dc: bad vlc: %d:%d (%p)\n", 0, dc_index,
911 &s->vlcs[0][dc_index]);
917 diff = get_bits(&s->gb, code);
918 if ((diff & (1 << (code - 1))) == 0)
919 diff = (-1 << code) | (diff + 1);
924 /* decode block and dequantize */
925 static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
926 int component, int dc_index, int ac_index, int quant_index)
928 int nbits, code, i, j, level;
934 val = mjpeg_decode_dc(s, dc_index);
936 dprintf("error dc\n");
939 quant_matrix = s->quant_matrixes[quant_index];
940 val = val * quant_matrix[0] + s->last_dc[component];
941 s->last_dc[component] = val;
944 ac_vlc = &s->vlcs[1][ac_index];
948 code = get_vlc2(&s->gb, s->vlcs[1][ac_index].table, 9, 2);
950 code = get_vlc(&s->gb, ac_vlc);
953 dprintf("error ac\n");
964 level = get_bits(&s->gb, nbits);
965 if ((level & (1 << (nbits - 1))) == 0)
966 level = (-1 << nbits) | (level + 1);
969 dprintf("error count: %d\n", i);
972 j = s->scantable.permutated[i];
973 block[j] = level * quant_matrix[j];
982 static int mjpeg_decode_sos(MJpegDecodeContext *s)
984 int len, nb_components, i, j, n, h, v, ret;
985 int mb_width, mb_height, mb_x, mb_y, vmax, hmax, index, id;
993 /* XXX: verify len field validity */
994 len = get_bits(&s->gb, 16);
995 nb_components = get_bits(&s->gb, 8);
996 if (len != 6+2*nb_components)
998 dprintf("decode_sos: invalid len (%d)\n", len);
1001 /* XXX: only interleaved scan accepted */
1002 if (nb_components != 3)
1004 dprintf("decode_sos: components(%d) mismatch\n", nb_components);
1009 for(i=0;i<nb_components;i++) {
1010 id = get_bits(&s->gb, 8) - 1;
1011 dprintf("component: %d\n", id);
1012 /* find component index */
1013 for(index=0;index<s->nb_components;index++)
1014 if (id == s->component_id[index])
1016 if (index == s->nb_components)
1018 dprintf("decode_sos: index(%d) out of components\n", index);
1022 comp_index[i] = index;
1023 nb_blocks[i] = s->h_count[index] * s->v_count[index];
1024 h_count[i] = s->h_count[index];
1025 v_count[i] = s->v_count[index];
1027 dc_index[i] = get_bits(&s->gb, 4);
1028 ac_index[i] = get_bits(&s->gb, 4);
1030 if (dc_index[i] < 0 || ac_index[i] < 0 ||
1031 dc_index[i] >= 4 || ac_index[i] >= 4)
1033 switch(s->start_code)
1036 if (dc_index[i] > 1 || ac_index[i] > 1)
1041 if (dc_index[i] > 3 || ac_index[i] > 3)
1045 if (dc_index[i] > 3 || ac_index[i] != 0)
1050 skip_bits(&s->gb, 8); /* Ss */
1051 skip_bits(&s->gb, 8); /* Se */
1052 skip_bits(&s->gb, 8); /* Ah and Al (each are 4 bits) */
1054 for(i=0;i<nb_components;i++)
1055 s->last_dc[i] = 1024;
1057 if (nb_components > 1) {
1058 /* interleaved stream */
1059 mb_width = (s->width + s->h_max * 8 - 1) / (s->h_max * 8);
1060 mb_height = (s->height + s->v_max * 8 - 1) / (s->v_max * 8);
1062 h = s->h_max / s->h_count[comp_index[0]];
1063 v = s->v_max / s->v_count[comp_index[0]];
1064 mb_width = (s->width + h * 8 - 1) / (h * 8);
1065 mb_height = (s->height + v * 8 - 1) / (v * 8);
1071 for(mb_y = 0; mb_y < mb_height; mb_y++) {
1072 for(mb_x = 0; mb_x < mb_width; mb_x++) {
1073 for(i=0;i<nb_components;i++) {
1082 if (s->restart_interval && !s->restart_count)
1083 s->restart_count = s->restart_interval;
1085 memset(s->block, 0, sizeof(s->block));
1086 if (decode_block(s, s->block, i,
1087 dc_index[i], ac_index[i],
1088 s->quant_index[c]) < 0) {
1089 dprintf("error y=%d x=%d\n", mb_y, mb_x);
1093 // dprintf("mb: %d %d processed\n", mb_y, mb_x);
1094 ptr = s->current_picture[c] +
1095 (s->linesize[c] * (v * mb_y + y) * 8) +
1097 if (s->interlaced && s->bottom_field)
1098 ptr += s->linesize[c] >> 1;
1099 s->idct_put(ptr, s->linesize[c], s->block);
1106 /* (< 1350) buggy workaround for Spectralfan.mov, should be fixed */
1107 if (s->restart_interval && (s->restart_interval < 1350) &&
1108 !--s->restart_count) {
1109 align_get_bits(&s->gb);
1110 skip_bits(&s->gb, 16); /* skip RSTn */
1111 for (j=0; j<nb_components; j++) /* reset dc */
1112 s->last_dc[j] = 1024;
1121 dprintf("decode_sos: ac/dc index out of range\n");
1125 static int mjpeg_decode_dri(MJpegDecodeContext *s)
1127 if (get_bits(&s->gb, 16) != 4)
1129 s->restart_interval = get_bits(&s->gb, 16);
1130 dprintf("restart interval: %d\n", s->restart_interval);
1135 static int mjpeg_decode_app(MJpegDecodeContext *s)
1139 /* XXX: verify len field validity */
1140 len = get_bits(&s->gb, 16);
1144 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
1148 /* buggy AVID, it puts EOI only at every 10th frame */
1149 /* also this fourcc is used by non-avid files too, it holds some
1150 informations, but it's always present in AVID creates files */
1151 if (id == ff_get_fourcc("AVI1"))
1158 4bytes field_size_less_padding
1161 // if (s->first_picture)
1162 // printf("mjpeg: workarounding buggy AVID\n");
1163 s->interlace_polarity = get_bits(&s->gb, 8);
1165 skip_bits(&s->gb, 8);
1166 skip_bits(&s->gb, 32);
1167 skip_bits(&s->gb, 32);
1170 // if (s->interlace_polarity)
1171 // printf("mjpeg: interlace polarity: %d\n", s->interlace_polarity);
1177 if (id == ff_get_fourcc("JFIF"))
1180 skip_bits(&s->gb, 8); /* the trailing zero-byte */
1181 printf("mjpeg: JFIF header found (version: %x.%x)\n",
1182 get_bits(&s->gb, 8), get_bits(&s->gb, 8));
1183 if (get_bits(&s->gb, 8) == 0)
1185 int x_density, y_density;
1186 x_density = get_bits(&s->gb, 16);
1187 y_density = get_bits(&s->gb, 16);
1189 dprintf("x/y density: %d (%f), %d (%f)\n", x_density,
1190 (float)x_density, y_density, (float)y_density);
1192 //MN: needs to be checked
1194 // s->avctx->aspect_ratio= s->width*y_density/((float)s->height*x_density);
1195 s->avctx->aspect_ratio = (float)x_density/y_density;
1196 /* it's better, but every JFIF I have seen stores 1:1 */
1198 s->avctx->aspect_ratio= 0.0;
1203 skip_bits(&s->gb, 16);
1204 skip_bits(&s->gb, 16);
1207 t_w = get_bits(&s->gb, 8);
1208 t_h = get_bits(&s->gb, 8);
1211 /* skip thumbnail */
1212 if (len-10-(t_w*t_h*3) > 0)
1219 if (id == ff_get_fourcc("Adob") && (get_bits(&s->gb, 8) == 'e'))
1221 printf("mjpeg: Adobe header found\n");
1222 skip_bits(&s->gb, 16); /* version */
1223 skip_bits(&s->gb, 16); /* flags0 */
1224 skip_bits(&s->gb, 16); /* flags1 */
1225 skip_bits(&s->gb, 8); /* transform */
1231 if ((s->start_code == APP1) && (len > (0x28 - 8)))
1233 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
1236 if (id == ff_get_fourcc("mjpg")) /* Apple MJPEG-A */
1239 skip_bits(&s->gb, 32); /* field size */
1240 skip_bits(&s->gb, 32); /* pad field size */
1241 skip_bits(&s->gb, 32); /* next off */
1242 skip_bits(&s->gb, 32); /* quant off */
1243 skip_bits(&s->gb, 32); /* huff off */
1244 skip_bits(&s->gb, 32); /* image off */
1245 skip_bits(&s->gb, 32); /* scan off */
1246 skip_bits(&s->gb, 32); /* data off */
1248 if (s->first_picture)
1249 printf("mjpeg: Apple MJPEG-A header found\n");
1254 /* slow but needed for extreme adobe jpegs */
1256 printf("mjpeg: error, decode_app parser read over the end\n");
1258 skip_bits(&s->gb, 8);
1263 static int mjpeg_decode_com(MJpegDecodeContext *s)
1265 /* XXX: verify len field validity */
1266 unsigned int len = get_bits(&s->gb, 16);
1267 if (len >= 2 && len < 32768) {
1268 /* XXX: any better upper bound */
1269 UINT8 *cbuf = av_malloc(len - 1);
1272 for (i = 0; i < len - 2; i++)
1273 cbuf[i] = get_bits(&s->gb, 8);
1274 if (i > 0 && cbuf[i-1] == '\n')
1279 printf("mjpeg comment: '%s'\n", cbuf);
1281 /* buggy avid, it puts EOI only at every 10th frame */
1282 if (!strcmp(cbuf, "AVID"))
1285 // if (s->first_picture)
1286 // printf("mjpeg: workarounding buggy AVID\n");
1297 static int valid_marker_list[] =
1299 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f */
1300 /* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1301 /* 1 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1302 /* 2 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1303 /* 3 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1304 /* 4 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1305 /* 5 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1306 /* 6 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1307 /* 7 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1308 /* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1309 /* 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1310 /* a */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1311 /* b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1312 /* c */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1313 /* d */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1314 /* e */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1315 /* f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1319 /* return the 8 bit start code value and update the search
1320 state. Return -1 if no start code found */
1321 static int find_marker(UINT8 **pbuf_ptr, UINT8 *buf_end)
1330 buf_ptr = *pbuf_ptr;
1331 while (buf_ptr < buf_end) {
1334 if ((v == 0xff) && (v2 >= 0xc0) && (v2 <= 0xfe)) {
1345 dprintf("find_marker skipped %d bytes\n", skipped);
1347 *pbuf_ptr = buf_ptr;
1351 static int mjpeg_decode_frame(AVCodecContext *avctx,
1352 void *data, int *data_size,
1353 UINT8 *buf, int buf_size)
1355 MJpegDecodeContext *s = avctx->priv_data;
1356 UINT8 *buf_end, *buf_ptr;
1358 AVPicture *picture = data;
1362 /* no supplementary picture */
1367 buf_end = buf + buf_size;
1368 while (buf_ptr < buf_end) {
1369 /* find start next marker */
1370 start_code = find_marker(&buf_ptr, buf_end);
1373 if (start_code < 0) {
1376 dprintf("marker=%x avail_size_in_buf=%d\n", start_code, buf_end - buf_ptr);
1378 if ((buf_end - buf_ptr) > s->buffer_size)
1381 s->buffer_size = buf_end-buf_ptr;
1382 s->buffer = av_malloc(s->buffer_size);
1383 dprintf("buffer too small, expanding to %d bytes\n",
1387 /* unescape buffer of SOS */
1388 if (start_code == SOS)
1390 UINT8 *src = buf_ptr;
1391 UINT8 *dst = s->buffer;
1400 while(*src == 0xff) src++;
1403 if (x >= 0xd0 && x <= 0xd7)
1409 init_get_bits(&s->gb, s->buffer, (dst - s->buffer)*8);
1411 dprintf("escaping removed %d bytes\n",
1412 (buf_end - buf_ptr) - (dst - s->buffer));
1415 init_get_bits(&s->gb, buf_ptr, (buf_end - buf_ptr)*8);
1417 s->start_code = start_code;
1419 /* process markers */
1420 if (start_code >= 0xd0 && start_code <= 0xd7) {
1421 dprintf("restart marker: %d\n", start_code&0x0f);
1422 } else if (s->first_picture) {
1424 if (start_code >= 0xe0 && start_code <= 0xef)
1425 mjpeg_decode_app(s);
1427 else if (start_code == COM)
1428 mjpeg_decode_com(s);
1431 switch(start_code) {
1433 s->restart_interval = 0;
1434 /* nothing to do on SOI */
1437 mjpeg_decode_dqt(s);
1440 mjpeg_decode_dht(s);
1443 if (mjpeg_decode_sof0(s) < 0)
1449 if (s->interlaced) {
1450 s->bottom_field ^= 1;
1451 /* if not bottom field, do not output image yet */
1452 if (s->bottom_field)
1456 picture->data[i] = s->current_picture[i];
1457 picture->linesize[i] = (s->interlaced) ?
1458 s->linesize[i] >> 1 : s->linesize[i];
1460 *data_size = sizeof(AVPicture);
1461 avctx->height = s->height;
1464 avctx->width = s->width;
1465 /* XXX: not complete test ! */
1466 switch((s->h_count[0] << 4) | s->v_count[0]) {
1468 avctx->pix_fmt = PIX_FMT_YUV444P;
1471 avctx->pix_fmt = PIX_FMT_YUV422P;
1475 avctx->pix_fmt = PIX_FMT_YUV420P;
1479 /* XXX: infer it with matrix */
1480 // avctx->quality = 3;
1485 mjpeg_decode_sos(s);
1486 /* buggy avid puts EOI every 10-20th frame */
1487 /* if restart period is over process EOI */
1488 if ((s->buggy_avid && !s->interlaced) || s->restart_interval)
1492 mjpeg_decode_dri(s);
1507 printf("mjpeg: unsupported coding type (%x)\n", start_code);
1510 // printf("mjpeg: unsupported marker (%x)\n", start_code);
1515 /* eof process start code */
1516 buf_ptr += (get_bits_count(&s->gb)+7)/8;
1517 dprintf("marker parser used %d bytes (%d bits)\n",
1518 (get_bits_count(&s->gb)+7)/8, get_bits_count(&s->gb));
1523 dprintf("mjpeg decode frame unused %d bytes\n", buf_end - buf_ptr);
1524 // return buf_end - buf_ptr;
1525 return buf_ptr - buf;
1528 static int mjpegb_decode_frame(AVCodecContext *avctx,
1529 void *data, int *data_size,
1530 UINT8 *buf, int buf_size)
1532 MJpegDecodeContext *s = avctx->priv_data;
1533 UINT8 *buf_end, *buf_ptr;
1535 AVPicture *picture = data;
1536 GetBitContext hgb; /* for the header */
1537 uint32_t dqt_offs, dht_offs, sof_offs, sos_offs, second_field_offs;
1538 uint32_t field_size;
1542 /* no supplementary picture */
1547 buf_end = buf + buf_size;
1550 /* reset on every SOI */
1551 s->restart_interval = 0;
1553 init_get_bits(&hgb, buf_ptr, /*buf_size*/(buf_end - buf_ptr)*8);
1555 skip_bits(&hgb, 32); /* reserved zeros */
1557 if (get_bits(&hgb, 32) != be2me_32(ff_get_fourcc("mjpg")))
1559 dprintf("not mjpeg-b (bad fourcc)\n");
1563 field_size = get_bits(&hgb, 32); /* field size */
1564 dprintf("field size: 0x%x\n", field_size);
1565 skip_bits(&hgb, 32); /* padded field size */
1566 second_field_offs = get_bits(&hgb, 32);
1567 dprintf("second field offs: 0x%x\n", second_field_offs);
1568 if (second_field_offs)
1571 dqt_offs = get_bits(&hgb, 32);
1572 dprintf("dqt offs: 0x%x\n", dqt_offs);
1575 init_get_bits(&s->gb, buf+dqt_offs, (buf_end - (buf+dqt_offs))*8);
1576 s->start_code = DQT;
1577 mjpeg_decode_dqt(s);
1580 dht_offs = get_bits(&hgb, 32);
1581 dprintf("dht offs: 0x%x\n", dht_offs);
1584 init_get_bits(&s->gb, buf+dht_offs, (buf_end - (buf+dht_offs))*8);
1585 s->start_code = DHT;
1586 mjpeg_decode_dht(s);
1589 sof_offs = get_bits(&hgb, 32);
1590 dprintf("sof offs: 0x%x\n", sof_offs);
1593 init_get_bits(&s->gb, buf+sof_offs, (buf_end - (buf+sof_offs))*8);
1594 s->start_code = SOF0;
1595 if (mjpeg_decode_sof0(s) < 0)
1599 sos_offs = get_bits(&hgb, 32);
1600 dprintf("sos offs: 0x%x\n", sos_offs);
1603 // init_get_bits(&s->gb, buf+sos_offs, (buf_end - (buf+sos_offs))*8);
1604 init_get_bits(&s->gb, buf+sos_offs, field_size*8);
1605 s->start_code = SOS;
1606 mjpeg_decode_sos(s);
1609 skip_bits(&hgb, 32); /* start of data offset */
1611 if (s->interlaced) {
1612 s->bottom_field ^= 1;
1613 /* if not bottom field, do not output image yet */
1614 if (s->bottom_field && second_field_offs)
1616 buf_ptr = buf + second_field_offs;
1617 second_field_offs = 0;
1623 picture->data[i] = s->current_picture[i];
1624 picture->linesize[i] = (s->interlaced) ?
1625 s->linesize[i] >> 1 : s->linesize[i];
1627 *data_size = sizeof(AVPicture);
1628 avctx->height = s->height;
1631 avctx->width = s->width;
1632 /* XXX: not complete test ! */
1633 switch((s->h_count[0] << 4) | s->v_count[0]) {
1635 avctx->pix_fmt = PIX_FMT_YUV444P;
1638 avctx->pix_fmt = PIX_FMT_YUV422P;
1642 avctx->pix_fmt = PIX_FMT_YUV420P;
1646 /* XXX: infer it with matrix */
1647 // avctx->quality = 3;
1649 return buf_ptr - buf;
1653 static int mjpeg_decode_end(AVCodecContext *avctx)
1655 MJpegDecodeContext *s = avctx->priv_data;
1659 for(i=0;i<MAX_COMPONENTS;i++)
1660 av_free(s->current_picture[i]);
1663 free_vlc(&s->vlcs[i][j]);
1668 AVCodec mjpeg_decoder = {
1672 sizeof(MJpegDecodeContext),
1681 AVCodec mjpegb_decoder = {
1685 sizeof(MJpegDecodeContext),
1689 mjpegb_decode_frame,