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
30 * MJPEG encoder and decoder.
38 #include "mpegvideo.h"
39 #include "bytestream.h"
41 #include "jpeglsdec.h"
43 /* use two quantizer tables (one for luminance and one for chrominance) */
47 typedef struct MJpegContext {
48 uint8_t huff_size_dc_luminance[12]; //FIXME use array [3] instead of lumi / chrom, for easier addressing
49 uint16_t huff_code_dc_luminance[12];
50 uint8_t huff_size_dc_chrominance[12];
51 uint16_t huff_code_dc_chrominance[12];
53 uint8_t huff_size_ac_luminance[256];
54 uint16_t huff_code_ac_luminance[256];
55 uint8_t huff_size_ac_chrominance[256];
56 uint16_t huff_code_ac_chrominance[256];
60 /* These are the sample quantization tables given in JPEG spec section K.1.
61 * The spec says that the values given produce "good" quality, and
62 * when divided by 2, "very good" quality.
64 static const unsigned char std_luminance_quant_tbl[64] = {
65 16, 11, 10, 16, 24, 40, 51, 61,
66 12, 12, 14, 19, 26, 58, 60, 55,
67 14, 13, 16, 24, 40, 57, 69, 56,
68 14, 17, 22, 29, 51, 87, 80, 62,
69 18, 22, 37, 56, 68, 109, 103, 77,
70 24, 35, 55, 64, 81, 104, 113, 92,
71 49, 64, 78, 87, 103, 121, 120, 101,
72 72, 92, 95, 98, 112, 100, 103, 99
74 static const unsigned char std_chrominance_quant_tbl[64] = {
75 17, 18, 24, 47, 99, 99, 99, 99,
76 18, 21, 26, 66, 99, 99, 99, 99,
77 24, 26, 56, 99, 99, 99, 99, 99,
78 47, 66, 99, 99, 99, 99, 99, 99,
79 99, 99, 99, 99, 99, 99, 99, 99,
80 99, 99, 99, 99, 99, 99, 99, 99,
81 99, 99, 99, 99, 99, 99, 99, 99,
82 99, 99, 99, 99, 99, 99, 99, 99
86 /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
87 /* IMPORTANT: these are only valid for 8-bit data precision! */
88 static const uint8_t bits_dc_luminance[17] =
89 { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
90 static const uint8_t val_dc_luminance[] =
91 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
93 static const uint8_t bits_dc_chrominance[17] =
94 { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
95 static const uint8_t val_dc_chrominance[] =
96 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
98 static const uint8_t bits_ac_luminance[17] =
99 { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
100 static const uint8_t val_ac_luminance[] =
101 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
102 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
103 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
104 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
105 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
106 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
107 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
108 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
109 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
110 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
111 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
112 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
113 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
114 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
115 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
116 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
117 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
118 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
119 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
120 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
124 static const uint8_t bits_ac_chrominance[17] =
125 { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
127 static const uint8_t val_ac_chrominance[] =
128 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
129 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
130 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
131 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
132 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
133 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
134 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
135 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
136 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
137 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
138 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
139 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
140 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
141 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
142 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
143 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
144 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
145 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
146 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
147 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
151 /* isn't this function nicer than the one in the libjpeg ? */
152 static void build_huffman_codes(uint8_t *huff_size, uint16_t *huff_code,
153 const uint8_t *bits_table, const uint8_t *val_table)
155 int i, j, k,nb, code, sym;
162 sym = val_table[k++];
164 huff_code[sym] = code;
171 #ifdef CONFIG_ENCODERS
172 int mjpeg_init(MpegEncContext *s)
176 m = av_malloc(sizeof(MJpegContext));
183 /* build all the huffman tables */
184 build_huffman_codes(m->huff_size_dc_luminance,
185 m->huff_code_dc_luminance,
188 build_huffman_codes(m->huff_size_dc_chrominance,
189 m->huff_code_dc_chrominance,
192 build_huffman_codes(m->huff_size_ac_luminance,
193 m->huff_code_ac_luminance,
196 build_huffman_codes(m->huff_size_ac_chrominance,
197 m->huff_code_ac_chrominance,
205 void mjpeg_close(MpegEncContext *s)
207 av_free(s->mjpeg_ctx);
209 #endif //CONFIG_ENCODERS
211 #define PREDICT(ret, topleft, top, left, predictor)\
213 case 1: ret= left; break;\
214 case 2: ret= top; break;\
215 case 3: ret= topleft; break;\
216 case 4: ret= left + top - topleft; break;\
217 case 5: ret= left + ((top - topleft)>>1); break;\
218 case 6: ret= top + ((left - topleft)>>1); break;\
220 case 7: ret= (left + top)>>1; break;\
223 #ifdef CONFIG_ENCODERS
224 /* table_class: 0 = DC coef, 1 = AC coefs */
225 static int put_huffman_table(MpegEncContext *s, int table_class, int table_id,
226 const uint8_t *bits_table, const uint8_t *value_table)
228 PutBitContext *p = &s->pb;
231 put_bits(p, 4, table_class);
232 put_bits(p, 4, table_id);
237 put_bits(p, 8, bits_table[i]);
241 put_bits(p, 8, value_table[i]);
246 static void jpeg_table_header(MpegEncContext *s)
248 PutBitContext *p = &s->pb;
255 put_bits(p, 16, 2 + 2 * (1 + 64));
257 put_bits(p, 16, 2 + 1 * (1 + 64));
259 put_bits(p, 4, 0); /* 8 bit precision */
260 put_bits(p, 4, 0); /* table 0 */
262 j = s->intra_scantable.permutated[i];
263 put_bits(p, 8, s->intra_matrix[j]);
266 put_bits(p, 4, 0); /* 8 bit precision */
267 put_bits(p, 4, 1); /* table 1 */
269 j = s->intra_scantable.permutated[i];
270 put_bits(p, 8, s->chroma_intra_matrix[j]);
278 put_bits(p, 16, 0); /* patched later */
280 size += put_huffman_table(s, 0, 0, bits_dc_luminance, val_dc_luminance);
281 size += put_huffman_table(s, 0, 1, bits_dc_chrominance, val_dc_chrominance);
283 size += put_huffman_table(s, 1, 0, bits_ac_luminance, val_ac_luminance);
284 size += put_huffman_table(s, 1, 1, bits_ac_chrominance, val_ac_chrominance);
289 static void jpeg_put_comments(MpegEncContext *s)
291 PutBitContext *p = &s->pb;
295 if (s->aspect_ratio_info /* && !lossless */)
300 ff_put_string(p, "JFIF", 1); /* this puts the trailing zero-byte too */
301 put_bits(p, 16, 0x0201); /* v 1.02 */
302 put_bits(p, 8, 0); /* units type: 0 - aspect ratio */
303 put_bits(p, 16, s->avctx->sample_aspect_ratio.num);
304 put_bits(p, 16, s->avctx->sample_aspect_ratio.den);
305 put_bits(p, 8, 0); /* thumbnail width */
306 put_bits(p, 8, 0); /* thumbnail height */
310 if(!(s->flags & CODEC_FLAG_BITEXACT)){
314 put_bits(p, 16, 0); /* patched later */
315 ff_put_string(p, LIBAVCODEC_IDENT, 1);
316 size = strlen(LIBAVCODEC_IDENT)+3;
321 if( s->avctx->pix_fmt == PIX_FMT_YUV420P
322 ||s->avctx->pix_fmt == PIX_FMT_YUV422P
323 ||s->avctx->pix_fmt == PIX_FMT_YUV444P){
327 put_bits(p, 16, 0); /* patched later */
328 ff_put_string(p, "CS=ITU601", 1);
329 size = strlen("CS=ITU601")+3;
335 void mjpeg_picture_header(MpegEncContext *s)
337 const int lossless= s->avctx->codec_id != CODEC_ID_MJPEG;
339 put_marker(&s->pb, SOI);
341 jpeg_put_comments(s);
343 jpeg_table_header(s);
345 switch(s->avctx->codec_id){
346 case CODEC_ID_MJPEG: put_marker(&s->pb, SOF0 ); break;
347 case CODEC_ID_LJPEG: put_marker(&s->pb, SOF3 ); break;
351 put_bits(&s->pb, 16, 17);
352 if(lossless && s->avctx->pix_fmt == PIX_FMT_RGB32)
353 put_bits(&s->pb, 8, 9); /* 9 bits/component RCT */
355 put_bits(&s->pb, 8, 8); /* 8 bits/component */
356 put_bits(&s->pb, 16, s->height);
357 put_bits(&s->pb, 16, s->width);
358 put_bits(&s->pb, 8, 3); /* 3 components */
361 put_bits(&s->pb, 8, 1); /* component number */
362 put_bits(&s->pb, 4, s->mjpeg_hsample[0]); /* H factor */
363 put_bits(&s->pb, 4, s->mjpeg_vsample[0]); /* V factor */
364 put_bits(&s->pb, 8, 0); /* select matrix */
367 put_bits(&s->pb, 8, 2); /* component number */
368 put_bits(&s->pb, 4, s->mjpeg_hsample[1]); /* H factor */
369 put_bits(&s->pb, 4, s->mjpeg_vsample[1]); /* V factor */
371 put_bits(&s->pb, 8, lossless ? 0 : 1); /* select matrix */
373 put_bits(&s->pb, 8, 0); /* select matrix */
377 put_bits(&s->pb, 8, 3); /* component number */
378 put_bits(&s->pb, 4, s->mjpeg_hsample[2]); /* H factor */
379 put_bits(&s->pb, 4, s->mjpeg_vsample[2]); /* V factor */
381 put_bits(&s->pb, 8, lossless ? 0 : 1); /* select matrix */
383 put_bits(&s->pb, 8, 0); /* select matrix */
387 put_marker(&s->pb, SOS);
388 put_bits(&s->pb, 16, 12); /* length */
389 put_bits(&s->pb, 8, 3); /* 3 components */
392 put_bits(&s->pb, 8, 1); /* index */
393 put_bits(&s->pb, 4, 0); /* DC huffman table index */
394 put_bits(&s->pb, 4, 0); /* AC huffman table index */
397 put_bits(&s->pb, 8, 2); /* index */
398 put_bits(&s->pb, 4, 1); /* DC huffman table index */
399 put_bits(&s->pb, 4, lossless ? 0 : 1); /* AC huffman table index */
402 put_bits(&s->pb, 8, 3); /* index */
403 put_bits(&s->pb, 4, 1); /* DC huffman table index */
404 put_bits(&s->pb, 4, lossless ? 0 : 1); /* AC huffman table index */
406 put_bits(&s->pb, 8, lossless ? s->avctx->prediction_method+1 : 0); /* Ss (not used) */
408 switch(s->avctx->codec_id){
409 case CODEC_ID_MJPEG: put_bits(&s->pb, 8, 63); break; /* Se (not used) */
410 case CODEC_ID_LJPEG: put_bits(&s->pb, 8, 0); break; /* not used */
414 put_bits(&s->pb, 8, 0); /* Ah/Al (not used) */
417 static void escape_FF(MpegEncContext *s, int start)
419 int size= put_bits_count(&s->pb) - start*8;
421 uint8_t *buf= s->pb.buf + start;
422 int align= (-(size_t)(buf))&3;
424 assert((size&7) == 0);
428 for(i=0; i<size && i<align; i++){
429 if(buf[i]==0xFF) ff_count++;
431 for(; i<size-15; i+=16){
434 v= *(uint32_t*)(&buf[i]);
435 acc= (((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
436 v= *(uint32_t*)(&buf[i+4]);
437 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
438 v= *(uint32_t*)(&buf[i+8]);
439 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
440 v= *(uint32_t*)(&buf[i+12]);
441 acc+=(((v & (v>>4))&0x0F0F0F0F)+0x01010101)&0x10101010;
449 if(buf[i]==0xFF) ff_count++;
452 if(ff_count==0) return;
455 for(i=0; i<ff_count-3; i+=4)
456 put_bits(&s->pb, 32, 0);
457 put_bits(&s->pb, (ff_count-i)*8, 0);
458 flush_put_bits(&s->pb);
460 for(i=size-1; ff_count; i--){
464 //printf("%d %d\n", i, ff_count);
473 void ff_mjpeg_stuffing(PutBitContext * pbc)
476 length= (-put_bits_count(pbc))&7;
477 if(length) put_bits(pbc, length, (1<<length)-1);
480 void mjpeg_picture_trailer(MpegEncContext *s)
482 ff_mjpeg_stuffing(&s->pb);
483 flush_put_bits(&s->pb);
485 assert((s->header_bits&7)==0);
487 escape_FF(s, s->header_bits>>3);
489 put_marker(&s->pb, EOI);
492 static inline void mjpeg_encode_dc(MpegEncContext *s, int val,
493 uint8_t *huff_size, uint16_t *huff_code)
498 put_bits(&s->pb, huff_size[0], huff_code[0]);
506 nbits= av_log2_16bit(val) + 1;
508 put_bits(&s->pb, huff_size[nbits], huff_code[nbits]);
510 put_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
514 static void encode_block(MpegEncContext *s, DCTELEM *block, int n)
516 int mant, nbits, code, i, j;
517 int component, dc, run, last_index, val;
518 MJpegContext *m = s->mjpeg_ctx;
519 uint8_t *huff_size_ac;
520 uint16_t *huff_code_ac;
523 component = (n <= 3 ? 0 : (n&1) + 1);
524 dc = block[0]; /* overflow is impossible */
525 val = dc - s->last_dc[component];
527 mjpeg_encode_dc(s, val, m->huff_size_dc_luminance, m->huff_code_dc_luminance);
528 huff_size_ac = m->huff_size_ac_luminance;
529 huff_code_ac = m->huff_code_ac_luminance;
531 mjpeg_encode_dc(s, val, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
532 huff_size_ac = m->huff_size_ac_chrominance;
533 huff_code_ac = m->huff_code_ac_chrominance;
535 s->last_dc[component] = dc;
540 last_index = s->block_last_index[n];
541 for(i=1;i<=last_index;i++) {
542 j = s->intra_scantable.permutated[i];
548 put_bits(&s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]);
557 nbits= av_log2(val) + 1;
558 code = (run << 4) | nbits;
560 put_bits(&s->pb, huff_size_ac[code], huff_code_ac[code]);
562 put_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
567 /* output EOB only if not already 64 values */
568 if (last_index < 63 || run != 0)
569 put_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]);
572 void mjpeg_encode_mb(MpegEncContext *s,
573 DCTELEM block[6][64])
577 encode_block(s, block[i], i);
579 if (s->chroma_format == CHROMA_420) {
580 encode_block(s, block[5], 5);
582 encode_block(s, block[6], 6);
583 encode_block(s, block[5], 5);
584 encode_block(s, block[7], 7);
588 static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){
589 MpegEncContext * const s = avctx->priv_data;
590 MJpegContext * const m = s->mjpeg_ctx;
591 AVFrame *pict = data;
592 const int width= s->width;
593 const int height= s->height;
594 AVFrame * const p= (AVFrame*)&s->current_picture;
595 const int predictor= avctx->prediction_method+1;
597 init_put_bits(&s->pb, buf, buf_size);
600 p->pict_type= FF_I_TYPE;
603 mjpeg_picture_header(s);
605 s->header_bits= put_bits_count(&s->pb);
607 if(avctx->pix_fmt == PIX_FMT_RGB32){
609 const int linesize= p->linesize[0];
610 uint16_t (*buffer)[4]= (void *) s->rd_scratchpad;
611 int left[3], top[3], topleft[3];
614 buffer[0][i]= 1 << (9 - 1);
617 for(y = 0; y < height; y++) {
618 const int modified_predictor= y ? predictor : 1;
619 uint8_t *ptr = p->data[0] + (linesize * y);
621 if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < width*3*4){
622 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
627 top[i]= left[i]= topleft[i]= buffer[0][i];
629 for(x = 0; x < width; x++) {
630 buffer[x][1] = ptr[4*x+0] - ptr[4*x+1] + 0x100;
631 buffer[x][2] = ptr[4*x+2] - ptr[4*x+1] + 0x100;
632 buffer[x][0] = (ptr[4*x+0] + 2*ptr[4*x+1] + ptr[4*x+2])>>2;
637 PREDICT(pred, topleft[i], top[i], left[i], modified_predictor);
640 top[i]= buffer[x+1][i];
642 left[i]= buffer[x][i];
644 diff= ((left[i] - pred + 0x100)&0x1FF) - 0x100;
647 mjpeg_encode_dc(s, diff, m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly
649 mjpeg_encode_dc(s, diff, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
655 const int mb_width = (width + s->mjpeg_hsample[0] - 1) / s->mjpeg_hsample[0];
656 const int mb_height = (height + s->mjpeg_vsample[0] - 1) / s->mjpeg_vsample[0];
658 for(mb_y = 0; mb_y < mb_height; mb_y++) {
659 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]){
660 av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
663 for(mb_x = 0; mb_x < mb_width; mb_x++) {
664 if(mb_x==0 || mb_y==0){
667 int x, y, h, v, linesize;
668 h = s->mjpeg_hsample[i];
669 v = s->mjpeg_vsample[i];
670 linesize= p->linesize[i];
676 ptr = p->data[i] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
685 pred= ptr[-linesize];
687 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
692 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly
694 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
701 int x, y, h, v, linesize;
702 h = s->mjpeg_hsample[i];
703 v = s->mjpeg_vsample[i];
704 linesize= p->linesize[i];
710 ptr = p->data[i] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
711 //printf("%d %d %d %d %8X\n", mb_x, mb_y, x, y, ptr);
712 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
715 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly
717 mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
728 mjpeg_picture_trailer(s);
731 flush_put_bits(&s->pb);
732 return pbBufPtr(&s->pb) - s->pb.buf;
733 // return (put_bits_count(&f->pb)+7)/8;
736 #endif //CONFIG_ENCODERS
738 /******************************************/
741 static int mjpeg_decode_dht(MJpegDecodeContext *s);
743 static int build_vlc(VLC *vlc, const uint8_t *bits_table, const uint8_t *val_table,
744 int nb_codes, int use_static, int is_ac)
746 uint8_t huff_size[256+16];
747 uint16_t huff_code[256+16];
749 assert(nb_codes <= 256);
751 memset(huff_size, 0, sizeof(huff_size));
752 build_huffman_codes(huff_size, huff_code, bits_table, val_table);
755 memmove(huff_size+16, huff_size, sizeof(uint8_t)*nb_codes);
756 memmove(huff_code+16, huff_code, sizeof(uint16_t)*nb_codes);
757 memset(huff_size, 0, sizeof(uint8_t)*16);
758 memset(huff_code, 0, sizeof(uint16_t)*16);
762 return init_vlc(vlc, 9, nb_codes, huff_size, 1, 1, huff_code, 2, 2, use_static);
765 static int mjpeg_decode_init(AVCodecContext *avctx)
767 MJpegDecodeContext *s = avctx->priv_data;
770 dsputil_init(&s->dsp, avctx);
771 ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct);
775 s->first_picture = 1;
776 s->org_height = avctx->coded_height;
778 build_vlc(&s->vlcs[0][0], bits_dc_luminance, val_dc_luminance, 12, 0, 0);
779 build_vlc(&s->vlcs[0][1], bits_dc_chrominance, val_dc_chrominance, 12, 0, 0);
780 build_vlc(&s->vlcs[1][0], bits_ac_luminance, val_ac_luminance, 251, 0, 1);
781 build_vlc(&s->vlcs[1][1], bits_ac_chrominance, val_ac_chrominance, 251, 0, 1);
783 if (avctx->flags & CODEC_FLAG_EXTERN_HUFF)
785 av_log(avctx, AV_LOG_INFO, "mjpeg: using external huffman table\n");
786 init_get_bits(&s->gb, avctx->extradata, avctx->extradata_size*8);
788 /* should check for error - but dunno */
790 if (avctx->extradata_size > 9 &&
791 AV_RL32(avctx->extradata + 4) == MKTAG('f','i','e','l')) {
792 if (avctx->extradata[9] == 6) { /* quicktime icefloe 019 */
793 s->interlace_polarity = 1; /* bottom field first */
794 av_log(avctx, AV_LOG_DEBUG, "mjpeg bottom field first\n");
802 /* quantize tables */
803 static int mjpeg_decode_dqt(MJpegDecodeContext *s)
805 int len, index, i, j;
807 len = get_bits(&s->gb, 16) - 2;
810 /* only 8 bit precision handled */
811 if (get_bits(&s->gb, 4) != 0)
813 av_log(s->avctx, AV_LOG_ERROR, "dqt: 16bit precision\n");
816 index = get_bits(&s->gb, 4);
819 av_log(s->avctx, AV_LOG_DEBUG, "index=%d\n", index);
820 /* read quant table */
822 j = s->scantable.permutated[i];
823 s->quant_matrixes[index][j] = get_bits(&s->gb, 8);
826 //XXX FIXME finetune, and perhaps add dc too
827 s->qscale[index]= FFMAX(
828 s->quant_matrixes[index][s->scantable.permutated[1]],
829 s->quant_matrixes[index][s->scantable.permutated[8]]) >> 1;
830 av_log(s->avctx, AV_LOG_DEBUG, "qscale[%d]: %d\n", index, s->qscale[index]);
837 /* decode huffman tables and build VLC decoders */
838 static int mjpeg_decode_dht(MJpegDecodeContext *s)
840 int len, index, i, class, n, v, code_max;
841 uint8_t bits_table[17];
842 uint8_t val_table[256];
844 len = get_bits(&s->gb, 16) - 2;
849 class = get_bits(&s->gb, 4);
852 index = get_bits(&s->gb, 4);
857 bits_table[i] = get_bits(&s->gb, 8);
861 if (len < n || n > 256)
866 v = get_bits(&s->gb, 8);
873 /* build VLC and flush previous vlc if present */
874 free_vlc(&s->vlcs[class][index]);
875 av_log(s->avctx, AV_LOG_DEBUG, "class=%d index=%d nb_codes=%d\n",
876 class, index, code_max + 1);
877 if(build_vlc(&s->vlcs[class][index], bits_table, val_table, code_max + 1, 0, class > 0) < 0){
884 static int mjpeg_decode_sof(MJpegDecodeContext *s)
886 int len, nb_components, i, width, height, pix_fmt_id;
888 /* XXX: verify len field validity */
889 len = get_bits(&s->gb, 16);
890 s->bits= get_bits(&s->gb, 8);
892 if(s->pegasus_rct) s->bits=9;
893 if(s->bits==9 && !s->pegasus_rct) s->rct=1; //FIXME ugly
895 if (s->bits != 8 && !s->lossless){
896 av_log(s->avctx, AV_LOG_ERROR, "only 8 bits/component accepted\n");
900 height = get_bits(&s->gb, 16);
901 width = get_bits(&s->gb, 16);
903 //HACK for odd_height.mov
904 if(s->interlaced && s->width == width && s->height == height + 1)
907 av_log(s->avctx, AV_LOG_DEBUG, "sof0: picture: %dx%d\n", width, height);
908 if(avcodec_check_dimensions(s->avctx, width, height))
911 nb_components = get_bits(&s->gb, 8);
912 if (nb_components <= 0 ||
913 nb_components > MAX_COMPONENTS)
915 if (s->ls && !(s->bits <= 8 || nb_components == 1)){
916 av_log(s->avctx, AV_LOG_ERROR, "only <= 8 bits/component or 16-bit gray accepted for JPEG-LS\n");
919 s->nb_components = nb_components;
922 for(i=0;i<nb_components;i++) {
924 s->component_id[i] = get_bits(&s->gb, 8) - 1;
925 s->h_count[i] = get_bits(&s->gb, 4);
926 s->v_count[i] = get_bits(&s->gb, 4);
927 /* compute hmax and vmax (only used in interleaved case) */
928 if (s->h_count[i] > s->h_max)
929 s->h_max = s->h_count[i];
930 if (s->v_count[i] > s->v_max)
931 s->v_max = s->v_count[i];
932 s->quant_index[i] = get_bits(&s->gb, 8);
933 if (s->quant_index[i] >= 4)
935 av_log(s->avctx, AV_LOG_DEBUG, "component %d %d:%d id: %d quant:%d\n", i, s->h_count[i],
936 s->v_count[i], s->component_id[i], s->quant_index[i]);
939 if(s->ls && (s->h_max > 1 || s->v_max > 1)) {
940 av_log(s->avctx, AV_LOG_ERROR, "Subsampling in JPEG-LS is not supported.\n");
944 if(s->v_max==1 && s->h_max==1 && s->lossless==1) s->rgb=1;
946 /* if different size, realloc/alloc picture */
947 /* XXX: also check h_count and v_count */
948 if (width != s->width || height != s->height) {
949 av_freep(&s->qscale_table);
955 /* test interlaced mode */
956 if (s->first_picture &&
957 s->org_height != 0 &&
958 s->height < ((s->org_height * 3) / 4)) {
960 s->bottom_field = s->interlace_polarity;
961 s->picture.interlaced_frame = 1;
962 s->picture.top_field_first = !s->interlace_polarity;
966 avcodec_set_dimensions(s->avctx, width, height);
968 s->qscale_table= av_mallocz((s->width+15)/16);
970 s->first_picture = 0;
973 if(s->interlaced && (s->bottom_field == !s->interlace_polarity))
976 /* XXX: not complete test ! */
977 pix_fmt_id = (s->h_count[0] << 20) | (s->v_count[0] << 16) |
978 (s->h_count[1] << 12) | (s->v_count[1] << 8) |
979 (s->h_count[2] << 4) | s->v_count[2];
980 av_log(s->avctx, AV_LOG_DEBUG, "pix fmt id %x\n", pix_fmt_id);
985 s->avctx->pix_fmt = PIX_FMT_RGB32;
986 }else if(s->nb_components==3)
987 s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV444P : PIX_FMT_YUVJ444P;
989 s->avctx->pix_fmt = PIX_FMT_GRAY8;
993 s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV422P : PIX_FMT_YUVJ422P;
997 s->avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV420P : PIX_FMT_YUVJ420P;
1001 if(s->nb_components > 1)
1002 s->avctx->pix_fmt = PIX_FMT_RGB24;
1003 else if(s->bits <= 8)
1004 s->avctx->pix_fmt = PIX_FMT_GRAY8;
1006 s->avctx->pix_fmt = PIX_FMT_GRAY16;
1009 if(s->picture.data[0])
1010 s->avctx->release_buffer(s->avctx, &s->picture);
1012 s->picture.reference= 0;
1013 if(s->avctx->get_buffer(s->avctx, &s->picture) < 0){
1014 av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1017 s->picture.pict_type= I_TYPE;
1018 s->picture.key_frame= 1;
1021 s->linesize[i]= s->picture.linesize[i] << s->interlaced;
1024 // printf("%d %d %d %d %d %d\n", s->width, s->height, s->linesize[0], s->linesize[1], s->interlaced, s->avctx->height);
1026 if (len != (8+(3*nb_components)))
1028 av_log(s->avctx, AV_LOG_DEBUG, "decode_sof0: error, len(%d) mismatch\n", len);
1031 /* totally blank picture as progressive JPEG will only add details to it */
1033 memset(s->picture.data[0], 0, s->picture.linesize[0] * s->height);
1034 memset(s->picture.data[1], 0, s->picture.linesize[1] * s->height >> (s->v_max - s->v_count[1]));
1035 memset(s->picture.data[2], 0, s->picture.linesize[2] * s->height >> (s->v_max - s->v_count[2]));
1040 static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
1043 code = get_vlc2(&s->gb, s->vlcs[0][dc_index].table, 9, 2);
1046 av_log(s->avctx, AV_LOG_WARNING, "mjpeg_decode_dc: bad vlc: %d:%d (%p)\n", 0, dc_index,
1047 &s->vlcs[0][dc_index]);
1052 return get_xbits(&s->gb, code);
1057 /* decode block and dequantize */
1058 static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
1059 int component, int dc_index, int ac_index, int16_t *quant_matrix)
1061 int code, i, j, level, val;
1064 val = mjpeg_decode_dc(s, dc_index);
1065 if (val == 0xffff) {
1066 av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
1069 val = val * quant_matrix[0] + s->last_dc[component];
1070 s->last_dc[component] = val;
1074 {OPEN_READER(re, &s->gb)
1076 UPDATE_CACHE(re, &s->gb);
1077 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2)
1082 i += ((unsigned)code) >> 4;
1085 if(code > MIN_CACHE_BITS - 16){
1086 UPDATE_CACHE(re, &s->gb)
1089 int cache=GET_CACHE(re,&s->gb);
1090 int sign=(~cache)>>31;
1091 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
1094 LAST_SKIP_BITS(re, &s->gb, code)
1098 j = s->scantable.permutated[63];
1099 block[j] = level * quant_matrix[j];
1102 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
1105 j = s->scantable.permutated[i];
1106 block[j] = level * quant_matrix[j];
1109 CLOSE_READER(re, &s->gb)}
1114 /* decode block and dequantize - progressive JPEG version */
1115 static int decode_block_progressive(MJpegDecodeContext *s, DCTELEM *block,
1116 int component, int dc_index, int ac_index, int16_t *quant_matrix,
1117 int ss, int se, int Ah, int Al, int *EOBRUN)
1119 int code, i, j, level, val, run;
1123 val = mjpeg_decode_dc(s, dc_index);
1124 if (val == 0xffff) {
1125 av_log(s->avctx, AV_LOG_ERROR, "error dc\n");
1128 val = (val * quant_matrix[0] << Al) + s->last_dc[component];
1131 s->last_dc[component] = val;
1139 {OPEN_READER(re, &s->gb)
1141 UPDATE_CACHE(re, &s->gb);
1142 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2)
1143 /* Progressive JPEG use AC coeffs from zero and this decoder sets offset 16 by default */
1146 i += ((unsigned) code) >> 4;
1148 if(code > MIN_CACHE_BITS - 16){
1149 UPDATE_CACHE(re, &s->gb)
1152 int cache=GET_CACHE(re,&s->gb);
1153 int sign=(~cache)>>31;
1154 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
1157 LAST_SKIP_BITS(re, &s->gb, code)
1161 j = s->scantable.permutated[se];
1162 block[j] = level * quant_matrix[j] << Al;
1165 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
1168 j = s->scantable.permutated[i];
1169 block[j] = level * quant_matrix[j] << Al;
1171 run = ((unsigned) code) >> 4;
1172 if(run == 0xF){// ZRL - skip 15 coefficients
1177 UPDATE_CACHE(re, &s->gb);
1178 run += (GET_CACHE(re, &s->gb) >> (32 - val)) & (run - 1);
1180 LAST_SKIP_BITS(re, &s->gb, val);
1186 CLOSE_READER(re, &s->gb)}
1191 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s, int predictor, int point_transform){
1193 uint16_t buffer[32768][4];
1194 int left[3], top[3], topleft[3];
1195 const int linesize= s->linesize[0];
1196 const int mask= (1<<s->bits)-1;
1198 if((unsigned)s->mb_width > 32768) //dynamic alloc
1202 buffer[0][i]= 1 << (s->bits + point_transform - 1);
1204 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1205 const int modified_predictor= mb_y ? predictor : 1;
1206 uint8_t *ptr = s->picture.data[0] + (linesize * mb_y);
1208 if (s->interlaced && s->bottom_field)
1209 ptr += linesize >> 1;
1212 top[i]= left[i]= topleft[i]= buffer[0][i];
1214 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1215 if (s->restart_interval && !s->restart_count)
1216 s->restart_count = s->restart_interval;
1222 top[i]= buffer[mb_x][i];
1224 PREDICT(pred, topleft[i], top[i], left[i], modified_predictor);
1227 buffer[mb_x][i]= mask & (pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform));
1230 if (s->restart_interval && !--s->restart_count) {
1231 align_get_bits(&s->gb);
1232 skip_bits(&s->gb, 16); /* skip RSTn */
1237 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1238 ptr[4*mb_x+1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200)>>2);
1239 ptr[4*mb_x+0] = buffer[mb_x][1] + ptr[4*mb_x+1];
1240 ptr[4*mb_x+2] = buffer[mb_x][2] + ptr[4*mb_x+1];
1242 }else if(s->pegasus_rct){
1243 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1244 ptr[4*mb_x+1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2])>>2);
1245 ptr[4*mb_x+0] = buffer[mb_x][1] + ptr[4*mb_x+1];
1246 ptr[4*mb_x+2] = buffer[mb_x][2] + ptr[4*mb_x+1];
1249 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1250 ptr[4*mb_x+0] = buffer[mb_x][0];
1251 ptr[4*mb_x+1] = buffer[mb_x][1];
1252 ptr[4*mb_x+2] = buffer[mb_x][2];
1259 static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s, int predictor, int point_transform){
1261 const int nb_components=3;
1263 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1264 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1265 if (s->restart_interval && !s->restart_count)
1266 s->restart_count = s->restart_interval;
1268 if(mb_x==0 || mb_y==0 || s->interlaced){
1269 for(i=0;i<nb_components;i++) {
1271 int n, h, v, x, y, c, j, linesize;
1272 n = s->nb_blocks[i];
1273 c = s->comp_index[i];
1278 linesize= s->linesize[c];
1280 for(j=0; j<n; j++) {
1283 ptr = s->picture.data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
1284 if(y==0 && mb_y==0){
1285 if(x==0 && mb_x==0){
1286 pred= 128 << point_transform;
1291 if(x==0 && mb_x==0){
1292 pred= ptr[-linesize];
1294 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1298 if (s->interlaced && s->bottom_field)
1299 ptr += linesize >> 1;
1300 *ptr= pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform);
1309 for(i=0;i<nb_components;i++) {
1311 int n, h, v, x, y, c, j, linesize;
1312 n = s->nb_blocks[i];
1313 c = s->comp_index[i];
1318 linesize= s->linesize[c];
1320 for(j=0; j<n; j++) {
1323 ptr = s->picture.data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); //FIXME optimize this crap
1324 PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor);
1325 *ptr= pred + (mjpeg_decode_dc(s, s->dc_index[i]) << point_transform);
1333 if (s->restart_interval && !--s->restart_count) {
1334 align_get_bits(&s->gb);
1335 skip_bits(&s->gb, 16); /* skip RSTn */
1342 static int mjpeg_decode_scan(MJpegDecodeContext *s, int nb_components, int ss, int se, int Ah, int Al){
1346 if(Ah) return 0; /* TODO decode refinement planes too */
1347 for(mb_y = 0; mb_y < s->mb_height; mb_y++) {
1348 for(mb_x = 0; mb_x < s->mb_width; mb_x++) {
1349 if (s->restart_interval && !s->restart_count)
1350 s->restart_count = s->restart_interval;
1352 for(i=0;i<nb_components;i++) {
1354 int n, h, v, x, y, c, j;
1355 n = s->nb_blocks[i];
1356 c = s->comp_index[i];
1362 memset(s->block, 0, sizeof(s->block));
1363 if (!s->progressive && decode_block(s, s->block, i,
1364 s->dc_index[i], s->ac_index[i],
1365 s->quant_matrixes[ s->quant_index[c] ]) < 0) {
1366 av_log(s->avctx, AV_LOG_ERROR, "error y=%d x=%d\n", mb_y, mb_x);
1369 if (s->progressive && decode_block_progressive(s, s->block, i,
1370 s->dc_index[i], s->ac_index[i],
1371 s->quant_matrixes[ s->quant_index[c] ], ss, se, Ah, Al, &EOBRUN) < 0) {
1372 av_log(s->avctx, AV_LOG_ERROR, "error y=%d x=%d\n", mb_y, mb_x);
1375 // av_log(s->avctx, AV_LOG_DEBUG, "mb: %d %d processed\n", mb_y, mb_x);
1376 ptr = s->picture.data[c] +
1377 (((s->linesize[c] * (v * mb_y + y) * 8) +
1378 (h * mb_x + x) * 8) >> s->avctx->lowres);
1379 if (s->interlaced && s->bottom_field)
1380 ptr += s->linesize[c] >> 1;
1381 //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);
1383 s->dsp.idct_put(ptr, s->linesize[c], s->block);
1385 s->dsp.idct_add(ptr, s->linesize[c], s->block);
1392 /* (< 1350) buggy workaround for Spectralfan.mov, should be fixed */
1393 if (s->restart_interval && (s->restart_interval < 1350) &&
1394 !--s->restart_count) {
1395 align_get_bits(&s->gb);
1396 skip_bits(&s->gb, 16); /* skip RSTn */
1397 for (i=0; i<nb_components; i++) /* reset dc */
1398 s->last_dc[i] = 1024;
1405 static int mjpeg_decode_sos(MJpegDecodeContext *s)
1407 int len, nb_components, i, h, v, predictor, point_transform;
1408 int vmax, hmax, index, id;
1409 const int block_size= s->lossless ? 1 : 8;
1410 int ilv, prev_shift;
1412 /* XXX: verify len field validity */
1413 len = get_bits(&s->gb, 16);
1414 nb_components = get_bits(&s->gb, 8);
1415 if (len != 6+2*nb_components)
1417 av_log(s->avctx, AV_LOG_ERROR, "decode_sos: invalid len (%d)\n", len);
1422 for(i=0;i<nb_components;i++) {
1423 id = get_bits(&s->gb, 8) - 1;
1424 av_log(s->avctx, AV_LOG_DEBUG, "component: %d\n", id);
1425 /* find component index */
1426 for(index=0;index<s->nb_components;index++)
1427 if (id == s->component_id[index])
1429 if (index == s->nb_components)
1431 av_log(s->avctx, AV_LOG_ERROR, "decode_sos: index(%d) out of components\n", index);
1435 s->comp_index[i] = index;
1437 s->nb_blocks[i] = s->h_count[index] * s->v_count[index];
1438 s->h_scount[i] = s->h_count[index];
1439 s->v_scount[i] = s->v_count[index];
1441 s->dc_index[i] = get_bits(&s->gb, 4);
1442 s->ac_index[i] = get_bits(&s->gb, 4);
1444 if (s->dc_index[i] < 0 || s->ac_index[i] < 0 ||
1445 s->dc_index[i] >= 4 || s->ac_index[i] >= 4)
1448 switch(s->start_code)
1451 if (dc_index[i] > 1 || ac_index[i] > 1)
1456 if (dc_index[i] > 3 || ac_index[i] > 3)
1460 if (dc_index[i] > 3 || ac_index[i] != 0)
1467 predictor= get_bits(&s->gb, 8); /* JPEG Ss / lossless JPEG predictor /JPEG-LS NEAR */
1468 ilv= get_bits(&s->gb, 8); /* JPEG Se / JPEG-LS ILV */
1469 prev_shift = get_bits(&s->gb, 4); /* Ah */
1470 point_transform= get_bits(&s->gb, 4); /* Al */
1472 for(i=0;i<nb_components;i++)
1473 s->last_dc[i] = 1024;
1475 if (nb_components > 1) {
1476 /* interleaved stream */
1477 s->mb_width = (s->width + s->h_max * block_size - 1) / (s->h_max * block_size);
1478 s->mb_height = (s->height + s->v_max * block_size - 1) / (s->v_max * block_size);
1479 } else if(!s->ls) { /* skip this for JPEG-LS */
1480 h = s->h_max / s->h_scount[0];
1481 v = s->v_max / s->v_scount[0];
1482 s->mb_width = (s->width + h * block_size - 1) / (h * block_size);
1483 s->mb_height = (s->height + v * block_size - 1) / (v * block_size);
1484 s->nb_blocks[0] = 1;
1489 if(s->avctx->debug & FF_DEBUG_PICT_INFO)
1490 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" : "",
1491 predictor, point_transform, ilv, s->bits,
1492 s->pegasus_rct ? "PRCT" : (s->rct ? "RCT" : ""));
1495 /* mjpeg-b can have padding bytes between sos and image data, skip them */
1496 for (i = s->mjpb_skiptosod; i > 0; i--)
1497 skip_bits(&s->gb, 8);
1502 // reset_ls_coding_parameters(s, 0);
1504 ff_jpegls_decode_picture(s, predictor, point_transform, ilv);
1507 if(ljpeg_decode_rgb_scan(s, predictor, point_transform) < 0)
1510 if(ljpeg_decode_yuv_scan(s, predictor, point_transform) < 0)
1515 if(mjpeg_decode_scan(s, nb_components, predictor, ilv, prev_shift, point_transform) < 0)
1521 av_log(s->avctx, AV_LOG_ERROR, "decode_sos: ac/dc index out of range\n");
1525 static int mjpeg_decode_dri(MJpegDecodeContext *s)
1527 if (get_bits(&s->gb, 16) != 4)
1529 s->restart_interval = get_bits(&s->gb, 16);
1530 s->restart_count = 0;
1531 av_log(s->avctx, AV_LOG_DEBUG, "restart interval: %d\n", s->restart_interval);
1536 static int mjpeg_decode_app(MJpegDecodeContext *s)
1540 len = get_bits(&s->gb, 16);
1543 if(8*len + get_bits_count(&s->gb) > s->gb.size_in_bits)
1546 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
1550 if(s->avctx->debug & FF_DEBUG_STARTCODE){
1551 av_log(s->avctx, AV_LOG_DEBUG, "APPx %8X\n", id);
1554 /* buggy AVID, it puts EOI only at every 10th frame */
1555 /* also this fourcc is used by non-avid files too, it holds some
1556 informations, but it's always present in AVID creates files */
1557 if (id == ff_get_fourcc("AVI1"))
1564 4bytes field_size_less_padding
1567 // if (s->first_picture)
1568 // printf("mjpeg: workarounding buggy AVID\n");
1569 i = get_bits(&s->gb, 8);
1570 if (i==2) s->bottom_field= 1;
1571 else if(i==1) s->bottom_field= 0;
1573 skip_bits(&s->gb, 8);
1574 skip_bits(&s->gb, 32);
1575 skip_bits(&s->gb, 32);
1578 // if (s->interlace_polarity)
1579 // printf("mjpeg: interlace polarity: %d\n", s->interlace_polarity);
1585 if (id == ff_get_fourcc("JFIF"))
1587 int t_w, t_h, v1, v2;
1588 skip_bits(&s->gb, 8); /* the trailing zero-byte */
1589 v1= get_bits(&s->gb, 8);
1590 v2= get_bits(&s->gb, 8);
1591 skip_bits(&s->gb, 8);
1593 s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 16);
1594 s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 16);
1596 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1597 av_log(s->avctx, AV_LOG_INFO, "mjpeg: JFIF header found (version: %x.%x) SAR=%d/%d\n",
1599 s->avctx->sample_aspect_ratio.num,
1600 s->avctx->sample_aspect_ratio.den
1603 t_w = get_bits(&s->gb, 8);
1604 t_h = get_bits(&s->gb, 8);
1607 /* skip thumbnail */
1608 if (len-10-(t_w*t_h*3) > 0)
1615 if (id == ff_get_fourcc("Adob") && (get_bits(&s->gb, 8) == 'e'))
1617 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1618 av_log(s->avctx, AV_LOG_INFO, "mjpeg: Adobe header found\n");
1619 skip_bits(&s->gb, 16); /* version */
1620 skip_bits(&s->gb, 16); /* flags0 */
1621 skip_bits(&s->gb, 16); /* flags1 */
1622 skip_bits(&s->gb, 8); /* transform */
1627 if (id == ff_get_fourcc("LJIF")){
1628 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1629 av_log(s->avctx, AV_LOG_INFO, "Pegasus lossless jpeg header found\n");
1630 skip_bits(&s->gb, 16); /* version ? */
1631 skip_bits(&s->gb, 16); /* unknwon always 0? */
1632 skip_bits(&s->gb, 16); /* unknwon always 0? */
1633 skip_bits(&s->gb, 16); /* unknwon always 0? */
1634 switch( get_bits(&s->gb, 8)){
1644 av_log(s->avctx, AV_LOG_ERROR, "unknown colorspace\n");
1651 if ((s->start_code == APP1) && (len > (0x28 - 8)))
1653 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
1656 if (id == ff_get_fourcc("mjpg")) /* Apple MJPEG-A */
1659 skip_bits(&s->gb, 32); /* field size */
1660 skip_bits(&s->gb, 32); /* pad field size */
1661 skip_bits(&s->gb, 32); /* next off */
1662 skip_bits(&s->gb, 32); /* quant off */
1663 skip_bits(&s->gb, 32); /* huff off */
1664 skip_bits(&s->gb, 32); /* image off */
1665 skip_bits(&s->gb, 32); /* scan off */
1666 skip_bits(&s->gb, 32); /* data off */
1668 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1669 av_log(s->avctx, AV_LOG_INFO, "mjpeg: Apple MJPEG-A header found\n");
1674 /* slow but needed for extreme adobe jpegs */
1676 av_log(s->avctx, AV_LOG_ERROR, "mjpeg: error, decode_app parser read over the end\n");
1678 skip_bits(&s->gb, 8);
1683 static int mjpeg_decode_com(MJpegDecodeContext *s)
1685 int len = get_bits(&s->gb, 16);
1686 if (len >= 2 && 8*len - 16 + get_bits_count(&s->gb) <= s->gb.size_in_bits) {
1687 char *cbuf = av_malloc(len - 1);
1690 for (i = 0; i < len - 2; i++)
1691 cbuf[i] = get_bits(&s->gb, 8);
1692 if (i > 0 && cbuf[i-1] == '\n')
1697 if(s->avctx->debug & FF_DEBUG_PICT_INFO)
1698 av_log(s->avctx, AV_LOG_INFO, "mjpeg comment: '%s'\n", cbuf);
1700 /* buggy avid, it puts EOI only at every 10th frame */
1701 if (!strcmp(cbuf, "AVID"))
1704 // if (s->first_picture)
1705 // printf("mjpeg: workarounding buggy AVID\n");
1707 else if(!strcmp(cbuf, "CS=ITU601")){
1719 static int valid_marker_list[] =
1721 /* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f */
1722 /* 0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1723 /* 1 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1724 /* 2 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1725 /* 3 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1726 /* 4 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1727 /* 5 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1728 /* 6 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1729 /* 7 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1730 /* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1731 /* 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1732 /* a */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1733 /* b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1734 /* c */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1735 /* d */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1736 /* e */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1737 /* f */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,
1741 /* return the 8 bit start code value and update the search
1742 state. Return -1 if no start code found */
1743 static int find_marker(uint8_t **pbuf_ptr, uint8_t *buf_end)
1752 buf_ptr = *pbuf_ptr;
1753 while (buf_ptr < buf_end) {
1756 if ((v == 0xff) && (v2 >= 0xc0) && (v2 <= 0xfe) && buf_ptr < buf_end) {
1767 av_log(NULL, AV_LOG_VERBOSE, "find_marker skipped %d bytes\n", skipped);
1769 *pbuf_ptr = buf_ptr;
1773 static int mjpeg_decode_frame(AVCodecContext *avctx,
1774 void *data, int *data_size,
1775 uint8_t *buf, int buf_size)
1777 MJpegDecodeContext *s = avctx->priv_data;
1778 uint8_t *buf_end, *buf_ptr;
1780 AVFrame *picture = data;
1783 buf_end = buf + buf_size;
1784 while (buf_ptr < buf_end) {
1785 /* find start next marker */
1786 start_code = find_marker(&buf_ptr, buf_end);
1789 if (start_code < 0) {
1792 av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%d\n", start_code, buf_end - buf_ptr);
1794 if ((buf_end - buf_ptr) > s->buffer_size)
1797 s->buffer_size = buf_end-buf_ptr;
1798 s->buffer = av_malloc(s->buffer_size + FF_INPUT_BUFFER_PADDING_SIZE);
1799 av_log(avctx, AV_LOG_DEBUG, "buffer too small, expanding to %d bytes\n",
1803 /* unescape buffer of SOS, use special treatment for JPEG-LS */
1804 if (start_code == SOS && !s->ls)
1806 uint8_t *src = buf_ptr;
1807 uint8_t *dst = s->buffer;
1811 uint8_t x = *(src++);
1814 if (avctx->codec_id != CODEC_ID_THP)
1817 while (src < buf_end && x == 0xff)
1820 if (x >= 0xd0 && x <= 0xd7)
1827 init_get_bits(&s->gb, s->buffer, (dst - s->buffer)*8);
1829 av_log(avctx, AV_LOG_DEBUG, "escaping removed %d bytes\n",
1830 (buf_end - buf_ptr) - (dst - s->buffer));
1832 else if(start_code == SOS && s->ls){
1833 uint8_t *src = buf_ptr;
1834 uint8_t *dst = s->buffer;
1842 while (src + t < buf_end){
1843 uint8_t x = src[t++];
1845 while((src + t < buf_end) && x == 0xff)
1855 init_put_bits(&pb, dst, t);
1857 /* unescape bitstream */
1859 uint8_t x = src[b++];
1860 put_bits(&pb, 8, x);
1863 put_bits(&pb, 7, x);
1867 flush_put_bits(&pb);
1869 init_get_bits(&s->gb, dst, bit_count);
1872 init_get_bits(&s->gb, buf_ptr, (buf_end - buf_ptr)*8);
1874 s->start_code = start_code;
1875 if(s->avctx->debug & FF_DEBUG_STARTCODE){
1876 av_log(avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code);
1879 /* process markers */
1880 if (start_code >= 0xd0 && start_code <= 0xd7) {
1881 av_log(avctx, AV_LOG_DEBUG, "restart marker: %d\n", start_code&0x0f);
1883 } else if (start_code >= APP0 && start_code <= APP15) {
1884 mjpeg_decode_app(s);
1886 } else if (start_code == COM){
1887 mjpeg_decode_com(s);
1890 switch(start_code) {
1892 s->restart_interval = 0;
1894 s->restart_count = 0;
1895 /* nothing to do on SOI */
1898 mjpeg_decode_dqt(s);
1901 if(mjpeg_decode_dht(s) < 0){
1902 av_log(avctx, AV_LOG_ERROR, "huffman table decode error\n");
1910 if (mjpeg_decode_sof(s) < 0)
1917 if (mjpeg_decode_sof(s) < 0)
1924 if (mjpeg_decode_sof(s) < 0)
1931 if (mjpeg_decode_sof(s) < 0)
1935 if (ff_jpegls_decode_lse(s) < 0)
1940 if ((s->buggy_avid && !s->interlaced) || s->restart_interval)
1944 if (s->interlaced) {
1945 s->bottom_field ^= 1;
1946 /* if not bottom field, do not output image yet */
1947 if (s->bottom_field == !s->interlace_polarity)
1950 *picture = s->picture;
1951 *data_size = sizeof(AVFrame);
1954 picture->quality= FFMAX(FFMAX(s->qscale[0], s->qscale[1]), s->qscale[2]);
1955 picture->qstride= 0;
1956 picture->qscale_table= s->qscale_table;
1957 memset(picture->qscale_table, picture->quality, (s->width+15)/16);
1958 if(avctx->debug & FF_DEBUG_QP)
1959 av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", picture->quality);
1960 picture->quality*= FF_QP2LAMBDA;
1967 mjpeg_decode_sos(s);
1968 /* buggy avid puts EOI every 10-20th frame */
1969 /* if restart period is over process EOI */
1970 if ((s->buggy_avid && !s->interlaced) || s->restart_interval)
1974 mjpeg_decode_dri(s);
1987 av_log(avctx, AV_LOG_ERROR, "mjpeg: unsupported coding type (%x)\n", start_code);
1990 // printf("mjpeg: unsupported marker (%x)\n", start_code);
1995 /* eof process start code */
1996 buf_ptr += (get_bits_count(&s->gb)+7)/8;
1997 av_log(avctx, AV_LOG_DEBUG, "marker parser used %d bytes (%d bits)\n",
1998 (get_bits_count(&s->gb)+7)/8, get_bits_count(&s->gb));
2003 av_log(avctx, AV_LOG_DEBUG, "mjpeg decode frame unused %d bytes\n", buf_end - buf_ptr);
2004 // return buf_end - buf_ptr;
2005 return buf_ptr - buf;
2008 static int mjpegb_decode_frame(AVCodecContext *avctx,
2009 void *data, int *data_size,
2010 uint8_t *buf, int buf_size)
2012 MJpegDecodeContext *s = avctx->priv_data;
2013 uint8_t *buf_end, *buf_ptr;
2014 AVFrame *picture = data;
2015 GetBitContext hgb; /* for the header */
2016 uint32_t dqt_offs, dht_offs, sof_offs, sos_offs, second_field_offs;
2017 uint32_t field_size, sod_offs;
2020 buf_end = buf + buf_size;
2023 /* reset on every SOI */
2024 s->restart_interval = 0;
2025 s->restart_count = 0;
2026 s->mjpb_skiptosod = 0;
2028 init_get_bits(&hgb, buf_ptr, /*buf_size*/(buf_end - buf_ptr)*8);
2030 skip_bits(&hgb, 32); /* reserved zeros */
2032 if (get_bits_long(&hgb, 32) != MKBETAG('m','j','p','g'))
2034 av_log(avctx, AV_LOG_WARNING, "not mjpeg-b (bad fourcc)\n");
2038 field_size = get_bits_long(&hgb, 32); /* field size */
2039 av_log(avctx, AV_LOG_DEBUG, "field size: 0x%x\n", field_size);
2040 skip_bits(&hgb, 32); /* padded field size */
2041 second_field_offs = get_bits_long(&hgb, 32);
2042 av_log(avctx, AV_LOG_DEBUG, "second field offs: 0x%x\n", second_field_offs);
2044 dqt_offs = get_bits_long(&hgb, 32);
2045 av_log(avctx, AV_LOG_DEBUG, "dqt offs: 0x%x\n", dqt_offs);
2048 init_get_bits(&s->gb, buf+dqt_offs, (buf_end - (buf+dqt_offs))*8);
2049 s->start_code = DQT;
2050 mjpeg_decode_dqt(s);
2053 dht_offs = get_bits_long(&hgb, 32);
2054 av_log(avctx, AV_LOG_DEBUG, "dht offs: 0x%x\n", dht_offs);
2057 init_get_bits(&s->gb, buf+dht_offs, (buf_end - (buf+dht_offs))*8);
2058 s->start_code = DHT;
2059 mjpeg_decode_dht(s);
2062 sof_offs = get_bits_long(&hgb, 32);
2063 av_log(avctx, AV_LOG_DEBUG, "sof offs: 0x%x\n", sof_offs);
2066 init_get_bits(&s->gb, buf+sof_offs, (buf_end - (buf+sof_offs))*8);
2067 s->start_code = SOF0;
2068 if (mjpeg_decode_sof(s) < 0)
2072 sos_offs = get_bits_long(&hgb, 32);
2073 av_log(avctx, AV_LOG_DEBUG, "sos offs: 0x%x\n", sos_offs);
2074 sod_offs = get_bits_long(&hgb, 32);
2075 av_log(avctx, AV_LOG_DEBUG, "sod offs: 0x%x\n", sod_offs);
2078 // init_get_bits(&s->gb, buf+sos_offs, (buf_end - (buf+sos_offs))*8);
2079 init_get_bits(&s->gb, buf+sos_offs, field_size*8);
2080 s->mjpb_skiptosod = (sod_offs - sos_offs - show_bits(&s->gb, 16));
2081 s->start_code = SOS;
2082 mjpeg_decode_sos(s);
2085 if (s->interlaced) {
2086 s->bottom_field ^= 1;
2087 /* if not bottom field, do not output image yet */
2088 if (s->bottom_field && second_field_offs)
2090 buf_ptr = buf + second_field_offs;
2091 second_field_offs = 0;
2096 //XXX FIXME factorize, this looks very similar to the EOI code
2098 *picture= s->picture;
2099 *data_size = sizeof(AVFrame);
2102 picture->quality= FFMAX(FFMAX(s->qscale[0], s->qscale[1]), s->qscale[2]);
2103 picture->qstride= 0;
2104 picture->qscale_table= s->qscale_table;
2105 memset(picture->qscale_table, picture->quality, (s->width+15)/16);
2106 if(avctx->debug & FF_DEBUG_QP)
2107 av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", picture->quality);
2108 picture->quality*= FF_QP2LAMBDA;
2111 return buf_ptr - buf;
2116 static int sp5x_decode_frame(AVCodecContext *avctx,
2117 void *data, int *data_size,
2118 uint8_t *buf, int buf_size)
2121 MJpegDecodeContext *s = avctx->priv_data;
2123 const int qscale = 5;
2124 uint8_t *buf_ptr, *buf_end, *recoded;
2127 if (!avctx->width || !avctx->height)
2131 buf_end = buf + buf_size;
2134 recoded = av_mallocz(buf_size + 1024);
2139 recoded[j++] = 0xFF;
2140 recoded[j++] = 0xD8;
2142 memcpy(recoded+j, &sp5x_data_dqt[0], sizeof(sp5x_data_dqt));
2143 memcpy(recoded+j+5, &sp5x_quant_table[qscale * 2], 64);
2144 memcpy(recoded+j+70, &sp5x_quant_table[(qscale * 2) + 1], 64);
2145 j += sizeof(sp5x_data_dqt);
2147 memcpy(recoded+j, &sp5x_data_dht[0], sizeof(sp5x_data_dht));
2148 j += sizeof(sp5x_data_dht);
2150 memcpy(recoded+j, &sp5x_data_sof[0], sizeof(sp5x_data_sof));
2151 recoded[j+5] = (avctx->coded_height >> 8) & 0xFF;
2152 recoded[j+6] = avctx->coded_height & 0xFF;
2153 recoded[j+7] = (avctx->coded_width >> 8) & 0xFF;
2154 recoded[j+8] = avctx->coded_width & 0xFF;
2155 j += sizeof(sp5x_data_sof);
2157 memcpy(recoded+j, &sp5x_data_sos[0], sizeof(sp5x_data_sos));
2158 j += sizeof(sp5x_data_sos);
2160 for (i = 14; i < buf_size && j < buf_size+1024-2; i++)
2162 recoded[j++] = buf[i];
2168 recoded[j++] = 0xFF;
2169 recoded[j++] = 0xD9;
2171 i = mjpeg_decode_frame(avctx, data, data_size, recoded, j);
2178 s->width = avctx->coded_width;
2179 s->height = avctx->coded_height;
2180 s->nb_components = 3;
2181 s->component_id[0] = 0;
2184 s->quant_index[0] = 0;
2185 s->component_id[1] = 1;
2188 s->quant_index[1] = 1;
2189 s->component_id[2] = 2;
2192 s->quant_index[2] = 1;
2196 s->qscale_table = av_mallocz((s->width+15)/16);
2197 avctx->pix_fmt = s->cs_itu601 ? PIX_FMT_YUV420P : PIX_FMT_YUVJ420;
2200 s->picture.reference = 0;
2201 if (avctx->get_buffer(avctx, &s->picture) < 0)
2203 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
2207 s->picture.pict_type = I_TYPE;
2208 s->picture.key_frame = 1;
2210 for (i = 0; i < 3; i++)
2211 s->linesize[i] = s->picture.linesize[i] << s->interlaced;
2214 for (i = 0; i < 64; i++)
2216 j = s->scantable.permutated[i];
2217 s->quant_matrixes[0][j] = sp5x_quant_table[(qscale * 2) + i];
2219 s->qscale[0] = FFMAX(
2220 s->quant_matrixes[0][s->scantable.permutated[1]],
2221 s->quant_matrixes[0][s->scantable.permutated[8]]) >> 1;
2223 for (i = 0; i < 64; i++)
2225 j = s->scantable.permutated[i];
2226 s->quant_matrixes[1][j] = sp5x_quant_table[(qscale * 2) + 1 + i];
2228 s->qscale[1] = FFMAX(
2229 s->quant_matrixes[1][s->scantable.permutated[1]],
2230 s->quant_matrixes[1][s->scantable.permutated[8]]) >> 1;
2235 s->comp_index[0] = 0;
2236 s->nb_blocks[0] = s->h_count[0] * s->v_count[0];
2237 s->h_scount[0] = s->h_count[0];
2238 s->v_scount[0] = s->v_count[0];
2242 s->comp_index[1] = 1;
2243 s->nb_blocks[1] = s->h_count[1] * s->v_count[1];
2244 s->h_scount[1] = s->h_count[1];
2245 s->v_scount[1] = s->v_count[1];
2249 s->comp_index[2] = 2;
2250 s->nb_blocks[2] = s->h_count[2] * s->v_count[2];
2251 s->h_scount[2] = s->h_count[2];
2252 s->v_scount[2] = s->v_count[2];
2256 for (i = 0; i < 3; i++)
2257 s->last_dc[i] = 1024;
2259 s->mb_width = (s->width * s->h_max * 8 -1) / (s->h_max * 8);
2260 s->mb_height = (s->height * s->v_max * 8 -1) / (s->v_max * 8);
2262 init_get_bits(&s->gb, buf+14, (buf_size-14)*8);
2264 return mjpeg_decode_scan(s);
2270 static int mjpeg_decode_end(AVCodecContext *avctx)
2272 MJpegDecodeContext *s = avctx->priv_data;
2276 av_free(s->qscale_table);
2280 free_vlc(&s->vlcs[i][j]);
2285 static int mjpega_dump_header(AVBitStreamFilterContext *bsfc, AVCodecContext *avctx, const char *args,
2286 uint8_t **poutbuf, int *poutbuf_size,
2287 const uint8_t *buf, int buf_size, int keyframe)
2292 if (avctx->codec_id != CODEC_ID_MJPEG) {
2293 av_log(avctx, AV_LOG_ERROR, "mjpega bitstream filter only applies to mjpeg codec\n");
2298 *poutbuf = av_malloc(buf_size + 44 + FF_INPUT_BUFFER_PADDING_SIZE);
2299 poutbufp = *poutbuf;
2300 bytestream_put_byte(&poutbufp, 0xff);
2301 bytestream_put_byte(&poutbufp, SOI);
2302 bytestream_put_byte(&poutbufp, 0xff);
2303 bytestream_put_byte(&poutbufp, APP1);
2304 bytestream_put_be16(&poutbufp, 42); /* size */
2305 bytestream_put_be32(&poutbufp, 0);
2306 bytestream_put_buffer(&poutbufp, "mjpg", 4);
2307 bytestream_put_be32(&poutbufp, buf_size + 44); /* field size */
2308 bytestream_put_be32(&poutbufp, buf_size + 44); /* pad field size */
2309 bytestream_put_be32(&poutbufp, 0); /* next ptr */
2311 for (i = 0; i < buf_size - 1; i++) {
2312 if (buf[i] == 0xff) {
2313 switch (buf[i + 1]) {
2314 case DQT: /* quant off */
2315 case DHT: /* huff off */
2316 case SOF0: /* image off */
2317 bytestream_put_be32(&poutbufp, i + 46);
2320 bytestream_put_be32(&poutbufp, i + 46); /* scan off */
2321 bytestream_put_be32(&poutbufp, i + 46 + AV_RB16(buf + i + 2)); /* data off */
2322 bytestream_put_buffer(&poutbufp, buf + 2, buf_size - 2); /* skip already written SOI */
2323 *poutbuf_size = poutbufp - *poutbuf;
2326 if (i + 8 < buf_size && AV_RL32(buf + i + 8) == ff_get_fourcc("mjpg")) {
2327 av_log(avctx, AV_LOG_ERROR, "bitstream already formatted\n");
2328 memcpy(*poutbuf, buf, buf_size);
2329 *poutbuf_size = buf_size;
2336 av_log(avctx, AV_LOG_ERROR, "could not find SOS marker in bitstream\n");
2340 AVCodec mjpeg_decoder = {
2344 sizeof(MJpegDecodeContext),
2353 AVCodec thp_decoder = {
2357 sizeof(MJpegDecodeContext),
2366 AVCodec mjpegb_decoder = {
2370 sizeof(MJpegDecodeContext),
2374 mjpegb_decode_frame,
2379 AVCodec sp5x_decoder = {
2383 sizeof(MJpegDecodeContext),
2392 #ifdef CONFIG_ENCODERS
2393 AVCodec ljpeg_encoder = { //FIXME avoid MPV_* lossless jpeg shouldnt need them
2397 sizeof(MpegEncContext),
2399 encode_picture_lossless,
2404 #ifdef CONFIG_MJPEGA_DUMP_HEADER_BSF
2405 AVBitStreamFilter mjpega_dump_header_bsf = {