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 int mjpeg_decode_init(AVCodecContext *avctx)
460 MJpegDecodeContext *s = avctx->priv_data;
463 s->mpeg_enc_ctx_allocated = 0;
464 s->buffer_size = PICTURE_BUFFER_SIZE - 1; /* minus 1 to take into
465 account FF 00 case */
467 s->buf_ptr = s->buffer;
471 /* quantize tables */
472 static int mjpeg_decode_dqt(MJpegDecodeContext *s,
473 UINT8 *buf, int buf_size)
476 init_get_bits(&s->gb, buf, buf_size);
478 len = get_bits(&s->gb, 16);
482 /* only 8 bit precision handled */
483 if (get_bits(&s->gb, 4) != 0)
485 index = get_bits(&s->gb, 4);
488 dprintf("index=%d\n", index);
489 /* read quant table */
491 s->quant_matrixes[index][i] = get_bits(&s->gb, 8);
497 /* decode huffman tables and build VLC decoders */
498 static int mjpeg_decode_dht(MJpegDecodeContext *s,
499 UINT8 *buf, int buf_size)
501 int len, index, i, class, n, v, code_max;
502 UINT8 bits_table[17];
503 UINT8 val_table[256];
504 UINT8 huff_size[256];
505 UINT16 huff_code[256];
507 init_get_bits(&s->gb, buf, buf_size);
509 len = get_bits(&s->gb, 16);
515 class = get_bits(&s->gb, 4);
518 index = get_bits(&s->gb, 4);
523 bits_table[i] = get_bits(&s->gb, 8);
527 if (len < n || n > 256)
532 v = get_bits(&s->gb, 8);
539 /* now build size/code table */
540 memset(huff_size, 0, sizeof(huff_size));
541 build_huffman_codes(huff_size, huff_code, bits_table, val_table);
543 /* build VLC and flush previous vlc if present */
544 free_vlc(&s->vlcs[class][index]);
545 dprintf("class=%d index=%d nb_codes=%d\n",
546 class, index, code_max + 1);
547 init_vlc(&s->vlcs[class][index], 9, code_max + 1,
554 static int mjpeg_decode_sof0(MJpegDecodeContext *s,
555 UINT8 *buf, int buf_size)
557 int len, nb_components, i, width, height;
559 init_get_bits(&s->gb, buf, buf_size);
561 /* XXX: verify len field validity */
562 len = get_bits(&s->gb, 16);
563 /* only 8 bits/component accepted */
564 if (get_bits(&s->gb, 8) != 8)
566 height = get_bits(&s->gb, 16);
567 width = get_bits(&s->gb, 16);
569 nb_components = get_bits(&s->gb, 8);
570 if (nb_components <= 0 ||
571 nb_components > MAX_COMPONENTS)
573 s->nb_components = nb_components;
576 for(i=0;i<nb_components;i++) {
578 s->component_id[i] = get_bits(&s->gb, 8) - 1;
579 s->h_count[i] = get_bits(&s->gb, 4);
580 s->v_count[i] = get_bits(&s->gb, 4);
581 /* compute hmax and vmax (only used in interleaved case) */
582 if (s->h_count[i] > s->h_max)
583 s->h_max = s->h_count[i];
584 if (s->v_count[i] > s->v_max)
585 s->v_max = s->v_count[i];
587 /* XXX: only 420 is accepted */
588 if ((i == 0 && (s->h_count[i] != 2 || s->v_count[i] != 2)) ||
589 (i != 0 && (s->h_count[i] != 1 || s->v_count[i] != 1)))
592 s->quant_index[i] = get_bits(&s->gb, 8);
593 if (s->quant_index[i] >= 4)
595 dprintf("component %d %d:%d\n", i, s->h_count[i], s->v_count[i]);
598 /* if different size, realloc/alloc picture */
599 /* XXX: also check h_count and v_count */
600 if (width != s->width || height != s->height) {
601 for(i=0;i<MAX_COMPONENTS;i++) {
602 free(s->current_picture[i]);
603 s->current_picture[i] = NULL;
607 for(i=0;i<nb_components;i++) {
609 hh = s->h_max / s->h_count[i];
610 vv = s->v_max / s->v_count[i];
611 w = (s->width + 8 * hh - 1) / (8 * hh);
612 h = (s->height + 8 * vv - 1) / (8 * vv);
616 /* memory test is done in mjpeg_decode_sos() */
617 s->current_picture[i] = av_mallocz(w * h);
624 static inline int decode_dc(MJpegDecodeContext *s, int dc_index)
629 dc_vlc = &s->vlcs[0][dc_index];
630 code = get_vlc(&s->gb, dc_vlc);
636 diff = get_bits(&s->gb, code);
637 if ((diff & (1 << (code - 1))) == 0)
638 diff = (-1 << code) | (diff + 1);
643 /* decode block and dequantize */
644 static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
645 int component, int dc_index, int ac_index, int quant_index)
647 int nbits, code, i, j, level;
652 quant_matrix = s->quant_matrixes[quant_index];
654 val = decode_dc(s, dc_index);
656 dprintf("error dc\n");
659 val = val * quant_matrix[0] + s->last_dc[component];
660 s->last_dc[component] = val;
664 ac_vlc = &s->vlcs[1][ac_index];
667 code = get_vlc(&s->gb, ac_vlc);
669 dprintf("error ac\n");
680 level = get_bits(&s->gb, nbits);
681 if ((level & (1 << (nbits - 1))) == 0)
682 level = (-1 << nbits) | (level + 1);
685 dprintf("error count: %d\n", i);
688 j = zigzag_direct[i];
689 block[j] = level * quant_matrix[j];
696 static int mjpeg_decode_sos(MJpegDecodeContext *s,
697 UINT8 *buf, int buf_size)
699 int len, nb_components, i, j, n, h, v;
700 int mb_width, mb_height, mb_x, mb_y, vmax, hmax, index, id;
708 init_get_bits(&s->gb, buf, buf_size);
709 /* XXX: verify len field validity */
710 len = get_bits(&s->gb, 16);
711 nb_components = get_bits(&s->gb, 8);
712 /* XXX: only interleaved scan accepted */
713 if (nb_components != 3)
717 for(i=0;i<nb_components;i++) {
718 id = get_bits(&s->gb, 8) - 1;
719 /* find component index */
720 for(index=0;index<s->nb_components;index++)
721 if (id == s->component_id[index])
723 if (index == s->nb_components)
726 comp_index[i] = index;
727 nb_blocks[i] = s->h_count[index] * s->v_count[index];
728 h_count[i] = s->h_count[index];
729 v_count[i] = s->v_count[index];
731 dc_index[i] = get_bits(&s->gb, 4);
732 if (dc_index[i] >= 4)
734 ac_index[i] = get_bits(&s->gb, 4);
735 if (ac_index[i] >= 4)
738 get_bits(&s->gb, 8); /* Ss */
739 get_bits(&s->gb, 8); /* Se */
740 get_bits(&s->gb, 8); /* not used */
742 for(i=0;i<nb_components;i++)
743 s->last_dc[i] = 1024;
745 if (nb_components > 1) {
746 /* interleaved stream */
747 mb_width = (s->width + s->h_max * 8 - 1) / (s->h_max * 8);
748 mb_height = (s->height + s->v_max * 8 - 1) / (s->v_max * 8);
750 h = s->h_max / s->h_count[comp_index[0]];
751 v = s->v_max / s->v_count[comp_index[0]];
752 mb_width = (s->width + h * 8 - 1) / (h * 8);
753 mb_height = (s->height + v * 8 - 1) / (v * 8);
759 for(mb_y = 0; mb_y < mb_height; mb_y++) {
760 for(mb_x = 0; mb_x < mb_width; mb_x++) {
761 for(i=0;i<nb_components;i++) {
771 memset(s->block, 0, sizeof(s->block));
772 if (decode_block(s, s->block, i,
773 dc_index[i], ac_index[i],
774 s->quant_index[c]) < 0) {
775 dprintf("error %d %d\n", mb_y, mb_x);
779 ptr = s->current_picture[c] +
780 (s->linesize[c] * (v * mb_y + y) * 8) +
782 put_pixels_clamped(s->block, ptr, s->linesize[c]);
794 /* return the 8 bit start code value and update the search
795 state. Return -1 if no start code found */
796 static int find_marker(UINT8 **pbuf_ptr, UINT8 *buf_end,
797 UINT32 *header_state)
800 unsigned int state, v;
803 state = *header_state;
808 if (buf_ptr < buf_end) {
815 while (buf_ptr < buf_end) {
825 *header_state = state;
829 static int mjpeg_decode_frame(AVCodecContext *avctx,
830 void *data, int *data_size,
831 UINT8 *buf, int buf_size)
833 MJpegDecodeContext *s = avctx->priv_data;
834 UINT8 *buf_end, *buf_ptr, *buf_start;
835 int len, code, start_code, input_size, i;
836 AVPicture *picture = data;
838 /* no supplementary picture */
845 buf_end = buf + buf_size;
846 while (buf_ptr < buf_end) {
848 /* find start next marker */
849 code = find_marker(&buf_ptr, buf_end, &s->header_state);
851 len = buf_ptr - buf_start;
852 if (len + (s->buf_ptr - s->buffer) > s->buffer_size) {
853 /* data too big : flush */
854 s->buf_ptr = s->buffer;
856 s->start_code = code;
858 memcpy(s->buf_ptr, buf_start, len);
860 /* if we got FF 00, we copy FF to the stream to unescape FF 00 */
863 } else if (code > 0) {
864 /* prepare data for next start code */
865 input_size = s->buf_ptr - s->buffer;
866 start_code = s->start_code;
867 s->buf_ptr = s->buffer;
868 s->start_code = code;
871 /* nothing to do on SOI */
874 mjpeg_decode_dqt(s, s->buffer, input_size);
877 mjpeg_decode_dht(s, s->buffer, input_size);
880 mjpeg_decode_sof0(s, s->buffer, input_size);
883 mjpeg_decode_sos(s, s->buffer, input_size);
884 if (s->start_code == EOI) {
885 /* XXX: YUV420 hardcoded */
887 picture->data[i] = s->current_picture[i];
888 picture->linesize[i] = s->linesize[i];
890 *data_size = sizeof(AVPicture);
891 avctx->height = s->height;
892 avctx->width = s->width;
893 avctx->pix_fmt = PIX_FMT_YUV420P;
902 return buf_ptr - buf;
905 static int mjpeg_decode_end(AVCodecContext *avctx)
907 MJpegDecodeContext *s = avctx->priv_data;
910 for(i=0;i<MAX_COMPONENTS;i++)
911 free(s->current_picture[i]);
914 free_vlc(&s->vlcs[i][j]);
919 AVCodec mjpeg_decoder = {
923 sizeof(MJpegDecodeContext),