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", 1); /* 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, 1);
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= put_bits_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 ff_mjpeg_stuffing(PutBitContext * pbc)
537 length= (-put_bits_count(pbc))&7;
538 if(length) put_bits(pbc, length, (1<<length)-1);
541 void mjpeg_picture_trailer(MpegEncContext *s)
543 ff_mjpeg_stuffing(&s->pb);
544 flush_put_bits(&s->pb);
546 assert((s->header_bits&7)==0);
548 escape_FF(s, s->header_bits>>3);
550 put_marker(&s->pb, EOI);
553 static inline void mjpeg_encode_dc(MpegEncContext *s, int val,
554 uint8_t *huff_size, uint16_t *huff_code)
559 put_bits(&s->pb, huff_size[0], huff_code[0]);
567 nbits= av_log2_16bit(val) + 1;
569 put_bits(&s->pb, huff_size[nbits], huff_code[nbits]);
571 put_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
575 static void encode_block(MpegEncContext *s, DCTELEM *block, int n)
577 int mant, nbits, code, i, j;
578 int component, dc, run, last_index, val;
579 MJpegContext *m = s->mjpeg_ctx;
580 uint8_t *huff_size_ac;
581 uint16_t *huff_code_ac;
584 component = (n <= 3 ? 0 : n - 4 + 1);
585 dc = block[0]; /* overflow is impossible */
586 val = dc - s->last_dc[component];
588 mjpeg_encode_dc(s, val, m->huff_size_dc_luminance, m->huff_code_dc_luminance);
589 huff_size_ac = m->huff_size_ac_luminance;
590 huff_code_ac = m->huff_code_ac_luminance;
592 mjpeg_encode_dc(s, val, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
593 huff_size_ac = m->huff_size_ac_chrominance;
594 huff_code_ac = m->huff_code_ac_chrominance;
596 s->last_dc[component] = dc;
601 last_index = s->block_last_index[n];
602 for(i=1;i<=last_index;i++) {
603 j = s->intra_scantable.permutated[i];
609 put_bits(&s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]);
618 nbits= av_log2(val) + 1;
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 static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
643 MpegEncContext * const s = avctx->priv_data;
644 MJpegContext * const m = s->mjpeg_ctx;
645 AVFrame *pict = data;
646 const int width= s->width;
647 const int height= s->height;
648 AVFrame * const p= (AVFrame*)&s->current_picture;
649 const int predictor= avctx->prediction_method+1;
651 init_put_bits(&s->pb, buf, buf_size);
654 p->pict_type= FF_I_TYPE;
657 mjpeg_picture_header(s);
659 s->header_bits= put_bits_count(&s->pb);
661 if(avctx->pix_fmt == PIX_FMT_RGBA32){
663 const int linesize= p->linesize[0];
664 uint16_t buffer[2048][4];
665 int left[3], top[3], topleft[3];
668 buffer[0][i]= 1 << (9 - 1);
671 for(y = 0; y < height; y++) {
672 const int modified_predictor= y ? predictor : 1;
673 uint8_t *ptr = p->data[0] + (linesize * y);
676 top[i]= left[i]= topleft[i]= buffer[0][i];
678 for(x = 0; x < width; x++) {
679 buffer[x][1] = ptr[4*x+0] - ptr[4*x+1] + 0x100;
680 buffer[x][2] = ptr[4*x+2] - ptr[4*x+1] + 0x100;
681 buffer[x][0] = (ptr[4*x+0] + 2*ptr[4*x+1] + ptr[4*x+2])>>2;
686 PREDICT(pred, topleft[i], top[i], left[i], modified_predictor);
689 top[i]= buffer[x+1][i];
691 left[i]= buffer[x][i];
693 diff= ((left[i] - pred + 0x100)&0x1FF) - 0x100;
696 mjpeg_encode_dc(s, diff, m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly
698 mjpeg_encode_dc(s, diff, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
704 const int mb_width = (width + s->mjpeg_hsample[0] - 1) / s->mjpeg_hsample[0];
705 const int mb_height = (height + s->mjpeg_vsample[0] - 1) / s->mjpeg_vsample[0];
707 for(mb_y = 0; mb_y < mb_height; mb_y++) {
708 for(mb_x = 0; mb_x < mb_width; mb_x++) {
709 if(mb_x==0 || mb_y==0){
712 int x, y, h, v, linesize;
713 h = s->mjpeg_hsample[i];
714 v = s->mjpeg_vsample[i];
715 linesize= p->linesize[i];
721 ptr = p->data[i] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
730 pred= ptr[-linesize];
732 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
737 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly
739 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
746 int x, y, h, v, linesize;
747 h = s->mjpeg_hsample[i];
748 v = s->mjpeg_vsample[i];
749 linesize= p->linesize[i];
755 ptr = p->data[i] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
756 //printf("%d %d %d %d %8X\n", mb_x, mb_y, x, y, ptr);
757 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
760 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly
762 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
773 mjpeg_picture_trailer(s);
776 flush_put_bits(&s->pb);
777 return pbBufPtr(&s->pb) - s->pb.buf;
778 // return (put_bits_count(&f->pb)+7)/8;
781 #endif //CONFIG_ENCODERS
783 /******************************************/
786 #define MAX_COMPONENTS 4
788 typedef struct MJpegDecodeContext {
789 AVCodecContext *avctx;
791 int mpeg_enc_ctx_allocated; /* true if decoding context allocated */
793 int start_code; /* current start code */
797 int16_t quant_matrixes[4][64];
799 int qscale[4]; ///< quantizer scale calculated from quant_matrixes
801 int org_height; /* size given at codec init */
802 int first_picture; /* true if decoding first picture */
803 int interlaced; /* true if interlaced */
804 int bottom_field; /* true if bottom field */
807 int rct; /* standard rct */
808 int pegasus_rct; /* pegasus reversible colorspace transform */
809 int bits; /* bits per component */
812 int mb_width, mb_height;
814 int component_id[MAX_COMPONENTS];
815 int h_count[MAX_COMPONENTS]; /* horizontal and vertical count for each component */
816 int v_count[MAX_COMPONENTS];
817 int comp_index[MAX_COMPONENTS];
818 int dc_index[MAX_COMPONENTS];
819 int ac_index[MAX_COMPONENTS];
820 int nb_blocks[MAX_COMPONENTS];
821 int h_scount[MAX_COMPONENTS];
822 int v_scount[MAX_COMPONENTS];
823 int h_max, v_max; /* maximum h and v counts */
824 int quant_index[4]; /* quant table index for each component */
825 int last_dc[MAX_COMPONENTS]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */
826 AVFrame picture; /* picture structure */
827 int linesize[MAX_COMPONENTS]; ///< linesize << interlaced
828 uint8_t *qscale_table;
829 DCTELEM block[64] __align8;
831 void (*idct_put)(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/);
833 int restart_interval;
837 int interlace_polarity;
838 } MJpegDecodeContext;
840 static int mjpeg_decode_dht(MJpegDecodeContext *s);
842 static int build_vlc(VLC *vlc, const uint8_t *bits_table, const uint8_t *val_table,
845 uint8_t huff_size[256];
846 uint16_t huff_code[256];
848 memset(huff_size, 0, sizeof(huff_size));
849 build_huffman_codes(huff_size, huff_code, bits_table, val_table);
851 return init_vlc(vlc, 9, nb_codes, huff_size, 1, 1, huff_code, 2, 2);
854 static int mjpeg_decode_init(AVCodecContext *avctx)
856 MJpegDecodeContext *s = avctx->priv_data;
861 /* ugly way to get the idct & scantable FIXME */
862 memset(&s2, 0, sizeof(MpegEncContext));
864 // s2->out_format = FMT_MJPEG;
865 dsputil_init(&s2.dsp, avctx);
866 DCT_common_init(&s2);
868 s->scantable= s2.intra_scantable;
869 s->idct_put= s2.dsp.idct_put;
871 s->mpeg_enc_ctx_allocated = 0;
872 s->buffer_size = 102400; /* smaller buffer should be enough,
873 but photojpg files could ahive bigger sizes */
874 s->buffer = av_malloc(s->buffer_size);
878 s->first_picture = 1;
879 s->org_height = avctx->height;
881 build_vlc(&s->vlcs[0][0], bits_dc_luminance, val_dc_luminance, 12);
882 build_vlc(&s->vlcs[0][1], bits_dc_chrominance, val_dc_chrominance, 12);
883 build_vlc(&s->vlcs[1][0], bits_ac_luminance, val_ac_luminance, 251);
884 build_vlc(&s->vlcs[1][1], bits_ac_chrominance, val_ac_chrominance, 251);
886 if (avctx->flags & CODEC_FLAG_EXTERN_HUFF)
888 av_log(avctx, AV_LOG_INFO, "mjpeg: using external huffman table\n");
889 init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8);
891 /* should check for error - but dunno */
897 /* quantize tables */
898 static int mjpeg_decode_dqt(MJpegDecodeContext *s)
900 int len, index, i, j;
902 len = get_bits(&s->gb, 16) - 2;
905 /* only 8 bit precision handled */
906 if (get_bits(&s->gb, 4) != 0)
908 dprintf("dqt: 16bit precision\n");
911 index = get_bits(&s->gb, 4);
914 dprintf("index=%d\n", index);
915 /* read quant table */
917 j = s->scantable.permutated[i];
918 s->quant_matrixes[index][j] = get_bits(&s->gb, 8);
921 //XXX FIXME finetune, and perhaps add dc too
922 s->qscale[index]= FFMAX(
923 s->quant_matrixes[index][s->scantable.permutated[1]],
924 s->quant_matrixes[index][s->scantable.permutated[8]]) >> 1;
925 dprintf("qscale[%d]: %d\n", index, s->qscale[index]);
932 /* decode huffman tables and build VLC decoders */
933 static int mjpeg_decode_dht(MJpegDecodeContext *s)
935 int len, index, i, class, n, v, code_max;
936 uint8_t bits_table[17];
937 uint8_t val_table[256];
939 len = get_bits(&s->gb, 16) - 2;
944 class = get_bits(&s->gb, 4);
947 index = get_bits(&s->gb, 4);
952 bits_table[i] = get_bits(&s->gb, 8);
956 if (len < n || n > 256)
961 v = get_bits(&s->gb, 8);
968 /* build VLC and flush previous vlc if present */
969 free_vlc(&s->vlcs[class][index]);
970 dprintf("class=%d index=%d nb_codes=%d\n",
971 class, index, code_max + 1);
972 if(build_vlc(&s->vlcs[class][index], bits_table, val_table, code_max + 1) < 0){
979 static int mjpeg_decode_sof(MJpegDecodeContext *s)
981 int len, nb_components, i, width, height;
983 /* XXX: verify len field validity */
984 len = get_bits(&s->gb, 16);
985 s->bits= get_bits(&s->gb, 8);
987 if(s->pegasus_rct) s->bits=9;
988 if(s->bits==9 && !s->pegasus_rct) s->rct=1; //FIXME ugly
990 if (s->bits != 8 && !s->lossless){
991 av_log(s->avctx, AV_LOG_ERROR, "only 8 bits/component accepted\n");
994 height = get_bits(&s->gb, 16);
995 width = get_bits(&s->gb, 16);
996 dprintf("sof0: picture: %dx%d\n", width, height);
998 nb_components = get_bits(&s->gb, 8);
999 if (nb_components <= 0 ||
1000 nb_components > MAX_COMPONENTS)
1002 s->nb_components = nb_components;
1005 for(i=0;i<nb_components;i++) {
1007 s->component_id[i] = get_bits(&s->gb, 8) - 1;
1008 s->h_count[i] = get_bits(&s->gb, 4);
1009 s->v_count[i] = get_bits(&s->gb, 4);
1010 /* compute hmax and vmax (only used in interleaved case) */
1011 if (s->h_count[i] > s->h_max)
1012 s->h_max = s->h_count[i];
1013 if (s->v_count[i] > s->v_max)
1014 s->v_max = s->v_count[i];
1015 s->quant_index[i] = get_bits(&s->gb, 8);
1016 if (s->quant_index[i] >= 4)
1018 dprintf("component %d %d:%d id: %d quant:%d\n", i, s->h_count[i],
1019 s->v_count[i], s->component_id[i], s->quant_index[i]);
1022 if(s->v_max==1 && s->h_max==1 && s->lossless==1) s->rgb=1;
1024 /* if different size, realloc/alloc picture */
1025 /* XXX: also check h_count and v_count */
1026 if (width != s->width || height != s->height) {
1027 av_freep(&s->qscale_table);
1031 s->avctx->width = s->width;
1032 s->avctx->height = s->height;
1034 /* test interlaced mode */
1035 if (s->first_picture &&
1036 s->org_height != 0 &&
1037 s->height < ((s->org_height * 3) / 4)) {
1039 // s->bottom_field = (s->interlace_polarity) ? 1 : 0;
1040 s->bottom_field = 0;
1041 s->avctx->height *= 2;
1044 s->qscale_table= av_mallocz((s->width+15)/16);
1046 s->first_picture = 0;
1049 if(s->interlaced && s->bottom_field)
1052 /* XXX: not complete test ! */
1053 switch((s->h_count[0] << 4) | s->v_count[0]) {
1056 s->avctx->pix_fmt = PIX_FMT_RGBA32;
1057 }else if(s->nb_components==3)
1058 s->avctx->pix_fmt = PIX_FMT_YUV444P;
1060 s->avctx->pix_fmt = PIX_FMT_GRAY8;
1063 s->avctx->pix_fmt = PIX_FMT_YUV422P;
1067 s->avctx->pix_fmt = PIX_FMT_YUV420P;
1071 if(s->picture.data[0])
1072 s->avctx->release_buffer(s->avctx, &s->picture);
1074 s->picture.reference= 0;
1075 if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){
1076 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1079 s->picture.pict_type= I_TYPE;
1080 s->picture.key_frame= 1;
1083 s->linesize[i]= s->picture.linesize[i] << s->interlaced;
1086 // printf("%d %d %d %d %d %d\n", s->width, s->height, s->linesize[0], s->linesize[1], s->interlaced, s->avctx->height);
1088 if (len != (8+(3*nb_components)))
1090 dprintf("decode_sof0: error, len(%d) mismatch\n", len);
1096 static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
1099 code = get_vlc2(&s->gb, s->vlcs[0][dc_index].table, 9, 2);
1102 dprintf("mjpeg_decode_dc: bad vlc: %d:%d (%p)\n", 0, dc_index,
1103 &s->vlcs[0][dc_index]);
1108 return get_xbits(&s->gb, code);
1113 /* decode block and dequantize */
1114 static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
1115 int component, int dc_index, int ac_index, int quant_index)
1117 int code, i, j, level, val;
1119 int16_t *quant_matrix;
1122 val = mjpeg_decode_dc(s, dc_index);
1123 if (val == 0xffff) {
1124 dprintf("error dc\n");
1127 quant_matrix = s->quant_matrixes[quant_index];
1128 val = val * quant_matrix[0] + s->last_dc[component];
1129 s->last_dc[component] = val;
1132 ac_vlc = &s->vlcs[1][ac_index];
1135 code = get_vlc2(&s->gb, s->vlcs[1][ac_index].table, 9, 2);
1138 dprintf("error ac\n");
1147 level = get_xbits(&s->gb, code & 0xf);
1150 dprintf("error count: %d\n", i);
1153 j = s->scantable.permutated[i];
1154 block[j] = level * quant_matrix[j];
1163 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point_transform){
1165 uint16_t buffer[2048][4];
1166 int left[3], top[3], topleft[3];
1167 const int linesize= s->linesize[0];
1168 const int mask= (1<<s->bits)-1;
1171 buffer[0][i]= 1 << (s->bits + point_transform - 1);
1173 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1174 const int modified_predictor= mb_y ? predictor : 1;
1175 uint8_t *ptr = s->picture.data[0] + (linesize * mb_y);
1177 if (s->interlaced && s->bottom_field)
1178 ptr += linesize >> 1;
1181 top[i]= left[i]= topleft[i]= buffer[0][i];
1183 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1184 if (s->restart_interval && !s->restart_count)
1185 s->restart_count = s->restart_interval;
1191 top[i]= buffer[mb_x][i];
1193 PREDICT(pred, topleft[i], top[i], left[i], modified_predictor);
1196 buffer[mb_x][i]= mask & (pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform));
1199 if (s->restart_interval && !--s->restart_count) {
1200 align_get_bits(&s->gb);
1201 skip_bits(&s->gb, 16); /* skip RSTn */
1206 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1207 ptr[4*mb_x+1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200)>>2);
1208 ptr[4*mb_x+0] = buffer[mb_x][1] + ptr[4*mb_x+1];
1209 ptr[4*mb_x+2] = buffer[mb_x][2] + ptr[4*mb_x+1];
1211 }else if(s->pegasus_rct){
1212 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1213 ptr[4*mb_x+1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2])>>2);
1214 ptr[4*mb_x+0] = buffer[mb_x][1] + ptr[4*mb_x+1];
1215 ptr[4*mb_x+2] = buffer[mb_x][2] + ptr[4*mb_x+1];
1218 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1219 ptr[4*mb_x+0] = buffer[mb_x][0];
1220 ptr[4*mb_x+1] = buffer[mb_x][1];
1221 ptr[4*mb_x+2] = buffer[mb_x][2];
1228 static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point_transform){
1230 const int nb_components=3;
1232 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1233 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1234 if (s->restart_interval && !s->restart_count)
1235 s->restart_count = s->restart_interval;
1237 if(mb_x==0 || mb_y==0 || s->interlaced){
1238 for(i=0;i<nb_components;i++) {
1240 int n, h, v, x, y, c, j, linesize;
1241 n = s->nb_blocks[i];
1242 c = s->comp_index[i];
1247 linesize= s->linesize[c];
1249 for(j=0; j<n; j++) {
1252 ptr = s->picture.data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
1253 if(y==0 && mb_y==0){
1254 if(x==0 && mb_x==0){
1255 pred= 128 << point_transform;
1260 if(x==0 && mb_x==0){
1261 pred= ptr[-linesize];
1263 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1267 if (s->interlaced && s->bottom_field)
1268 ptr += linesize >> 1;
1269 *ptr= pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform);
1278 for(i=0;i<nb_components;i++) {
1280 int n, h, v, x, y, c, j, linesize;
1281 n = s->nb_blocks[i];
1282 c = s->comp_index[i];
1287 linesize= s->linesize[c];
1289 for(j=0; j<n; j++) {
1292 ptr = s->picture.data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
1293 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1294 *ptr= pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform);
1302 if (s->restart_interval && !--s->restart_count) {
1303 align_get_bits(&s->gb);
1304 skip_bits(&s->gb, 16); /* skip RSTn */
1311 static int mjpeg_decode_scan(MJpegDecodeContext *s){
1313 const int nb_components=3;
1315 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1316 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1317 if (s->restart_interval && !s->restart_count)
1318 s->restart_count = s->restart_interval;
1320 for(i=0;i<nb_components;i++) {
1322 int n, h, v, x, y, c, j;
1323 n = s->nb_blocks[i];
1324 c = s->comp_index[i];
1330 memset(s->block, 0, sizeof(s->block));
1331 if (decode_block(s, s->block, i,
1332 s->dc_index[i], s->ac_index[i],
1333 s->quant_index[c]) < 0) {
1334 dprintf("error y=%d x=%d\n", mb_y, mb_x);
1337 // dprintf("mb: %d %d processed\n", mb_y, mb_x);
1338 ptr = s->picture.data[c] +
1339 (s->linesize[c] * (v * mb_y + y) * 8) +
1341 if (s->interlaced && s->bottom_field)
1342 ptr += s->linesize[c] >> 1;
1343 //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);
1344 s->idct_put(ptr, s->linesize[c], s->block);
1351 /* (< 1350) buggy workaround for Spectralfan.mov, should be fixed */
1352 if (s->restart_interval && (s->restart_interval < 1350) &&
1353 !--s->restart_count) {
1354 align_get_bits(&s->gb);
1355 skip_bits(&s->gb, 16); /* skip RSTn */
1356 for (i=0; i<nb_components; i++) /* reset dc */
1357 s->last_dc[i] = 1024;
1364 static int mjpeg_decode_sos(MJpegDecodeContext *s)
1366 int len, nb_components, i, h, v, predictor, point_transform;
1367 int vmax, hmax, index, id;
1368 const int block_size= s->lossless ? 1 : 8;
1370 /* XXX: verify len field validity */
1371 len = get_bits(&s->gb, 16);
1372 nb_components = get_bits(&s->gb, 8);
1373 if (len != 6+2*nb_components)
1375 dprintf("decode_sos: invalid len (%d)\n", len);
1378 /* XXX: only interleaved scan accepted */
1379 if (nb_components != s->nb_components)
1381 dprintf("decode_sos: components(%d) mismatch\n", nb_components);
1386 for(i=0;i<nb_components;i++) {
1387 id = get_bits(&s->gb, 8) - 1;
1388 dprintf("component: %d\n", id);
1389 /* find component index */
1390 for(index=0;index<s->nb_components;index++)
1391 if (id == s->component_id[index])
1393 if (index == s->nb_components)
1395 dprintf("decode_sos: index(%d) out of components\n", index);
1399 s->comp_index[i] = index;
1401 s->nb_blocks[i] = s->h_count[index] * s->v_count[index];
1402 s->h_scount[i] = s->h_count[index];
1403 s->v_scount[i] = s->v_count[index];
1405 s->dc_index[i] = get_bits(&s->gb, 4);
1406 s->ac_index[i] = get_bits(&s->gb, 4);
1408 if (s->dc_index[i] < 0 || s->ac_index[i] < 0 ||
1409 s->dc_index[i] >= 4 || s->ac_index[i] >= 4)
1412 switch(s->start_code)
1415 if (dc_index[i] > 1 || ac_index[i] > 1)
1420 if (dc_index[i] > 3 || ac_index[i] > 3)
1424 if (dc_index[i] > 3 || ac_index[i] != 0)
1431 predictor= get_bits(&s->gb, 8); /* lossless predictor or start of spectral (Ss) */
1432 skip_bits(&s->gb, 8); /* Se */
1433 skip_bits(&s->gb, 4); /* Ah */
1434 point_transform= get_bits(&s->gb, 4); /* Al */
1436 for(i=0;i<nb_components;i++)
1437 s->last_dc[i] = 1024;
1439 if (nb_components > 1) {
1440 /* interleaved stream */
1441 s->mb_width = (s->width + s->h_max * block_size - 1) / (s->h_max * block_size);
1442 s->mb_height = (s->height + s->v_max * block_size - 1) / (s->v_max * block_size);
1444 h = s->h_max / s->h_scount[s->comp_index[0]];
1445 v = s->v_max / s->v_scount[s->comp_index[0]];
1446 s->mb_width = (s->width + h * block_size - 1) / (h * block_size);
1447 s->mb_height = (s->height + v * block_size - 1) / (v * block_size);
1448 s->nb_blocks[0] = 1;
1453 if(s->avctx->debug & FF_DEBUG_PICT_INFO)
1454 av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d\n", s->lossless ? "lossless" : "sequencial DCT", s->rgb ? "RGB" : "", predictor, point_transform);
1458 if(ljpeg_decode_rgb_scan(s, predictor, point_transform) < 0)
1461 if(ljpeg_decode_yuv_scan(s, predictor, point_transform) < 0)
1465 if(mjpeg_decode_scan(s) < 0)
1471 dprintf("decode_sos: ac/dc index out of range\n");
1475 static int mjpeg_decode_dri(MJpegDecodeContext *s)
1477 if (get_bits(&s->gb, 16) != 4)
1479 s->restart_interval = get_bits(&s->gb, 16);
1480 dprintf("restart interval: %d\n", s->restart_interval);
1485 static int mjpeg_decode_app(MJpegDecodeContext *s)
1489 /* XXX: verify len field validity */
1490 len = get_bits(&s->gb, 16);
1494 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
1498 if(s->avctx->debug & FF_DEBUG_STARTCODE){
1499 av_log(s->avctx, AV_LOG_DEBUG, "APPx %8X\n", id);
1502 /* buggy AVID, it puts EOI only at every 10th frame */
1503 /* also this fourcc is used by non-avid files too, it holds some
1504 informations, but it's always present in AVID creates files */
1505 if (id == ff_get_fourcc("AVI1"))
1512 4bytes field_size_less_padding
1515 // if (s->first_picture)
1516 // printf("mjpeg: workarounding buggy AVID\n");
1517 s->interlace_polarity = get_bits(&s->gb, 8);
1519 skip_bits(&s->gb, 8);
1520 skip_bits(&s->gb, 32);
1521 skip_bits(&s->gb, 32);
1524 // if (s->interlace_polarity)
1525 // printf("mjpeg: interlace polarity: %d\n", s->interlace_polarity);
1531 if (id == ff_get_fourcc("JFIF"))
1534 skip_bits(&s->gb, 8); /* the trailing zero-byte */
1535 av_log(s->avctx, AV_LOG_INFO, "mjpeg: JFIF header found (version: %x.%x)\n",
1536 get_bits(&s->gb, 8), get_bits(&s->gb, 8));
1537 skip_bits(&s->gb, 8);
1539 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 16);
1540 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 16);
1542 t_w = get_bits(&s->gb, 8);
1543 t_h = get_bits(&s->gb, 8);
1546 /* skip thumbnail */
1547 if (len-10-(t_w*t_h*3) > 0)
1554 if (id == ff_get_fourcc("Adob") && (get_bits(&s->gb, 8) == 'e'))
1556 av_log(s->avctx, AV_LOG_INFO, "mjpeg: Adobe header found\n");
1557 skip_bits(&s->gb, 16); /* version */
1558 skip_bits(&s->gb, 16); /* flags0 */
1559 skip_bits(&s->gb, 16); /* flags1 */
1560 skip_bits(&s->gb, 8); /* transform */
1565 if (id == ff_get_fourcc("LJIF")){
1566 av_log(s->avctx, AV_LOG_INFO, "Pegasus lossless jpeg header found\n");
1567 skip_bits(&s->gb, 16); /* version ? */
1568 skip_bits(&s->gb, 16); /* unknwon always 0? */
1569 skip_bits(&s->gb, 16); /* unknwon always 0? */
1570 skip_bits(&s->gb, 16); /* unknwon always 0? */
1571 switch( get_bits(&s->gb, 8)){
1581 av_log(s->avctx, AV_LOG_ERROR, "unknown colorspace\n");
1588 if ((s->start_code == APP1) && (len > (0x28 - 8)))
1590 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
1593 if (id == ff_get_fourcc("mjpg")) /* Apple MJPEG-A */
1596 skip_bits(&s->gb, 32); /* field size */
1597 skip_bits(&s->gb, 32); /* pad field size */
1598 skip_bits(&s->gb, 32); /* next off */
1599 skip_bits(&s->gb, 32); /* quant off */
1600 skip_bits(&s->gb, 32); /* huff off */
1601 skip_bits(&s->gb, 32); /* image off */
1602 skip_bits(&s->gb, 32); /* scan off */
1603 skip_bits(&s->gb, 32); /* data off */
1605 if (s->first_picture)
1606 av_log(s->avctx, AV_LOG_INFO, "mjpeg: Apple MJPEG-A header found\n");
1611 /* slow but needed for extreme adobe jpegs */
1613 av_log(s->avctx, AV_LOG_ERROR, "mjpeg: error, decode_app parser read over the end\n");
1615 skip_bits(&s->gb, 8);
1620 static int mjpeg_decode_com(MJpegDecodeContext *s)
1622 /* XXX: verify len field validity */
1623 int len = get_bits(&s->gb, 16);
1624 if (len >= 2 && len < 32768) {
1625 /* XXX: any better upper bound */
1626 uint8_t *cbuf = av_malloc(len - 1);
1629 for (i = 0; i < len - 2; i++)
1630 cbuf[i] = get_bits(&s->gb, 8);
1631 if (i > 0 && cbuf[i-1] == '\n')
1636 av_log(s->avctx, AV_LOG_INFO, "mjpeg comment: '%s'\n", cbuf);
1638 /* buggy avid, it puts EOI only at every 10th frame */
1639 if (!strcmp(cbuf, "AVID"))
1642 // if (s->first_picture)
1643 // printf("mjpeg: workarounding buggy AVID\n");
1654 static int valid_marker_list[] =
1656 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f */
1657 /* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1658 /* 1 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1659 /* 2 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1660 /* 3 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1661 /* 4 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1662 /* 5 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1663 /* 6 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1664 /* 7 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1665 /* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1666 /* 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1667 /* a */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1668 /* b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1669 /* c */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1670 /* d */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1671 /* e */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1672 /* f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1676 /* return the 8 bit start code value and update the search
1677 state. Return -1 if no start code found */
1678 static int find_marker(uint8_t **pbuf_ptr, uint8_t *buf_end)
1687 buf_ptr = *pbuf_ptr;
1688 while (buf_ptr < buf_end) {
1691 if ((v == 0xff) && (v2 >= 0xc0) && (v2 <= 0xfe) && buf_ptr < buf_end) {
1702 dprintf("find_marker skipped %d bytes\n", skipped);
1704 *pbuf_ptr = buf_ptr;
1708 static int mjpeg_decode_frame(AVCodecContext *avctx,
1709 void *data, int *data_size,
1710 uint8_t *buf, int buf_size)
1712 MJpegDecodeContext *s = avctx->priv_data;
1713 uint8_t *buf_end, *buf_ptr;
1715 AVFrame *picture = data;
1719 /* no supplementary picture */
1724 buf_end = buf + buf_size;
1725 while (buf_ptr < buf_end) {
1726 /* find start next marker */
1727 start_code = find_marker(&buf_ptr, buf_end);
1730 if (start_code < 0) {
1733 dprintf("marker=%x avail_size_in_buf=%d\n", start_code, buf_end - buf_ptr);
1735 if ((buf_end - buf_ptr) > s->buffer_size)
1738 s->buffer_size = buf_end-buf_ptr;
1739 s->buffer = av_malloc(s->buffer_size);
1740 dprintf("buffer too small, expanding to %d bytes\n",
1744 /* unescape buffer of SOS */
1745 if (start_code == SOS)
1747 uint8_t *src = buf_ptr;
1748 uint8_t *dst = s->buffer;
1752 uint8_t x = *(src++);
1757 while(*src == 0xff) src++;
1760 if (x >= 0xd0 && x <= 0xd7)
1766 init_get_bits(&s->gb, s->buffer, (dst - s->buffer)*8);
1768 dprintf("escaping removed %d bytes\n",
1769 (buf_end - buf_ptr) - (dst - s->buffer));
1772 init_get_bits(&s->gb, buf_ptr, (buf_end - buf_ptr)*8);
1774 s->start_code = start_code;
1775 if(s->avctx->debug & FF_DEBUG_STARTCODE){
1776 av_log(s->avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code);
1779 /* process markers */
1780 if (start_code >= 0xd0 && start_code <= 0xd7) {
1781 dprintf("restart marker: %d\n", start_code&0x0f);
1782 } else if (s->first_picture) {
1784 if (start_code >= 0xe0 && start_code <= 0xef)
1785 mjpeg_decode_app(s);
1787 else if (start_code == COM)
1788 mjpeg_decode_com(s);
1791 switch(start_code) {
1793 s->restart_interval = 0;
1794 /* nothing to do on SOI */
1797 mjpeg_decode_dqt(s);
1800 if(mjpeg_decode_dht(s) < 0){
1801 av_log(s->avctx, AV_LOG_ERROR, "huffman table decode error\n");
1807 if (mjpeg_decode_sof(s) < 0)
1812 if (mjpeg_decode_sof(s) < 0)
1816 if ((s->buggy_avid && !s->interlaced) || s->restart_interval)
1820 if (s->interlaced) {
1821 s->bottom_field ^= 1;
1822 /* if not bottom field, do not output image yet */
1823 if (s->bottom_field)
1826 *picture = s->picture;
1827 *data_size = sizeof(AVFrame);
1830 picture->quality= FFMAX(FFMAX(s->qscale[0], s->qscale[1]), s->qscale[2]);
1831 picture->qstride= 0;
1832 picture->qscale_table= s->qscale_table;
1833 memset(picture->qscale_table, picture->quality, (s->width+15)/16);
1834 if(avctx->debug & FF_DEBUG_QP)
1835 av_log(s->avctx, AV_LOG_DEBUG, "QP: %d\n", picture->quality);
1836 picture->quality*= FF_QP2LAMBDA;
1843 mjpeg_decode_sos(s);
1844 /* buggy avid puts EOI every 10-20th frame */
1845 /* if restart period is over process EOI */
1846 if ((s->buggy_avid && !s->interlaced) || s->restart_interval)
1850 mjpeg_decode_dri(s);
1864 av_log(s->avctx, AV_LOG_ERROR, "mjpeg: unsupported coding type (%x)\n", start_code);
1867 // printf("mjpeg: unsupported marker (%x)\n", start_code);
1872 /* eof process start code */
1873 buf_ptr += (get_bits_count(&s->gb)+7)/8;
1874 dprintf("marker parser used %d bytes (%d bits)\n",
1875 (get_bits_count(&s->gb)+7)/8, get_bits_count(&s->gb));
1880 dprintf("mjpeg decode frame unused %d bytes\n", buf_end - buf_ptr);
1881 // return buf_end - buf_ptr;
1882 return buf_ptr - buf;
1885 static int mjpegb_decode_frame(AVCodecContext *avctx,
1886 void *data, int *data_size,
1887 uint8_t *buf, int buf_size)
1889 MJpegDecodeContext *s = avctx->priv_data;
1890 uint8_t *buf_end, *buf_ptr;
1891 AVFrame *picture = data;
1892 GetBitContext hgb; /* for the header */
1893 uint32_t dqt_offs, dht_offs, sof_offs, sos_offs, second_field_offs;
1894 uint32_t field_size;
1898 /* no supplementary picture */
1903 buf_end = buf + buf_size;
1906 /* reset on every SOI */
1907 s->restart_interval = 0;
1909 init_get_bits(&hgb, buf_ptr, /*buf_size*/(buf_end - buf_ptr)*8);
1911 skip_bits(&hgb, 32); /* reserved zeros */
1913 if (get_bits(&hgb, 32) != be2me_32(ff_get_fourcc("mjpg")))
1915 dprintf("not mjpeg-b (bad fourcc)\n");
1919 field_size = get_bits(&hgb, 32); /* field size */
1920 dprintf("field size: 0x%x\n", field_size);
1921 skip_bits(&hgb, 32); /* padded field size */
1922 second_field_offs = get_bits(&hgb, 32);
1923 dprintf("second field offs: 0x%x\n", second_field_offs);
1924 if (second_field_offs)
1927 dqt_offs = get_bits(&hgb, 32);
1928 dprintf("dqt offs: 0x%x\n", dqt_offs);
1931 init_get_bits(&s->gb, buf+dqt_offs, (buf_end - (buf+dqt_offs))*8);
1932 s->start_code = DQT;
1933 mjpeg_decode_dqt(s);
1936 dht_offs = get_bits(&hgb, 32);
1937 dprintf("dht offs: 0x%x\n", dht_offs);
1940 init_get_bits(&s->gb, buf+dht_offs, (buf_end - (buf+dht_offs))*8);
1941 s->start_code = DHT;
1942 mjpeg_decode_dht(s);
1945 sof_offs = get_bits(&hgb, 32);
1946 dprintf("sof offs: 0x%x\n", sof_offs);
1949 init_get_bits(&s->gb, buf+sof_offs, (buf_end - (buf+sof_offs))*8);
1950 s->start_code = SOF0;
1951 if (mjpeg_decode_sof(s) < 0)
1955 sos_offs = get_bits(&hgb, 32);
1956 dprintf("sos offs: 0x%x\n", sos_offs);
1959 // init_get_bits(&s->gb, buf+sos_offs, (buf_end - (buf+sos_offs))*8);
1960 init_get_bits(&s->gb, buf+sos_offs, field_size*8);
1961 s->start_code = SOS;
1962 mjpeg_decode_sos(s);
1965 skip_bits(&hgb, 32); /* start of data offset */
1967 if (s->interlaced) {
1968 s->bottom_field ^= 1;
1969 /* if not bottom field, do not output image yet */
1970 if (s->bottom_field && second_field_offs)
1972 buf_ptr = buf + second_field_offs;
1973 second_field_offs = 0;
1978 //XXX FIXME factorize, this looks very similar to the EOI code
1980 *picture= s->picture;
1981 *data_size = sizeof(AVFrame);
1984 picture->quality= FFMAX(FFMAX(s->qscale[0], s->qscale[1]), s->qscale[2]);
1985 picture->qstride= 0;
1986 picture->qscale_table= s->qscale_table;
1987 memset(picture->qscale_table, picture->quality, (s->width+15)/16);
1988 if(avctx->debug & FF_DEBUG_QP)
1989 av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", picture->quality);
1990 picture->quality*= FF_QP2LAMBDA;
1993 return buf_ptr - buf;
1998 static int sp5x_decode_frame(AVCodecContext *avctx,
1999 void *data, int *data_size,
2000 uint8_t *buf, int buf_size)
2003 MJpegDecodeContext *s = avctx->priv_data;
2005 const int qscale = 5;
2006 uint8_t *buf_ptr, *buf_end, *recoded;
2011 /* no supplementary picture */
2015 if (!avctx->width || !avctx->height)
2019 buf_end = buf + buf_size;
2022 recoded = av_mallocz(buf_size + 1024);
2027 recoded[j++] = 0xFF;
2028 recoded[j++] = 0xD8;
2030 memcpy(recoded+j, &sp5x_data_dqt[0], sizeof(sp5x_data_dqt));
2031 memcpy(recoded+j+5, &sp5x_quant_table[qscale * 2], 64);
2032 memcpy(recoded+j+70, &sp5x_quant_table[(qscale * 2) + 1], 64);
2033 j += sizeof(sp5x_data_dqt);
2035 memcpy(recoded+j, &sp5x_data_dht[0], sizeof(sp5x_data_dht));
2036 j += sizeof(sp5x_data_dht);
2038 memcpy(recoded+j, &sp5x_data_sof[0], sizeof(sp5x_data_sof));
2039 recoded[j+5] = (avctx->height >> 8) & 0xFF;
2040 recoded[j+6] = avctx->height & 0xFF;
2041 recoded[j+7] = (avctx->width >> 8) & 0xFF;
2042 recoded[j+8] = avctx->width & 0xFF;
2043 j += sizeof(sp5x_data_sof);
2045 memcpy(recoded+j, &sp5x_data_sos[0], sizeof(sp5x_data_sos));
2046 j += sizeof(sp5x_data_sos);
2048 for (i = 14; i < buf_size && j < buf_size+1024-2; i++)
2050 recoded[j++] = buf[i];
2056 recoded[j++] = 0xFF;
2057 recoded[j++] = 0xD9;
2059 i = mjpeg_decode_frame(avctx, data, data_size, recoded, j);
2066 s->width = avctx->width;
2067 s->height = avctx->height;
2068 s->nb_components = 3;
2069 s->component_id[0] = 0;
2072 s->quant_index[0] = 0;
2073 s->component_id[1] = 1;
2076 s->quant_index[1] = 1;
2077 s->component_id[2] = 2;
2080 s->quant_index[2] = 1;
2084 s->qscale_table = av_mallocz((s->width+15)/16);
2085 avctx->pix_fmt = PIX_FMT_YUV420P;
2088 s->picture.reference = 0;
2089 if (avctx->get_buffer(avctx, &s->picture) < 0)
2091 fprintf(stderr, "get_buffer() failed\n");
2095 s->picture.pict_type = I_TYPE;
2096 s->picture.key_frame = 1;
2098 for (i = 0; i < 3; i++)
2099 s->linesize[i] = s->picture.linesize[i] << s->interlaced;
2102 for (i = 0; i < 64; i++)
2104 j = s->scantable.permutated[i];
2105 s->quant_matrixes[0][j] = sp5x_quant_table[(qscale * 2) + i];
2107 s->qscale[0] = FFMAX(
2108 s->quant_matrixes[0][s->scantable.permutated[1]],
2109 s->quant_matrixes[0][s->scantable.permutated[8]]) >> 1;
2111 for (i = 0; i < 64; i++)
2113 j = s->scantable.permutated[i];
2114 s->quant_matrixes[1][j] = sp5x_quant_table[(qscale * 2) + 1 + i];
2116 s->qscale[1] = FFMAX(
2117 s->quant_matrixes[1][s->scantable.permutated[1]],
2118 s->quant_matrixes[1][s->scantable.permutated[8]]) >> 1;
2123 s->comp_index[0] = 0;
2124 s->nb_blocks[0] = s->h_count[0] * s->v_count[0];
2125 s->h_scount[0] = s->h_count[0];
2126 s->v_scount[0] = s->v_count[0];
2130 s->comp_index[1] = 1;
2131 s->nb_blocks[1] = s->h_count[1] * s->v_count[1];
2132 s->h_scount[1] = s->h_count[1];
2133 s->v_scount[1] = s->v_count[1];
2137 s->comp_index[2] = 2;
2138 s->nb_blocks[2] = s->h_count[2] * s->v_count[2];
2139 s->h_scount[2] = s->h_count[2];
2140 s->v_scount[2] = s->v_count[2];
2144 for (i = 0; i < 3; i++)
2145 s->last_dc[i] = 1024;
2147 s->mb_width = (s->width * s->h_max * 8 -1) / (s->h_max * 8);
2148 s->mb_height = (s->height * s->v_max * 8 -1) / (s->v_max * 8);
2150 init_get_bits(&s->gb, buf+14, (buf_size-14)*8);
2152 return mjpeg_decode_scan(s);
2158 static int mjpeg_decode_end(AVCodecContext *avctx)
2160 MJpegDecodeContext *s = avctx->priv_data;
2164 av_free(s->qscale_table);
2165 avcodec_default_free_buffers(avctx);
2169 free_vlc(&s->vlcs[i][j]);
2174 AVCodec mjpeg_decoder = {
2178 sizeof(MJpegDecodeContext),
2187 AVCodec mjpegb_decoder = {
2191 sizeof(MJpegDecodeContext),
2195 mjpegb_decode_frame,
2200 AVCodec sp5x_decoder = {
2204 sizeof(MJpegDecodeContext),
2213 #ifdef CONFIG_ENCODERS
2214 AVCodec ljpeg_encoder = { //FIXME avoid MPV_* lossless jpeg shouldnt need them
2218 sizeof(MpegEncContext),
2220 encode_picture_lossless,