2 * MJPEG encoder and decoder
3 * Copyright (c) 2000, 2001 Gerard Lantau.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 #include "mpegvideo.h"
25 typedef struct MJpegContext {
26 UINT8 huff_size_dc_luminance[12];
27 UINT16 huff_code_dc_luminance[12];
28 UINT8 huff_size_dc_chrominance[12];
29 UINT16 huff_code_dc_chrominance[12];
31 UINT8 huff_size_ac_luminance[256];
32 UINT16 huff_code_ac_luminance[256];
33 UINT8 huff_size_ac_chrominance[256];
34 UINT16 huff_code_ac_chrominance[256];
45 /* These are the sample quantization tables given in JPEG spec section K.1.
46 * The spec says that the values given produce "good" quality, and
47 * when divided by 2, "very good" quality.
49 static const unsigned char std_luminance_quant_tbl[64] = {
50 16, 11, 10, 16, 24, 40, 51, 61,
51 12, 12, 14, 19, 26, 58, 60, 55,
52 14, 13, 16, 24, 40, 57, 69, 56,
53 14, 17, 22, 29, 51, 87, 80, 62,
54 18, 22, 37, 56, 68, 109, 103, 77,
55 24, 35, 55, 64, 81, 104, 113, 92,
56 49, 64, 78, 87, 103, 121, 120, 101,
57 72, 92, 95, 98, 112, 100, 103, 99
59 static const unsigned char std_chrominance_quant_tbl[64] = {
60 17, 18, 24, 47, 99, 99, 99, 99,
61 18, 21, 26, 66, 99, 99, 99, 99,
62 24, 26, 56, 99, 99, 99, 99, 99,
63 47, 66, 99, 99, 99, 99, 99, 99,
64 99, 99, 99, 99, 99, 99, 99, 99,
65 99, 99, 99, 99, 99, 99, 99, 99,
66 99, 99, 99, 99, 99, 99, 99, 99,
67 99, 99, 99, 99, 99, 99, 99, 99
71 /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
72 /* IMPORTANT: these are only valid for 8-bit data precision! */
73 static const UINT8 bits_dc_luminance[17] =
74 { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
75 static const UINT8 val_dc_luminance[] =
76 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
78 static const UINT8 bits_dc_chrominance[17] =
79 { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
80 static const UINT8 val_dc_chrominance[] =
81 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
83 static const UINT8 bits_ac_luminance[17] =
84 { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
85 static const UINT8 val_ac_luminance[] =
86 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
87 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
88 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
89 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
90 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
91 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
92 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
93 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
94 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
95 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
96 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
97 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
98 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
99 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
100 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
101 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
102 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
103 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
104 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
105 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
109 static const UINT8 bits_ac_chrominance[17] =
110 { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
112 static const UINT8 val_ac_chrominance[] =
113 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
114 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
115 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
116 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
117 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
118 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
119 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
120 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
121 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
122 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
123 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
124 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
125 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
126 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
127 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
128 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
129 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
130 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
131 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
132 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
137 /* isn't this function nicer than the one in the libjpeg ? */
138 static void build_huffman_codes(UINT8 *huff_size, UINT16 *huff_code,
139 const UINT8 *bits_table, const UINT8 *val_table)
141 int i, j, k,nb, code, sym;
148 sym = val_table[k++];
150 huff_code[sym] = code;
157 int mjpeg_init(MpegEncContext *s)
161 m = malloc(sizeof(MJpegContext));
165 /* build all the huffman tables */
166 build_huffman_codes(m->huff_size_dc_luminance,
167 m->huff_code_dc_luminance,
170 build_huffman_codes(m->huff_size_dc_chrominance,
171 m->huff_code_dc_chrominance,
174 build_huffman_codes(m->huff_size_ac_luminance,
175 m->huff_code_ac_luminance,
178 build_huffman_codes(m->huff_size_ac_chrominance,
179 m->huff_code_ac_chrominance,
187 void mjpeg_close(MpegEncContext *s)
192 static inline void put_marker(PutBitContext *p, int code)
194 put_bits(p, 8, 0xff);
195 put_bits(p, 8, code);
198 /* table_class: 0 = DC coef, 1 = AC coefs */
199 static int put_huffman_table(MpegEncContext *s, int table_class, int table_id,
200 const UINT8 *bits_table, const UINT8 *value_table)
202 PutBitContext *p = &s->pb;
205 put_bits(p, 4, table_class);
206 put_bits(p, 4, table_id);
211 put_bits(p, 8, bits_table[i]);
215 put_bits(p, 8, value_table[i]);
220 static void jpeg_table_header(MpegEncContext *s)
222 PutBitContext *p = &s->pb;
228 put_bits(p, 16, 2 + 1 * (1 + 64));
229 put_bits(p, 4, 0); /* 8 bit precision */
230 put_bits(p, 4, 0); /* table 0 */
232 put_bits(p, 8, s->intra_matrix[i]);
235 put_bits(p, 4, 0); /* 8 bit precision */
236 put_bits(p, 4, 1); /* table 1 */
238 put_bits(p, 8, s->chroma_intra_matrix[i]);
246 put_bits(p, 16, 0); /* patched later */
248 size += put_huffman_table(s, 0, 0, bits_dc_luminance, val_dc_luminance);
249 size += put_huffman_table(s, 0, 1, bits_dc_chrominance, val_dc_chrominance);
251 size += put_huffman_table(s, 1, 0, bits_ac_luminance, val_ac_luminance);
252 size += put_huffman_table(s, 1, 1, bits_ac_chrominance, val_ac_chrominance);
257 void mjpeg_picture_header(MpegEncContext *s)
259 put_marker(&s->pb, SOI);
261 jpeg_table_header(s);
263 put_marker(&s->pb, SOF0);
265 put_bits(&s->pb, 16, 17);
266 put_bits(&s->pb, 8, 8); /* 8 bits/component */
267 put_bits(&s->pb, 16, s->height);
268 put_bits(&s->pb, 16, s->width);
269 put_bits(&s->pb, 8, 3); /* 3 components */
272 put_bits(&s->pb, 8, 1); /* component number */
273 put_bits(&s->pb, 4, 2); /* H factor */
274 put_bits(&s->pb, 4, 2); /* V factor */
275 put_bits(&s->pb, 8, 0); /* select matrix */
278 put_bits(&s->pb, 8, 2); /* component number */
279 put_bits(&s->pb, 4, 1); /* H factor */
280 put_bits(&s->pb, 4, 1); /* V factor */
281 put_bits(&s->pb, 8, 0); /* select matrix */
284 put_bits(&s->pb, 8, 3); /* component number */
285 put_bits(&s->pb, 4, 1); /* H factor */
286 put_bits(&s->pb, 4, 1); /* V factor */
287 put_bits(&s->pb, 8, 0); /* select matrix */
290 put_marker(&s->pb, SOS);
291 put_bits(&s->pb, 16, 12); /* length */
292 put_bits(&s->pb, 8, 3); /* 3 components */
295 put_bits(&s->pb, 8, 1); /* index */
296 put_bits(&s->pb, 4, 0); /* DC huffman table index */
297 put_bits(&s->pb, 4, 0); /* AC huffman table index */
300 put_bits(&s->pb, 8, 2); /* index */
301 put_bits(&s->pb, 4, 1); /* DC huffman table index */
302 put_bits(&s->pb, 4, 1); /* AC huffman table index */
305 put_bits(&s->pb, 8, 3); /* index */
306 put_bits(&s->pb, 4, 1); /* DC huffman table index */
307 put_bits(&s->pb, 4, 1); /* AC huffman table index */
309 put_bits(&s->pb, 8, 0); /* Ss (not used) */
310 put_bits(&s->pb, 8, 63); /* Se (not used) */
311 put_bits(&s->pb, 8, 0); /* (not used) */
314 void mjpeg_picture_trailer(MpegEncContext *s)
316 jflush_put_bits(&s->pb);
317 put_marker(&s->pb, EOI);
320 static inline void encode_dc(MpegEncContext *s, int val,
321 UINT8 *huff_size, UINT16 *huff_code)
326 jput_bits(&s->pb, huff_size[0], huff_code[0]);
334 /* compute the log (XXX: optimize) */
341 jput_bits(&s->pb, huff_size[nbits], huff_code[nbits]);
343 jput_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
347 static void encode_block(MpegEncContext *s, DCTELEM *block, int n)
349 int mant, nbits, code, i, j;
350 int component, dc, run, last_index, val;
351 MJpegContext *m = s->mjpeg_ctx;
353 UINT16 *huff_code_ac;
356 component = (n <= 3 ? 0 : n - 4 + 1);
357 dc = block[0]; /* overflow is impossible */
358 val = dc - s->last_dc[component];
360 encode_dc(s, val, m->huff_size_dc_luminance, m->huff_code_dc_luminance);
361 huff_size_ac = m->huff_size_ac_luminance;
362 huff_code_ac = m->huff_code_ac_luminance;
364 encode_dc(s, val, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
365 huff_size_ac = m->huff_size_ac_chrominance;
366 huff_code_ac = m->huff_code_ac_chrominance;
368 s->last_dc[component] = dc;
373 last_index = s->block_last_index[n];
374 for(i=1;i<=last_index;i++) {
375 j = zigzag_direct[i];
381 jput_bits(&s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]);
390 /* compute the log (XXX: optimize) */
396 code = (run << 4) | nbits;
398 jput_bits(&s->pb, huff_size_ac[code], huff_code_ac[code]);
400 jput_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
405 /* output EOB only if not already 64 values */
406 if (last_index < 63 || run != 0)
407 jput_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]);
410 void mjpeg_encode_mb(MpegEncContext *s,
411 DCTELEM block[6][64])
415 encode_block(s, block[i], i);
419 /******************************************/
425 #define dprintf(fmt,args...) printf(fmt, ## args)
427 #define dprintf(fmt,args...)
430 /* compressed picture size */
431 #define PICTURE_BUFFER_SIZE 100000
433 #define MAX_COMPONENTS 4
435 typedef struct MJpegDecodeContext {
438 int start_code; /* current start code */
441 int mpeg_enc_ctx_allocated; /* true if decoding context allocated */
442 INT16 quant_matrixes[4][64];
446 int component_id[MAX_COMPONENTS];
447 int h_count[MAX_COMPONENTS]; /* horizontal and vertical count for each component */
448 int v_count[MAX_COMPONENTS];
449 int h_max, v_max; /* maximum h and v counts */
450 int quant_index[4]; /* quant table index for each component */
451 int last_dc[MAX_COMPONENTS]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */
452 UINT8 *current_picture[MAX_COMPONENTS]; /* picture structure */
453 int linesize[MAX_COMPONENTS];
454 DCTELEM block[64] __align8;
455 UINT8 buffer[PICTURE_BUFFER_SIZE];
456 } MJpegDecodeContext;
458 static void build_vlc(VLC *vlc, const UINT8 *bits_table, const UINT8 *val_table,
461 UINT8 huff_size[256];
462 UINT16 huff_code[256];
464 memset(huff_size, 0, sizeof(huff_size));
465 build_huffman_codes(huff_size, huff_code, bits_table, val_table);
467 init_vlc(vlc, 9, nb_codes, huff_size, 1, 1, huff_code, 2, 2);
470 static int mjpeg_decode_init(AVCodecContext *avctx)
472 MJpegDecodeContext *s = avctx->priv_data;
475 s->mpeg_enc_ctx_allocated = 0;
476 s->buffer_size = PICTURE_BUFFER_SIZE - 1; /* minus 1 to take into
477 account FF 00 case */
479 s->buf_ptr = s->buffer;
481 build_vlc(&s->vlcs[0][0], bits_dc_luminance, val_dc_luminance, 12);
482 build_vlc(&s->vlcs[0][1], bits_dc_chrominance, val_dc_chrominance, 12);
483 build_vlc(&s->vlcs[1][0], bits_ac_luminance, val_ac_luminance, 251);
484 build_vlc(&s->vlcs[1][1], bits_ac_chrominance, val_ac_chrominance, 251);
488 /* quantize tables */
489 static int mjpeg_decode_dqt(MJpegDecodeContext *s,
490 UINT8 *buf, int buf_size)
493 init_get_bits(&s->gb, buf, buf_size);
495 len = get_bits(&s->gb, 16);
499 /* only 8 bit precision handled */
500 if (get_bits(&s->gb, 4) != 0)
502 index = get_bits(&s->gb, 4);
505 dprintf("index=%d\n", index);
506 /* read quant table */
508 s->quant_matrixes[index][i] = get_bits(&s->gb, 8);
514 /* decode huffman tables and build VLC decoders */
515 static int mjpeg_decode_dht(MJpegDecodeContext *s,
516 UINT8 *buf, int buf_size)
518 int len, index, i, class, n, v, code_max;
519 UINT8 bits_table[17];
520 UINT8 val_table[256];
522 init_get_bits(&s->gb, buf, buf_size);
524 len = get_bits(&s->gb, 16);
530 class = get_bits(&s->gb, 4);
533 index = get_bits(&s->gb, 4);
538 bits_table[i] = get_bits(&s->gb, 8);
542 if (len < n || n > 256)
547 v = get_bits(&s->gb, 8);
554 /* build VLC and flush previous vlc if present */
555 free_vlc(&s->vlcs[class][index]);
556 dprintf("class=%d index=%d nb_codes=%d\n",
557 class, index, code_max + 1);
558 build_vlc(&s->vlcs[class][index], bits_table, val_table, code_max + 1);
563 static int mjpeg_decode_sof0(MJpegDecodeContext *s,
564 UINT8 *buf, int buf_size)
566 int len, nb_components, i, width, height;
568 init_get_bits(&s->gb, buf, buf_size);
570 /* XXX: verify len field validity */
571 len = get_bits(&s->gb, 16);
572 /* only 8 bits/component accepted */
573 if (get_bits(&s->gb, 8) != 8)
575 height = get_bits(&s->gb, 16);
576 width = get_bits(&s->gb, 16);
578 nb_components = get_bits(&s->gb, 8);
579 if (nb_components <= 0 ||
580 nb_components > MAX_COMPONENTS)
582 s->nb_components = nb_components;
585 for(i=0;i<nb_components;i++) {
587 s->component_id[i] = get_bits(&s->gb, 8) - 1;
588 s->h_count[i] = get_bits(&s->gb, 4);
589 s->v_count[i] = get_bits(&s->gb, 4);
590 /* compute hmax and vmax (only used in interleaved case) */
591 if (s->h_count[i] > s->h_max)
592 s->h_max = s->h_count[i];
593 if (s->v_count[i] > s->v_max)
594 s->v_max = s->v_count[i];
595 s->quant_index[i] = get_bits(&s->gb, 8);
596 if (s->quant_index[i] >= 4)
598 dprintf("component %d %d:%d\n", i, s->h_count[i], s->v_count[i]);
601 /* if different size, realloc/alloc picture */
602 /* XXX: also check h_count and v_count */
603 if (width != s->width || height != s->height) {
604 for(i=0;i<MAX_COMPONENTS;i++) {
605 free(s->current_picture[i]);
606 s->current_picture[i] = NULL;
610 for(i=0;i<nb_components;i++) {
612 hh = s->h_max / s->h_count[i];
613 vv = s->v_max / s->v_count[i];
614 w = (s->width + 8 * hh - 1) / (8 * hh);
615 h = (s->height + 8 * vv - 1) / (8 * vv);
619 /* memory test is done in mjpeg_decode_sos() */
620 s->current_picture[i] = av_mallocz(w * h);
627 static inline int decode_dc(MJpegDecodeContext *s, int dc_index)
632 dc_vlc = &s->vlcs[0][dc_index];
633 code = get_vlc(&s->gb, dc_vlc);
639 diff = get_bits(&s->gb, code);
640 if ((diff & (1 << (code - 1))) == 0)
641 diff = (-1 << code) | (diff + 1);
646 /* decode block and dequantize */
647 static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
648 int component, int dc_index, int ac_index, int quant_index)
650 int nbits, code, i, j, level;
655 quant_matrix = s->quant_matrixes[quant_index];
657 val = decode_dc(s, dc_index);
659 dprintf("error dc\n");
662 val = val * quant_matrix[0] + s->last_dc[component];
663 s->last_dc[component] = val;
666 ac_vlc = &s->vlcs[1][ac_index];
669 code = get_vlc(&s->gb, ac_vlc);
671 dprintf("error ac\n");
682 level = get_bits(&s->gb, nbits);
683 if ((level & (1 << (nbits - 1))) == 0)
684 level = (-1 << nbits) | (level + 1);
687 dprintf("error count: %d\n", i);
690 j = zigzag_direct[i];
691 block[j] = level * quant_matrix[j];
700 static int mjpeg_decode_sos(MJpegDecodeContext *s,
701 UINT8 *buf, int buf_size)
703 int len, nb_components, i, j, n, h, v;
704 int mb_width, mb_height, mb_x, mb_y, vmax, hmax, index, id;
712 init_get_bits(&s->gb, buf, buf_size);
713 /* XXX: verify len field validity */
714 len = get_bits(&s->gb, 16);
715 nb_components = get_bits(&s->gb, 8);
716 /* XXX: only interleaved scan accepted */
717 if (nb_components != 3)
721 for(i=0;i<nb_components;i++) {
722 id = get_bits(&s->gb, 8) - 1;
723 /* find component index */
724 for(index=0;index<s->nb_components;index++)
725 if (id == s->component_id[index])
727 if (index == s->nb_components)
730 comp_index[i] = index;
731 nb_blocks[i] = s->h_count[index] * s->v_count[index];
732 h_count[i] = s->h_count[index];
733 v_count[i] = s->v_count[index];
735 dc_index[i] = get_bits(&s->gb, 4);
736 if (dc_index[i] >= 4)
738 ac_index[i] = get_bits(&s->gb, 4);
739 if (ac_index[i] >= 4)
742 get_bits(&s->gb, 8); /* Ss */
743 get_bits(&s->gb, 8); /* Se */
744 get_bits(&s->gb, 8); /* not used */
746 for(i=0;i<nb_components;i++)
747 s->last_dc[i] = 1024;
749 if (nb_components > 1) {
750 /* interleaved stream */
751 mb_width = (s->width + s->h_max * 8 - 1) / (s->h_max * 8);
752 mb_height = (s->height + s->v_max * 8 - 1) / (s->v_max * 8);
754 h = s->h_max / s->h_count[comp_index[0]];
755 v = s->v_max / s->v_count[comp_index[0]];
756 mb_width = (s->width + h * 8 - 1) / (h * 8);
757 mb_height = (s->height + v * 8 - 1) / (v * 8);
763 for(mb_y = 0; mb_y < mb_height; mb_y++) {
764 for(mb_x = 0; mb_x < mb_width; mb_x++) {
765 for(i=0;i<nb_components;i++) {
775 memset(s->block, 0, sizeof(s->block));
776 if (decode_block(s, s->block, i,
777 dc_index[i], ac_index[i],
778 s->quant_index[c]) < 0) {
779 dprintf("error %d %d\n", mb_y, mb_x);
783 ptr = s->current_picture[c] +
784 (s->linesize[c] * (v * mb_y + y) * 8) +
786 put_pixels_clamped(s->block, ptr, s->linesize[c]);
798 /* return the 8 bit start code value and update the search
799 state. Return -1 if no start code found */
800 static int find_marker(UINT8 **pbuf_ptr, UINT8 *buf_end,
801 UINT32 *header_state)
804 unsigned int state, v;
807 state = *header_state;
812 if (buf_ptr < buf_end) {
819 while (buf_ptr < buf_end) {
829 *header_state = state;
833 static int mjpeg_decode_frame(AVCodecContext *avctx,
834 void *data, int *data_size,
835 UINT8 *buf, int buf_size)
837 MJpegDecodeContext *s = avctx->priv_data;
838 UINT8 *buf_end, *buf_ptr, *buf_start;
839 int len, code, start_code, input_size, i;
840 AVPicture *picture = data;
842 /* no supplementary picture */
849 buf_end = buf + buf_size;
850 while (buf_ptr < buf_end) {
852 /* find start next marker */
853 code = find_marker(&buf_ptr, buf_end, &s->header_state);
855 len = buf_ptr - buf_start;
856 if (len + (s->buf_ptr - s->buffer) > s->buffer_size) {
857 /* data too big : flush */
858 s->buf_ptr = s->buffer;
860 s->start_code = code;
862 memcpy(s->buf_ptr, buf_start, len);
864 /* if we got FF 00, we copy FF to the stream to unescape FF 00 */
867 } else if (code > 0) {
868 /* prepare data for next start code */
869 input_size = s->buf_ptr - s->buffer;
870 start_code = s->start_code;
871 s->buf_ptr = s->buffer;
872 s->start_code = code;
875 /* nothing to do on SOI */
878 mjpeg_decode_dqt(s, s->buffer, input_size);
881 mjpeg_decode_dht(s, s->buffer, input_size);
884 mjpeg_decode_sof0(s, s->buffer, input_size);
887 mjpeg_decode_sos(s, s->buffer, input_size);
888 if (s->start_code == EOI) {
890 picture->data[i] = s->current_picture[i];
891 picture->linesize[i] = s->linesize[i];
893 *data_size = sizeof(AVPicture);
894 avctx->height = s->height;
895 avctx->width = s->width;
896 /* XXX: not complete test ! */
897 switch((s->h_count[0] << 4) | s->v_count[0]) {
899 avctx->pix_fmt = PIX_FMT_YUV444P;
902 avctx->pix_fmt = PIX_FMT_YUV422P;
906 avctx->pix_fmt = PIX_FMT_YUV420P;
917 return buf_ptr - buf;
920 static int mjpeg_decode_end(AVCodecContext *avctx)
922 MJpegDecodeContext *s = avctx->priv_data;
925 for(i=0;i<MAX_COMPONENTS;i++)
926 free(s->current_picture[i]);
929 free_vlc(&s->vlcs[i][j]);
934 AVCodec mjpeg_decoder = {
938 sizeof(MJpegDecodeContext),