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 int mjpeg_init(MpegEncContext *s)
250 m = av_malloc(sizeof(MJpegContext));
257 /* build all the huffman tables */
258 build_huffman_codes(m->huff_size_dc_luminance,
259 m->huff_code_dc_luminance,
262 build_huffman_codes(m->huff_size_dc_chrominance,
263 m->huff_code_dc_chrominance,
266 build_huffman_codes(m->huff_size_ac_luminance,
267 m->huff_code_ac_luminance,
270 build_huffman_codes(m->huff_size_ac_chrominance,
271 m->huff_code_ac_chrominance,
279 void mjpeg_close(MpegEncContext *s)
281 av_free(s->mjpeg_ctx);
284 #define PREDICT(ret, topleft, top, left, predictor)\
286 case 1: ret= left; break;\
287 case 2: ret= top; break;\
288 case 3: ret= topleft; break;\
289 case 4: ret= left + top - topleft; break;\
290 case 5: ret= left + ((top - topleft)>>1); break;\
291 case 6: ret= top + ((left - topleft)>>1); break;\
293 case 7: ret= (left + top)>>1; break;\
296 #ifdef CONFIG_ENCODERS
297 static inline void put_marker(PutBitContext *p, int code)
299 put_bits(p, 8, 0xff);
300 put_bits(p, 8, code);
303 /* table_class: 0 = DC coef, 1 = AC coefs */
304 static int put_huffman_table(MpegEncContext *s, int table_class, int table_id,
305 const uint8_t *bits_table, const uint8_t *value_table)
307 PutBitContext *p = &s->pb;
310 put_bits(p, 4, table_class);
311 put_bits(p, 4, table_id);
316 put_bits(p, 8, bits_table[i]);
320 put_bits(p, 8, value_table[i]);
325 static void jpeg_table_header(MpegEncContext *s)
327 PutBitContext *p = &s->pb;
334 put_bits(p, 16, 2 + 2 * (1 + 64));
336 put_bits(p, 16, 2 + 1 * (1 + 64));
338 put_bits(p, 4, 0); /* 8 bit precision */
339 put_bits(p, 4, 0); /* table 0 */
341 j = s->intra_scantable.permutated[i];
342 put_bits(p, 8, s->intra_matrix[j]);
345 put_bits(p, 4, 0); /* 8 bit precision */
346 put_bits(p, 4, 1); /* table 1 */
348 j = s->intra_scantable.permutated[i];
349 put_bits(p, 8, s->chroma_intra_matrix[j]);
357 put_bits(p, 16, 0); /* patched later */
359 size += put_huffman_table(s, 0, 0, bits_dc_luminance, val_dc_luminance);
360 size += put_huffman_table(s, 0, 1, bits_dc_chrominance, val_dc_chrominance);
362 size += put_huffman_table(s, 1, 0, bits_ac_luminance, val_ac_luminance);
363 size += put_huffman_table(s, 1, 1, bits_ac_chrominance, val_ac_chrominance);
368 static void jpeg_put_comments(MpegEncContext *s)
370 PutBitContext *p = &s->pb;
374 if (s->aspect_ratio_info /* && !lossless */)
379 put_string(p, "JFIF"); /* this puts the trailing zero-byte too */
380 put_bits(p, 16, 0x0201); /* v 1.02 */
381 put_bits(p, 8, 0); /* units type: 0 - aspect ratio */
382 switch(s->aspect_ratio_info)
384 case FF_ASPECT_4_3_625:
385 case FF_ASPECT_4_3_525:
389 case FF_ASPECT_16_9_625:
390 case FF_ASPECT_16_9_525:
394 case FF_ASPECT_EXTENDED:
395 put_bits(p, 16, s->aspected_width);
396 put_bits(p, 16, s->aspected_height);
398 case FF_ASPECT_SQUARE:
400 put_bits(p, 16, 1); /* aspect: 1:1 */
404 put_bits(p, 8, 0); /* thumbnail width */
405 put_bits(p, 8, 0); /* thumbnail height */
409 if(!(s->flags & CODEC_FLAG_BITEXACT)){
413 put_bits(p, 16, 0); /* patched later */
414 put_string(p, LIBAVCODEC_IDENT);
415 size = strlen(LIBAVCODEC_IDENT)+3;
421 void mjpeg_picture_header(MpegEncContext *s)
423 const int lossless= s->avctx->codec_id == CODEC_ID_LJPEG;
425 put_marker(&s->pb, SOI);
427 if (!s->mjpeg_data_only_frames)
429 jpeg_put_comments(s);
431 if (s->mjpeg_write_tables) jpeg_table_header(s);
433 put_marker(&s->pb, lossless ? SOF3 : SOF0);
435 put_bits(&s->pb, 16, 17);
436 if(lossless && s->avctx->pix_fmt == PIX_FMT_RGBA32)
437 put_bits(&s->pb, 8, 9); /* 9 bits/component RCT */
439 put_bits(&s->pb, 8, 8); /* 8 bits/component */
440 put_bits(&s->pb, 16, s->height);
441 put_bits(&s->pb, 16, s->width);
442 put_bits(&s->pb, 8, 3); /* 3 components */
445 put_bits(&s->pb, 8, 1); /* component number */
446 put_bits(&s->pb, 4, s->mjpeg_hsample[0]); /* H factor */
447 put_bits(&s->pb, 4, s->mjpeg_vsample[0]); /* V factor */
448 put_bits(&s->pb, 8, 0); /* select matrix */
451 put_bits(&s->pb, 8, 2); /* component number */
452 put_bits(&s->pb, 4, s->mjpeg_hsample[1]); /* H factor */
453 put_bits(&s->pb, 4, s->mjpeg_vsample[1]); /* V factor */
455 put_bits(&s->pb, 8, lossless ? 0 : 1); /* select matrix */
457 put_bits(&s->pb, 8, 0); /* select matrix */
461 put_bits(&s->pb, 8, 3); /* component number */
462 put_bits(&s->pb, 4, s->mjpeg_hsample[2]); /* H factor */
463 put_bits(&s->pb, 4, s->mjpeg_vsample[2]); /* V factor */
465 put_bits(&s->pb, 8, lossless ? 0 : 1); /* select matrix */
467 put_bits(&s->pb, 8, 0); /* select matrix */
472 put_marker(&s->pb, SOS);
473 put_bits(&s->pb, 16, 12); /* length */
474 put_bits(&s->pb, 8, 3); /* 3 components */
477 put_bits(&s->pb, 8, 1); /* index */
478 put_bits(&s->pb, 4, 0); /* DC huffman table index */
479 put_bits(&s->pb, 4, 0); /* AC huffman table index */
482 put_bits(&s->pb, 8, 2); /* index */
483 put_bits(&s->pb, 4, 1); /* DC huffman table index */
484 put_bits(&s->pb, 4, lossless ? 0 : 1); /* AC huffman table index */
487 put_bits(&s->pb, 8, 3); /* index */
488 put_bits(&s->pb, 4, 1); /* DC huffman table index */
489 put_bits(&s->pb, 4, lossless ? 0 : 1); /* AC huffman table index */
491 put_bits(&s->pb, 8, lossless ? s->avctx->prediction_method+1 : 0); /* Ss (not used) */
492 put_bits(&s->pb, 8, lossless ? 0 : 63); /* Se (not used) */
493 put_bits(&s->pb, 8, 0); /* Ah/Al (not used) */
496 static void escape_FF(MpegEncContext *s, int start)
498 int size= get_bit_count(&s->pb) - start*8;
500 uint8_t *buf= s->pb.buf + start;
501 int align= (-(size_t)(buf))&3;
503 assert((size&7) == 0);
507 for(i=0; i<size && i<align; i++){
508 if(buf[i]==0xFF) ff_count++;
510 for(; i<size-15; i+=16){
513 v= *(uint32_t*)(&buf[i]);
514 acc= (((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
515 v= *(uint32_t*)(&buf[i+4]);
516 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
517 v= *(uint32_t*)(&buf[i+8]);
518 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
519 v= *(uint32_t*)(&buf[i+12]);
520 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
528 if(buf[i]==0xFF) ff_count++;
531 if(ff_count==0) return;
534 for(i=0; i<ff_count-3; i+=4)
535 put_bits(&s->pb, 32, 0);
536 put_bits(&s->pb, (ff_count-i)*8, 0);
537 flush_put_bits(&s->pb);
539 for(i=size-1; ff_count; i--){
543 //printf("%d %d\n", i, ff_count);
552 void mjpeg_picture_trailer(MpegEncContext *s)
554 int pad= (-get_bit_count(&s->pb))&7;
556 put_bits(&s->pb, pad,0xFF>>(8-pad));
557 flush_put_bits(&s->pb);
559 assert((s->header_bits&7)==0);
561 escape_FF(s, s->header_bits>>3);
563 put_marker(&s->pb, EOI);
566 static inline void mjpeg_encode_dc(MpegEncContext *s, int val,
567 uint8_t *huff_size, uint16_t *huff_code)
572 put_bits(&s->pb, huff_size[0], huff_code[0]);
580 nbits= av_log2_16bit(val) + 1;
582 put_bits(&s->pb, huff_size[nbits], huff_code[nbits]);
584 put_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
588 static void encode_block(MpegEncContext *s, DCTELEM *block, int n)
590 int mant, nbits, code, i, j;
591 int component, dc, run, last_index, val;
592 MJpegContext *m = s->mjpeg_ctx;
593 uint8_t *huff_size_ac;
594 uint16_t *huff_code_ac;
597 component = (n <= 3 ? 0 : n - 4 + 1);
598 dc = block[0]; /* overflow is impossible */
599 val = dc - s->last_dc[component];
601 mjpeg_encode_dc(s, val, m->huff_size_dc_luminance, m->huff_code_dc_luminance);
602 huff_size_ac = m->huff_size_ac_luminance;
603 huff_code_ac = m->huff_code_ac_luminance;
605 mjpeg_encode_dc(s, val, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
606 huff_size_ac = m->huff_size_ac_chrominance;
607 huff_code_ac = m->huff_code_ac_chrominance;
609 s->last_dc[component] = dc;
614 last_index = s->block_last_index[n];
615 for(i=1;i<=last_index;i++) {
616 j = s->intra_scantable.permutated[i];
622 put_bits(&s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]);
631 nbits= av_log2(val) + 1;
632 code = (run << 4) | nbits;
634 put_bits(&s->pb, huff_size_ac[code], huff_code_ac[code]);
636 put_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
641 /* output EOB only if not already 64 values */
642 if (last_index < 63 || run != 0)
643 put_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]);
646 void mjpeg_encode_mb(MpegEncContext *s,
647 DCTELEM block[6][64])
651 encode_block(s, block[i], i);
655 static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
656 MpegEncContext * const s = avctx->priv_data;
657 MJpegContext * const m = s->mjpeg_ctx;
658 AVFrame *pict = data;
659 const int width= s->width;
660 const int height= s->height;
661 AVFrame * const p= (AVFrame*)&s->current_picture;
662 const int predictor= avctx->prediction_method+1;
664 init_put_bits(&s->pb, buf, buf_size);
667 p->pict_type= FF_I_TYPE;
670 mjpeg_picture_header(s);
672 s->header_bits= get_bit_count(&s->pb);
674 if(avctx->pix_fmt == PIX_FMT_RGBA32){
676 const int linesize= p->linesize[0];
677 uint16_t buffer[2048][4];
678 int left[3], top[3], topleft[3];
681 buffer[0][i]= 1 << (9 - 1);
684 for(y = 0; y < height; y++) {
685 const int modified_predictor= y ? predictor : 1;
686 uint8_t *ptr = p->data[0] + (linesize * y);
689 top[i]= left[i]= topleft[i]= buffer[0][i];
691 for(x = 0; x < width; x++) {
692 buffer[x][1] = ptr[4*x+0] - ptr[4*x+1] + 0x100;
693 buffer[x][2] = ptr[4*x+2] - ptr[4*x+1] + 0x100;
694 buffer[x][0] = (ptr[4*x+0] + 2*ptr[4*x+1] + ptr[4*x+2])>>2;
699 PREDICT(pred, topleft[i], top[i], left[i], modified_predictor);
702 top[i]= buffer[x+1][i];
704 left[i]= buffer[x][i];
706 diff= ((left[i] - pred + 0x100)&0x1FF) - 0x100;
709 mjpeg_encode_dc(s, diff, m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly
711 mjpeg_encode_dc(s, diff, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
717 const int mb_width = (width + s->mjpeg_hsample[0] - 1) / s->mjpeg_hsample[0];
718 const int mb_height = (height + s->mjpeg_vsample[0] - 1) / s->mjpeg_vsample[0];
720 for(mb_y = 0; mb_y < mb_height; mb_y++) {
721 for(mb_x = 0; mb_x < mb_width; mb_x++) {
722 if(mb_x==0 || mb_y==0){
725 int x, y, h, v, linesize;
726 h = s->mjpeg_hsample[i];
727 v = s->mjpeg_vsample[i];
728 linesize= p->linesize[i];
734 ptr = p->data[i] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
743 pred= ptr[-linesize];
745 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
750 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly
752 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
759 int x, y, h, v, linesize;
760 h = s->mjpeg_hsample[i];
761 v = s->mjpeg_vsample[i];
762 linesize= p->linesize[i];
768 ptr = p->data[i] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
769 //printf("%d %d %d %d %8X\n", mb_x, mb_y, x, y, ptr);
770 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
773 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly
775 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
786 mjpeg_picture_trailer(s);
789 flush_put_bits(&s->pb);
790 return pbBufPtr(&s->pb) - s->pb.buf;
791 // return (get_bit_count(&f->pb)+7)/8;
794 #endif //CONFIG_ENCODERS
796 /******************************************/
799 #define MAX_COMPONENTS 4
801 typedef struct MJpegDecodeContext {
802 AVCodecContext *avctx;
804 int mpeg_enc_ctx_allocated; /* true if decoding context allocated */
806 int start_code; /* current start code */
810 int16_t quant_matrixes[4][64];
812 int qscale[4]; ///< quantizer scale calculated from quant_matrixes
814 int org_width, org_height; /* size given at codec init */
815 int first_picture; /* true if decoding first picture */
816 int interlaced; /* true if interlaced */
817 int bottom_field; /* true if bottom field */
820 int rct; /* standard rct */
821 int pegasus_rct; /* pegasus reversible colorspace transform */
822 int bits; /* bits per component */
825 int mb_width, mb_height;
827 int component_id[MAX_COMPONENTS];
828 int h_count[MAX_COMPONENTS]; /* horizontal and vertical count for each component */
829 int v_count[MAX_COMPONENTS];
830 int comp_index[MAX_COMPONENTS];
831 int dc_index[MAX_COMPONENTS];
832 int ac_index[MAX_COMPONENTS];
833 int nb_blocks[MAX_COMPONENTS];
834 int h_scount[MAX_COMPONENTS];
835 int v_scount[MAX_COMPONENTS];
836 int h_max, v_max; /* maximum h and v counts */
837 int quant_index[4]; /* quant table index for each component */
838 int last_dc[MAX_COMPONENTS]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */
839 AVFrame picture; /* picture structure */
840 int linesize[MAX_COMPONENTS]; ///< linesize << interlaced
841 uint8_t *qscale_table;
842 DCTELEM block[64] __align8;
844 void (*idct_put)(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*align 16*/);
846 int restart_interval;
850 int interlace_polarity;
851 } MJpegDecodeContext;
853 static int mjpeg_decode_dht(MJpegDecodeContext *s);
855 static int build_vlc(VLC *vlc, const uint8_t *bits_table, const uint8_t *val_table,
858 uint8_t huff_size[256];
859 uint16_t huff_code[256];
861 memset(huff_size, 0, sizeof(huff_size));
862 build_huffman_codes(huff_size, huff_code, bits_table, val_table);
864 return init_vlc(vlc, 9, nb_codes, huff_size, 1, 1, huff_code, 2, 2);
867 static int mjpeg_decode_init(AVCodecContext *avctx)
869 MJpegDecodeContext *s = avctx->priv_data;
874 /* ugly way to get the idct & scantable FIXME */
875 memset(&s2, 0, sizeof(MpegEncContext));
876 s2.flags= avctx->flags;
878 // s2->out_format = FMT_MJPEG;
881 if (MPV_common_init(&s2) < 0)
883 s->scantable= s2.intra_scantable;
884 s->idct_put= s2.dsp.idct_put;
887 s->mpeg_enc_ctx_allocated = 0;
888 s->buffer_size = 102400; /* smaller buffer should be enough,
889 but photojpg files could ahive bigger sizes */
890 s->buffer = av_malloc(s->buffer_size);
894 s->first_picture = 1;
895 s->org_width = avctx->width;
896 s->org_height = avctx->height;
898 build_vlc(&s->vlcs[0][0], bits_dc_luminance, val_dc_luminance, 12);
899 build_vlc(&s->vlcs[0][1], bits_dc_chrominance, val_dc_chrominance, 12);
900 build_vlc(&s->vlcs[1][0], bits_ac_luminance, val_ac_luminance, 251);
901 build_vlc(&s->vlcs[1][1], bits_ac_chrominance, val_ac_chrominance, 251);
903 if (avctx->flags & CODEC_FLAG_EXTERN_HUFF)
905 printf("mjpeg: using external huffman table\n");
906 init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8);
908 /* should check for error - but dunno */
914 /* quantize tables */
915 static int mjpeg_decode_dqt(MJpegDecodeContext *s)
917 int len, index, i, j;
919 len = get_bits(&s->gb, 16) - 2;
922 /* only 8 bit precision handled */
923 if (get_bits(&s->gb, 4) != 0)
925 dprintf("dqt: 16bit precision\n");
928 index = get_bits(&s->gb, 4);
931 dprintf("index=%d\n", index);
932 /* read quant table */
934 j = s->scantable.permutated[i];
935 s->quant_matrixes[index][j] = get_bits(&s->gb, 8);
938 //XXX FIXME finetune, and perhaps add dc too
939 s->qscale[index]= FFMAX(
940 s->quant_matrixes[index][s->scantable.permutated[1]],
941 s->quant_matrixes[index][s->scantable.permutated[8]]) >> 1;
942 dprintf("qscale[%d]: %d\n", index, s->qscale[index]);
949 /* decode huffman tables and build VLC decoders */
950 static int mjpeg_decode_dht(MJpegDecodeContext *s)
952 int len, index, i, class, n, v, code_max;
953 uint8_t bits_table[17];
954 uint8_t val_table[256];
956 len = get_bits(&s->gb, 16) - 2;
961 class = get_bits(&s->gb, 4);
964 index = get_bits(&s->gb, 4);
969 bits_table[i] = get_bits(&s->gb, 8);
973 if (len < n || n > 256)
978 v = get_bits(&s->gb, 8);
985 /* build VLC and flush previous vlc if present */
986 free_vlc(&s->vlcs[class][index]);
987 dprintf("class=%d index=%d nb_codes=%d\n",
988 class, index, code_max + 1);
989 if(build_vlc(&s->vlcs[class][index], bits_table, val_table, code_max + 1) < 0){
996 static int mjpeg_decode_sof(MJpegDecodeContext *s)
998 int len, nb_components, i, width, height;
1000 /* XXX: verify len field validity */
1001 len = get_bits(&s->gb, 16);
1002 s->bits= get_bits(&s->gb, 8);
1004 if(s->pegasus_rct) s->bits=9;
1005 if(s->bits==9 && !s->pegasus_rct) s->rct=1; //FIXME ugly
1007 if (s->bits != 8 && !s->lossless){
1008 printf("only 8 bits/component accepted\n");
1011 height = get_bits(&s->gb, 16);
1012 width = get_bits(&s->gb, 16);
1013 dprintf("sof0: picture: %dx%d\n", width, height);
1015 nb_components = get_bits(&s->gb, 8);
1016 if (nb_components <= 0 ||
1017 nb_components > MAX_COMPONENTS)
1019 s->nb_components = nb_components;
1022 for(i=0;i<nb_components;i++) {
1024 s->component_id[i] = get_bits(&s->gb, 8) - 1;
1025 s->h_count[i] = get_bits(&s->gb, 4);
1026 s->v_count[i] = get_bits(&s->gb, 4);
1027 /* compute hmax and vmax (only used in interleaved case) */
1028 if (s->h_count[i] > s->h_max)
1029 s->h_max = s->h_count[i];
1030 if (s->v_count[i] > s->v_max)
1031 s->v_max = s->v_count[i];
1032 s->quant_index[i] = get_bits(&s->gb, 8);
1033 if (s->quant_index[i] >= 4)
1035 dprintf("component %d %d:%d id: %d quant:%d\n", i, s->h_count[i],
1036 s->v_count[i], s->component_id[i], s->quant_index[i]);
1039 if(s->v_max==1 && s->h_max==1 && s->lossless==1) s->rgb=1;
1041 /* if different size, realloc/alloc picture */
1042 /* XXX: also check h_count and v_count */
1043 if (width != s->width || height != s->height) {
1044 av_freep(&s->qscale_table);
1048 /* test interlaced mode */
1049 if (s->first_picture &&
1050 s->org_height != 0 &&
1051 s->height < ((s->org_height * 3) / 4)) {
1053 // s->bottom_field = (s->interlace_polarity) ? 1 : 0;
1054 s->bottom_field = 0;
1057 s->qscale_table= av_mallocz((s->width+15)/16);
1059 s->first_picture = 0;
1062 if(s->interlaced && s->bottom_field)
1065 /* XXX: not complete test ! */
1066 switch((s->h_count[0] << 4) | s->v_count[0]) {
1069 s->avctx->pix_fmt = PIX_FMT_RGBA32;
1071 s->avctx->pix_fmt = PIX_FMT_YUV444P;
1074 s->avctx->pix_fmt = PIX_FMT_YUV422P;
1078 s->avctx->pix_fmt = PIX_FMT_YUV420P;
1082 if(s->picture.data[0])
1083 s->avctx->release_buffer(s->avctx, &s->picture);
1085 s->picture.reference= 0;
1086 if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){
1087 fprintf(stderr, "get_buffer() failed\n");
1090 s->picture.pict_type= I_TYPE;
1091 s->picture.key_frame= 1;
1094 s->linesize[i]= s->picture.linesize[i] << s->interlaced;
1097 // printf("%d %d %d %d %d %d\n", s->width, s->height, s->linesize[0], s->linesize[1], s->interlaced, s->avctx->height);
1099 if (len != (8+(3*nb_components)))
1101 dprintf("decode_sof0: error, len(%d) mismatch\n", len);
1107 static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
1110 code = get_vlc2(&s->gb, s->vlcs[0][dc_index].table, 9, 2);
1113 dprintf("mjpeg_decode_dc: bad vlc: %d:%d (%p)\n", 0, dc_index,
1114 &s->vlcs[0][dc_index]);
1119 return get_xbits(&s->gb, code);
1124 /* decode block and dequantize */
1125 static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
1126 int component, int dc_index, int ac_index, int quant_index)
1128 int code, i, j, level, val;
1130 int16_t *quant_matrix;
1133 val = mjpeg_decode_dc(s, dc_index);
1134 if (val == 0xffff) {
1135 dprintf("error dc\n");
1138 quant_matrix = s->quant_matrixes[quant_index];
1139 val = val * quant_matrix[0] + s->last_dc[component];
1140 s->last_dc[component] = val;
1143 ac_vlc = &s->vlcs[1][ac_index];
1146 code = get_vlc2(&s->gb, s->vlcs[1][ac_index].table, 9, 2);
1149 dprintf("error ac\n");
1158 level = get_xbits(&s->gb, code & 0xf);
1161 dprintf("error count: %d\n", i);
1164 j = s->scantable.permutated[i];
1165 block[j] = level * quant_matrix[j];
1174 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point_transform){
1176 uint16_t buffer[2048][4];
1177 int left[3], top[3], topleft[3];
1178 const int linesize= s->linesize[0];
1179 const int mask= (1<<s->bits)-1;
1182 buffer[0][i]= 1 << (s->bits + point_transform - 1);
1184 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1185 const int modified_predictor= mb_y ? predictor : 1;
1186 uint8_t *ptr = s->picture.data[0] + (linesize * mb_y);
1188 if (s->interlaced && s->bottom_field)
1189 ptr += linesize >> 1;
1192 top[i]= left[i]= topleft[i]= buffer[0][i];
1194 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1195 if (s->restart_interval && !s->restart_count)
1196 s->restart_count = s->restart_interval;
1202 top[i]= buffer[mb_x][i];
1204 PREDICT(pred, topleft[i], top[i], left[i], modified_predictor);
1207 buffer[mb_x][i]= mask & (pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform));
1210 if (s->restart_interval && !--s->restart_count) {
1211 align_get_bits(&s->gb);
1212 skip_bits(&s->gb, 16); /* skip RSTn */
1217 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1218 ptr[4*mb_x+1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200)>>2);
1219 ptr[4*mb_x+0] = buffer[mb_x][1] + ptr[4*mb_x+1];
1220 ptr[4*mb_x+2] = buffer[mb_x][2] + ptr[4*mb_x+1];
1222 }else if(s->pegasus_rct){
1223 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1224 ptr[4*mb_x+1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2])>>2);
1225 ptr[4*mb_x+0] = buffer[mb_x][1] + ptr[4*mb_x+1];
1226 ptr[4*mb_x+2] = buffer[mb_x][2] + ptr[4*mb_x+1];
1229 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1230 ptr[4*mb_x+0] = buffer[mb_x][0];
1231 ptr[4*mb_x+1] = buffer[mb_x][1];
1232 ptr[4*mb_x+2] = buffer[mb_x][2];
1239 static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point_transform){
1241 const int nb_components=3;
1243 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1244 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1245 if (s->restart_interval && !s->restart_count)
1246 s->restart_count = s->restart_interval;
1248 if(mb_x==0 || mb_y==0 || s->interlaced){
1249 for(i=0;i<nb_components;i++) {
1251 int n, h, v, x, y, c, j, linesize;
1252 n = s->nb_blocks[i];
1253 c = s->comp_index[i];
1258 linesize= s->linesize[c];
1260 for(j=0; j<n; j++) {
1263 ptr = s->picture.data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
1264 if(y==0 && mb_y==0){
1265 if(x==0 && mb_x==0){
1266 pred= 128 << point_transform;
1271 if(x==0 && mb_x==0){
1272 pred= ptr[-linesize];
1274 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1278 if (s->interlaced && s->bottom_field)
1279 ptr += linesize >> 1;
1280 *ptr= pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform);
1289 for(i=0;i<nb_components;i++) {
1291 int n, h, v, x, y, c, j, linesize;
1292 n = s->nb_blocks[i];
1293 c = s->comp_index[i];
1298 linesize= s->linesize[c];
1300 for(j=0; j<n; j++) {
1303 ptr = s->picture.data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
1304 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1305 *ptr= pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform);
1313 if (s->restart_interval && !--s->restart_count) {
1314 align_get_bits(&s->gb);
1315 skip_bits(&s->gb, 16); /* skip RSTn */
1322 static int mjpeg_decode_scan(MJpegDecodeContext *s){
1324 const int nb_components=3;
1326 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1327 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1328 if (s->restart_interval && !s->restart_count)
1329 s->restart_count = s->restart_interval;
1331 for(i=0;i<nb_components;i++) {
1333 int n, h, v, x, y, c, j;
1334 n = s->nb_blocks[i];
1335 c = s->comp_index[i];
1341 memset(s->block, 0, sizeof(s->block));
1342 if (decode_block(s, s->block, i,
1343 s->dc_index[i], s->ac_index[i],
1344 s->quant_index[c]) < 0) {
1345 dprintf("error y=%d x=%d\n", mb_y, mb_x);
1348 // dprintf("mb: %d %d processed\n", mb_y, mb_x);
1349 ptr = s->picture.data[c] +
1350 (s->linesize[c] * (v * mb_y + y) * 8) +
1352 if (s->interlaced && s->bottom_field)
1353 ptr += s->linesize[c] >> 1;
1354 //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);
1355 s->idct_put(ptr, s->linesize[c], s->block);
1362 /* (< 1350) buggy workaround for Spectralfan.mov, should be fixed */
1363 if (s->restart_interval && (s->restart_interval < 1350) &&
1364 !--s->restart_count) {
1365 align_get_bits(&s->gb);
1366 skip_bits(&s->gb, 16); /* skip RSTn */
1367 for (i=0; i<nb_components; i++) /* reset dc */
1368 s->last_dc[i] = 1024;
1375 static int mjpeg_decode_sos(MJpegDecodeContext *s)
1377 int len, nb_components, i, h, v, predictor, point_transform;
1378 int vmax, hmax, index, id;
1379 const int block_size= s->lossless ? 1 : 8;
1381 /* XXX: verify len field validity */
1382 len = get_bits(&s->gb, 16);
1383 nb_components = get_bits(&s->gb, 8);
1384 if (len != 6+2*nb_components)
1386 dprintf("decode_sos: invalid len (%d)\n", len);
1389 /* XXX: only interleaved scan accepted */
1390 if (nb_components != 3)
1392 dprintf("decode_sos: components(%d) mismatch\n", nb_components);
1397 for(i=0;i<nb_components;i++) {
1398 id = get_bits(&s->gb, 8) - 1;
1399 dprintf("component: %d\n", id);
1400 /* find component index */
1401 for(index=0;index<s->nb_components;index++)
1402 if (id == s->component_id[index])
1404 if (index == s->nb_components)
1406 dprintf("decode_sos: index(%d) out of components\n", index);
1410 s->comp_index[i] = index;
1412 s->nb_blocks[i] = s->h_count[index] * s->v_count[index];
1413 s->h_scount[i] = s->h_count[index];
1414 s->v_scount[i] = s->v_count[index];
1416 s->dc_index[i] = get_bits(&s->gb, 4);
1417 s->ac_index[i] = get_bits(&s->gb, 4);
1419 if (s->dc_index[i] < 0 || s->ac_index[i] < 0 ||
1420 s->dc_index[i] >= 4 || s->ac_index[i] >= 4)
1423 switch(s->start_code)
1426 if (dc_index[i] > 1 || ac_index[i] > 1)
1431 if (dc_index[i] > 3 || ac_index[i] > 3)
1435 if (dc_index[i] > 3 || ac_index[i] != 0)
1442 predictor= get_bits(&s->gb, 8); /* lossless predictor or start of spectral (Ss) */
1443 skip_bits(&s->gb, 8); /* Se */
1444 skip_bits(&s->gb, 4); /* Ah */
1445 point_transform= get_bits(&s->gb, 4); /* Al */
1447 for(i=0;i<nb_components;i++)
1448 s->last_dc[i] = 1024;
1450 if (nb_components > 1) {
1451 /* interleaved stream */
1452 s->mb_width = (s->width + s->h_max * block_size - 1) / (s->h_max * block_size);
1453 s->mb_height = (s->height + s->v_max * block_size - 1) / (s->v_max * block_size);
1455 h = s->h_max / s->h_scount[s->comp_index[0]];
1456 v = s->v_max / s->v_scount[s->comp_index[0]];
1457 s->mb_width = (s->width + h * block_size - 1) / (h * block_size);
1458 s->mb_height = (s->height + v * block_size - 1) / (v * block_size);
1459 s->nb_blocks[0] = 1;
1464 if(s->avctx->debug & FF_DEBUG_PICT_INFO)
1465 printf("%s %s p:%d >>:%d\n", s->lossless ? "lossless" : "sequencial DCT", s->rgb ? "RGB" : "", predictor, point_transform);
1469 if(ljpeg_decode_rgb_scan(s, predictor, point_transform) < 0)
1472 if(ljpeg_decode_yuv_scan(s, predictor, point_transform) < 0)
1476 if(mjpeg_decode_scan(s) < 0)
1482 dprintf("decode_sos: ac/dc index out of range\n");
1486 static int mjpeg_decode_dri(MJpegDecodeContext *s)
1488 if (get_bits(&s->gb, 16) != 4)
1490 s->restart_interval = get_bits(&s->gb, 16);
1491 dprintf("restart interval: %d\n", s->restart_interval);
1496 static int mjpeg_decode_app(MJpegDecodeContext *s)
1500 /* XXX: verify len field validity */
1501 len = get_bits(&s->gb, 16);
1505 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
1509 if(s->avctx->debug & FF_DEBUG_STARTCODE){
1510 printf("APPx %8X\n", id);
1513 /* buggy AVID, it puts EOI only at every 10th frame */
1514 /* also this fourcc is used by non-avid files too, it holds some
1515 informations, but it's always present in AVID creates files */
1516 if (id == ff_get_fourcc("AVI1"))
1523 4bytes field_size_less_padding
1526 // if (s->first_picture)
1527 // printf("mjpeg: workarounding buggy AVID\n");
1528 s->interlace_polarity = get_bits(&s->gb, 8);
1530 skip_bits(&s->gb, 8);
1531 skip_bits(&s->gb, 32);
1532 skip_bits(&s->gb, 32);
1535 // if (s->interlace_polarity)
1536 // printf("mjpeg: interlace polarity: %d\n", s->interlace_polarity);
1542 if (id == ff_get_fourcc("JFIF"))
1545 skip_bits(&s->gb, 8); /* the trailing zero-byte */
1546 printf("mjpeg: JFIF header found (version: %x.%x)\n",
1547 get_bits(&s->gb, 8), get_bits(&s->gb, 8));
1548 if (get_bits(&s->gb, 8) == 0)
1550 int x_density, y_density;
1551 x_density = get_bits(&s->gb, 16);
1552 y_density = get_bits(&s->gb, 16);
1554 dprintf("x/y density: %d (%f), %d (%f)\n", x_density,
1555 (float)x_density, y_density, (float)y_density);
1557 //MN: needs to be checked
1559 // s->avctx->aspect_ratio= s->width*y_density/((float)s->height*x_density);
1560 s->avctx->aspect_ratio = (float)x_density/y_density;
1561 /* it's better, but every JFIF I have seen stores 1:1 */
1563 s->avctx->aspect_ratio= 0.0;
1568 skip_bits(&s->gb, 16);
1569 skip_bits(&s->gb, 16);
1572 t_w = get_bits(&s->gb, 8);
1573 t_h = get_bits(&s->gb, 8);
1576 /* skip thumbnail */
1577 if (len-10-(t_w*t_h*3) > 0)
1584 if (id == ff_get_fourcc("Adob") && (get_bits(&s->gb, 8) == 'e'))
1586 printf("mjpeg: Adobe header found\n");
1587 skip_bits(&s->gb, 16); /* version */
1588 skip_bits(&s->gb, 16); /* flags0 */
1589 skip_bits(&s->gb, 16); /* flags1 */
1590 skip_bits(&s->gb, 8); /* transform */
1595 if (id == ff_get_fourcc("LJIF")){
1596 printf("Pegasus lossless jpeg header found\n");
1597 skip_bits(&s->gb, 16); /* version ? */
1598 skip_bits(&s->gb, 16); /* unknwon always 0? */
1599 skip_bits(&s->gb, 16); /* unknwon always 0? */
1600 skip_bits(&s->gb, 16); /* unknwon always 0? */
1601 switch( get_bits(&s->gb, 8)){
1611 printf("unknown colorspace\n");
1618 if ((s->start_code == APP1) && (len > (0x28 - 8)))
1620 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
1623 if (id == ff_get_fourcc("mjpg")) /* Apple MJPEG-A */
1626 skip_bits(&s->gb, 32); /* field size */
1627 skip_bits(&s->gb, 32); /* pad field size */
1628 skip_bits(&s->gb, 32); /* next off */
1629 skip_bits(&s->gb, 32); /* quant off */
1630 skip_bits(&s->gb, 32); /* huff off */
1631 skip_bits(&s->gb, 32); /* image off */
1632 skip_bits(&s->gb, 32); /* scan off */
1633 skip_bits(&s->gb, 32); /* data off */
1635 if (s->first_picture)
1636 printf("mjpeg: Apple MJPEG-A header found\n");
1641 /* slow but needed for extreme adobe jpegs */
1643 printf("mjpeg: error, decode_app parser read over the end\n");
1645 skip_bits(&s->gb, 8);
1650 static int mjpeg_decode_com(MJpegDecodeContext *s)
1652 /* XXX: verify len field validity */
1653 int len = get_bits(&s->gb, 16);
1654 if (len >= 2 && len < 32768) {
1655 /* XXX: any better upper bound */
1656 uint8_t *cbuf = av_malloc(len - 1);
1659 for (i = 0; i < len - 2; i++)
1660 cbuf[i] = get_bits(&s->gb, 8);
1661 if (i > 0 && cbuf[i-1] == '\n')
1666 printf("mjpeg comment: '%s'\n", cbuf);
1668 /* buggy avid, it puts EOI only at every 10th frame */
1669 if (!strcmp(cbuf, "AVID"))
1672 // if (s->first_picture)
1673 // printf("mjpeg: workarounding buggy AVID\n");
1684 static int valid_marker_list[] =
1686 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f */
1687 /* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1688 /* 1 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1689 /* 2 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1690 /* 3 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1691 /* 4 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1692 /* 5 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1693 /* 6 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1694 /* 7 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1695 /* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1696 /* 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1697 /* a */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1698 /* b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1699 /* c */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1700 /* d */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1701 /* e */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1702 /* f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1706 /* return the 8 bit start code value and update the search
1707 state. Return -1 if no start code found */
1708 static int find_marker(uint8_t **pbuf_ptr, uint8_t *buf_end)
1717 buf_ptr = *pbuf_ptr;
1718 while (buf_ptr < buf_end) {
1721 if ((v == 0xff) && (v2 >= 0xc0) && (v2 <= 0xfe)) {
1732 dprintf("find_marker skipped %d bytes\n", skipped);
1734 *pbuf_ptr = buf_ptr;
1738 static int mjpeg_decode_frame(AVCodecContext *avctx,
1739 void *data, int *data_size,
1740 uint8_t *buf, int buf_size)
1742 MJpegDecodeContext *s = avctx->priv_data;
1743 uint8_t *buf_end, *buf_ptr;
1745 AVFrame *picture = data;
1749 /* no supplementary picture */
1754 buf_end = buf + buf_size;
1755 while (buf_ptr < buf_end) {
1756 /* find start next marker */
1757 start_code = find_marker(&buf_ptr, buf_end);
1760 if (start_code < 0) {
1763 dprintf("marker=%x avail_size_in_buf=%d\n", start_code, buf_end - buf_ptr);
1765 if ((buf_end - buf_ptr) > s->buffer_size)
1768 s->buffer_size = buf_end-buf_ptr;
1769 s->buffer = av_malloc(s->buffer_size);
1770 dprintf("buffer too small, expanding to %d bytes\n",
1774 /* unescape buffer of SOS */
1775 if (start_code == SOS)
1777 uint8_t *src = buf_ptr;
1778 uint8_t *dst = s->buffer;
1782 uint8_t x = *(src++);
1787 while(*src == 0xff) src++;
1790 if (x >= 0xd0 && x <= 0xd7)
1796 init_get_bits(&s->gb, s->buffer, (dst - s->buffer)*8);
1798 dprintf("escaping removed %d bytes\n",
1799 (buf_end - buf_ptr) - (dst - s->buffer));
1802 init_get_bits(&s->gb, buf_ptr, (buf_end - buf_ptr)*8);
1804 s->start_code = start_code;
1805 if(s->avctx->debug & FF_DEBUG_STARTCODE){
1806 printf("startcode: %X\n", start_code);
1809 /* process markers */
1810 if (start_code >= 0xd0 && start_code <= 0xd7) {
1811 dprintf("restart marker: %d\n", start_code&0x0f);
1812 } else if (s->first_picture) {
1814 if (start_code >= 0xe0 && start_code <= 0xef)
1815 mjpeg_decode_app(s);
1817 else if (start_code == COM)
1818 mjpeg_decode_com(s);
1821 switch(start_code) {
1823 s->restart_interval = 0;
1824 /* nothing to do on SOI */
1827 mjpeg_decode_dqt(s);
1830 if(mjpeg_decode_dht(s) < 0){
1831 fprintf(stderr, "huffman table decode error\n");
1837 if (mjpeg_decode_sof(s) < 0)
1842 if (mjpeg_decode_sof(s) < 0)
1846 if ((s->buggy_avid && !s->interlaced) || s->restart_interval)
1850 if (s->interlaced) {
1851 s->bottom_field ^= 1;
1852 /* if not bottom field, do not output image yet */
1853 if (s->bottom_field)
1856 *picture = s->picture;
1857 *data_size = sizeof(AVFrame);
1858 avctx->height = s->height;
1861 avctx->width = s->width;
1864 picture->quality= FFMAX(FFMAX(s->qscale[0], s->qscale[1]), s->qscale[2]);
1865 picture->qstride= 0;
1866 picture->qscale_table= s->qscale_table;
1867 memset(picture->qscale_table, picture->quality, (s->width+15)/16);
1868 if(avctx->debug & FF_DEBUG_QP)
1869 printf("QP: %d\n", picture->quality);
1870 picture->quality*= FF_QP2LAMBDA;
1877 mjpeg_decode_sos(s);
1878 /* buggy avid puts EOI every 10-20th frame */
1879 /* if restart period is over process EOI */
1880 if ((s->buggy_avid && !s->interlaced) || s->restart_interval)
1884 mjpeg_decode_dri(s);
1898 printf("mjpeg: unsupported coding type (%x)\n", start_code);
1901 // printf("mjpeg: unsupported marker (%x)\n", start_code);
1906 /* eof process start code */
1907 buf_ptr += (get_bits_count(&s->gb)+7)/8;
1908 dprintf("marker parser used %d bytes (%d bits)\n",
1909 (get_bits_count(&s->gb)+7)/8, get_bits_count(&s->gb));
1914 dprintf("mjpeg decode frame unused %d bytes\n", buf_end - buf_ptr);
1915 // return buf_end - buf_ptr;
1916 return buf_ptr - buf;
1919 static int mjpegb_decode_frame(AVCodecContext *avctx,
1920 void *data, int *data_size,
1921 uint8_t *buf, int buf_size)
1923 MJpegDecodeContext *s = avctx->priv_data;
1924 uint8_t *buf_end, *buf_ptr;
1925 AVFrame *picture = data;
1926 GetBitContext hgb; /* for the header */
1927 uint32_t dqt_offs, dht_offs, sof_offs, sos_offs, second_field_offs;
1928 uint32_t field_size;
1932 /* no supplementary picture */
1937 buf_end = buf + buf_size;
1940 /* reset on every SOI */
1941 s->restart_interval = 0;
1943 init_get_bits(&hgb, buf_ptr, /*buf_size*/(buf_end - buf_ptr)*8);
1945 skip_bits(&hgb, 32); /* reserved zeros */
1947 if (get_bits(&hgb, 32) != be2me_32(ff_get_fourcc("mjpg")))
1949 dprintf("not mjpeg-b (bad fourcc)\n");
1953 field_size = get_bits(&hgb, 32); /* field size */
1954 dprintf("field size: 0x%x\n", field_size);
1955 skip_bits(&hgb, 32); /* padded field size */
1956 second_field_offs = get_bits(&hgb, 32);
1957 dprintf("second field offs: 0x%x\n", second_field_offs);
1958 if (second_field_offs)
1961 dqt_offs = get_bits(&hgb, 32);
1962 dprintf("dqt offs: 0x%x\n", dqt_offs);
1965 init_get_bits(&s->gb, buf+dqt_offs, (buf_end - (buf+dqt_offs))*8);
1966 s->start_code = DQT;
1967 mjpeg_decode_dqt(s);
1970 dht_offs = get_bits(&hgb, 32);
1971 dprintf("dht offs: 0x%x\n", dht_offs);
1974 init_get_bits(&s->gb, buf+dht_offs, (buf_end - (buf+dht_offs))*8);
1975 s->start_code = DHT;
1976 mjpeg_decode_dht(s);
1979 sof_offs = get_bits(&hgb, 32);
1980 dprintf("sof offs: 0x%x\n", sof_offs);
1983 init_get_bits(&s->gb, buf+sof_offs, (buf_end - (buf+sof_offs))*8);
1984 s->start_code = SOF0;
1985 if (mjpeg_decode_sof(s) < 0)
1989 sos_offs = get_bits(&hgb, 32);
1990 dprintf("sos offs: 0x%x\n", sos_offs);
1993 // init_get_bits(&s->gb, buf+sos_offs, (buf_end - (buf+sos_offs))*8);
1994 init_get_bits(&s->gb, buf+sos_offs, field_size*8);
1995 s->start_code = SOS;
1996 mjpeg_decode_sos(s);
1999 skip_bits(&hgb, 32); /* start of data offset */
2001 if (s->interlaced) {
2002 s->bottom_field ^= 1;
2003 /* if not bottom field, do not output image yet */
2004 if (s->bottom_field && second_field_offs)
2006 buf_ptr = buf + second_field_offs;
2007 second_field_offs = 0;
2012 //XXX FIXME factorize, this looks very similar to the EOI code
2014 *picture= s->picture;
2015 *data_size = sizeof(AVFrame);
2016 avctx->height = s->height;
2019 avctx->width = s->width;
2022 picture->quality= FFMAX(FFMAX(s->qscale[0], s->qscale[1]), s->qscale[2]);
2023 picture->qstride= 0;
2024 picture->qscale_table= s->qscale_table;
2025 memset(picture->qscale_table, picture->quality, (s->width+15)/16);
2026 if(avctx->debug & FF_DEBUG_QP)
2027 printf("QP: %d\n", picture->quality);
2028 picture->quality*= FF_QP2LAMBDA;
2031 return buf_ptr - buf;
2036 static int sp5x_decode_frame(AVCodecContext *avctx,
2037 void *data, int *data_size,
2038 uint8_t *buf, int buf_size)
2041 MJpegDecodeContext *s = avctx->priv_data;
2043 const int qscale = 5;
2044 uint8_t *buf_ptr, *buf_end, *recoded;
2049 /* no supplementary picture */
2053 if (!avctx->width || !avctx->height)
2057 buf_end = buf + buf_size;
2060 recoded = av_mallocz(buf_size + 1024);
2065 recoded[j++] = 0xFF;
2066 recoded[j++] = 0xD8;
2068 memcpy(recoded+j, &sp5x_data_dqt[0], sizeof(sp5x_data_dqt));
2069 memcpy(recoded+j+5, &sp5x_quant_table[qscale * 2], 64);
2070 memcpy(recoded+j+70, &sp5x_quant_table[(qscale * 2) + 1], 64);
2071 j += sizeof(sp5x_data_dqt);
2073 memcpy(recoded+j, &sp5x_data_dht[0], sizeof(sp5x_data_dht));
2074 j += sizeof(sp5x_data_dht);
2076 memcpy(recoded+j, &sp5x_data_sof[0], sizeof(sp5x_data_sof));
2077 recoded[j+5] = (avctx->height >> 8) & 0xFF;
2078 recoded[j+6] = avctx->height & 0xFF;
2079 recoded[j+7] = (avctx->width >> 8) & 0xFF;
2080 recoded[j+8] = avctx->width & 0xFF;
2081 j += sizeof(sp5x_data_sof);
2083 memcpy(recoded+j, &sp5x_data_sos[0], sizeof(sp5x_data_sos));
2084 j += sizeof(sp5x_data_sos);
2086 for (i = 14; i < buf_size, j < buf_size+1024-2; i++)
2088 recoded[j++] = buf[i];
2094 recoded[j++] = 0xFF;
2095 recoded[j++] = 0xD9;
2097 i = mjpeg_decode_frame(avctx, data, data_size, recoded, j);
2104 s->width = avctx->width;
2105 s->height = avctx->height;
2106 s->nb_components = 3;
2107 s->component_id[0] = 0;
2110 s->quant_index[0] = 0;
2111 s->component_id[1] = 1;
2114 s->quant_index[1] = 1;
2115 s->component_id[2] = 2;
2118 s->quant_index[2] = 1;
2122 s->qscale_table = av_mallocz((s->width+15)/16);
2123 avctx->pix_fmt = PIX_FMT_YUV420P;
2126 s->picture.reference = 0;
2127 if (avctx->get_buffer(avctx, &s->picture) < 0)
2129 fprintf(stderr, "get_buffer() failed\n");
2133 s->picture.pict_type = I_TYPE;
2134 s->picture.key_frame = 1;
2136 for (i = 0; i < 3; i++)
2137 s->linesize[i] = s->picture.linesize[i] << s->interlaced;
2140 for (i = 0; i < 64; i++)
2142 j = s->scantable.permutated[i];
2143 s->quant_matrixes[0][j] = sp5x_quant_table[(qscale * 2) + i];
2145 s->qscale[0] = FFMAX(
2146 s->quant_matrixes[0][s->scantable.permutated[1]],
2147 s->quant_matrixes[0][s->scantable.permutated[8]]) >> 1;
2149 for (i = 0; i < 64; i++)
2151 j = s->scantable.permutated[i];
2152 s->quant_matrixes[1][j] = sp5x_quant_table[(qscale * 2) + 1 + i];
2154 s->qscale[1] = FFMAX(
2155 s->quant_matrixes[1][s->scantable.permutated[1]],
2156 s->quant_matrixes[1][s->scantable.permutated[8]]) >> 1;
2161 s->comp_index[0] = 0;
2162 s->nb_blocks[0] = s->h_count[0] * s->v_count[0];
2163 s->h_scount[0] = s->h_count[0];
2164 s->v_scount[0] = s->v_count[0];
2168 s->comp_index[1] = 1;
2169 s->nb_blocks[1] = s->h_count[1] * s->v_count[1];
2170 s->h_scount[1] = s->h_count[1];
2171 s->v_scount[1] = s->v_count[1];
2175 s->comp_index[2] = 2;
2176 s->nb_blocks[2] = s->h_count[2] * s->v_count[2];
2177 s->h_scount[2] = s->h_count[2];
2178 s->v_scount[2] = s->v_count[2];
2182 for (i = 0; i < 3; i++)
2183 s->last_dc[i] = 1024;
2185 s->mb_width = (s->width * s->h_max * 8 -1) / (s->h_max * 8);
2186 s->mb_height = (s->height * s->v_max * 8 -1) / (s->v_max * 8);
2188 init_get_bits(&s->gb, buf, buf_size*8);
2190 return mjpeg_decode_scan(s);
2196 static int mjpeg_decode_end(AVCodecContext *avctx)
2198 MJpegDecodeContext *s = avctx->priv_data;
2202 av_free(s->qscale_table);
2203 avcodec_default_free_buffers(avctx);
2207 free_vlc(&s->vlcs[i][j]);
2212 AVCodec mjpeg_decoder = {
2216 sizeof(MJpegDecodeContext),
2225 AVCodec mjpegb_decoder = {
2229 sizeof(MJpegDecodeContext),
2233 mjpegb_decode_frame,
2238 AVCodec sp5x_decoder = {
2242 sizeof(MJpegDecodeContext),
2251 #ifdef CONFIG_ENCODERS
2252 AVCodec ljpeg_encoder = { //FIXME avoid MPV_* lossless jpeg shouldnt need them
2256 sizeof(MpegEncContext),
2258 encode_picture_lossless,