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_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));
859 // s2->out_format = FMT_MJPEG;
862 if (MPV_common_init(&s2) < 0)
864 s->scantable= s2.intra_scantable;
865 s->idct_put= s2.dsp.idct_put;
868 s->mpeg_enc_ctx_allocated = 0;
869 s->buffer_size = 102400; /* smaller buffer should be enough,
870 but photojpg files could ahive bigger sizes */
871 s->buffer = av_malloc(s->buffer_size);
875 s->first_picture = 1;
876 s->org_height = avctx->height;
878 build_vlc(&s->vlcs[0][0], bits_dc_luminance, val_dc_luminance, 12);
879 build_vlc(&s->vlcs[0][1], bits_dc_chrominance, val_dc_chrominance, 12);
880 build_vlc(&s->vlcs[1][0], bits_ac_luminance, val_ac_luminance, 251);
881 build_vlc(&s->vlcs[1][1], bits_ac_chrominance, val_ac_chrominance, 251);
883 if (avctx->flags & CODEC_FLAG_EXTERN_HUFF)
885 av_log(avctx, AV_LOG_INFO, "mjpeg: using external huffman table\n");
886 init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8);
888 /* should check for error - but dunno */
894 /* quantize tables */
895 static int mjpeg_decode_dqt(MJpegDecodeContext *s)
897 int len, index, i, j;
899 len = get_bits(&s->gb, 16) - 2;
902 /* only 8 bit precision handled */
903 if (get_bits(&s->gb, 4) != 0)
905 dprintf("dqt: 16bit precision\n");
908 index = get_bits(&s->gb, 4);
911 dprintf("index=%d\n", index);
912 /* read quant table */
914 j = s->scantable.permutated[i];
915 s->quant_matrixes[index][j] = get_bits(&s->gb, 8);
918 //XXX FIXME finetune, and perhaps add dc too
919 s->qscale[index]= FFMAX(
920 s->quant_matrixes[index][s->scantable.permutated[1]],
921 s->quant_matrixes[index][s->scantable.permutated[8]]) >> 1;
922 dprintf("qscale[%d]: %d\n", index, s->qscale[index]);
929 /* decode huffman tables and build VLC decoders */
930 static int mjpeg_decode_dht(MJpegDecodeContext *s)
932 int len, index, i, class, n, v, code_max;
933 uint8_t bits_table[17];
934 uint8_t val_table[256];
936 len = get_bits(&s->gb, 16) - 2;
941 class = get_bits(&s->gb, 4);
944 index = get_bits(&s->gb, 4);
949 bits_table[i] = get_bits(&s->gb, 8);
953 if (len < n || n > 256)
958 v = get_bits(&s->gb, 8);
965 /* build VLC and flush previous vlc if present */
966 free_vlc(&s->vlcs[class][index]);
967 dprintf("class=%d index=%d nb_codes=%d\n",
968 class, index, code_max + 1);
969 if(build_vlc(&s->vlcs[class][index], bits_table, val_table, code_max + 1) < 0){
976 static int mjpeg_decode_sof(MJpegDecodeContext *s)
978 int len, nb_components, i, width, height;
980 /* XXX: verify len field validity */
981 len = get_bits(&s->gb, 16);
982 s->bits= get_bits(&s->gb, 8);
984 if(s->pegasus_rct) s->bits=9;
985 if(s->bits==9 && !s->pegasus_rct) s->rct=1; //FIXME ugly
987 if (s->bits != 8 && !s->lossless){
988 av_log(s->avctx, AV_LOG_ERROR, "only 8 bits/component accepted\n");
991 height = get_bits(&s->gb, 16);
992 width = get_bits(&s->gb, 16);
993 dprintf("sof0: picture: %dx%d\n", width, height);
995 nb_components = get_bits(&s->gb, 8);
996 if (nb_components <= 0 ||
997 nb_components > MAX_COMPONENTS)
999 s->nb_components = nb_components;
1002 for(i=0;i<nb_components;i++) {
1004 s->component_id[i] = get_bits(&s->gb, 8) - 1;
1005 s->h_count[i] = get_bits(&s->gb, 4);
1006 s->v_count[i] = get_bits(&s->gb, 4);
1007 /* compute hmax and vmax (only used in interleaved case) */
1008 if (s->h_count[i] > s->h_max)
1009 s->h_max = s->h_count[i];
1010 if (s->v_count[i] > s->v_max)
1011 s->v_max = s->v_count[i];
1012 s->quant_index[i] = get_bits(&s->gb, 8);
1013 if (s->quant_index[i] >= 4)
1015 dprintf("component %d %d:%d id: %d quant:%d\n", i, s->h_count[i],
1016 s->v_count[i], s->component_id[i], s->quant_index[i]);
1019 if(s->v_max==1 && s->h_max==1 && s->lossless==1) s->rgb=1;
1021 /* if different size, realloc/alloc picture */
1022 /* XXX: also check h_count and v_count */
1023 if (width != s->width || height != s->height) {
1024 av_freep(&s->qscale_table);
1028 s->avctx->width = s->width;
1029 s->avctx->height = s->height;
1031 /* test interlaced mode */
1032 if (s->first_picture &&
1033 s->org_height != 0 &&
1034 s->height < ((s->org_height * 3) / 4)) {
1036 // s->bottom_field = (s->interlace_polarity) ? 1 : 0;
1037 s->bottom_field = 0;
1038 s->avctx->height *= 2;
1041 s->qscale_table= av_mallocz((s->width+15)/16);
1043 s->first_picture = 0;
1046 if(s->interlaced && s->bottom_field)
1049 /* XXX: not complete test ! */
1050 switch((s->h_count[0] << 4) | s->v_count[0]) {
1053 s->avctx->pix_fmt = PIX_FMT_RGBA32;
1054 }else if(s->nb_components==3)
1055 s->avctx->pix_fmt = PIX_FMT_YUV444P;
1057 s->avctx->pix_fmt = PIX_FMT_GRAY8;
1060 s->avctx->pix_fmt = PIX_FMT_YUV422P;
1064 s->avctx->pix_fmt = PIX_FMT_YUV420P;
1068 if(s->picture.data[0])
1069 s->avctx->release_buffer(s->avctx, &s->picture);
1071 s->picture.reference= 0;
1072 if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){
1073 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1076 s->picture.pict_type= I_TYPE;
1077 s->picture.key_frame= 1;
1080 s->linesize[i]= s->picture.linesize[i] << s->interlaced;
1083 // printf("%d %d %d %d %d %d\n", s->width, s->height, s->linesize[0], s->linesize[1], s->interlaced, s->avctx->height);
1085 if (len != (8+(3*nb_components)))
1087 dprintf("decode_sof0: error, len(%d) mismatch\n", len);
1093 static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
1096 code = get_vlc2(&s->gb, s->vlcs[0][dc_index].table, 9, 2);
1099 dprintf("mjpeg_decode_dc: bad vlc: %d:%d (%p)\n", 0, dc_index,
1100 &s->vlcs[0][dc_index]);
1105 return get_xbits(&s->gb, code);
1110 /* decode block and dequantize */
1111 static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
1112 int component, int dc_index, int ac_index, int quant_index)
1114 int code, i, j, level, val;
1116 int16_t *quant_matrix;
1119 val = mjpeg_decode_dc(s, dc_index);
1120 if (val == 0xffff) {
1121 dprintf("error dc\n");
1124 quant_matrix = s->quant_matrixes[quant_index];
1125 val = val * quant_matrix[0] + s->last_dc[component];
1126 s->last_dc[component] = val;
1129 ac_vlc = &s->vlcs[1][ac_index];
1132 code = get_vlc2(&s->gb, s->vlcs[1][ac_index].table, 9, 2);
1135 dprintf("error ac\n");
1144 level = get_xbits(&s->gb, code & 0xf);
1147 dprintf("error count: %d\n", i);
1150 j = s->scantable.permutated[i];
1151 block[j] = level * quant_matrix[j];
1160 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point_transform){
1162 uint16_t buffer[2048][4];
1163 int left[3], top[3], topleft[3];
1164 const int linesize= s->linesize[0];
1165 const int mask= (1<<s->bits)-1;
1168 buffer[0][i]= 1 << (s->bits + point_transform - 1);
1170 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1171 const int modified_predictor= mb_y ? predictor : 1;
1172 uint8_t *ptr = s->picture.data[0] + (linesize * mb_y);
1174 if (s->interlaced && s->bottom_field)
1175 ptr += linesize >> 1;
1178 top[i]= left[i]= topleft[i]= buffer[0][i];
1180 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1181 if (s->restart_interval && !s->restart_count)
1182 s->restart_count = s->restart_interval;
1188 top[i]= buffer[mb_x][i];
1190 PREDICT(pred, topleft[i], top[i], left[i], modified_predictor);
1193 buffer[mb_x][i]= mask & (pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform));
1196 if (s->restart_interval && !--s->restart_count) {
1197 align_get_bits(&s->gb);
1198 skip_bits(&s->gb, 16); /* skip RSTn */
1203 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1204 ptr[4*mb_x+1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200)>>2);
1205 ptr[4*mb_x+0] = buffer[mb_x][1] + ptr[4*mb_x+1];
1206 ptr[4*mb_x+2] = buffer[mb_x][2] + ptr[4*mb_x+1];
1208 }else if(s->pegasus_rct){
1209 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1210 ptr[4*mb_x+1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2])>>2);
1211 ptr[4*mb_x+0] = buffer[mb_x][1] + ptr[4*mb_x+1];
1212 ptr[4*mb_x+2] = buffer[mb_x][2] + ptr[4*mb_x+1];
1215 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1216 ptr[4*mb_x+0] = buffer[mb_x][0];
1217 ptr[4*mb_x+1] = buffer[mb_x][1];
1218 ptr[4*mb_x+2] = buffer[mb_x][2];
1225 static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point_transform){
1227 const int nb_components=3;
1229 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1230 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1231 if (s->restart_interval && !s->restart_count)
1232 s->restart_count = s->restart_interval;
1234 if(mb_x==0 || mb_y==0 || s->interlaced){
1235 for(i=0;i<nb_components;i++) {
1237 int n, h, v, x, y, c, j, linesize;
1238 n = s->nb_blocks[i];
1239 c = s->comp_index[i];
1244 linesize= s->linesize[c];
1246 for(j=0; j<n; j++) {
1249 ptr = s->picture.data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
1250 if(y==0 && mb_y==0){
1251 if(x==0 && mb_x==0){
1252 pred= 128 << point_transform;
1257 if(x==0 && mb_x==0){
1258 pred= ptr[-linesize];
1260 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1264 if (s->interlaced && s->bottom_field)
1265 ptr += linesize >> 1;
1266 *ptr= pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform);
1275 for(i=0;i<nb_components;i++) {
1277 int n, h, v, x, y, c, j, linesize;
1278 n = s->nb_blocks[i];
1279 c = s->comp_index[i];
1284 linesize= s->linesize[c];
1286 for(j=0; j<n; j++) {
1289 ptr = s->picture.data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
1290 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1291 *ptr= pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform);
1299 if (s->restart_interval && !--s->restart_count) {
1300 align_get_bits(&s->gb);
1301 skip_bits(&s->gb, 16); /* skip RSTn */
1308 static int mjpeg_decode_scan(MJpegDecodeContext *s){
1310 const int nb_components=3;
1312 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1313 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1314 if (s->restart_interval && !s->restart_count)
1315 s->restart_count = s->restart_interval;
1317 for(i=0;i<nb_components;i++) {
1319 int n, h, v, x, y, c, j;
1320 n = s->nb_blocks[i];
1321 c = s->comp_index[i];
1327 memset(s->block, 0, sizeof(s->block));
1328 if (decode_block(s, s->block, i,
1329 s->dc_index[i], s->ac_index[i],
1330 s->quant_index[c]) < 0) {
1331 dprintf("error y=%d x=%d\n", mb_y, mb_x);
1334 // dprintf("mb: %d %d processed\n", mb_y, mb_x);
1335 ptr = s->picture.data[c] +
1336 (s->linesize[c] * (v * mb_y + y) * 8) +
1338 if (s->interlaced && s->bottom_field)
1339 ptr += s->linesize[c] >> 1;
1340 //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);
1341 s->idct_put(ptr, s->linesize[c], s->block);
1348 /* (< 1350) buggy workaround for Spectralfan.mov, should be fixed */
1349 if (s->restart_interval && (s->restart_interval < 1350) &&
1350 !--s->restart_count) {
1351 align_get_bits(&s->gb);
1352 skip_bits(&s->gb, 16); /* skip RSTn */
1353 for (i=0; i<nb_components; i++) /* reset dc */
1354 s->last_dc[i] = 1024;
1361 static int mjpeg_decode_sos(MJpegDecodeContext *s)
1363 int len, nb_components, i, h, v, predictor, point_transform;
1364 int vmax, hmax, index, id;
1365 const int block_size= s->lossless ? 1 : 8;
1367 /* XXX: verify len field validity */
1368 len = get_bits(&s->gb, 16);
1369 nb_components = get_bits(&s->gb, 8);
1370 if (len != 6+2*nb_components)
1372 dprintf("decode_sos: invalid len (%d)\n", len);
1375 /* XXX: only interleaved scan accepted */
1376 if (nb_components != s->nb_components)
1378 dprintf("decode_sos: components(%d) mismatch\n", nb_components);
1383 for(i=0;i<nb_components;i++) {
1384 id = get_bits(&s->gb, 8) - 1;
1385 dprintf("component: %d\n", id);
1386 /* find component index */
1387 for(index=0;index<s->nb_components;index++)
1388 if (id == s->component_id[index])
1390 if (index == s->nb_components)
1392 dprintf("decode_sos: index(%d) out of components\n", index);
1396 s->comp_index[i] = index;
1398 s->nb_blocks[i] = s->h_count[index] * s->v_count[index];
1399 s->h_scount[i] = s->h_count[index];
1400 s->v_scount[i] = s->v_count[index];
1402 s->dc_index[i] = get_bits(&s->gb, 4);
1403 s->ac_index[i] = get_bits(&s->gb, 4);
1405 if (s->dc_index[i] < 0 || s->ac_index[i] < 0 ||
1406 s->dc_index[i] >= 4 || s->ac_index[i] >= 4)
1409 switch(s->start_code)
1412 if (dc_index[i] > 1 || ac_index[i] > 1)
1417 if (dc_index[i] > 3 || ac_index[i] > 3)
1421 if (dc_index[i] > 3 || ac_index[i] != 0)
1428 predictor= get_bits(&s->gb, 8); /* lossless predictor or start of spectral (Ss) */
1429 skip_bits(&s->gb, 8); /* Se */
1430 skip_bits(&s->gb, 4); /* Ah */
1431 point_transform= get_bits(&s->gb, 4); /* Al */
1433 for(i=0;i<nb_components;i++)
1434 s->last_dc[i] = 1024;
1436 if (nb_components > 1) {
1437 /* interleaved stream */
1438 s->mb_width = (s->width + s->h_max * block_size - 1) / (s->h_max * block_size);
1439 s->mb_height = (s->height + s->v_max * block_size - 1) / (s->v_max * block_size);
1441 h = s->h_max / s->h_scount[s->comp_index[0]];
1442 v = s->v_max / s->v_scount[s->comp_index[0]];
1443 s->mb_width = (s->width + h * block_size - 1) / (h * block_size);
1444 s->mb_height = (s->height + v * block_size - 1) / (v * block_size);
1445 s->nb_blocks[0] = 1;
1450 if(s->avctx->debug & FF_DEBUG_PICT_INFO)
1451 av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d\n", s->lossless ? "lossless" : "sequencial DCT", s->rgb ? "RGB" : "", predictor, point_transform);
1455 if(ljpeg_decode_rgb_scan(s, predictor, point_transform) < 0)
1458 if(ljpeg_decode_yuv_scan(s, predictor, point_transform) < 0)
1462 if(mjpeg_decode_scan(s) < 0)
1468 dprintf("decode_sos: ac/dc index out of range\n");
1472 static int mjpeg_decode_dri(MJpegDecodeContext *s)
1474 if (get_bits(&s->gb, 16) != 4)
1476 s->restart_interval = get_bits(&s->gb, 16);
1477 dprintf("restart interval: %d\n", s->restart_interval);
1482 static int mjpeg_decode_app(MJpegDecodeContext *s)
1486 /* XXX: verify len field validity */
1487 len = get_bits(&s->gb, 16);
1491 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
1495 if(s->avctx->debug & FF_DEBUG_STARTCODE){
1496 av_log(s->avctx, AV_LOG_DEBUG, "APPx %8X\n", id);
1499 /* buggy AVID, it puts EOI only at every 10th frame */
1500 /* also this fourcc is used by non-avid files too, it holds some
1501 informations, but it's always present in AVID creates files */
1502 if (id == ff_get_fourcc("AVI1"))
1509 4bytes field_size_less_padding
1512 // if (s->first_picture)
1513 // printf("mjpeg: workarounding buggy AVID\n");
1514 s->interlace_polarity = get_bits(&s->gb, 8);
1516 skip_bits(&s->gb, 8);
1517 skip_bits(&s->gb, 32);
1518 skip_bits(&s->gb, 32);
1521 // if (s->interlace_polarity)
1522 // printf("mjpeg: interlace polarity: %d\n", s->interlace_polarity);
1528 if (id == ff_get_fourcc("JFIF"))
1531 skip_bits(&s->gb, 8); /* the trailing zero-byte */
1532 av_log(s->avctx, AV_LOG_INFO, "mjpeg: JFIF header found (version: %x.%x)\n",
1533 get_bits(&s->gb, 8), get_bits(&s->gb, 8));
1534 skip_bits(&s->gb, 8);
1536 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 16);
1537 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 16);
1539 t_w = get_bits(&s->gb, 8);
1540 t_h = get_bits(&s->gb, 8);
1543 /* skip thumbnail */
1544 if (len-10-(t_w*t_h*3) > 0)
1551 if (id == ff_get_fourcc("Adob") && (get_bits(&s->gb, 8) == 'e'))
1553 av_log(s->avctx, AV_LOG_INFO, "mjpeg: Adobe header found\n");
1554 skip_bits(&s->gb, 16); /* version */
1555 skip_bits(&s->gb, 16); /* flags0 */
1556 skip_bits(&s->gb, 16); /* flags1 */
1557 skip_bits(&s->gb, 8); /* transform */
1562 if (id == ff_get_fourcc("LJIF")){
1563 av_log(s->avctx, AV_LOG_INFO, "Pegasus lossless jpeg header found\n");
1564 skip_bits(&s->gb, 16); /* version ? */
1565 skip_bits(&s->gb, 16); /* unknwon always 0? */
1566 skip_bits(&s->gb, 16); /* unknwon always 0? */
1567 skip_bits(&s->gb, 16); /* unknwon always 0? */
1568 switch( get_bits(&s->gb, 8)){
1578 av_log(s->avctx, AV_LOG_ERROR, "unknown colorspace\n");
1585 if ((s->start_code == APP1) && (len > (0x28 - 8)))
1587 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
1590 if (id == ff_get_fourcc("mjpg")) /* Apple MJPEG-A */
1593 skip_bits(&s->gb, 32); /* field size */
1594 skip_bits(&s->gb, 32); /* pad field size */
1595 skip_bits(&s->gb, 32); /* next off */
1596 skip_bits(&s->gb, 32); /* quant off */
1597 skip_bits(&s->gb, 32); /* huff off */
1598 skip_bits(&s->gb, 32); /* image off */
1599 skip_bits(&s->gb, 32); /* scan off */
1600 skip_bits(&s->gb, 32); /* data off */
1602 if (s->first_picture)
1603 av_log(s->avctx, AV_LOG_INFO, "mjpeg: Apple MJPEG-A header found\n");
1608 /* slow but needed for extreme adobe jpegs */
1610 av_log(s->avctx, AV_LOG_ERROR, "mjpeg: error, decode_app parser read over the end\n");
1612 skip_bits(&s->gb, 8);
1617 static int mjpeg_decode_com(MJpegDecodeContext *s)
1619 /* XXX: verify len field validity */
1620 int len = get_bits(&s->gb, 16);
1621 if (len >= 2 && len < 32768) {
1622 /* XXX: any better upper bound */
1623 uint8_t *cbuf = av_malloc(len - 1);
1626 for (i = 0; i < len - 2; i++)
1627 cbuf[i] = get_bits(&s->gb, 8);
1628 if (i > 0 && cbuf[i-1] == '\n')
1633 av_log(s->avctx, AV_LOG_INFO, "mjpeg comment: '%s'\n", cbuf);
1635 /* buggy avid, it puts EOI only at every 10th frame */
1636 if (!strcmp(cbuf, "AVID"))
1639 // if (s->first_picture)
1640 // printf("mjpeg: workarounding buggy AVID\n");
1651 static int valid_marker_list[] =
1653 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f */
1654 /* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1655 /* 1 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1656 /* 2 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1657 /* 3 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1658 /* 4 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1659 /* 5 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1660 /* 6 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1661 /* 7 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1662 /* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1663 /* 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1664 /* a */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1665 /* b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1666 /* c */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1667 /* d */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1668 /* e */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1669 /* f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1673 /* return the 8 bit start code value and update the search
1674 state. Return -1 if no start code found */
1675 static int find_marker(uint8_t **pbuf_ptr, uint8_t *buf_end)
1684 buf_ptr = *pbuf_ptr;
1685 while (buf_ptr < buf_end) {
1688 if ((v == 0xff) && (v2 >= 0xc0) && (v2 <= 0xfe) && buf_ptr < buf_end) {
1699 dprintf("find_marker skipped %d bytes\n", skipped);
1701 *pbuf_ptr = buf_ptr;
1705 static int mjpeg_decode_frame(AVCodecContext *avctx,
1706 void *data, int *data_size,
1707 uint8_t *buf, int buf_size)
1709 MJpegDecodeContext *s = avctx->priv_data;
1710 uint8_t *buf_end, *buf_ptr;
1712 AVFrame *picture = data;
1716 /* no supplementary picture */
1721 buf_end = buf + buf_size;
1722 while (buf_ptr < buf_end) {
1723 /* find start next marker */
1724 start_code = find_marker(&buf_ptr, buf_end);
1727 if (start_code < 0) {
1730 dprintf("marker=%x avail_size_in_buf=%d\n", start_code, buf_end - buf_ptr);
1732 if ((buf_end - buf_ptr) > s->buffer_size)
1735 s->buffer_size = buf_end-buf_ptr;
1736 s->buffer = av_malloc(s->buffer_size);
1737 dprintf("buffer too small, expanding to %d bytes\n",
1741 /* unescape buffer of SOS */
1742 if (start_code == SOS)
1744 uint8_t *src = buf_ptr;
1745 uint8_t *dst = s->buffer;
1749 uint8_t x = *(src++);
1754 while(*src == 0xff) src++;
1757 if (x >= 0xd0 && x <= 0xd7)
1763 init_get_bits(&s->gb, s->buffer, (dst - s->buffer)*8);
1765 dprintf("escaping removed %d bytes\n",
1766 (buf_end - buf_ptr) - (dst - s->buffer));
1769 init_get_bits(&s->gb, buf_ptr, (buf_end - buf_ptr)*8);
1771 s->start_code = start_code;
1772 if(s->avctx->debug & FF_DEBUG_STARTCODE){
1773 av_log(s->avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code);
1776 /* process markers */
1777 if (start_code >= 0xd0 && start_code <= 0xd7) {
1778 dprintf("restart marker: %d\n", start_code&0x0f);
1779 } else if (s->first_picture) {
1781 if (start_code >= 0xe0 && start_code <= 0xef)
1782 mjpeg_decode_app(s);
1784 else if (start_code == COM)
1785 mjpeg_decode_com(s);
1788 switch(start_code) {
1790 s->restart_interval = 0;
1791 /* nothing to do on SOI */
1794 mjpeg_decode_dqt(s);
1797 if(mjpeg_decode_dht(s) < 0){
1798 av_log(s->avctx, AV_LOG_ERROR, "huffman table decode error\n");
1804 if (mjpeg_decode_sof(s) < 0)
1809 if (mjpeg_decode_sof(s) < 0)
1813 if ((s->buggy_avid && !s->interlaced) || s->restart_interval)
1817 if (s->interlaced) {
1818 s->bottom_field ^= 1;
1819 /* if not bottom field, do not output image yet */
1820 if (s->bottom_field)
1823 *picture = s->picture;
1824 *data_size = sizeof(AVFrame);
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 av_log(s->avctx, AV_LOG_DEBUG, "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 av_log(s->avctx, AV_LOG_ERROR, "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);
1981 picture->quality= FFMAX(FFMAX(s->qscale[0], s->qscale[1]), s->qscale[2]);
1982 picture->qstride= 0;
1983 picture->qscale_table= s->qscale_table;
1984 memset(picture->qscale_table, picture->quality, (s->width+15)/16);
1985 if(avctx->debug & FF_DEBUG_QP)
1986 av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", picture->quality);
1987 picture->quality*= FF_QP2LAMBDA;
1990 return buf_ptr - buf;
1995 static int sp5x_decode_frame(AVCodecContext *avctx,
1996 void *data, int *data_size,
1997 uint8_t *buf, int buf_size)
2000 MJpegDecodeContext *s = avctx->priv_data;
2002 const int qscale = 5;
2003 uint8_t *buf_ptr, *buf_end, *recoded;
2008 /* no supplementary picture */
2012 if (!avctx->width || !avctx->height)
2016 buf_end = buf + buf_size;
2019 recoded = av_mallocz(buf_size + 1024);
2024 recoded[j++] = 0xFF;
2025 recoded[j++] = 0xD8;
2027 memcpy(recoded+j, &sp5x_data_dqt[0], sizeof(sp5x_data_dqt));
2028 memcpy(recoded+j+5, &sp5x_quant_table[qscale * 2], 64);
2029 memcpy(recoded+j+70, &sp5x_quant_table[(qscale * 2) + 1], 64);
2030 j += sizeof(sp5x_data_dqt);
2032 memcpy(recoded+j, &sp5x_data_dht[0], sizeof(sp5x_data_dht));
2033 j += sizeof(sp5x_data_dht);
2035 memcpy(recoded+j, &sp5x_data_sof[0], sizeof(sp5x_data_sof));
2036 recoded[j+5] = (avctx->height >> 8) & 0xFF;
2037 recoded[j+6] = avctx->height & 0xFF;
2038 recoded[j+7] = (avctx->width >> 8) & 0xFF;
2039 recoded[j+8] = avctx->width & 0xFF;
2040 j += sizeof(sp5x_data_sof);
2042 memcpy(recoded+j, &sp5x_data_sos[0], sizeof(sp5x_data_sos));
2043 j += sizeof(sp5x_data_sos);
2045 for (i = 14; i < buf_size && j < buf_size+1024-2; i++)
2047 recoded[j++] = buf[i];
2053 recoded[j++] = 0xFF;
2054 recoded[j++] = 0xD9;
2056 i = mjpeg_decode_frame(avctx, data, data_size, recoded, j);
2063 s->width = avctx->width;
2064 s->height = avctx->height;
2065 s->nb_components = 3;
2066 s->component_id[0] = 0;
2069 s->quant_index[0] = 0;
2070 s->component_id[1] = 1;
2073 s->quant_index[1] = 1;
2074 s->component_id[2] = 2;
2077 s->quant_index[2] = 1;
2081 s->qscale_table = av_mallocz((s->width+15)/16);
2082 avctx->pix_fmt = PIX_FMT_YUV420P;
2085 s->picture.reference = 0;
2086 if (avctx->get_buffer(avctx, &s->picture) < 0)
2088 fprintf(stderr, "get_buffer() failed\n");
2092 s->picture.pict_type = I_TYPE;
2093 s->picture.key_frame = 1;
2095 for (i = 0; i < 3; i++)
2096 s->linesize[i] = s->picture.linesize[i] << s->interlaced;
2099 for (i = 0; i < 64; i++)
2101 j = s->scantable.permutated[i];
2102 s->quant_matrixes[0][j] = sp5x_quant_table[(qscale * 2) + i];
2104 s->qscale[0] = FFMAX(
2105 s->quant_matrixes[0][s->scantable.permutated[1]],
2106 s->quant_matrixes[0][s->scantable.permutated[8]]) >> 1;
2108 for (i = 0; i < 64; i++)
2110 j = s->scantable.permutated[i];
2111 s->quant_matrixes[1][j] = sp5x_quant_table[(qscale * 2) + 1 + i];
2113 s->qscale[1] = FFMAX(
2114 s->quant_matrixes[1][s->scantable.permutated[1]],
2115 s->quant_matrixes[1][s->scantable.permutated[8]]) >> 1;
2120 s->comp_index[0] = 0;
2121 s->nb_blocks[0] = s->h_count[0] * s->v_count[0];
2122 s->h_scount[0] = s->h_count[0];
2123 s->v_scount[0] = s->v_count[0];
2127 s->comp_index[1] = 1;
2128 s->nb_blocks[1] = s->h_count[1] * s->v_count[1];
2129 s->h_scount[1] = s->h_count[1];
2130 s->v_scount[1] = s->v_count[1];
2134 s->comp_index[2] = 2;
2135 s->nb_blocks[2] = s->h_count[2] * s->v_count[2];
2136 s->h_scount[2] = s->h_count[2];
2137 s->v_scount[2] = s->v_count[2];
2141 for (i = 0; i < 3; i++)
2142 s->last_dc[i] = 1024;
2144 s->mb_width = (s->width * s->h_max * 8 -1) / (s->h_max * 8);
2145 s->mb_height = (s->height * s->v_max * 8 -1) / (s->v_max * 8);
2147 init_get_bits(&s->gb, buf+14, (buf_size-14)*8);
2149 return mjpeg_decode_scan(s);
2155 static int mjpeg_decode_end(AVCodecContext *avctx)
2157 MJpegDecodeContext *s = avctx->priv_data;
2161 av_free(s->qscale_table);
2162 avcodec_default_free_buffers(avctx);
2166 free_vlc(&s->vlcs[i][j]);
2171 AVCodec mjpeg_decoder = {
2175 sizeof(MJpegDecodeContext),
2184 AVCodec mjpegb_decoder = {
2188 sizeof(MJpegDecodeContext),
2192 mjpegb_decode_frame,
2197 AVCodec sp5x_decoder = {
2201 sizeof(MJpegDecodeContext),
2210 #ifdef CONFIG_ENCODERS
2211 AVCodec ljpeg_encoder = { //FIXME avoid MPV_* lossless jpeg shouldnt need them
2215 sizeof(MpegEncContext),
2217 encode_picture_lossless,