2 * MJPEG encoder and decoder
3 * Copyright (c) 2000, 2001 Fabrice Bellard.
4 * Copyright (c) 2003 Alex Beregszaszi
5 * Copyright (c) 2003-2004 Michael Niedermayer
7 * This file is part of FFmpeg.
9 * FFmpeg is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * Support for external huffman table, various fixes (AVID workaround),
24 * aspecting, new decode_frame mechanism and apple mjpeg-b support
25 * by Alex Beregszaszi <alex@naxine.org>
30 * MJPEG encoder and decoder.
38 #include "mpegvideo.h"
39 #include "bytestream.h"
41 /* use two quantizer tables (one for luminance and one for chrominance) */
45 typedef struct MJpegContext {
46 uint8_t huff_size_dc_luminance[12]; //FIXME use array [3] instead of lumi / chrom, for easier addressing
47 uint16_t huff_code_dc_luminance[12];
48 uint8_t huff_size_dc_chrominance[12];
49 uint16_t huff_code_dc_chrominance[12];
51 uint8_t huff_size_ac_luminance[256];
52 uint16_t huff_code_ac_luminance[256];
53 uint8_t huff_size_ac_chrominance[256];
54 uint16_t huff_code_ac_chrominance[256];
57 /* JPEG marker codes */
60 SOF0 = 0xc0, /* baseline */
61 SOF1 = 0xc1, /* extended sequential, huffman */
62 SOF2 = 0xc2, /* progressive, huffman */
63 SOF3 = 0xc3, /* lossless, huffman */
65 SOF5 = 0xc5, /* differential sequential, huffman */
66 SOF6 = 0xc6, /* differential progressive, huffman */
67 SOF7 = 0xc7, /* differential lossless, huffman */
68 JPG = 0xc8, /* reserved for JPEG extension */
69 SOF9 = 0xc9, /* extended sequential, arithmetic */
70 SOF10 = 0xca, /* progressive, arithmetic */
71 SOF11 = 0xcb, /* lossless, arithmetic */
73 SOF13 = 0xcd, /* differential sequential, arithmetic */
74 SOF14 = 0xce, /* differential progressive, arithmetic */
75 SOF15 = 0xcf, /* differential lossless, arithmetic */
77 DHT = 0xc4, /* define huffman tables */
79 DAC = 0xcc, /* define arithmetic-coding conditioning */
81 /* restart with modulo 8 count "m" */
91 SOI = 0xd8, /* start of image */
92 EOI = 0xd9, /* end of image */
93 SOS = 0xda, /* start of scan */
94 DQT = 0xdb, /* define quantization tables */
95 DNL = 0xdc, /* define number of lines */
96 DRI = 0xdd, /* define restart interval */
97 DHP = 0xde, /* define hierarchical progression */
98 EXP = 0xdf, /* expand reference components */
124 SOF48 = 0xf7, ///< JPEG-LS
125 LSE = 0xf8, ///< JPEG-LS extension parameters
132 COM = 0xfe, /* comment */
134 TEM = 0x01, /* temporary private use for arithmetic coding */
136 /* 0x02 -> 0xbf reserved */
140 /* These are the sample quantization tables given in JPEG spec section K.1.
141 * The spec says that the values given produce "good" quality, and
142 * when divided by 2, "very good" quality.
144 static const unsigned char std_luminance_quant_tbl[64] = {
145 16, 11, 10, 16, 24, 40, 51, 61,
146 12, 12, 14, 19, 26, 58, 60, 55,
147 14, 13, 16, 24, 40, 57, 69, 56,
148 14, 17, 22, 29, 51, 87, 80, 62,
149 18, 22, 37, 56, 68, 109, 103, 77,
150 24, 35, 55, 64, 81, 104, 113, 92,
151 49, 64, 78, 87, 103, 121, 120, 101,
152 72, 92, 95, 98, 112, 100, 103, 99
154 static const unsigned char std_chrominance_quant_tbl[64] = {
155 17, 18, 24, 47, 99, 99, 99, 99,
156 18, 21, 26, 66, 99, 99, 99, 99,
157 24, 26, 56, 99, 99, 99, 99, 99,
158 47, 66, 99, 99, 99, 99, 99, 99,
159 99, 99, 99, 99, 99, 99, 99, 99,
160 99, 99, 99, 99, 99, 99, 99, 99,
161 99, 99, 99, 99, 99, 99, 99, 99,
162 99, 99, 99, 99, 99, 99, 99, 99
166 /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
167 /* IMPORTANT: these are only valid for 8-bit data precision! */
168 static const uint8_t bits_dc_luminance[17] =
169 { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
170 static const uint8_t val_dc_luminance[] =
171 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
173 static const uint8_t bits_dc_chrominance[17] =
174 { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
175 static const uint8_t val_dc_chrominance[] =
176 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
178 static const uint8_t bits_ac_luminance[17] =
179 { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
180 static const uint8_t val_ac_luminance[] =
181 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
182 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
183 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
184 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
185 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
186 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
187 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
188 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
189 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
190 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
191 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
192 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
193 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
194 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
195 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
196 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
197 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
198 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
199 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
200 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
204 static const uint8_t bits_ac_chrominance[17] =
205 { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
207 static const uint8_t val_ac_chrominance[] =
208 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
209 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
210 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
211 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
212 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
213 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
214 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
215 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
216 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
217 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
218 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
219 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
220 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
221 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
222 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
223 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
224 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
225 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
226 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
227 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
231 /* isn't this function nicer than the one in the libjpeg ? */
232 static void build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code,
233 const uint8_t *bits_table, const uint8_t *val_table)
235 int i, j, k,nb, code, sym;
242 sym = val_table[k++];
244 huff_code[sym] = code;
251 #ifdef CONFIG_ENCODERS
252 int mjpeg_init(MpegEncContext *s)
256 m = av_malloc(sizeof(MJpegContext));
263 /* build all the huffman tables */
264 build_huffman_codes(m->huff_size_dc_luminance,
265 m->huff_code_dc_luminance,
268 build_huffman_codes(m->huff_size_dc_chrominance,
269 m->huff_code_dc_chrominance,
272 build_huffman_codes(m->huff_size_ac_luminance,
273 m->huff_code_ac_luminance,
276 build_huffman_codes(m->huff_size_ac_chrominance,
277 m->huff_code_ac_chrominance,
285 void mjpeg_close(MpegEncContext *s)
287 av_free(s->mjpeg_ctx);
289 #endif //CONFIG_ENCODERS
291 #define PREDICT(ret, topleft, top, left, predictor)\
293 case 1: ret= left; break;\
294 case 2: ret= top; break;\
295 case 3: ret= topleft; break;\
296 case 4: ret= left + top - topleft; break;\
297 case 5: ret= left + ((top - topleft)>>1); break;\
298 case 6: ret= top + ((left - topleft)>>1); break;\
300 case 7: ret= (left + top)>>1; break;\
303 #ifdef CONFIG_ENCODERS
304 static inline void put_marker(PutBitContext *p, int code)
306 put_bits(p, 8, 0xff);
307 put_bits(p, 8, code);
310 /* table_class: 0 = DC coef, 1 = AC coefs */
311 static int put_huffman_table(MpegEncContext *s, int table_class, int table_id,
312 const uint8_t *bits_table, const uint8_t *value_table)
314 PutBitContext *p = &s->pb;
317 put_bits(p, 4, table_class);
318 put_bits(p, 4, table_id);
323 put_bits(p, 8, bits_table[i]);
327 put_bits(p, 8, value_table[i]);
332 static void jpeg_table_header(MpegEncContext *s)
334 PutBitContext *p = &s->pb;
341 put_bits(p, 16, 2 + 2 * (1 + 64));
343 put_bits(p, 16, 2 + 1 * (1 + 64));
345 put_bits(p, 4, 0); /* 8 bit precision */
346 put_bits(p, 4, 0); /* table 0 */
348 j = s->intra_scantable.permutated[i];
349 put_bits(p, 8, s->intra_matrix[j]);
352 put_bits(p, 4, 0); /* 8 bit precision */
353 put_bits(p, 4, 1); /* table 1 */
355 j = s->intra_scantable.permutated[i];
356 put_bits(p, 8, s->chroma_intra_matrix[j]);
364 put_bits(p, 16, 0); /* patched later */
366 size += put_huffman_table(s, 0, 0, bits_dc_luminance, val_dc_luminance);
367 size += put_huffman_table(s, 0, 1, bits_dc_chrominance, val_dc_chrominance);
369 size += put_huffman_table(s, 1, 0, bits_ac_luminance, val_ac_luminance);
370 size += put_huffman_table(s, 1, 1, bits_ac_chrominance, val_ac_chrominance);
375 static void jpeg_put_comments(MpegEncContext *s)
377 PutBitContext *p = &s->pb;
381 if (s->aspect_ratio_info /* && !lossless */)
386 ff_put_string(p, "JFIF", 1); /* this puts the trailing zero-byte too */
387 put_bits(p, 16, 0x0201); /* v 1.02 */
388 put_bits(p, 8, 0); /* units type: 0 - aspect ratio */
389 put_bits(p, 16, s->avctx->sample_aspect_ratio.num);
390 put_bits(p, 16, s->avctx->sample_aspect_ratio.den);
391 put_bits(p, 8, 0); /* thumbnail width */
392 put_bits(p, 8, 0); /* thumbnail height */
396 if(!(s->flags & CODEC_FLAG_BITEXACT)){
400 put_bits(p, 16, 0); /* patched later */
401 ff_put_string(p, LIBAVCODEC_IDENT, 1);
402 size = strlen(LIBAVCODEC_IDENT)+3;
407 if( s->avctx->pix_fmt == PIX_FMT_YUV420P
408 ||s->avctx->pix_fmt == PIX_FMT_YUV422P
409 ||s->avctx->pix_fmt == PIX_FMT_YUV444P){
413 put_bits(p, 16, 0); /* patched later */
414 ff_put_string(p, "CS=ITU601", 1);
415 size = strlen("CS=ITU601")+3;
421 void mjpeg_picture_header(MpegEncContext *s)
423 const int lossless= s->avctx->codec_id != CODEC_ID_MJPEG;
424 const int ls = s->avctx->codec_id == CODEC_ID_JPEGLS;
426 assert(!(ls && s->mjpeg_write_tables));
428 put_marker(&s->pb, SOI);
430 if (!s->mjpeg_data_only_frames)
432 jpeg_put_comments(s);
434 if (s->mjpeg_write_tables) jpeg_table_header(s);
436 switch(s->avctx->codec_id){
437 case CODEC_ID_MJPEG: put_marker(&s->pb, SOF0 ); break;
438 case CODEC_ID_LJPEG: put_marker(&s->pb, SOF3 ); break;
439 case CODEC_ID_JPEGLS: put_marker(&s->pb, SOF48); break;
443 put_bits(&s->pb, 16, 17);
444 if(lossless && s->avctx->pix_fmt == PIX_FMT_RGB32)
445 put_bits(&s->pb, 8, 9); /* 9 bits/component RCT */
447 put_bits(&s->pb, 8, 8); /* 8 bits/component */
448 put_bits(&s->pb, 16, s->height);
449 put_bits(&s->pb, 16, s->width);
450 put_bits(&s->pb, 8, 3); /* 3 components */
453 put_bits(&s->pb, 8, 1); /* component number */
454 put_bits(&s->pb, 4, s->mjpeg_hsample[0]); /* H factor */
455 put_bits(&s->pb, 4, s->mjpeg_vsample[0]); /* V factor */
456 put_bits(&s->pb, 8, 0); /* select matrix */
459 put_bits(&s->pb, 8, 2); /* component number */
460 put_bits(&s->pb, 4, s->mjpeg_hsample[1]); /* H factor */
461 put_bits(&s->pb, 4, s->mjpeg_vsample[1]); /* V factor */
463 put_bits(&s->pb, 8, lossless ? 0 : 1); /* select matrix */
465 put_bits(&s->pb, 8, 0); /* select matrix */
469 put_bits(&s->pb, 8, 3); /* component number */
470 put_bits(&s->pb, 4, s->mjpeg_hsample[2]); /* H factor */
471 put_bits(&s->pb, 4, s->mjpeg_vsample[2]); /* V factor */
473 put_bits(&s->pb, 8, lossless ? 0 : 1); /* select matrix */
475 put_bits(&s->pb, 8, 0); /* select matrix */
480 put_marker(&s->pb, SOS);
481 put_bits(&s->pb, 16, 12); /* length */
482 put_bits(&s->pb, 8, 3); /* 3 components */
485 put_bits(&s->pb, 8, 1); /* index */
486 put_bits(&s->pb, 4, 0); /* DC huffman table index */
487 put_bits(&s->pb, 4, 0); /* AC huffman table index */
490 put_bits(&s->pb, 8, 2); /* index */
491 put_bits(&s->pb, 4, 1); /* DC huffman table index */
492 put_bits(&s->pb, 4, lossless ? 0 : 1); /* AC huffman table index */
495 put_bits(&s->pb, 8, 3); /* index */
496 put_bits(&s->pb, 4, 1); /* DC huffman table index */
497 put_bits(&s->pb, 4, lossless ? 0 : 1); /* AC huffman table index */
499 put_bits(&s->pb, 8, (lossless && !ls) ? s->avctx->prediction_method+1 : 0); /* Ss (not used) */
501 switch(s->avctx->codec_id){
502 case CODEC_ID_MJPEG: put_bits(&s->pb, 8, 63); break; /* Se (not used) */
503 case CODEC_ID_LJPEG: put_bits(&s->pb, 8, 0); break; /* not used */
504 case CODEC_ID_JPEGLS: put_bits(&s->pb, 8, 1); break; /* ILV = line interleaved */
508 put_bits(&s->pb, 8, 0); /* Ah/Al (not used) */
510 //FIXME DC/AC entropy table selectors stuff in jpegls
513 static void escape_FF(MpegEncContext *s, int start)
515 int size= put_bits_count(&s->pb) - start*8;
517 uint8_t *buf= s->pb.buf + start;
518 int align= (-(size_t)(buf))&3;
520 assert((size&7) == 0);
524 for(i=0; i<size && i<align; i++){
525 if(buf[i]==0xFF) ff_count++;
527 for(; i<size-15; i+=16){
530 v= *(uint32_t*)(&buf[i]);
531 acc= (((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
532 v= *(uint32_t*)(&buf[i+4]);
533 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
534 v= *(uint32_t*)(&buf[i+8]);
535 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
536 v= *(uint32_t*)(&buf[i+12]);
537 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
545 if(buf[i]==0xFF) ff_count++;
548 if(ff_count==0) return;
551 for(i=0; i<ff_count-3; i+=4)
552 put_bits(&s->pb, 32, 0);
553 put_bits(&s->pb, (ff_count-i)*8, 0);
554 flush_put_bits(&s->pb);
556 for(i=size-1; ff_count; i--){
560 //printf("%d %d\n", i, ff_count);
569 void ff_mjpeg_stuffing(PutBitContext * pbc)
572 length= (-put_bits_count(pbc))&7;
573 if(length) put_bits(pbc, length, (1<<length)-1);
576 void mjpeg_picture_trailer(MpegEncContext *s)
578 ff_mjpeg_stuffing(&s->pb);
579 flush_put_bits(&s->pb);
581 assert((s->header_bits&7)==0);
583 escape_FF(s, s->header_bits>>3);
585 put_marker(&s->pb, EOI);
588 static inline void mjpeg_encode_dc(MpegEncContext *s, int val,
589 uint8_t *huff_size, uint16_t *huff_code)
594 put_bits(&s->pb, huff_size[0], huff_code[0]);
602 nbits= av_log2_16bit(val) + 1;
604 put_bits(&s->pb, huff_size[nbits], huff_code[nbits]);
606 put_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
610 static void encode_block(MpegEncContext *s, DCTELEM *block, int n)
612 int mant, nbits, code, i, j;
613 int component, dc, run, last_index, val;
614 MJpegContext *m = s->mjpeg_ctx;
615 uint8_t *huff_size_ac;
616 uint16_t *huff_code_ac;
619 component = (n <= 3 ? 0 : (n&1) + 1);
620 dc = block[0]; /* overflow is impossible */
621 val = dc - s->last_dc[component];
623 mjpeg_encode_dc(s, val, m->huff_size_dc_luminance, m->huff_code_dc_luminance);
624 huff_size_ac = m->huff_size_ac_luminance;
625 huff_code_ac = m->huff_code_ac_luminance;
627 mjpeg_encode_dc(s, val, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
628 huff_size_ac = m->huff_size_ac_chrominance;
629 huff_code_ac = m->huff_code_ac_chrominance;
631 s->last_dc[component] = dc;
636 last_index = s->block_last_index[n];
637 for(i=1;i<=last_index;i++) {
638 j = s->intra_scantable.permutated[i];
644 put_bits(&s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]);
653 nbits= av_log2(val) + 1;
654 code = (run << 4) | nbits;
656 put_bits(&s->pb, huff_size_ac[code], huff_code_ac[code]);
658 put_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
663 /* output EOB only if not already 64 values */
664 if (last_index < 63 || run != 0)
665 put_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]);
668 void mjpeg_encode_mb(MpegEncContext *s,
669 DCTELEM block[6][64])
673 encode_block(s, block[i], i);
675 if (s->chroma_format == CHROMA_420) {
676 encode_block(s, block[5], 5);
678 encode_block(s, block[6], 6);
679 encode_block(s, block[5], 5);
680 encode_block(s, block[7], 7);
684 static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
685 MpegEncContext * const s = avctx->priv_data;
686 MJpegContext * const m = s->mjpeg_ctx;
687 AVFrame *pict = data;
688 const int width= s->width;
689 const int height= s->height;
690 AVFrame * const p= (AVFrame*)&s->current_picture;
691 const int predictor= avctx->prediction_method+1;
693 init_put_bits(&s->pb, buf, buf_size);
696 p->pict_type= FF_I_TYPE;
699 mjpeg_picture_header(s);
701 s->header_bits= put_bits_count(&s->pb);
703 if(avctx->pix_fmt == PIX_FMT_RGB32){
705 const int linesize= p->linesize[0];
706 uint16_t (*buffer)[4]= (void *) s->rd_scratchpad;
707 int left[3], top[3], topleft[3];
710 buffer[0][i]= 1 << (9 - 1);
713 for(y = 0; y < height; y++) {
714 const int modified_predictor= y ? predictor : 1;
715 uint8_t *ptr = p->data[0] + (linesize * y);
717 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < width*3*4){
718 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
723 top[i]= left[i]= topleft[i]= buffer[0][i];
725 for(x = 0; x < width; x++) {
726 buffer[x][1] = ptr[4*x+0] - ptr[4*x+1] + 0x100;
727 buffer[x][2] = ptr[4*x+2] - ptr[4*x+1] + 0x100;
728 buffer[x][0] = (ptr[4*x+0] + 2*ptr[4*x+1] + ptr[4*x+2])>>2;
733 PREDICT(pred, topleft[i], top[i], left[i], modified_predictor);
736 top[i]= buffer[x+1][i];
738 left[i]= buffer[x][i];
740 diff= ((left[i] - pred + 0x100)&0x1FF) - 0x100;
743 mjpeg_encode_dc(s, diff, m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly
745 mjpeg_encode_dc(s, diff, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
751 const int mb_width = (width + s->mjpeg_hsample[0] - 1) / s->mjpeg_hsample[0];
752 const int mb_height = (height + s->mjpeg_vsample[0] - 1) / s->mjpeg_vsample[0];
754 for(mb_y = 0; mb_y < mb_height; mb_y++) {
755 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < mb_width * 4 * 3 * s->mjpeg_hsample[0] * s->mjpeg_vsample[0]){
756 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
759 for(mb_x = 0; mb_x < mb_width; mb_x++) {
760 if(mb_x==0 || mb_y==0){
763 int x, y, h, v, linesize;
764 h = s->mjpeg_hsample[i];
765 v = s->mjpeg_vsample[i];
766 linesize= p->linesize[i];
772 ptr = p->data[i] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
781 pred= ptr[-linesize];
783 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
788 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly
790 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
797 int x, y, h, v, linesize;
798 h = s->mjpeg_hsample[i];
799 v = s->mjpeg_vsample[i];
800 linesize= p->linesize[i];
806 ptr = p->data[i] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
807 //printf("%d %d %d %d %8X\n", mb_x, mb_y, x, y, ptr);
808 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
811 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly
813 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
824 mjpeg_picture_trailer(s);
827 flush_put_bits(&s->pb);
828 return pbBufPtr(&s->pb) - s->pb.buf;
829 // return (put_bits_count(&f->pb)+7)/8;
832 #endif //CONFIG_ENCODERS
834 /******************************************/
837 #define MAX_COMPONENTS 4
839 typedef struct MJpegDecodeContext {
840 AVCodecContext *avctx;
843 int start_code; /* current start code */
847 int16_t quant_matrixes[4][64];
849 int qscale[4]; ///< quantizer scale calculated from quant_matrixes
851 int org_height; /* size given at codec init */
852 int first_picture; /* true if decoding first picture */
853 int interlaced; /* true if interlaced */
854 int bottom_field; /* true if bottom field */
859 int rct; /* standard rct */
860 int pegasus_rct; /* pegasus reversible colorspace transform */
861 int bits; /* bits per component */
864 int near; ///< near lossless bound (si 0 for lossless)
866 int reset; ///< context halfing intervall ?rename
869 int mb_width, mb_height;
871 int component_id[MAX_COMPONENTS];
872 int h_count[MAX_COMPONENTS]; /* horizontal and vertical count for each component */
873 int v_count[MAX_COMPONENTS];
874 int comp_index[MAX_COMPONENTS];
875 int dc_index[MAX_COMPONENTS];
876 int ac_index[MAX_COMPONENTS];
877 int nb_blocks[MAX_COMPONENTS];
878 int h_scount[MAX_COMPONENTS];
879 int v_scount[MAX_COMPONENTS];
880 int h_max, v_max; /* maximum h and v counts */
881 int quant_index[4]; /* quant table index for each component */
882 int last_dc[MAX_COMPONENTS]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */
883 AVFrame picture; /* picture structure */
884 int linesize[MAX_COMPONENTS]; ///< linesize << interlaced
885 int8_t *qscale_table;
886 DECLARE_ALIGNED_8(DCTELEM, block[64]);
890 int restart_interval;
895 int interlace_polarity;
899 int cur_scan; /* current scan, used by JPEG-LS */
900 } MJpegDecodeContext;
902 #include "jpeg_ls.c" //FIXME make jpeg-ls more independent
904 static int mjpeg_decode_dht(MJpegDecodeContext *s);
906 static int build_vlc(VLC *vlc, const uint8_t *bits_table, const uint8_t *val_table,
907 int nb_codes, int use_static, int is_ac)
909 uint8_t huff_size[256+16];
910 uint16_t huff_code[256+16];
912 assert(nb_codes <= 256);
914 memset(huff_size, 0, sizeof(huff_size));
915 build_huffman_codes(huff_size, huff_code, bits_table, val_table);
918 memmove(huff_size+16, huff_size, sizeof(uint8_t)*nb_codes);
919 memmove(huff_code+16, huff_code, sizeof(uint16_t)*nb_codes);
920 memset(huff_size, 0, sizeof(uint8_t)*16);
921 memset(huff_code, 0, sizeof(uint16_t)*16);
925 return init_vlc(vlc, 9, nb_codes, huff_size, 1, 1, huff_code, 2, 2, use_static);
928 static int mjpeg_decode_init(AVCodecContext *avctx)
930 MJpegDecodeContext *s = avctx->priv_data;
933 dsputil_init(&s->dsp, avctx);
934 ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct);
938 s->first_picture = 1;
939 s->org_height = avctx->coded_height;
941 build_vlc(&s->vlcs[0][0], bits_dc_luminance, val_dc_luminance, 12, 0, 0);
942 build_vlc(&s->vlcs[0][1], bits_dc_chrominance, val_dc_chrominance, 12, 0, 0);
943 build_vlc(&s->vlcs[1][0], bits_ac_luminance, val_ac_luminance, 251, 0, 1);
944 build_vlc(&s->vlcs[1][1], bits_ac_chrominance, val_ac_chrominance, 251, 0, 1);
946 if (avctx->flags & CODEC_FLAG_EXTERN_HUFF)
948 av_log(avctx, AV_LOG_INFO, "mjpeg: using external huffman table\n");
949 init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8);
951 /* should check for error - but dunno */
953 if (avctx->extradata_size > 9 &&
954 AV_RL32(avctx->extradata + 4) == MKTAG('f','i','e','l')) {
955 if (avctx->extradata[9] == 6) { /* quicktime icefloe 019 */
956 s->interlace_polarity = 1; /* bottom field first */
957 av_log(avctx, AV_LOG_DEBUG, "mjpeg bottom field first\n");
966 * finds the end of the current frame in the bitstream.
967 * @return the position of the first byte of the next frame, or -1
969 static int find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size){
973 vop_found= pc->frame_start_found;
978 for(i=0; i<buf_size; i++){
979 state= (state<<8) | buf[i];
989 /* EOF considered as end of frame */
992 for(; i<buf_size; i++){
993 state= (state<<8) | buf[i];
995 pc->frame_start_found=0;
1001 pc->frame_start_found= vop_found;
1003 return END_NOT_FOUND;
1006 static int jpeg_parse(AVCodecParserContext *s,
1007 AVCodecContext *avctx,
1008 uint8_t **poutbuf, int *poutbuf_size,
1009 const uint8_t *buf, int buf_size)
1011 ParseContext *pc = s->priv_data;
1014 next= find_frame_end(pc, buf, buf_size);
1016 if (ff_combine_frame(pc, next, (uint8_t **)&buf, &buf_size) < 0) {
1022 *poutbuf = (uint8_t *)buf;
1023 *poutbuf_size = buf_size;
1027 /* quantize tables */
1028 static int mjpeg_decode_dqt(MJpegDecodeContext *s)
1030 int len, index, i, j;
1032 len = get_bits(&s->gb, 16) - 2;
1035 /* only 8 bit precision handled */
1036 if (get_bits(&s->gb, 4) != 0)
1038 av_log(s->avctx, AV_LOG_ERROR, "dqt: 16bit precision\n");
1041 index = get_bits(&s->gb, 4);
1044 av_log(s->avctx, AV_LOG_DEBUG, "index=%d\n", index);
1045 /* read quant table */
1047 j = s->scantable.permutated[i];
1048 s->quant_matrixes[index][j] = get_bits(&s->gb, 8);
1051 //XXX FIXME finetune, and perhaps add dc too
1052 s->qscale[index]= FFMAX(
1053 s->quant_matrixes[index][s->scantable.permutated[1]],
1054 s->quant_matrixes[index][s->scantable.permutated[8]]) >> 1;
1055 av_log(s->avctx, AV_LOG_DEBUG, "qscale[%d]: %d\n", index, s->qscale[index]);
1062 /* decode huffman tables and build VLC decoders */
1063 static int mjpeg_decode_dht(MJpegDecodeContext *s)
1065 int len, index, i, class, n, v, code_max;
1066 uint8_t bits_table[17];
1067 uint8_t val_table[256];
1069 len = get_bits(&s->gb, 16) - 2;
1074 class = get_bits(&s->gb, 4);
1077 index = get_bits(&s->gb, 4);
1081 for(i=1;i<=16;i++) {
1082 bits_table[i] = get_bits(&s->gb, 8);
1086 if (len < n || n > 256)
1091 v = get_bits(&s->gb, 8);
1098 /* build VLC and flush previous vlc if present */
1099 free_vlc(&s->vlcs[class][index]);
1100 av_log(s->avctx, AV_LOG_DEBUG, "class=%d index=%d nb_codes=%d\n",
1101 class, index, code_max + 1);
1102 if(build_vlc(&s->vlcs[class][index], bits_table, val_table, code_max + 1, 0, class > 0) < 0){
1109 static int mjpeg_decode_sof(MJpegDecodeContext *s)
1111 int len, nb_components, i, width, height, pix_fmt_id;
1113 /* XXX: verify len field validity */
1114 len = get_bits(&s->gb, 16);
1115 s->bits= get_bits(&s->gb, 8);
1117 if(s->pegasus_rct) s->bits=9;
1118 if(s->bits==9 && !s->pegasus_rct) s->rct=1; //FIXME ugly
1120 if (s->bits != 8 && !s->lossless){
1121 av_log(s->avctx, AV_LOG_ERROR, "only 8 bits/component accepted\n");
1125 height = get_bits(&s->gb, 16);
1126 width = get_bits(&s->gb, 16);
1128 av_log(s->avctx, AV_LOG_DEBUG, "sof0: picture: %dx%d\n", width, height);
1129 if(avcodec_check_dimensions(s->avctx, width, height))
1132 nb_components = get_bits(&s->gb, 8);
1133 if (nb_components <= 0 ||
1134 nb_components > MAX_COMPONENTS)
1136 if (s->ls && !(s->bits <= 8 || nb_components == 1)){
1137 av_log(s->avctx, AV_LOG_ERROR, "only <= 8 bits/component or 16-bit gray accepted for JPEG-LS\n");
1140 s->nb_components = nb_components;
1143 for(i=0;i<nb_components;i++) {
1145 s->component_id[i] = get_bits(&s->gb, 8) - 1;
1146 s->h_count[i] = get_bits(&s->gb, 4);
1147 s->v_count[i] = get_bits(&s->gb, 4);
1148 /* compute hmax and vmax (only used in interleaved case) */
1149 if (s->h_count[i] > s->h_max)
1150 s->h_max = s->h_count[i];
1151 if (s->v_count[i] > s->v_max)
1152 s->v_max = s->v_count[i];
1153 s->quant_index[i] = get_bits(&s->gb, 8);
1154 if (s->quant_index[i] >= 4)
1156 av_log(s->avctx, AV_LOG_DEBUG, "component %d %d:%d id: %d quant:%d\n", i, s->h_count[i],
1157 s->v_count[i], s->component_id[i], s->quant_index[i]);
1160 if(s->ls && (s->h_max > 1 || s->v_max > 1)) {
1161 av_log(s->avctx, AV_LOG_ERROR, "Subsampling in JPEG-LS is not supported.\n");
1165 if(s->v_max==1 && s->h_max==1 && s->lossless==1) s->rgb=1;
1167 /* if different size, realloc/alloc picture */
1168 /* XXX: also check h_count and v_count */
1169 if (width != s->width || height != s->height) {
1170 av_freep(&s->qscale_table);
1176 /* test interlaced mode */
1177 if (s->first_picture &&
1178 s->org_height != 0 &&
1179 s->height < ((s->org_height * 3) / 4)) {
1181 s->bottom_field = s->interlace_polarity;
1182 s->picture.interlaced_frame = 1;
1183 s->picture.top_field_first = !s->interlace_polarity;
1187 avcodec_set_dimensions(s->avctx, width, height);
1189 s->qscale_table= av_mallocz((s->width+15)/16);
1191 s->first_picture = 0;
1194 if(s->interlaced && (s->bottom_field == !s->interlace_polarity))
1197 /* XXX: not complete test ! */
1198 pix_fmt_id = (s->h_count[0] << 20) | (s->v_count[0] << 16) |
1199 (s->h_count[1] << 12) | (s->v_count[1] << 8) |
1200 (s->h_count[2] << 4) | s->v_count[2];
1201 av_log(s->avctx, AV_LOG_DEBUG, "pix fmt id %x\n", pix_fmt_id);
1206 s->avctx->pix_fmt = PIX_FMT_RGB32;
1207 }else if(s->nb_components==3)
1208 s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV444P : PIX_FMT_YUVJ444P;
1210 s->avctx->pix_fmt = PIX_FMT_GRAY8;
1214 s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV422P : PIX_FMT_YUVJ422P;
1218 s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV420P : PIX_FMT_YUVJ420P;
1222 if(s->nb_components > 1)
1223 s->avctx->pix_fmt = PIX_FMT_RGB24;
1224 else if(s->bits <= 8)
1225 s->avctx->pix_fmt = PIX_FMT_GRAY8;
1227 s->avctx->pix_fmt = PIX_FMT_GRAY16;
1230 if(s->picture.data[0])
1231 s->avctx->release_buffer(s->avctx, &s->picture);
1233 s->picture.reference= 0;
1234 if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){
1235 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1238 s->picture.pict_type= I_TYPE;
1239 s->picture.key_frame= 1;
1242 s->linesize[i]= s->picture.linesize[i] << s->interlaced;
1245 // printf("%d %d %d %d %d %d\n", s->width, s->height, s->linesize[0], s->linesize[1], s->interlaced, s->avctx->height);
1247 if (len != (8+(3*nb_components)))
1249 av_log(s->avctx, AV_LOG_DEBUG, "decode_sof0: error, len(%d) mismatch\n", len);
1252 /* totally blank picture as progressive JPEG will only add details to it */
1254 memset(s->picture.data[0], 0, s->picture.linesize[0] * s->height);
1255 memset(s->picture.data[1], 0, s->picture.linesize[1] * s->height >> (s->v_max - s->v_count[1]));
1256 memset(s->picture.data[2], 0, s->picture.linesize[2] * s->height >> (s->v_max - s->v_count[2]));
1261 static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
1264 code = get_vlc2(&s->gb, s->vlcs[0][dc_index].table, 9, 2);
1267 av_log(s->avctx, AV_LOG_WARNING, "mjpeg_decode_dc: bad vlc: %d:%d (%p)\n", 0, dc_index,
1268 &s->vlcs[0][dc_index]);
1273 return get_xbits(&s->gb, code);
1278 /* decode block and dequantize */
1279 static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
1280 int component, int dc_index, int ac_index, int16_t *quant_matrix)
1282 int code, i, j, level, val;
1285 val = mjpeg_decode_dc(s, dc_index);
1286 if (val == 0xffff) {
1287 av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
1290 val = val * quant_matrix[0] + s->last_dc[component];
1291 s->last_dc[component] = val;
1295 {OPEN_READER(re, &s->gb)
1297 UPDATE_CACHE(re, &s->gb);
1298 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2)
1303 i += ((unsigned)code) >> 4;
1306 if(code > MIN_CACHE_BITS - 16){
1307 UPDATE_CACHE(re, &s->gb)
1310 int cache=GET_CACHE(re,&s->gb);
1311 int sign=(~cache)>>31;
1312 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
1315 LAST_SKIP_BITS(re, &s->gb, code)
1319 j = s->scantable.permutated[63];
1320 block[j] = level * quant_matrix[j];
1323 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
1326 j = s->scantable.permutated[i];
1327 block[j] = level * quant_matrix[j];
1330 CLOSE_READER(re, &s->gb)}
1335 /* decode block and dequantize - progressive JPEG version */
1336 static int decode_block_progressive(MJpegDecodeContext *s, DCTELEM *block,
1337 int component, int dc_index, int ac_index, int16_t *quant_matrix,
1338 int ss, int se, int Ah, int Al, int *EOBRUN)
1340 int code, i, j, level, val, run;
1344 val = mjpeg_decode_dc(s, dc_index);
1345 if (val == 0xffff) {
1346 av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
1349 val = (val * quant_matrix[0] << Al) + s->last_dc[component];
1352 s->last_dc[component] = val;
1360 {OPEN_READER(re, &s->gb)
1362 UPDATE_CACHE(re, &s->gb);
1363 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2)
1364 /* Progressive JPEG use AC coeffs from zero and this decoder sets offset 16 by default */
1367 i += ((unsigned) code) >> 4;
1369 if(code > MIN_CACHE_BITS - 16){
1370 UPDATE_CACHE(re, &s->gb)
1373 int cache=GET_CACHE(re,&s->gb);
1374 int sign=(~cache)>>31;
1375 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
1378 LAST_SKIP_BITS(re, &s->gb, code)
1382 j = s->scantable.permutated[se];
1383 block[j] = level * quant_matrix[j] << Al;
1386 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
1389 j = s->scantable.permutated[i];
1390 block[j] = level * quant_matrix[j] << Al;
1392 run = ((unsigned) code) >> 4;
1393 if(run == 0xF){// ZRL - skip 15 coefficients
1398 UPDATE_CACHE(re, &s->gb);
1399 run += (GET_CACHE(re, &s->gb) >> (32 - val)) & (run - 1);
1401 LAST_SKIP_BITS(re, &s->gb, val);
1407 CLOSE_READER(re, &s->gb)}
1412 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point_transform){
1414 uint16_t buffer[32768][4];
1415 int left[3], top[3], topleft[3];
1416 const int linesize= s->linesize[0];
1417 const int mask= (1<<s->bits)-1;
1419 if((unsigned)s->mb_width > 32768) //dynamic alloc
1423 buffer[0][i]= 1 << (s->bits + point_transform - 1);
1425 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1426 const int modified_predictor= mb_y ? predictor : 1;
1427 uint8_t *ptr = s->picture.data[0] + (linesize * mb_y);
1429 if (s->interlaced && s->bottom_field)
1430 ptr += linesize >> 1;
1433 top[i]= left[i]= topleft[i]= buffer[0][i];
1435 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1436 if (s->restart_interval && !s->restart_count)
1437 s->restart_count = s->restart_interval;
1443 top[i]= buffer[mb_x][i];
1445 PREDICT(pred, topleft[i], top[i], left[i], modified_predictor);
1448 buffer[mb_x][i]= mask & (pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform));
1451 if (s->restart_interval && !--s->restart_count) {
1452 align_get_bits(&s->gb);
1453 skip_bits(&s->gb, 16); /* skip RSTn */
1458 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1459 ptr[4*mb_x+1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200)>>2);
1460 ptr[4*mb_x+0] = buffer[mb_x][1] + ptr[4*mb_x+1];
1461 ptr[4*mb_x+2] = buffer[mb_x][2] + ptr[4*mb_x+1];
1463 }else if(s->pegasus_rct){
1464 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1465 ptr[4*mb_x+1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2])>>2);
1466 ptr[4*mb_x+0] = buffer[mb_x][1] + ptr[4*mb_x+1];
1467 ptr[4*mb_x+2] = buffer[mb_x][2] + ptr[4*mb_x+1];
1470 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1471 ptr[4*mb_x+0] = buffer[mb_x][0];
1472 ptr[4*mb_x+1] = buffer[mb_x][1];
1473 ptr[4*mb_x+2] = buffer[mb_x][2];
1480 static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point_transform){
1482 const int nb_components=3;
1484 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1485 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1486 if (s->restart_interval && !s->restart_count)
1487 s->restart_count = s->restart_interval;
1489 if(mb_x==0 || mb_y==0 || s->interlaced){
1490 for(i=0;i<nb_components;i++) {
1492 int n, h, v, x, y, c, j, linesize;
1493 n = s->nb_blocks[i];
1494 c = s->comp_index[i];
1499 linesize= s->linesize[c];
1501 for(j=0; j<n; j++) {
1504 ptr = s->picture.data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
1505 if(y==0 && mb_y==0){
1506 if(x==0 && mb_x==0){
1507 pred= 128 << point_transform;
1512 if(x==0 && mb_x==0){
1513 pred= ptr[-linesize];
1515 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1519 if (s->interlaced && s->bottom_field)
1520 ptr += linesize >> 1;
1521 *ptr= pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform);
1530 for(i=0;i<nb_components;i++) {
1532 int n, h, v, x, y, c, j, linesize;
1533 n = s->nb_blocks[i];
1534 c = s->comp_index[i];
1539 linesize= s->linesize[c];
1541 for(j=0; j<n; j++) {
1544 ptr = s->picture.data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
1545 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1546 *ptr= pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform);
1554 if (s->restart_interval && !--s->restart_count) {
1555 align_get_bits(&s->gb);
1556 skip_bits(&s->gb, 16); /* skip RSTn */
1563 static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int ss, int se, int Ah, int Al){
1567 if(Ah) return 0; /* TODO decode refinement planes too */
1568 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1569 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1570 if (s->restart_interval && !s->restart_count)
1571 s->restart_count = s->restart_interval;
1573 for(i=0;i<nb_components;i++) {
1575 int n, h, v, x, y, c, j;
1576 n = s->nb_blocks[i];
1577 c = s->comp_index[i];
1583 memset(s->block, 0, sizeof(s->block));
1584 if (!s->progressive && decode_block(s, s->block, i,
1585 s->dc_index[i], s->ac_index[i],
1586 s->quant_matrixes[ s->quant_index[c] ]) < 0) {
1587 av_log(s->avctx, AV_LOG_ERROR, "error y=%d x=%d\n", mb_y, mb_x);
1590 if (s->progressive && decode_block_progressive(s, s->block, i,
1591 s->dc_index[i], s->ac_index[i],
1592 s->quant_matrixes[ s->quant_index[c] ], ss, se, Ah, Al, &EOBRUN) < 0) {
1593 av_log(s->avctx, AV_LOG_ERROR, "error y=%d x=%d\n", mb_y, mb_x);
1596 // av_log(s->avctx, AV_LOG_DEBUG, "mb: %d %d processed\n", mb_y, mb_x);
1597 ptr = s->picture.data[c] +
1598 (((s->linesize[c] * (v * mb_y + y) * 8) +
1599 (h * mb_x + x) * 8) >> s->avctx->lowres);
1600 if (s->interlaced && s->bottom_field)
1601 ptr += s->linesize[c] >> 1;
1602 //av_log(NULL, AV_LOG_DEBUG, "%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);
1604 s->dsp.idct_put(ptr, s->linesize[c], s->block);
1606 s->dsp.idct_add(ptr, s->linesize[c], s->block);
1613 /* (< 1350) buggy workaround for Spectralfan.mov, should be fixed */
1614 if (s->restart_interval && (s->restart_interval < 1350) &&
1615 !--s->restart_count) {
1616 align_get_bits(&s->gb);
1617 skip_bits(&s->gb, 16); /* skip RSTn */
1618 for (i=0; i<nb_components; i++) /* reset dc */
1619 s->last_dc[i] = 1024;
1626 static int mjpeg_decode_sos(MJpegDecodeContext *s)
1628 int len, nb_components, i, h, v, predictor, point_transform;
1629 int vmax, hmax, index, id;
1630 const int block_size= s->lossless ? 1 : 8;
1631 int ilv, prev_shift;
1633 /* XXX: verify len field validity */
1634 len = get_bits(&s->gb, 16);
1635 nb_components = get_bits(&s->gb, 8);
1636 if (len != 6+2*nb_components)
1638 av_log(s->avctx, AV_LOG_ERROR, "decode_sos: invalid len (%d)\n", len);
1643 for(i=0;i<nb_components;i++) {
1644 id = get_bits(&s->gb, 8) - 1;
1645 av_log(s->avctx, AV_LOG_DEBUG, "component: %d\n", id);
1646 /* find component index */
1647 for(index=0;index<s->nb_components;index++)
1648 if (id == s->component_id[index])
1650 if (index == s->nb_components)
1652 av_log(s->avctx, AV_LOG_ERROR, "decode_sos: index(%d) out of components\n", index);
1656 s->comp_index[i] = index;
1658 s->nb_blocks[i] = s->h_count[index] * s->v_count[index];
1659 s->h_scount[i] = s->h_count[index];
1660 s->v_scount[i] = s->v_count[index];
1662 s->dc_index[i] = get_bits(&s->gb, 4);
1663 s->ac_index[i] = get_bits(&s->gb, 4);
1665 if (s->dc_index[i] < 0 || s->ac_index[i] < 0 ||
1666 s->dc_index[i] >= 4 || s->ac_index[i] >= 4)
1669 switch(s->start_code)
1672 if (dc_index[i] > 1 || ac_index[i] > 1)
1677 if (dc_index[i] > 3 || ac_index[i] > 3)
1681 if (dc_index[i] > 3 || ac_index[i] != 0)
1688 predictor= get_bits(&s->gb, 8); /* JPEG Ss / lossless JPEG predictor /JPEG-LS NEAR */
1689 ilv= get_bits(&s->gb, 8); /* JPEG Se / JPEG-LS ILV */
1690 prev_shift = get_bits(&s->gb, 4); /* Ah */
1691 point_transform= get_bits(&s->gb, 4); /* Al */
1693 for(i=0;i<nb_components;i++)
1694 s->last_dc[i] = 1024;
1696 if (nb_components > 1) {
1697 /* interleaved stream */
1698 s->mb_width = (s->width + s->h_max * block_size - 1) / (s->h_max * block_size);
1699 s->mb_height = (s->height + s->v_max * block_size - 1) / (s->v_max * block_size);
1700 } else if(!s->ls) { /* skip this for JPEG-LS */
1701 h = s->h_max / s->h_scount[0];
1702 v = s->v_max / s->v_scount[0];
1703 s->mb_width = (s->width + h * block_size - 1) / (h * block_size);
1704 s->mb_height = (s->height + v * block_size - 1) / (v * block_size);
1705 s->nb_blocks[0] = 1;
1710 if(s->avctx->debug & FF_DEBUG_PICT_INFO)
1711 av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d ilv:%d bits:%d %s\n", s->lossless ? "lossless" : "sequencial DCT", s->rgb ? "RGB" : "",
1712 predictor, point_transform, ilv, s->bits,
1713 s->pegasus_rct ? "PRCT" : (s->rct ? "RCT" : ""));
1716 /* mjpeg-b can have padding bytes between sos and image data, skip them */
1717 for (i = s->mjpb_skiptosod; i > 0; i--)
1718 skip_bits(&s->gb, 8);
1723 // reset_ls_coding_parameters(s, 0);
1725 ls_decode_picture(s, predictor, point_transform, ilv);
1728 if(ljpeg_decode_rgb_scan(s, predictor, point_transform) < 0)
1731 if(ljpeg_decode_yuv_scan(s, predictor, point_transform) < 0)
1736 if(mjpeg_decode_scan(s, nb_components, predictor, ilv, prev_shift, point_transform) < 0)
1742 av_log(s->avctx, AV_LOG_ERROR, "decode_sos: ac/dc index out of range\n");
1746 static int mjpeg_decode_dri(MJpegDecodeContext *s)
1748 if (get_bits(&s->gb, 16) != 4)
1750 s->restart_interval = get_bits(&s->gb, 16);
1751 s->restart_count = 0;
1752 av_log(s->avctx, AV_LOG_DEBUG, "restart interval: %d\n", s->restart_interval);
1757 static int mjpeg_decode_app(MJpegDecodeContext *s)
1761 len = get_bits(&s->gb, 16);
1764 if(8*len + get_bits_count(&s->gb) > s->gb.size_in_bits)
1767 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
1771 if(s->avctx->debug & FF_DEBUG_STARTCODE){
1772 av_log(s->avctx, AV_LOG_DEBUG, "APPx %8X\n", id);
1775 /* buggy AVID, it puts EOI only at every 10th frame */
1776 /* also this fourcc is used by non-avid files too, it holds some
1777 informations, but it's always present in AVID creates files */
1778 if (id == ff_get_fourcc("AVI1"))
1785 4bytes field_size_less_padding
1788 // if (s->first_picture)
1789 // printf("mjpeg: workarounding buggy AVID\n");
1790 s->interlace_polarity = get_bits(&s->gb, 8);
1792 skip_bits(&s->gb, 8);
1793 skip_bits(&s->gb, 32);
1794 skip_bits(&s->gb, 32);
1797 // if (s->interlace_polarity)
1798 // printf("mjpeg: interlace polarity: %d\n", s->interlace_polarity);
1804 if (id == ff_get_fourcc("JFIF"))
1806 int t_w, t_h, v1, v2;
1807 skip_bits(&s->gb, 8); /* the trailing zero-byte */
1808 v1= get_bits(&s->gb, 8);
1809 v2= get_bits(&s->gb, 8);
1810 skip_bits(&s->gb, 8);
1812 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 16);
1813 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 16);
1815 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1816 av_log(s->avctx, AV_LOG_INFO, "mjpeg: JFIF header found (version: %x.%x) SAR=%d/%d\n",
1818 s->avctx->sample_aspect_ratio.num,
1819 s->avctx->sample_aspect_ratio.den
1822 t_w = get_bits(&s->gb, 8);
1823 t_h = get_bits(&s->gb, 8);
1826 /* skip thumbnail */
1827 if (len-10-(t_w*t_h*3) > 0)
1834 if (id == ff_get_fourcc("Adob") && (get_bits(&s->gb, 8) == 'e'))
1836 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1837 av_log(s->avctx, AV_LOG_INFO, "mjpeg: Adobe header found\n");
1838 skip_bits(&s->gb, 16); /* version */
1839 skip_bits(&s->gb, 16); /* flags0 */
1840 skip_bits(&s->gb, 16); /* flags1 */
1841 skip_bits(&s->gb, 8); /* transform */
1846 if (id == ff_get_fourcc("LJIF")){
1847 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1848 av_log(s->avctx, AV_LOG_INFO, "Pegasus lossless jpeg header found\n");
1849 skip_bits(&s->gb, 16); /* version ? */
1850 skip_bits(&s->gb, 16); /* unknwon always 0? */
1851 skip_bits(&s->gb, 16); /* unknwon always 0? */
1852 skip_bits(&s->gb, 16); /* unknwon always 0? */
1853 switch( get_bits(&s->gb, 8)){
1863 av_log(s->avctx, AV_LOG_ERROR, "unknown colorspace\n");
1870 if ((s->start_code == APP1) && (len > (0x28 - 8)))
1872 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
1875 if (id == ff_get_fourcc("mjpg")) /* Apple MJPEG-A */
1878 skip_bits(&s->gb, 32); /* field size */
1879 skip_bits(&s->gb, 32); /* pad field size */
1880 skip_bits(&s->gb, 32); /* next off */
1881 skip_bits(&s->gb, 32); /* quant off */
1882 skip_bits(&s->gb, 32); /* huff off */
1883 skip_bits(&s->gb, 32); /* image off */
1884 skip_bits(&s->gb, 32); /* scan off */
1885 skip_bits(&s->gb, 32); /* data off */
1887 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1888 av_log(s->avctx, AV_LOG_INFO, "mjpeg: Apple MJPEG-A header found\n");
1893 /* slow but needed for extreme adobe jpegs */
1895 av_log(s->avctx, AV_LOG_ERROR, "mjpeg: error, decode_app parser read over the end\n");
1897 skip_bits(&s->gb, 8);
1902 static int mjpeg_decode_com(MJpegDecodeContext *s)
1904 int len = get_bits(&s->gb, 16);
1905 if (len >= 2 && 8*len - 16 + get_bits_count(&s->gb) <= s->gb.size_in_bits) {
1906 char *cbuf = av_malloc(len - 1);
1909 for (i = 0; i < len - 2; i++)
1910 cbuf[i] = get_bits(&s->gb, 8);
1911 if (i > 0 && cbuf[i-1] == '\n')
1916 if(s->avctx->debug & FF_DEBUG_PICT_INFO)
1917 av_log(s->avctx, AV_LOG_INFO, "mjpeg comment: '%s'\n", cbuf);
1919 /* buggy avid, it puts EOI only at every 10th frame */
1920 if (!strcmp(cbuf, "AVID"))
1923 // if (s->first_picture)
1924 // printf("mjpeg: workarounding buggy AVID\n");
1926 else if(!strcmp(cbuf, "CS=ITU601")){
1938 static int valid_marker_list[] =
1940 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f */
1941 /* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1942 /* 1 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1943 /* 2 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1944 /* 3 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1945 /* 4 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1946 /* 5 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1947 /* 6 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1948 /* 7 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1949 /* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1950 /* 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1951 /* a */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1952 /* b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1953 /* c */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1954 /* d */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1955 /* e */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1956 /* f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1960 /* return the 8 bit start code value and update the search
1961 state. Return -1 if no start code found */
1962 static int find_marker(uint8_t **pbuf_ptr, uint8_t *buf_end)
1971 buf_ptr = *pbuf_ptr;
1972 while (buf_ptr < buf_end) {
1975 if ((v == 0xff) && (v2 >= 0xc0) && (v2 <= 0xfe) && buf_ptr < buf_end) {
1986 av_log(NULL, AV_LOG_VERBOSE, "find_marker skipped %d bytes\n", skipped);
1988 *pbuf_ptr = buf_ptr;
1992 static int mjpeg_decode_frame(AVCodecContext *avctx,
1993 void *data, int *data_size,
1994 uint8_t *buf, int buf_size)
1996 MJpegDecodeContext *s = avctx->priv_data;
1997 uint8_t *buf_end, *buf_ptr;
1999 AVFrame *picture = data;
2002 buf_end = buf + buf_size;
2003 while (buf_ptr < buf_end) {
2004 /* find start next marker */
2005 start_code = find_marker(&buf_ptr, buf_end);
2008 if (start_code < 0) {
2011 av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%d\n", start_code, buf_end - buf_ptr);
2013 if ((buf_end - buf_ptr) > s->buffer_size)
2016 s->buffer_size = buf_end-buf_ptr;
2017 s->buffer = av_malloc(s->buffer_size + FF_INPUT_BUFFER_PADDING_SIZE);
2018 av_log(avctx, AV_LOG_DEBUG, "buffer too small, expanding to %d bytes\n",
2022 /* unescape buffer of SOS, use special treatment for JPEG-LS */
2023 if (start_code == SOS && !s->ls)
2025 uint8_t *src = buf_ptr;
2026 uint8_t *dst = s->buffer;
2030 uint8_t x = *(src++);
2033 if (avctx->codec_id != CODEC_ID_THP)
2036 while (src < buf_end && x == 0xff)
2039 if (x >= 0xd0 && x <= 0xd7)
2046 init_get_bits(&s->gb, s->buffer, (dst - s->buffer)*8);
2048 av_log(avctx, AV_LOG_DEBUG, "escaping removed %d bytes\n",
2049 (buf_end - buf_ptr) - (dst - s->buffer));
2051 else if(start_code == SOS && s->ls){
2052 uint8_t *src = buf_ptr;
2053 uint8_t *dst = s->buffer;
2061 while (src + t < buf_end){
2062 uint8_t x = src[t++];
2064 while((src + t < buf_end) && x == 0xff)
2074 init_put_bits(&pb, dst, t);
2076 /* unescape bitstream */
2078 uint8_t x = src[b++];
2079 put_bits(&pb, 8, x);
2082 put_bits(&pb, 7, x);
2086 flush_put_bits(&pb);
2088 init_get_bits(&s->gb, dst, bit_count);
2091 init_get_bits(&s->gb, buf_ptr, (buf_end - buf_ptr)*8);
2093 s->start_code = start_code;
2094 if(s->avctx->debug & FF_DEBUG_STARTCODE){
2095 av_log(avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code);
2098 /* process markers */
2099 if (start_code >= 0xd0 && start_code <= 0xd7) {
2100 av_log(avctx, AV_LOG_DEBUG, "restart marker: %d\n", start_code&0x0f);
2102 } else if (start_code >= APP0 && start_code <= APP15) {
2103 mjpeg_decode_app(s);
2105 } else if (start_code == COM){
2106 mjpeg_decode_com(s);
2109 switch(start_code) {
2111 s->restart_interval = 0;
2113 s->restart_count = 0;
2114 /* nothing to do on SOI */
2117 mjpeg_decode_dqt(s);
2120 if(mjpeg_decode_dht(s) < 0){
2121 av_log(avctx, AV_LOG_ERROR, "huffman table decode error\n");
2129 if (mjpeg_decode_sof(s) < 0)
2136 if (mjpeg_decode_sof(s) < 0)
2143 if (mjpeg_decode_sof(s) < 0)
2150 if (mjpeg_decode_sof(s) < 0)
2154 if (decode_lse(s) < 0)
2159 if ((s->buggy_avid && !s->interlaced) || s->restart_interval)
2163 if (s->interlaced) {
2164 s->bottom_field ^= 1;
2165 /* if not bottom field, do not output image yet */
2166 if (s->bottom_field == !s->interlace_polarity)
2169 *picture = s->picture;
2170 *data_size = sizeof(AVFrame);
2173 picture->quality= FFMAX(FFMAX(s->qscale[0], s->qscale[1]), s->qscale[2]);
2174 picture->qstride= 0;
2175 picture->qscale_table= s->qscale_table;
2176 memset(picture->qscale_table, picture->quality, (s->width+15)/16);
2177 if(avctx->debug & FF_DEBUG_QP)
2178 av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", picture->quality);
2179 picture->quality*= FF_QP2LAMBDA;
2186 mjpeg_decode_sos(s);
2187 /* buggy avid puts EOI every 10-20th frame */
2188 /* if restart period is over process EOI */
2189 if ((s->buggy_avid && !s->interlaced) || s->restart_interval)
2193 mjpeg_decode_dri(s);
2206 av_log(avctx, AV_LOG_ERROR, "mjpeg: unsupported coding type (%x)\n", start_code);
2209 // printf("mjpeg: unsupported marker (%x)\n", start_code);
2214 /* eof process start code */
2215 buf_ptr += (get_bits_count(&s->gb)+7)/8;
2216 av_log(avctx, AV_LOG_DEBUG, "marker parser used %d bytes (%d bits)\n",
2217 (get_bits_count(&s->gb)+7)/8, get_bits_count(&s->gb));
2222 av_log(avctx, AV_LOG_DEBUG, "mjpeg decode frame unused %d bytes\n", buf_end - buf_ptr);
2223 // return buf_end - buf_ptr;
2224 return buf_ptr - buf;
2227 static int mjpegb_decode_frame(AVCodecContext *avctx,
2228 void *data, int *data_size,
2229 uint8_t *buf, int buf_size)
2231 MJpegDecodeContext *s = avctx->priv_data;
2232 uint8_t *buf_end, *buf_ptr;
2233 AVFrame *picture = data;
2234 GetBitContext hgb; /* for the header */
2235 uint32_t dqt_offs, dht_offs, sof_offs, sos_offs, second_field_offs;
2236 uint32_t field_size, sod_offs;
2239 buf_end = buf + buf_size;
2242 /* reset on every SOI */
2243 s->restart_interval = 0;
2244 s->restart_count = 0;
2245 s->mjpb_skiptosod = 0;
2247 init_get_bits(&hgb, buf_ptr, /*buf_size*/(buf_end - buf_ptr)*8);
2249 skip_bits(&hgb, 32); /* reserved zeros */
2251 if (get_bits_long(&hgb, 32) != MKBETAG('m','j','p','g'))
2253 av_log(avctx, AV_LOG_WARNING, "not mjpeg-b (bad fourcc)\n");
2257 field_size = get_bits_long(&hgb, 32); /* field size */
2258 av_log(avctx, AV_LOG_DEBUG, "field size: 0x%x\n", field_size);
2259 skip_bits(&hgb, 32); /* padded field size */
2260 second_field_offs = get_bits_long(&hgb, 32);
2261 av_log(avctx, AV_LOG_DEBUG, "second field offs: 0x%x\n", second_field_offs);
2263 dqt_offs = get_bits_long(&hgb, 32);
2264 av_log(avctx, AV_LOG_DEBUG, "dqt offs: 0x%x\n", dqt_offs);
2267 init_get_bits(&s->gb, buf+dqt_offs, (buf_end - (buf+dqt_offs))*8);
2268 s->start_code = DQT;
2269 mjpeg_decode_dqt(s);
2272 dht_offs = get_bits_long(&hgb, 32);
2273 av_log(avctx, AV_LOG_DEBUG, "dht offs: 0x%x\n", dht_offs);
2276 init_get_bits(&s->gb, buf+dht_offs, (buf_end - (buf+dht_offs))*8);
2277 s->start_code = DHT;
2278 mjpeg_decode_dht(s);
2281 sof_offs = get_bits_long(&hgb, 32);
2282 av_log(avctx, AV_LOG_DEBUG, "sof offs: 0x%x\n", sof_offs);
2285 init_get_bits(&s->gb, buf+sof_offs, (buf_end - (buf+sof_offs))*8);
2286 s->start_code = SOF0;
2287 if (mjpeg_decode_sof(s) < 0)
2291 sos_offs = get_bits_long(&hgb, 32);
2292 av_log(avctx, AV_LOG_DEBUG, "sos offs: 0x%x\n", sos_offs);
2293 sod_offs = get_bits_long(&hgb, 32);
2294 av_log(avctx, AV_LOG_DEBUG, "sod offs: 0x%x\n", sod_offs);
2297 // init_get_bits(&s->gb, buf+sos_offs, (buf_end - (buf+sos_offs))*8);
2298 init_get_bits(&s->gb, buf+sos_offs, field_size*8);
2299 s->mjpb_skiptosod = (sod_offs - sos_offs - show_bits(&s->gb, 16));
2300 s->start_code = SOS;
2301 mjpeg_decode_sos(s);
2304 if (s->interlaced) {
2305 s->bottom_field ^= 1;
2306 /* if not bottom field, do not output image yet */
2307 if (s->bottom_field && second_field_offs)
2309 buf_ptr = buf + second_field_offs;
2310 second_field_offs = 0;
2315 //XXX FIXME factorize, this looks very similar to the EOI code
2317 *picture= s->picture;
2318 *data_size = sizeof(AVFrame);
2321 picture->quality= FFMAX(FFMAX(s->qscale[0], s->qscale[1]), s->qscale[2]);
2322 picture->qstride= 0;
2323 picture->qscale_table= s->qscale_table;
2324 memset(picture->qscale_table, picture->quality, (s->width+15)/16);
2325 if(avctx->debug & FF_DEBUG_QP)
2326 av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", picture->quality);
2327 picture->quality*= FF_QP2LAMBDA;
2330 return buf_ptr - buf;
2335 static int sp5x_decode_frame(AVCodecContext *avctx,
2336 void *data, int *data_size,
2337 uint8_t *buf, int buf_size)
2340 MJpegDecodeContext *s = avctx->priv_data;
2342 const int qscale = 5;
2343 uint8_t *buf_ptr, *buf_end, *recoded;
2346 if (!avctx->width || !avctx->height)
2350 buf_end = buf + buf_size;
2353 recoded = av_mallocz(buf_size + 1024);
2358 recoded[j++] = 0xFF;
2359 recoded[j++] = 0xD8;
2361 memcpy(recoded+j, &sp5x_data_dqt[0], sizeof(sp5x_data_dqt));
2362 memcpy(recoded+j+5, &sp5x_quant_table[qscale * 2], 64);
2363 memcpy(recoded+j+70, &sp5x_quant_table[(qscale * 2) + 1], 64);
2364 j += sizeof(sp5x_data_dqt);
2366 memcpy(recoded+j, &sp5x_data_dht[0], sizeof(sp5x_data_dht));
2367 j += sizeof(sp5x_data_dht);
2369 memcpy(recoded+j, &sp5x_data_sof[0], sizeof(sp5x_data_sof));
2370 recoded[j+5] = (avctx->coded_height >> 8) & 0xFF;
2371 recoded[j+6] = avctx->coded_height & 0xFF;
2372 recoded[j+7] = (avctx->coded_width >> 8) & 0xFF;
2373 recoded[j+8] = avctx->coded_width & 0xFF;
2374 j += sizeof(sp5x_data_sof);
2376 memcpy(recoded+j, &sp5x_data_sos[0], sizeof(sp5x_data_sos));
2377 j += sizeof(sp5x_data_sos);
2379 for (i = 14; i < buf_size && j < buf_size+1024-2; i++)
2381 recoded[j++] = buf[i];
2387 recoded[j++] = 0xFF;
2388 recoded[j++] = 0xD9;
2390 i = mjpeg_decode_frame(avctx, data, data_size, recoded, j);
2397 s->width = avctx->coded_width;
2398 s->height = avctx->coded_height;
2399 s->nb_components = 3;
2400 s->component_id[0] = 0;
2403 s->quant_index[0] = 0;
2404 s->component_id[1] = 1;
2407 s->quant_index[1] = 1;
2408 s->component_id[2] = 2;
2411 s->quant_index[2] = 1;
2415 s->qscale_table = av_mallocz((s->width+15)/16);
2416 avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV420P : PIX_FMT_YUVJ420;
2419 s->picture.reference = 0;
2420 if (avctx->get_buffer(avctx, &s->picture) < 0)
2422 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
2426 s->picture.pict_type = I_TYPE;
2427 s->picture.key_frame = 1;
2429 for (i = 0; i < 3; i++)
2430 s->linesize[i] = s->picture.linesize[i] << s->interlaced;
2433 for (i = 0; i < 64; i++)
2435 j = s->scantable.permutated[i];
2436 s->quant_matrixes[0][j] = sp5x_quant_table[(qscale * 2) + i];
2438 s->qscale[0] = FFMAX(
2439 s->quant_matrixes[0][s->scantable.permutated[1]],
2440 s->quant_matrixes[0][s->scantable.permutated[8]]) >> 1;
2442 for (i = 0; i < 64; i++)
2444 j = s->scantable.permutated[i];
2445 s->quant_matrixes[1][j] = sp5x_quant_table[(qscale * 2) + 1 + i];
2447 s->qscale[1] = FFMAX(
2448 s->quant_matrixes[1][s->scantable.permutated[1]],
2449 s->quant_matrixes[1][s->scantable.permutated[8]]) >> 1;
2454 s->comp_index[0] = 0;
2455 s->nb_blocks[0] = s->h_count[0] * s->v_count[0];
2456 s->h_scount[0] = s->h_count[0];
2457 s->v_scount[0] = s->v_count[0];
2461 s->comp_index[1] = 1;
2462 s->nb_blocks[1] = s->h_count[1] * s->v_count[1];
2463 s->h_scount[1] = s->h_count[1];
2464 s->v_scount[1] = s->v_count[1];
2468 s->comp_index[2] = 2;
2469 s->nb_blocks[2] = s->h_count[2] * s->v_count[2];
2470 s->h_scount[2] = s->h_count[2];
2471 s->v_scount[2] = s->v_count[2];
2475 for (i = 0; i < 3; i++)
2476 s->last_dc[i] = 1024;
2478 s->mb_width = (s->width * s->h_max * 8 -1) / (s->h_max * 8);
2479 s->mb_height = (s->height * s->v_max * 8 -1) / (s->v_max * 8);
2481 init_get_bits(&s->gb, buf+14, (buf_size-14)*8);
2483 return mjpeg_decode_scan(s);
2489 static int mjpeg_decode_end(AVCodecContext *avctx)
2491 MJpegDecodeContext *s = avctx->priv_data;
2495 av_free(s->qscale_table);
2499 free_vlc(&s->vlcs[i][j]);
2504 static int mjpega_dump_header(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args,
2505 uint8_t **poutbuf, int *poutbuf_size,
2506 const uint8_t *buf, int buf_size, int keyframe)
2511 if (avctx->codec_id != CODEC_ID_MJPEG) {
2512 av_log(avctx, AV_LOG_ERROR, "mjpega bitstream filter only applies to mjpeg codec\n");
2517 *poutbuf = av_malloc(buf_size + 44 + FF_INPUT_BUFFER_PADDING_SIZE);
2518 poutbufp = *poutbuf;
2519 bytestream_put_byte(&poutbufp, 0xff);
2520 bytestream_put_byte(&poutbufp, SOI);
2521 bytestream_put_byte(&poutbufp, 0xff);
2522 bytestream_put_byte(&poutbufp, APP1);
2523 bytestream_put_be16(&poutbufp, 42); /* size */
2524 bytestream_put_be32(&poutbufp, 0);
2525 bytestream_put_buffer(&poutbufp, "mjpg", 4);
2526 bytestream_put_be32(&poutbufp, buf_size + 44); /* field size */
2527 bytestream_put_be32(&poutbufp, buf_size + 44); /* pad field size */
2528 bytestream_put_be32(&poutbufp, 0); /* next ptr */
2530 for (i = 0; i < buf_size - 1; i++) {
2531 if (buf[i] == 0xff) {
2532 switch (buf[i + 1]) {
2533 case DQT: /* quant off */
2534 case DHT: /* huff off */
2535 case SOF0: /* image off */
2536 bytestream_put_be32(&poutbufp, i + 46);
2539 bytestream_put_be32(&poutbufp, i + 46); /* scan off */
2540 bytestream_put_be32(&poutbufp, i + 46 + AV_RB16(buf + i + 2)); /* data off */
2541 bytestream_put_buffer(&poutbufp, buf + 2, buf_size - 2); /* skip already written SOI */
2542 *poutbuf_size = poutbufp - *poutbuf;
2545 if (i + 8 < buf_size && AV_RL32(buf + i + 8) == ff_get_fourcc("mjpg")) {
2546 av_log(avctx, AV_LOG_ERROR, "bitstream already formatted\n");
2547 memcpy(*poutbuf, buf, buf_size);
2548 *poutbuf_size = buf_size;
2555 av_log(avctx, AV_LOG_ERROR, "could not find SOS marker in bitstream\n");
2559 AVCodec mjpeg_decoder = {
2563 sizeof(MJpegDecodeContext),
2572 AVCodec thp_decoder = {
2576 sizeof(MJpegDecodeContext),
2585 AVCodec mjpegb_decoder = {
2589 sizeof(MJpegDecodeContext),
2593 mjpegb_decode_frame,
2598 AVCodec sp5x_decoder = {
2602 sizeof(MJpegDecodeContext),
2611 #ifdef CONFIG_ENCODERS
2612 AVCodec ljpeg_encoder = { //FIXME avoid MPV_* lossless jpeg shouldnt need them
2616 sizeof(MpegEncContext),
2618 encode_picture_lossless,
2623 AVCodecParser mjpeg_parser = {
2625 sizeof(ParseContext),
2631 AVBitStreamFilter mjpega_dump_header_bsf = {