annotate mjpeg.c @ 625:bb6a69f9d409 libavcodec

slow but accurate integer dct from IJG (should be ok with the LGPL as the old DCT is the fast integer DCT from IJG) per context DCT selection
author michaelni
date Thu, 29 Aug 2002 23:55:32 +0000
parents 03e395b31197
children 8c9edc20599a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
1 /*
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
2 * MJPEG encoder and decoder
427
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
3 * Copyright (c) 2000, 2001 Fabrice Bellard.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
4 *
427
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
5 * This library is free software; you can redistribute it and/or
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
7 * License as published by the Free Software Foundation; either
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
8 * version 2 of the License, or (at your option) any later version.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
9 *
427
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
10 * This library is distributed in the hope that it will be useful,
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
427
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
13 * Lesser General Public License for more details.
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
14 *
427
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
16 * License along with this library; if not, write to the Free Software
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
18 *
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
19 * Support for external huffman table and various fixes (AVID workaround) by
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
20 * Alex Beregszaszi <alex@naxine.org>
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
21 */
76
0b09bd08ef4b win32 fixes
glantau
parents: 68
diff changeset
22 //#define DEBUG
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
23 #include "avcodec.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
24 #include "dsputil.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
25 #include "mpegvideo.h"
986e461dc072 Initial revision
glantau
parents:
diff changeset
26
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
27 #ifdef USE_FASTMEMCPY
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
28 #include "fastmemcpy.h"
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
29 #endif
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
30
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
31 /* use two quantizer table (one for luminance and one for chrominance) */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
32 /* not yet working */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
33 #undef TWOMATRIXES
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
34
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
35 typedef struct MJpegContext {
986e461dc072 Initial revision
glantau
parents:
diff changeset
36 UINT8 huff_size_dc_luminance[12];
986e461dc072 Initial revision
glantau
parents:
diff changeset
37 UINT16 huff_code_dc_luminance[12];
986e461dc072 Initial revision
glantau
parents:
diff changeset
38 UINT8 huff_size_dc_chrominance[12];
986e461dc072 Initial revision
glantau
parents:
diff changeset
39 UINT16 huff_code_dc_chrominance[12];
986e461dc072 Initial revision
glantau
parents:
diff changeset
40
986e461dc072 Initial revision
glantau
parents:
diff changeset
41 UINT8 huff_size_ac_luminance[256];
986e461dc072 Initial revision
glantau
parents:
diff changeset
42 UINT16 huff_code_ac_luminance[256];
986e461dc072 Initial revision
glantau
parents:
diff changeset
43 UINT8 huff_size_ac_chrominance[256];
986e461dc072 Initial revision
glantau
parents:
diff changeset
44 UINT16 huff_code_ac_chrominance[256];
986e461dc072 Initial revision
glantau
parents:
diff changeset
45 } MJpegContext;
986e461dc072 Initial revision
glantau
parents:
diff changeset
46
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
47 /* JPEG marker codes */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
48 typedef enum {
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
49 /* start of frame */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
50 SOF0 = 0xc0, /* baseline */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
51 SOF1 = 0xc1, /* extended sequential, huffman */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
52 SOF2 = 0xc2, /* progressive, huffman */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
53 SOF3 = 0xc3, /* lossless, huffman */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
54
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
55 SOF5 = 0xc5, /* differential sequential, huffman */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
56 SOF6 = 0xc6, /* differential progressive, huffman */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
57 SOF7 = 0xc7, /* differential lossless, huffman */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
58 JPG = 0xc8, /* reserved for JPEG extension */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
59 SOF9 = 0xc9, /* extended sequential, arithmetic */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
60 SOF10 = 0xca, /* progressive, arithmetic */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
61 SOF11 = 0xcb, /* lossless, arithmetic */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
62
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
63 SOF13 = 0xcd, /* differential sequential, arithmetic */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
64 SOF14 = 0xce, /* differential progressive, arithmetic */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
65 SOF15 = 0xcf, /* differential lossless, arithmetic */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
66
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
67 DHT = 0xc4, /* define huffman tables */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
68
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
69 DAC = 0xcc, /* define arithmetic-coding conditioning */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
70
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
71 /* restart with modulo 8 count "m" */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
72 RST0 = 0xd0,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
73 RST1 = 0xd1,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
74 RST2 = 0xd2,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
75 RST3 = 0xd3,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
76 RST4 = 0xd4,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
77 RST5 = 0xd5,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
78 RST6 = 0xd6,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
79 RST7 = 0xd7,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
80
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
81 SOI = 0xd8, /* start of image */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
82 EOI = 0xd9, /* end of image */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
83 SOS = 0xda, /* start of scan */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
84 DQT = 0xdb, /* define quantization tables */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
85 DNL = 0xdc, /* define number of lines */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
86 DRI = 0xdd, /* define restart interval */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
87 DHP = 0xde, /* define hierarchical progression */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
88 EXP = 0xdf, /* expand reference components */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
89
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
90 APP0 = 0xe0,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
91 APP1 = 0xe1,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
92 APP2 = 0xe2,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
93 APP3 = 0xe3,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
94 APP4 = 0xe4,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
95 APP5 = 0xe5,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
96 APP6 = 0xe6,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
97 APP7 = 0xe7,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
98 APP8 = 0xe8,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
99 APP9 = 0xe9,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
100 APP10 = 0xea,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
101 APP11 = 0xeb,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
102 APP12 = 0xec,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
103 APP13 = 0xed,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
104 APP14 = 0xee,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
105 APP15 = 0xef,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
106
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
107 JPG0 = 0xf0,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
108 JPG1 = 0xf1,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
109 JPG2 = 0xf2,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
110 JPG3 = 0xf3,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
111 JPG4 = 0xf4,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
112 JPG5 = 0xf5,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
113 JPG6 = 0xf6,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
114 JPG7 = 0xf7,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
115 JPG8 = 0xf8,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
116 JPG9 = 0xf9,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
117 JPG10 = 0xfa,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
118 JPG11 = 0xfb,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
119 JPG12 = 0xfc,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
120 JPG13 = 0xfd,
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
121
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
122 COM = 0xfe, /* comment */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
123
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
124 TEM = 0x01, /* temporary private use for arithmetic coding */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
125
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
126 /* 0x02 -> 0xbf reserved */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
127 } JPEG_MARKER;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
128
986e461dc072 Initial revision
glantau
parents:
diff changeset
129 #if 0
986e461dc072 Initial revision
glantau
parents:
diff changeset
130 /* These are the sample quantization tables given in JPEG spec section K.1.
986e461dc072 Initial revision
glantau
parents:
diff changeset
131 * The spec says that the values given produce "good" quality, and
986e461dc072 Initial revision
glantau
parents:
diff changeset
132 * when divided by 2, "very good" quality.
986e461dc072 Initial revision
glantau
parents:
diff changeset
133 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
134 static const unsigned char std_luminance_quant_tbl[64] = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
135 16, 11, 10, 16, 24, 40, 51, 61,
986e461dc072 Initial revision
glantau
parents:
diff changeset
136 12, 12, 14, 19, 26, 58, 60, 55,
986e461dc072 Initial revision
glantau
parents:
diff changeset
137 14, 13, 16, 24, 40, 57, 69, 56,
986e461dc072 Initial revision
glantau
parents:
diff changeset
138 14, 17, 22, 29, 51, 87, 80, 62,
986e461dc072 Initial revision
glantau
parents:
diff changeset
139 18, 22, 37, 56, 68, 109, 103, 77,
986e461dc072 Initial revision
glantau
parents:
diff changeset
140 24, 35, 55, 64, 81, 104, 113, 92,
986e461dc072 Initial revision
glantau
parents:
diff changeset
141 49, 64, 78, 87, 103, 121, 120, 101,
986e461dc072 Initial revision
glantau
parents:
diff changeset
142 72, 92, 95, 98, 112, 100, 103, 99
986e461dc072 Initial revision
glantau
parents:
diff changeset
143 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
144 static const unsigned char std_chrominance_quant_tbl[64] = {
986e461dc072 Initial revision
glantau
parents:
diff changeset
145 17, 18, 24, 47, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
146 18, 21, 26, 66, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
147 24, 26, 56, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
148 47, 66, 99, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
149 99, 99, 99, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
150 99, 99, 99, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
151 99, 99, 99, 99, 99, 99, 99, 99,
986e461dc072 Initial revision
glantau
parents:
diff changeset
152 99, 99, 99, 99, 99, 99, 99, 99
986e461dc072 Initial revision
glantau
parents:
diff changeset
153 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
154 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
155
986e461dc072 Initial revision
glantau
parents:
diff changeset
156 /* Set up the standard Huffman tables (cf. JPEG standard section K.3) */
986e461dc072 Initial revision
glantau
parents:
diff changeset
157 /* IMPORTANT: these are only valid for 8-bit data precision! */
986e461dc072 Initial revision
glantau
parents:
diff changeset
158 static const UINT8 bits_dc_luminance[17] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
159 { /* 0-base */ 0, 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
160 static const UINT8 val_dc_luminance[] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
161 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
162
986e461dc072 Initial revision
glantau
parents:
diff changeset
163 static const UINT8 bits_dc_chrominance[17] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
164 { /* 0-base */ 0, 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
165 static const UINT8 val_dc_chrominance[] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
166 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
167
986e461dc072 Initial revision
glantau
parents:
diff changeset
168 static const UINT8 bits_ac_luminance[17] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
169 { /* 0-base */ 0, 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d };
986e461dc072 Initial revision
glantau
parents:
diff changeset
170 static const UINT8 val_ac_luminance[] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
171 { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12,
986e461dc072 Initial revision
glantau
parents:
diff changeset
172 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07,
986e461dc072 Initial revision
glantau
parents:
diff changeset
173 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08,
986e461dc072 Initial revision
glantau
parents:
diff changeset
174 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0,
986e461dc072 Initial revision
glantau
parents:
diff changeset
175 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16,
986e461dc072 Initial revision
glantau
parents:
diff changeset
176 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28,
986e461dc072 Initial revision
glantau
parents:
diff changeset
177 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39,
986e461dc072 Initial revision
glantau
parents:
diff changeset
178 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
986e461dc072 Initial revision
glantau
parents:
diff changeset
179 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
986e461dc072 Initial revision
glantau
parents:
diff changeset
180 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
986e461dc072 Initial revision
glantau
parents:
diff changeset
181 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
986e461dc072 Initial revision
glantau
parents:
diff changeset
182 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
986e461dc072 Initial revision
glantau
parents:
diff changeset
183 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98,
986e461dc072 Initial revision
glantau
parents:
diff changeset
184 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
986e461dc072 Initial revision
glantau
parents:
diff changeset
185 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6,
986e461dc072 Initial revision
glantau
parents:
diff changeset
186 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5,
986e461dc072 Initial revision
glantau
parents:
diff changeset
187 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4,
986e461dc072 Initial revision
glantau
parents:
diff changeset
188 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2,
986e461dc072 Initial revision
glantau
parents:
diff changeset
189 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea,
986e461dc072 Initial revision
glantau
parents:
diff changeset
190 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
191 0xf9, 0xfa
986e461dc072 Initial revision
glantau
parents:
diff changeset
192 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
193
986e461dc072 Initial revision
glantau
parents:
diff changeset
194 static const UINT8 bits_ac_chrominance[17] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
195 { /* 0-base */ 0, 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
196
986e461dc072 Initial revision
glantau
parents:
diff changeset
197 static const UINT8 val_ac_chrominance[] =
986e461dc072 Initial revision
glantau
parents:
diff changeset
198 { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21,
986e461dc072 Initial revision
glantau
parents:
diff changeset
199 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71,
986e461dc072 Initial revision
glantau
parents:
diff changeset
200 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91,
986e461dc072 Initial revision
glantau
parents:
diff changeset
201 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0,
986e461dc072 Initial revision
glantau
parents:
diff changeset
202 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34,
986e461dc072 Initial revision
glantau
parents:
diff changeset
203 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26,
986e461dc072 Initial revision
glantau
parents:
diff changeset
204 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38,
986e461dc072 Initial revision
glantau
parents:
diff changeset
205 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
986e461dc072 Initial revision
glantau
parents:
diff changeset
206 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
986e461dc072 Initial revision
glantau
parents:
diff changeset
207 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
986e461dc072 Initial revision
glantau
parents:
diff changeset
208 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
986e461dc072 Initial revision
glantau
parents:
diff changeset
209 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
986e461dc072 Initial revision
glantau
parents:
diff changeset
210 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96,
986e461dc072 Initial revision
glantau
parents:
diff changeset
211 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5,
986e461dc072 Initial revision
glantau
parents:
diff changeset
212 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4,
986e461dc072 Initial revision
glantau
parents:
diff changeset
213 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3,
986e461dc072 Initial revision
glantau
parents:
diff changeset
214 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2,
986e461dc072 Initial revision
glantau
parents:
diff changeset
215 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda,
986e461dc072 Initial revision
glantau
parents:
diff changeset
216 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9,
986e461dc072 Initial revision
glantau
parents:
diff changeset
217 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8,
986e461dc072 Initial revision
glantau
parents:
diff changeset
218 0xf9, 0xfa
986e461dc072 Initial revision
glantau
parents:
diff changeset
219 };
986e461dc072 Initial revision
glantau
parents:
diff changeset
220
986e461dc072 Initial revision
glantau
parents:
diff changeset
221 /* isn't this function nicer than the one in the libjpeg ? */
986e461dc072 Initial revision
glantau
parents:
diff changeset
222 static void build_huffman_codes(UINT8 *huff_size, UINT16 *huff_code,
986e461dc072 Initial revision
glantau
parents:
diff changeset
223 const UINT8 *bits_table, const UINT8 *val_table)
986e461dc072 Initial revision
glantau
parents:
diff changeset
224 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
225 int i, j, k,nb, code, sym;
986e461dc072 Initial revision
glantau
parents:
diff changeset
226
986e461dc072 Initial revision
glantau
parents:
diff changeset
227 code = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
228 k = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
229 for(i=1;i<=16;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
230 nb = bits_table[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
231 for(j=0;j<nb;j++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
232 sym = val_table[k++];
986e461dc072 Initial revision
glantau
parents:
diff changeset
233 huff_size[sym] = i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
234 huff_code[sym] = code;
986e461dc072 Initial revision
glantau
parents:
diff changeset
235 code++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
236 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
237 code <<= 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
238 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
239 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
240
986e461dc072 Initial revision
glantau
parents:
diff changeset
241 int mjpeg_init(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
242 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
243 MJpegContext *m;
986e461dc072 Initial revision
glantau
parents:
diff changeset
244
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 375
diff changeset
245 m = av_malloc(sizeof(MJpegContext));
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
246 if (!m)
986e461dc072 Initial revision
glantau
parents:
diff changeset
247 return -1;
344
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 234
diff changeset
248
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 234
diff changeset
249 s->min_qcoeff=-1023;
9f6071a87e17 fixed msmpeg4 infinite loop if buggy stream
michaelni
parents: 234
diff changeset
250 s->max_qcoeff= 1023;
357
ae179ec5fb47 correct quantizer bias
michaelni
parents: 354
diff changeset
251 s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
252
986e461dc072 Initial revision
glantau
parents:
diff changeset
253 /* build all the huffman tables */
986e461dc072 Initial revision
glantau
parents:
diff changeset
254 build_huffman_codes(m->huff_size_dc_luminance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
255 m->huff_code_dc_luminance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
256 bits_dc_luminance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
257 val_dc_luminance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
258 build_huffman_codes(m->huff_size_dc_chrominance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
259 m->huff_code_dc_chrominance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
260 bits_dc_chrominance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
261 val_dc_chrominance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
262 build_huffman_codes(m->huff_size_ac_luminance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
263 m->huff_code_ac_luminance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
264 bits_ac_luminance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
265 val_ac_luminance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
266 build_huffman_codes(m->huff_size_ac_chrominance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
267 m->huff_code_ac_chrominance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
268 bits_ac_chrominance,
986e461dc072 Initial revision
glantau
parents:
diff changeset
269 val_ac_chrominance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
270
986e461dc072 Initial revision
glantau
parents:
diff changeset
271 s->mjpeg_ctx = m;
986e461dc072 Initial revision
glantau
parents:
diff changeset
272 return 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
273 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
274
986e461dc072 Initial revision
glantau
parents:
diff changeset
275 void mjpeg_close(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
276 {
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 375
diff changeset
277 av_free(s->mjpeg_ctx);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
278 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
279
986e461dc072 Initial revision
glantau
parents:
diff changeset
280 static inline void put_marker(PutBitContext *p, int code)
986e461dc072 Initial revision
glantau
parents:
diff changeset
281 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
282 put_bits(p, 8, 0xff);
986e461dc072 Initial revision
glantau
parents:
diff changeset
283 put_bits(p, 8, code);
986e461dc072 Initial revision
glantau
parents:
diff changeset
284 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
285
986e461dc072 Initial revision
glantau
parents:
diff changeset
286 /* table_class: 0 = DC coef, 1 = AC coefs */
986e461dc072 Initial revision
glantau
parents:
diff changeset
287 static int put_huffman_table(MpegEncContext *s, int table_class, int table_id,
986e461dc072 Initial revision
glantau
parents:
diff changeset
288 const UINT8 *bits_table, const UINT8 *value_table)
986e461dc072 Initial revision
glantau
parents:
diff changeset
289 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
290 PutBitContext *p = &s->pb;
986e461dc072 Initial revision
glantau
parents:
diff changeset
291 int n, i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
292
986e461dc072 Initial revision
glantau
parents:
diff changeset
293 put_bits(p, 4, table_class);
986e461dc072 Initial revision
glantau
parents:
diff changeset
294 put_bits(p, 4, table_id);
986e461dc072 Initial revision
glantau
parents:
diff changeset
295
986e461dc072 Initial revision
glantau
parents:
diff changeset
296 n = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
297 for(i=1;i<=16;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
298 n += bits_table[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
299 put_bits(p, 8, bits_table[i]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
300 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
301
986e461dc072 Initial revision
glantau
parents:
diff changeset
302 for(i=0;i<n;i++)
986e461dc072 Initial revision
glantau
parents:
diff changeset
303 put_bits(p, 8, value_table[i]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
304
986e461dc072 Initial revision
glantau
parents:
diff changeset
305 return n + 17;
986e461dc072 Initial revision
glantau
parents:
diff changeset
306 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
307
986e461dc072 Initial revision
glantau
parents:
diff changeset
308 static void jpeg_table_header(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
309 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
310 PutBitContext *p = &s->pb;
37
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
311 int i, j, size;
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
312 UINT8 *ptr;
986e461dc072 Initial revision
glantau
parents:
diff changeset
313
986e461dc072 Initial revision
glantau
parents:
diff changeset
314 /* quant matrixes */
986e461dc072 Initial revision
glantau
parents:
diff changeset
315 put_marker(p, DQT);
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
316 #ifdef TWOMATRIXES
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
317 put_bits(p, 16, 2 + 2 * (1 + 64));
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
318 #else
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
319 put_bits(p, 16, 2 + 1 * (1 + 64));
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
320 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
321 put_bits(p, 4, 0); /* 8 bit precision */
986e461dc072 Initial revision
glantau
parents:
diff changeset
322 put_bits(p, 4, 0); /* table 0 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
323 for(i=0;i<64;i++) {
37
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
324 j = zigzag_direct[i];
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
325 put_bits(p, 8, s->intra_matrix[j]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
326 }
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
327 #ifdef TWOMATRIXES
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
328 put_bits(p, 4, 0); /* 8 bit precision */
986e461dc072 Initial revision
glantau
parents:
diff changeset
329 put_bits(p, 4, 1); /* table 1 */
986e461dc072 Initial revision
glantau
parents:
diff changeset
330 for(i=0;i<64;i++) {
37
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
331 j = zigzag_direct[i];
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
332 put_bits(p, 8, s->chroma_intra_matrix[j]);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
333 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
334 #endif
986e461dc072 Initial revision
glantau
parents:
diff changeset
335
986e461dc072 Initial revision
glantau
parents:
diff changeset
336 /* huffman table */
986e461dc072 Initial revision
glantau
parents:
diff changeset
337 put_marker(p, DHT);
986e461dc072 Initial revision
glantau
parents:
diff changeset
338 flush_put_bits(p);
234
5fc0c3af3fe4 alternative bitstream writer (disabled by default, uncomment #define ALT_BISTREAM_WRITER in common.h if u want to try it)
michaelni
parents: 229
diff changeset
339 ptr = pbBufPtr(p);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
340 put_bits(p, 16, 0); /* patched later */
986e461dc072 Initial revision
glantau
parents:
diff changeset
341 size = 2;
986e461dc072 Initial revision
glantau
parents:
diff changeset
342 size += put_huffman_table(s, 0, 0, bits_dc_luminance, val_dc_luminance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
343 size += put_huffman_table(s, 0, 1, bits_dc_chrominance, val_dc_chrominance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
344
986e461dc072 Initial revision
glantau
parents:
diff changeset
345 size += put_huffman_table(s, 1, 0, bits_ac_luminance, val_ac_luminance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
346 size += put_huffman_table(s, 1, 1, bits_ac_chrominance, val_ac_chrominance);
986e461dc072 Initial revision
glantau
parents:
diff changeset
347 ptr[0] = size >> 8;
986e461dc072 Initial revision
glantau
parents:
diff changeset
348 ptr[1] = size;
986e461dc072 Initial revision
glantau
parents:
diff changeset
349 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
350
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
351 static void jpeg_put_comments(MpegEncContext *s)
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
352 {
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
353 PutBitContext *p = &s->pb;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
354 int size;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
355 UINT8 *ptr;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
356
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
357 #if 0
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
358 /* JFIF header */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
359 put_marker(p, APP0);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
360 put_bits(p, 16, 16);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
361 put_string(p, "JFIF"); /* this puts the trailing zero-byte too */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
362 put_bits(p, 16, 0x101);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
363 put_bits(p, 8, 0); /* units type: 0 - aspect ratio */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
364 put_bits(p, 16, 1); /* aspect: 1:1 */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
365 put_bits(p, 16, 1);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
366 put_bits(p, 8, 0); /* thumbnail width */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
367 put_bits(p, 8, 0); /* thumbnail height */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
368 #endif
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
370 /* comment */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
371 put_marker(p, COM);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
372 flush_put_bits(p);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
373 ptr = pbBufPtr(p);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
374 put_bits(p, 16, 0); /* patched later */
527
d02d0e6db25c * clean compiler warning
kabi
parents: 507
diff changeset
375 #define MJPEG_VERSION "FFmpeg" LIBAVCODEC_VERSION "b" LIBAVCODEC_BUILD_STR
d02d0e6db25c * clean compiler warning
kabi
parents: 507
diff changeset
376 put_string(p, MJPEG_VERSION);
d02d0e6db25c * clean compiler warning
kabi
parents: 507
diff changeset
377 size = strlen(MJPEG_VERSION)+3;
d02d0e6db25c * clean compiler warning
kabi
parents: 507
diff changeset
378 #undef MJPEG_VERSION
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
379 ptr[0] = size >> 8;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
380 ptr[1] = size;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
381 }
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
382
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
383 void mjpeg_picture_header(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
384 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
385 put_marker(&s->pb, SOI);
986e461dc072 Initial revision
glantau
parents:
diff changeset
386
370
0eca28d16cbd clamp intra matrix to 8bit for mjpeg (workaround for qscale>=25)
al3x
parents: 369
diff changeset
387 if (!s->mjpeg_data_only_frames)
0eca28d16cbd clamp intra matrix to 8bit for mjpeg (workaround for qscale>=25)
al3x
parents: 369
diff changeset
388 {
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
389 jpeg_put_comments(s);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
390
229
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 226
diff changeset
391 if (s->mjpeg_write_tables) jpeg_table_header(s);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
392
986e461dc072 Initial revision
glantau
parents:
diff changeset
393 put_marker(&s->pb, SOF0);
986e461dc072 Initial revision
glantau
parents:
diff changeset
394
986e461dc072 Initial revision
glantau
parents:
diff changeset
395 put_bits(&s->pb, 16, 17);
986e461dc072 Initial revision
glantau
parents:
diff changeset
396 put_bits(&s->pb, 8, 8); /* 8 bits/component */
986e461dc072 Initial revision
glantau
parents:
diff changeset
397 put_bits(&s->pb, 16, s->height);
986e461dc072 Initial revision
glantau
parents:
diff changeset
398 put_bits(&s->pb, 16, s->width);
986e461dc072 Initial revision
glantau
parents:
diff changeset
399 put_bits(&s->pb, 8, 3); /* 3 components */
986e461dc072 Initial revision
glantau
parents:
diff changeset
400
986e461dc072 Initial revision
glantau
parents:
diff changeset
401 /* Y component */
986e461dc072 Initial revision
glantau
parents:
diff changeset
402 put_bits(&s->pb, 8, 1); /* component number */
229
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 226
diff changeset
403 put_bits(&s->pb, 4, s->mjpeg_hsample[0]); /* H factor */
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 226
diff changeset
404 put_bits(&s->pb, 4, s->mjpeg_vsample[0]); /* V factor */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
405 put_bits(&s->pb, 8, 0); /* select matrix */
986e461dc072 Initial revision
glantau
parents:
diff changeset
406
986e461dc072 Initial revision
glantau
parents:
diff changeset
407 /* Cb component */
986e461dc072 Initial revision
glantau
parents:
diff changeset
408 put_bits(&s->pb, 8, 2); /* component number */
229
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 226
diff changeset
409 put_bits(&s->pb, 4, s->mjpeg_hsample[1]); /* H factor */
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 226
diff changeset
410 put_bits(&s->pb, 4, s->mjpeg_vsample[1]); /* V factor */
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
411 #ifdef TWOMATRIXES
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
412 put_bits(&s->pb, 8, 1); /* select matrix */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
413 #else
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
414 put_bits(&s->pb, 8, 0); /* select matrix */
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
415 #endif
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
416
986e461dc072 Initial revision
glantau
parents:
diff changeset
417 /* Cr component */
986e461dc072 Initial revision
glantau
parents:
diff changeset
418 put_bits(&s->pb, 8, 3); /* component number */
229
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 226
diff changeset
419 put_bits(&s->pb, 4, s->mjpeg_hsample[2]); /* H factor */
f418b5c5ff67 PATCH by Rik Snel <rsnel@cube.dyndns.org>
arpi_esp
parents: 226
diff changeset
420 put_bits(&s->pb, 4, s->mjpeg_vsample[2]); /* V factor */
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
421 #ifdef TWOMATRIXES
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
422 put_bits(&s->pb, 8, 1); /* select matrix */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
423 #else
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
424 put_bits(&s->pb, 8, 0); /* select matrix */
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
425 #endif
370
0eca28d16cbd clamp intra matrix to 8bit for mjpeg (workaround for qscale>=25)
al3x
parents: 369
diff changeset
426 }
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
427
986e461dc072 Initial revision
glantau
parents:
diff changeset
428 /* scan header */
986e461dc072 Initial revision
glantau
parents:
diff changeset
429 put_marker(&s->pb, SOS);
986e461dc072 Initial revision
glantau
parents:
diff changeset
430 put_bits(&s->pb, 16, 12); /* length */
986e461dc072 Initial revision
glantau
parents:
diff changeset
431 put_bits(&s->pb, 8, 3); /* 3 components */
986e461dc072 Initial revision
glantau
parents:
diff changeset
432
986e461dc072 Initial revision
glantau
parents:
diff changeset
433 /* Y component */
986e461dc072 Initial revision
glantau
parents:
diff changeset
434 put_bits(&s->pb, 8, 1); /* index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
435 put_bits(&s->pb, 4, 0); /* DC huffman table index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
436 put_bits(&s->pb, 4, 0); /* AC huffman table index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
437
986e461dc072 Initial revision
glantau
parents:
diff changeset
438 /* Cb component */
986e461dc072 Initial revision
glantau
parents:
diff changeset
439 put_bits(&s->pb, 8, 2); /* index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
440 put_bits(&s->pb, 4, 1); /* DC huffman table index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
441 put_bits(&s->pb, 4, 1); /* AC huffman table index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
442
986e461dc072 Initial revision
glantau
parents:
diff changeset
443 /* Cr component */
986e461dc072 Initial revision
glantau
parents:
diff changeset
444 put_bits(&s->pb, 8, 3); /* index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
445 put_bits(&s->pb, 4, 1); /* DC huffman table index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
446 put_bits(&s->pb, 4, 1); /* AC huffman table index */
986e461dc072 Initial revision
glantau
parents:
diff changeset
447
986e461dc072 Initial revision
glantau
parents:
diff changeset
448 put_bits(&s->pb, 8, 0); /* Ss (not used) */
986e461dc072 Initial revision
glantau
parents:
diff changeset
449 put_bits(&s->pb, 8, 63); /* Se (not used) */
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
450 put_bits(&s->pb, 8, 0); /* Ah/Al (not used) */
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
451 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
452
986e461dc072 Initial revision
glantau
parents:
diff changeset
453 void mjpeg_picture_trailer(MpegEncContext *s)
986e461dc072 Initial revision
glantau
parents:
diff changeset
454 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
455 jflush_put_bits(&s->pb);
986e461dc072 Initial revision
glantau
parents:
diff changeset
456 put_marker(&s->pb, EOI);
986e461dc072 Initial revision
glantau
parents:
diff changeset
457 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
458
440
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 427
diff changeset
459 static inline void mjpeg_encode_dc(MpegEncContext *s, int val,
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 427
diff changeset
460 UINT8 *huff_size, UINT16 *huff_code)
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
461 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
462 int mant, nbits;
986e461dc072 Initial revision
glantau
parents:
diff changeset
463
986e461dc072 Initial revision
glantau
parents:
diff changeset
464 if (val == 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
465 jput_bits(&s->pb, huff_size[0], huff_code[0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
466 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
467 mant = val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
468 if (val < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
469 val = -val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
470 mant--;
986e461dc072 Initial revision
glantau
parents:
diff changeset
471 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
472
986e461dc072 Initial revision
glantau
parents:
diff changeset
473 /* compute the log (XXX: optimize) */
986e461dc072 Initial revision
glantau
parents:
diff changeset
474 nbits = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
475 while (val != 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
476 val = val >> 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
477 nbits++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
478 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
479
986e461dc072 Initial revision
glantau
parents:
diff changeset
480 jput_bits(&s->pb, huff_size[nbits], huff_code[nbits]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
481
986e461dc072 Initial revision
glantau
parents:
diff changeset
482 jput_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
986e461dc072 Initial revision
glantau
parents:
diff changeset
483 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
484 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
485
986e461dc072 Initial revision
glantau
parents:
diff changeset
486 static void encode_block(MpegEncContext *s, DCTELEM *block, int n)
986e461dc072 Initial revision
glantau
parents:
diff changeset
487 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
488 int mant, nbits, code, i, j;
986e461dc072 Initial revision
glantau
parents:
diff changeset
489 int component, dc, run, last_index, val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
490 MJpegContext *m = s->mjpeg_ctx;
986e461dc072 Initial revision
glantau
parents:
diff changeset
491 UINT8 *huff_size_ac;
986e461dc072 Initial revision
glantau
parents:
diff changeset
492 UINT16 *huff_code_ac;
986e461dc072 Initial revision
glantau
parents:
diff changeset
493
986e461dc072 Initial revision
glantau
parents:
diff changeset
494 /* DC coef */
986e461dc072 Initial revision
glantau
parents:
diff changeset
495 component = (n <= 3 ? 0 : n - 4 + 1);
986e461dc072 Initial revision
glantau
parents:
diff changeset
496 dc = block[0]; /* overflow is impossible */
986e461dc072 Initial revision
glantau
parents:
diff changeset
497 val = dc - s->last_dc[component];
986e461dc072 Initial revision
glantau
parents:
diff changeset
498 if (n < 4) {
440
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 427
diff changeset
499 mjpeg_encode_dc(s, val, m->huff_size_dc_luminance, m->huff_code_dc_luminance);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
500 huff_size_ac = m->huff_size_ac_luminance;
986e461dc072 Initial revision
glantau
parents:
diff changeset
501 huff_code_ac = m->huff_code_ac_luminance;
986e461dc072 Initial revision
glantau
parents:
diff changeset
502 } else {
440
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 427
diff changeset
503 mjpeg_encode_dc(s, val, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance);
0
986e461dc072 Initial revision
glantau
parents:
diff changeset
504 huff_size_ac = m->huff_size_ac_chrominance;
986e461dc072 Initial revision
glantau
parents:
diff changeset
505 huff_code_ac = m->huff_code_ac_chrominance;
986e461dc072 Initial revision
glantau
parents:
diff changeset
506 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
507 s->last_dc[component] = dc;
986e461dc072 Initial revision
glantau
parents:
diff changeset
508
986e461dc072 Initial revision
glantau
parents:
diff changeset
509 /* AC coefs */
986e461dc072 Initial revision
glantau
parents:
diff changeset
510
986e461dc072 Initial revision
glantau
parents:
diff changeset
511 run = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
512 last_index = s->block_last_index[n];
986e461dc072 Initial revision
glantau
parents:
diff changeset
513 for(i=1;i<=last_index;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
514 j = zigzag_direct[i];
986e461dc072 Initial revision
glantau
parents:
diff changeset
515 val = block[j];
986e461dc072 Initial revision
glantau
parents:
diff changeset
516 if (val == 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
517 run++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
518 } else {
986e461dc072 Initial revision
glantau
parents:
diff changeset
519 while (run >= 16) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
520 jput_bits(&s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
521 run -= 16;
986e461dc072 Initial revision
glantau
parents:
diff changeset
522 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
523 mant = val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
524 if (val < 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
525 val = -val;
986e461dc072 Initial revision
glantau
parents:
diff changeset
526 mant--;
986e461dc072 Initial revision
glantau
parents:
diff changeset
527 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
528
986e461dc072 Initial revision
glantau
parents:
diff changeset
529 /* compute the log (XXX: optimize) */
986e461dc072 Initial revision
glantau
parents:
diff changeset
530 nbits = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
531 while (val != 0) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
532 val = val >> 1;
986e461dc072 Initial revision
glantau
parents:
diff changeset
533 nbits++;
986e461dc072 Initial revision
glantau
parents:
diff changeset
534 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
535 code = (run << 4) | nbits;
986e461dc072 Initial revision
glantau
parents:
diff changeset
536
986e461dc072 Initial revision
glantau
parents:
diff changeset
537 jput_bits(&s->pb, huff_size_ac[code], huff_code_ac[code]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
538
986e461dc072 Initial revision
glantau
parents:
diff changeset
539 jput_bits(&s->pb, nbits, mant & ((1 << nbits) - 1));
986e461dc072 Initial revision
glantau
parents:
diff changeset
540 run = 0;
986e461dc072 Initial revision
glantau
parents:
diff changeset
541 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
542 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
543
986e461dc072 Initial revision
glantau
parents:
diff changeset
544 /* output EOB only if not already 64 values */
986e461dc072 Initial revision
glantau
parents:
diff changeset
545 if (last_index < 63 || run != 0)
986e461dc072 Initial revision
glantau
parents:
diff changeset
546 jput_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]);
986e461dc072 Initial revision
glantau
parents:
diff changeset
547 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
548
986e461dc072 Initial revision
glantau
parents:
diff changeset
549 void mjpeg_encode_mb(MpegEncContext *s,
986e461dc072 Initial revision
glantau
parents:
diff changeset
550 DCTELEM block[6][64])
986e461dc072 Initial revision
glantau
parents:
diff changeset
551 {
986e461dc072 Initial revision
glantau
parents:
diff changeset
552 int i;
986e461dc072 Initial revision
glantau
parents:
diff changeset
553 for(i=0;i<6;i++) {
986e461dc072 Initial revision
glantau
parents:
diff changeset
554 encode_block(s, block[i], i);
986e461dc072 Initial revision
glantau
parents:
diff changeset
555 }
986e461dc072 Initial revision
glantau
parents:
diff changeset
556 }
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
557
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
558 /******************************************/
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
559 /* decoding */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
560
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
561 /* compressed picture size */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
562 #define PICTURE_BUFFER_SIZE 100000
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
563
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
564 #define MAX_COMPONENTS 4
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
565
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
566 typedef struct MJpegDecodeContext {
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
567 AVCodecContext *avctx;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
568 GetBitContext gb;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
569 UINT32 header_state;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
570 int start_code; /* current start code */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
571 UINT8 *buf_ptr;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
572 int buffer_size;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
573 int mpeg_enc_ctx_allocated; /* true if decoding context allocated */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
574 INT16 quant_matrixes[4][64];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
575 VLC vlcs[2][4];
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
576
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
577 int org_width, org_height; /* size given at codec init */
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
578 int first_picture; /* true if decoding first picture */
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
579 int interlaced; /* true if interlaced */
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
580 int bottom_field; /* true if bottom field */
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
581
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
582 int width, height;
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
583 int nb_components;
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
584 int component_id[MAX_COMPONENTS];
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
585 int h_count[MAX_COMPONENTS]; /* horizontal and vertical count for each component */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
586 int v_count[MAX_COMPONENTS];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
587 int h_max, v_max; /* maximum h and v counts */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
588 int quant_index[4]; /* quant table index for each component */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
589 int last_dc[MAX_COMPONENTS]; /* last DEQUANTIZED dc (XXX: am I right to do that ?) */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
590 UINT8 *current_picture[MAX_COMPONENTS]; /* picture structure */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
591 int linesize[MAX_COMPONENTS];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
592 DCTELEM block[64] __align8;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
593 UINT8 buffer[PICTURE_BUFFER_SIZE];
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
594
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
595 int buggy_avid;
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
596 int restart_interval;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
597 int restart_count;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
598 int interleaved_rows;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
599 } MJpegDecodeContext;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
600
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
601 #define SKIP_REMAINING(gb, len) { \
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
602 dprintf("reamining %d bytes in marker\n", len); \
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
603 if (len) while (--len) \
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
604 skip_bits(gb, 8); \
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
605 }
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
606
375
749b5c16c0f7 - Warning fix.
pulento
parents: 370
diff changeset
607 static int mjpeg_decode_dht(MJpegDecodeContext *s, UINT8 *buf, int buf_size);
749b5c16c0f7 - Warning fix.
pulento
parents: 370
diff changeset
608
29
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
609 static void build_vlc(VLC *vlc, const UINT8 *bits_table, const UINT8 *val_table,
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
610 int nb_codes)
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
611 {
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
612 UINT8 huff_size[256];
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
613 UINT16 huff_code[256];
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
614
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
615 memset(huff_size, 0, sizeof(huff_size));
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
616 build_huffman_codes(huff_size, huff_code, bits_table, val_table);
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
617
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
618 init_vlc(vlc, 9, nb_codes, huff_size, 1, 1, huff_code, 2, 2);
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
619 }
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
620
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
621 static int mjpeg_decode_init(AVCodecContext *avctx)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
622 {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
623 MJpegDecodeContext *s = avctx->priv_data;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
624
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
625 s->avctx = avctx;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
626
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
627 s->header_state = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
628 s->mpeg_enc_ctx_allocated = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
629 s->buffer_size = PICTURE_BUFFER_SIZE - 1; /* minus 1 to take into
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
630 account FF 00 case */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
631 s->start_code = -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
632 s->buf_ptr = s->buffer;
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
633 s->first_picture = 1;
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
634 s->org_width = avctx->width;
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
635 s->org_height = avctx->height;
29
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
636
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
637 build_vlc(&s->vlcs[0][0], bits_dc_luminance, val_dc_luminance, 12);
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
638 build_vlc(&s->vlcs[0][1], bits_dc_chrominance, val_dc_chrominance, 12);
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
639 build_vlc(&s->vlcs[1][0], bits_ac_luminance, val_ac_luminance, 251);
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
640 build_vlc(&s->vlcs[1][1], bits_ac_chrominance, val_ac_chrominance, 251);
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
641
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
642 if (avctx->flags & CODEC_FLAG_EXTERN_HUFF)
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
643 {
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
644 printf("mjpeg: using external huffman table\n");
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
645 mjpeg_decode_dht(s, avctx->extradata, avctx->extradata_size);
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
646 /* should check for error - but dunno */
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
647 }
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
648 return 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
649 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
650
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
651 /* quantize tables */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
652 static int mjpeg_decode_dqt(MJpegDecodeContext *s,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
653 UINT8 *buf, int buf_size)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
654 {
37
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
655 int len, index, i, j;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
656 init_get_bits(&s->gb, buf, buf_size);
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
657
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
658 len = get_bits(&s->gb, 16) - 2;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
659
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
660 while (len >= 65) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
661 /* only 8 bit precision handled */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
662 if (get_bits(&s->gb, 4) != 0)
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
663 {
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
664 dprintf("dqt: 16bit precision\n");
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
665 return -1;
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
666 }
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
667 index = get_bits(&s->gb, 4);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
668 if (index >= 4)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
669 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
670 dprintf("index=%d\n", index);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
671 /* read quant table */
37
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
672 for(i=0;i<64;i++) {
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
673 j = zigzag_direct[i];
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
674 s->quant_matrixes[index][j] = get_bits(&s->gb, 8);
37
eb898f29e49f fixed mjpeg matrix quant encoding and decoding
glantau
parents: 29
diff changeset
675 }
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
676 len -= 65;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
677 }
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
678
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
679 SKIP_REMAINING(&s->gb, len);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
680
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
681 return 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
682 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
683
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
684 /* decode huffman tables and build VLC decoders */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
685 static int mjpeg_decode_dht(MJpegDecodeContext *s,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
686 UINT8 *buf, int buf_size)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
687 {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
688 int len, index, i, class, n, v, code_max;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
689 UINT8 bits_table[17];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
690 UINT8 val_table[256];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
691
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
692 init_get_bits(&s->gb, buf, buf_size);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
693
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
694 len = get_bits(&s->gb, 16);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
695 len -= 2;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
696
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
697 while (len > 0) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
698 if (len < 17)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
699 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
700 class = get_bits(&s->gb, 4);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
701 if (class >= 2)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
702 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
703 index = get_bits(&s->gb, 4);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
704 if (index >= 4)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
705 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
706 n = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
707 for(i=1;i<=16;i++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
708 bits_table[i] = get_bits(&s->gb, 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
709 n += bits_table[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
710 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
711 len -= 17;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
712 if (len < n || n > 256)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
713 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
714
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
715 code_max = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
716 for(i=0;i<n;i++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
717 v = get_bits(&s->gb, 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
718 if (v > code_max)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
719 code_max = v;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
720 val_table[i] = v;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
721 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
722 len -= n;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
723
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
724 /* build VLC and flush previous vlc if present */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
725 free_vlc(&s->vlcs[class][index]);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
726 dprintf("class=%d index=%d nb_codes=%d\n",
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
727 class, index, code_max + 1);
29
e04aea3bbf51 use default huffman tables if none given
glantau
parents: 28
diff changeset
728 build_vlc(&s->vlcs[class][index], bits_table, val_table, code_max + 1);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
729 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
730 return 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
731 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
732
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
733 static int mjpeg_decode_sof0(MJpegDecodeContext *s,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
734 UINT8 *buf, int buf_size)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
735 {
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
736 int len, nb_components, i, width, height;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
737
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
738 init_get_bits(&s->gb, buf, buf_size);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
739
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
740 /* XXX: verify len field validity */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
741 len = get_bits(&s->gb, 16);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
742 /* only 8 bits/component accepted */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
743 if (get_bits(&s->gb, 8) != 8)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
744 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
745 height = get_bits(&s->gb, 16);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
746 width = get_bits(&s->gb, 16);
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
747 dprintf("sof0: picture: %dx%d\n", width, height);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
748
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
749 nb_components = get_bits(&s->gb, 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
750 if (nb_components <= 0 ||
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
751 nb_components > MAX_COMPONENTS)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
752 return -1;
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
753 s->nb_components = nb_components;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
754 s->h_max = 1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
755 s->v_max = 1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
756 for(i=0;i<nb_components;i++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
757 /* component id */
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
758 s->component_id[i] = get_bits(&s->gb, 8) - 1;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
759 s->h_count[i] = get_bits(&s->gb, 4);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
760 s->v_count[i] = get_bits(&s->gb, 4);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
761 /* compute hmax and vmax (only used in interleaved case) */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
762 if (s->h_count[i] > s->h_max)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
763 s->h_max = s->h_count[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
764 if (s->v_count[i] > s->v_max)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
765 s->v_max = s->v_count[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
766 s->quant_index[i] = get_bits(&s->gb, 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
767 if (s->quant_index[i] >= 4)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
768 return -1;
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
769 dprintf("component %d %d:%d id: %d quant:%d\n", i, s->h_count[i],
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
770 s->v_count[i], s->component_id[i], s->quant_index[i]);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
771 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
772
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
773 /* if different size, realloc/alloc picture */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
774 /* XXX: also check h_count and v_count */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
775 if (width != s->width || height != s->height) {
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 375
diff changeset
776 for(i=0;i<MAX_COMPONENTS;i++)
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 375
diff changeset
777 av_freep(&s->current_picture[i]);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
778 s->width = width;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
779 s->height = height;
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
780 /* test interlaced mode */
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
781 if (s->first_picture &&
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
782 s->org_height != 0 &&
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
783 s->height < ((s->org_height * 3) / 4)) {
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
784 s->interlaced = 1;
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
785 s->bottom_field = 0;
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
786 }
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
787
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
788 for(i=0;i<nb_components;i++) {
226
5784987c3940 width or height %16 != 0 bugfix
michaelni
parents: 76
diff changeset
789 int w, h;
5784987c3940 width or height %16 != 0 bugfix
michaelni
parents: 76
diff changeset
790 w = (s->width + 8 * s->h_max - 1) / (8 * s->h_max);
5784987c3940 width or height %16 != 0 bugfix
michaelni
parents: 76
diff changeset
791 h = (s->height + 8 * s->v_max - 1) / (8 * s->v_max);
5784987c3940 width or height %16 != 0 bugfix
michaelni
parents: 76
diff changeset
792 w = w * 8 * s->h_count[i];
5784987c3940 width or height %16 != 0 bugfix
michaelni
parents: 76
diff changeset
793 h = h * 8 * s->v_count[i];
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
794 if (s->interlaced)
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
795 w *= 2;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
796 s->linesize[i] = w;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
797 /* memory test is done in mjpeg_decode_sos() */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
798 s->current_picture[i] = av_mallocz(w * h);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
799 }
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
800 s->first_picture = 0;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
801 }
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
802
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
803 if (len != (8+(3*nb_components)))
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
804 {
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
805 dprintf("decode_sof0: error, len(%d) mismatch\n", len);
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
806 }
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
807
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
808 return 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
809 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
810
440
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 427
diff changeset
811 static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index)
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
812 {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
813 int code, diff;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
814
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
815 code = get_vlc(&s->gb, &s->vlcs[0][dc_index]);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
816 if (code < 0)
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
817 {
440
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 427
diff changeset
818 dprintf("mjpeg_decode_dc: bad vlc: %d:%d (%p)\n", 0, dc_index,
427
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
819 &s->vlcs[0][dc_index]);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
820 return 0xffff;
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
821 }
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
822 if (code == 0) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
823 diff = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
824 } else {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
825 diff = get_bits(&s->gb, code);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
826 if ((diff & (1 << (code - 1))) == 0)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
827 diff = (-1 << code) | (diff + 1);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
828 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
829 return diff;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
830 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
831
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
832 /* decode block and dequantize */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
833 static int decode_block(MJpegDecodeContext *s, DCTELEM *block,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
834 int component, int dc_index, int ac_index, int quant_index)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
835 {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
836 int nbits, code, i, j, level;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
837 int run, val;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
838 VLC *ac_vlc;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
839 INT16 *quant_matrix;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
840
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
841 /* DC coef */
440
000aeeac27a2 * started to cleanup name clashes for onetime compilation
kabi
parents: 427
diff changeset
842 val = mjpeg_decode_dc(s, dc_index);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
843 if (val == 0xffff) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
844 dprintf("error dc\n");
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
845 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
846 }
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
847 quant_matrix = s->quant_matrixes[quant_index];
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
848 val = val * quant_matrix[0] + s->last_dc[component];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
849 s->last_dc[component] = val;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
850 block[0] = val;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
851 /* AC coefs */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
852 ac_vlc = &s->vlcs[1][ac_index];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
853 i = 1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
854 for(;;) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
855 code = get_vlc(&s->gb, ac_vlc);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
856 if (code < 0) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
857 dprintf("error ac\n");
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
858 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
859 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
860 /* EOB */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
861 if (code == 0)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
862 break;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
863 if (code == 0xf0) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
864 i += 16;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
865 } else {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
866 run = code >> 4;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
867 nbits = code & 0xf;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
868 level = get_bits(&s->gb, nbits);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
869 if ((level & (1 << (nbits - 1))) == 0)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
870 level = (-1 << nbits) | (level + 1);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
871 i += run;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
872 if (i >= 64) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
873 dprintf("error count: %d\n", i);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
874 return -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
875 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
876 j = zigzag_direct[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
877 block[j] = level * quant_matrix[j];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
878 i++;
28
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
879 if (i >= 64)
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
880 break;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
881 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
882 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
883 return 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
884 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
885
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
886 static int mjpeg_decode_sos(MJpegDecodeContext *s,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
887 UINT8 *buf, int buf_size)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
888 {
47
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
889 int len, nb_components, i, j, n, h, v, ret;
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
890 int mb_width, mb_height, mb_x, mb_y, vmax, hmax, index, id;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
891 int comp_index[4];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
892 int dc_index[4];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
893 int ac_index[4];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
894 int nb_blocks[4];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
895 int h_count[4];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
896 int v_count[4];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
897
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
898 init_get_bits(&s->gb, buf, buf_size);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
899 /* XXX: verify len field validity */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
900 len = get_bits(&s->gb, 16);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
901 nb_components = get_bits(&s->gb, 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
902 /* XXX: only interleaved scan accepted */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
903 if (nb_components != 3)
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
904 {
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
905 dprintf("decode_sos: components(%d) mismatch\n", nb_components);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
906 return -1;
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
907 }
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
908 vmax = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
909 hmax = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
910 for(i=0;i<nb_components;i++) {
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
911 id = get_bits(&s->gb, 8) - 1;
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
912 dprintf("component: %d\n", id);
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
913 /* find component index */
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
914 for(index=0;index<s->nb_components;index++)
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
915 if (id == s->component_id[index])
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
916 break;
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
917 if (index == s->nb_components)
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
918 {
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
919 dprintf("decode_sos: index(%d) out of components\n", index);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
920 return -1;
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
921 }
26
ce751dfbcace added correct component id handling
glantau
parents: 23
diff changeset
922
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
923 comp_index[i] = index;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
924 nb_blocks[i] = s->h_count[index] * s->v_count[index];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
925 h_count[i] = s->h_count[index];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
926 v_count[i] = s->v_count[index];
28
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
927
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
928 dc_index[i] = get_bits(&s->gb, 4);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
929 ac_index[i] = get_bits(&s->gb, 4);
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
930
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
931 if (dc_index[i] < 0 || ac_index[i] < 0 ||
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
932 dc_index[i] >= 4 || ac_index[i] >= 4)
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
933 goto out_of_range;
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
934 switch(s->start_code)
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
935 {
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
936 case SOF0:
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
937 if (dc_index[i] > 1 || ac_index[i] > 1)
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
938 goto out_of_range;
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
939 break;
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
940 case SOF1:
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
941 case SOF2:
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
942 if (dc_index[i] > 3 || ac_index[i] > 3)
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
943 goto out_of_range;
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
944 break;
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
945 case SOF3:
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
946 if (dc_index[i] > 3 || ac_index[i] != 0)
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
947 goto out_of_range;
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
948 break;
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
949 }
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
950 }
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
951 skip_bits(&s->gb, 8); /* Ss */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
952 skip_bits(&s->gb, 8); /* Se */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
953 skip_bits(&s->gb, 8); /* Ah and Al (each are 4 bits) */
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
954
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
955 for(i=0;i<nb_components;i++)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
956 s->last_dc[i] = 1024;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
957
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
958 if (nb_components > 1) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
959 /* interleaved stream */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
960 mb_width = (s->width + s->h_max * 8 - 1) / (s->h_max * 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
961 mb_height = (s->height + s->v_max * 8 - 1) / (s->v_max * 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
962 } else {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
963 h = s->h_max / s->h_count[comp_index[0]];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
964 v = s->v_max / s->v_count[comp_index[0]];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
965 mb_width = (s->width + h * 8 - 1) / (h * 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
966 mb_height = (s->height + v * 8 - 1) / (v * 8);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
967 nb_blocks[0] = 1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
968 h_count[0] = 1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
969 v_count[0] = 1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
970 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
971
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
972 for(mb_y = 0; mb_y < mb_height; mb_y++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
973 for(mb_x = 0; mb_x < mb_width; mb_x++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
974 for(i=0;i<nb_components;i++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
975 UINT8 *ptr;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
976 int x, y, c;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
977 n = nb_blocks[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
978 c = comp_index[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
979 h = h_count[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
980 v = v_count[i];
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
981 x = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
982 y = 0;
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
983 if (s->restart_interval && !s->restart_count)
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
984 s->restart_count = s->restart_interval;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
985 for(j=0;j<n;j++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
986 memset(s->block, 0, sizeof(s->block));
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
987 if (decode_block(s, s->block, i,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
988 dc_index[i], ac_index[i],
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
989 s->quant_index[c]) < 0) {
427
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
990 dprintf("error y=%d x=%d\n", mb_y, mb_x);
47
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
991 ret = -1;
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
992 goto the_end;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
993 }
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
994 // dprintf("mb: %d %d processed\n", mb_y, mb_x);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
995 ptr = s->current_picture[c] +
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
996 (s->linesize[c] * (v * mb_y + y) * 8) +
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
997 (h * mb_x + x) * 8;
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
998 if (s->interlaced && s->bottom_field)
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
999 ptr += s->linesize[c] >> 1;
477
bc7ceb6461eb use ff_idct_put()
bellard
parents: 440
diff changeset
1000 ff_idct_put(ptr, s->linesize[c], s->block);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1001 if (++x == h) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1002 x = 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1003 y++;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1004 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1005 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1006 }
584
03e395b31197 handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents: 541
diff changeset
1007 if (s->restart_interval && !--s->restart_count) {
03e395b31197 handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents: 541
diff changeset
1008 align_get_bits(&s->gb);
03e395b31197 handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents: 541
diff changeset
1009 skip_bits(&s->gb, 16); /* skip RSTn */
03e395b31197 handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents: 541
diff changeset
1010 for (j=0; j<nb_components; j++) /* reset dc */
03e395b31197 handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents: 541
diff changeset
1011 s->last_dc[j] = 1024;
03e395b31197 handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents: 541
diff changeset
1012 }
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1013 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1014 }
47
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
1015 ret = 0;
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
1016 the_end:
44
92d51f683931 added forgotten emms() - fix various segmentation faults when using mjpeg
glantau
parents: 37
diff changeset
1017 emms_c();
47
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
1018 return ret;
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
1019 out_of_range:
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
1020 dprintf("decode_sos: ac/dc index out of range\n");
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
1021 return -1;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1022 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1023
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1024 static int mjpeg_decode_dri(MJpegDecodeContext *s,
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1025 UINT8 *buf, int buf_size)
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1026 {
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1027 init_get_bits(&s->gb, buf, buf_size);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1028
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1029 if (get_bits(&s->gb, 16) != 4)
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1030 return -1;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1031 s->restart_interval = get_bits(&s->gb, 16);
507
b5b91e89b88c * turned into debug message - it's annoying when watching mjpeg files
kabi
parents: 477
diff changeset
1032 dprintf("restart interval: %d\n", s->restart_interval);
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1033
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1034 return 0;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1035 }
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1036
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1037 #define FOURCC(a,b,c,d) ((a << 24) | (b << 16) | (c << 8) | d)
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1038 static int mjpeg_decode_app(MJpegDecodeContext *s,
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1039 UINT8 *buf, int buf_size, int start_code)
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1040 {
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1041 int len, id;
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1042
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1043 init_get_bits(&s->gb, buf, buf_size);
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1044
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1045 /* XXX: verify len field validity */
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1046 len = get_bits(&s->gb, 16);
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1047 if (len < 5)
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1048 return -1;
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1049
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1050 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1051 len -= 6;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1052
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1053 /* buggy AVID, it puts EOI only at every 10th frame */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1054 /* also this fourcc is used by non-avid files too, it means
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1055 interleaving, but it's always present in AVID files */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1056 if (id == FOURCC('A','V','I','1'))
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1057 {
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1058 /* structure:
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1059 4bytes AVI1
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1060 1bytes polarity
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1061 1bytes always zero
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1062 4bytes field_size
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1063 4bytes field_size_less_padding
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1064 */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1065 s->buggy_avid = 1;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1066 if (s->first_picture)
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1067 printf("mjpeg: workarounding buggy AVID\n");
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1068 s->interleaved_rows = get_bits(&s->gb, 8);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1069 #if 0
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1070 skip_bits(&s->gb, 8);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1071 skip_bits(&s->gb, 32);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1072 skip_bits(&s->gb, 32);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1073 len -= 10;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1074 #endif
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1075 if (s->interleaved_rows)
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1076 printf("mjpeg: interleaved rows: %d\n", s->interleaved_rows);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1077 goto out;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1078 }
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1079
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1080 len -= 2;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1081
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1082 if (id == FOURCC('J','F','I','F'))
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1083 {
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1084 skip_bits(&s->gb, 8); /* the trailing zero-byte */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1085 printf("mjpeg: JFIF header found (version: %x.%x)\n",
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1086 get_bits(&s->gb, 8), get_bits(&s->gb, 8));
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1087 goto out;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1088 }
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1089
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1090 /* Apple MJPEG-A */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1091 if ((start_code == APP1) && (len > (0x28 - 8)))
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1092 {
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1093 id = (get_bits(&s->gb, 16) << 16) | get_bits(&s->gb, 16);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1094 len -= 4;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1095 if (id == FOURCC('m','j','p','g')) /* Apple MJPEG-A */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1096 {
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1097 #if 0
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1098 skip_bits(&s->gb, 32); /* field size */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1099 skip_bits(&s->gb, 32); /* pad field size */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1100 skip_bits(&s->gb, 32); /* next off */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1101 skip_bits(&s->gb, 32); /* quant off */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1102 skip_bits(&s->gb, 32); /* huff off */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1103 skip_bits(&s->gb, 32); /* image off */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1104 skip_bits(&s->gb, 32); /* scan off */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1105 skip_bits(&s->gb, 32); /* data off */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1106 #endif
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1107 if (s->first_picture)
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1108 printf("mjpeg: Apple MJPEG-A header found\n");
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1109 }
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1110 }
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1111
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1112 out:
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1113 /* should check for further values.. */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1114 SKIP_REMAINING(&s->gb, len);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1115
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1116 return 0;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1117 }
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1118 #undef FOURCC
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1119
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1120 static int mjpeg_decode_com(MJpegDecodeContext *s,
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1121 UINT8 *buf, int buf_size)
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1122 {
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1123 int len, i;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1124 UINT8 *cbuf;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1125
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1126 init_get_bits(&s->gb, buf, buf_size);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1127
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1128 /* XXX: verify len field validity */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1129 len = get_bits(&s->gb, 16)-2;
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 375
diff changeset
1130 cbuf = av_malloc(len+1);
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1131
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1132 for (i = 0; i < len; i++)
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1133 cbuf[i] = get_bits(&s->gb, 8);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1134 if (cbuf[i-1] == '\n')
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1135 cbuf[i-1] = 0;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1136 else
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1137 cbuf[i] = 0;
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1138
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1139 printf("mjpeg comment: '%s'\n", cbuf);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1140
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1141 /* buggy avid, it puts EOI only at every 10th frame */
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1142 if (!strcmp(cbuf, "AVID"))
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1143 {
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1144 s->buggy_avid = 1;
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1145 if (s->first_picture)
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1146 printf("mjpeg: workarounding buggy AVID\n");
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1147 }
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1148
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 375
diff changeset
1149 av_free(cbuf);
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1150
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1151 return 0;
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1152 }
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1153
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1154 /* return the 8 bit start code value and update the search
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1155 state. Return -1 if no start code found */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1156 static int find_marker(UINT8 **pbuf_ptr, UINT8 *buf_end,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1157 UINT32 *header_state)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1158 {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1159 UINT8 *buf_ptr;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1160 unsigned int state, v;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1161 int val;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1162
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1163 state = *header_state;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1164 buf_ptr = *pbuf_ptr;
584
03e395b31197 handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents: 541
diff changeset
1165 retry:
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1166 if (state) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1167 /* get marker */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1168 found:
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1169 if (buf_ptr < buf_end) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1170 val = *buf_ptr++;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1171 state = 0;
584
03e395b31197 handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents: 541
diff changeset
1172 if ((val >= RST0) && (val <= RST7))
03e395b31197 handle DRI/RST markers patch by Leon van Stuivenberg <leonvs at iae dot nl>
michaelni
parents: 541
diff changeset
1173 goto retry;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1174 } else {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1175 val = -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1176 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1177 } else {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1178 while (buf_ptr < buf_end) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1179 v = *buf_ptr++;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1180 if (v == 0xff) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1181 state = 1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1182 goto found;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1183 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1184 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1185 val = -1;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1186 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1187 *pbuf_ptr = buf_ptr;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1188 *header_state = state;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1189 return val;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1190 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1191
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1192 static int mjpeg_decode_frame(AVCodecContext *avctx,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1193 void *data, int *data_size,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1194 UINT8 *buf, int buf_size)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1195 {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1196 MJpegDecodeContext *s = avctx->priv_data;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1197 UINT8 *buf_end, *buf_ptr, *buf_start;
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
1198 int len, code, input_size, i;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1199 AVPicture *picture = data;
349
34f6c77ff01a Support for external huffman table and various fixes by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 344
diff changeset
1200 unsigned int start_code;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1201
68
99cc25b48e24 fix got_picture output
glantau
parents: 64
diff changeset
1202 *data_size = 0;
99cc25b48e24 fix got_picture output
glantau
parents: 64
diff changeset
1203
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1204 /* no supplementary picture */
68
99cc25b48e24 fix got_picture output
glantau
parents: 64
diff changeset
1205 if (buf_size == 0)
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1206 return 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1207
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1208 buf_ptr = buf;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1209 buf_end = buf + buf_size;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1210 while (buf_ptr < buf_end) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1211 buf_start = buf_ptr;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1212 /* find start next marker */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1213 code = find_marker(&buf_ptr, buf_end, &s->header_state);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1214 /* copy to buffer */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1215 len = buf_ptr - buf_start;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1216 if (len + (s->buf_ptr - s->buffer) > s->buffer_size) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1217 /* data too big : flush */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1218 s->buf_ptr = s->buffer;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1219 if (code > 0)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1220 s->start_code = code;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1221 } else {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1222 memcpy(s->buf_ptr, buf_start, len);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1223 s->buf_ptr += len;
427
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
1224 if (code < 0) {
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
1225 /* nothing to do: wait next marker */
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
1226 } else if (code == 0 || code == 0xff) {
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
1227 /* if we got FF 00, we copy FF to the stream to unescape FF 00 */
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
1228 /* valid marker code is between 00 and ff - alex */
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1229 s->buf_ptr--;
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1230 } else {
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1231 /* prepare data for next start code */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1232 input_size = s->buf_ptr - s->buffer;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1233 start_code = s->start_code;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1234 s->buf_ptr = s->buffer;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1235 s->start_code = code;
44
92d51f683931 added forgotten emms() - fix various segmentation faults when using mjpeg
glantau
parents: 37
diff changeset
1236 dprintf("marker=%x\n", start_code);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1237 switch(start_code) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1238 case SOI:
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1239 s->restart_interval = 0;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1240 /* nothing to do on SOI */
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1241 break;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1242 case DQT:
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1243 mjpeg_decode_dqt(s, s->buffer, input_size);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1244 break;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1245 case DHT:
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1246 mjpeg_decode_dht(s, s->buffer, input_size);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1247 break;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1248 case SOF0:
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1249 mjpeg_decode_sof0(s, s->buffer, input_size);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1250 break;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1251 case SOS:
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1252 mjpeg_decode_sos(s, s->buffer, input_size);
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1253 if (s->start_code == EOI || s->buggy_avid || s->restart_interval) {
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
1254 int l;
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
1255 if (s->interlaced) {
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
1256 s->bottom_field ^= 1;
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
1257 /* if not bottom field, do not output image yet */
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
1258 if (s->bottom_field)
540
4cee7ce37e10 don't exit decoder after decoding first field -> fixes angels.avi interlacing
arpi_esp
parents: 527
diff changeset
1259 goto not_the_end;
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
1260 }
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1261 for(i=0;i<3;i++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1262 picture->data[i] = s->current_picture[i];
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
1263 l = s->linesize[i];
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
1264 if (s->interlaced)
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
1265 l >>= 1;
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
1266 picture->linesize[i] = l;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1267 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1268 *data_size = sizeof(AVPicture);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1269 avctx->height = s->height;
53
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
1270 if (s->interlaced)
adf7cea364ca added interlaced MJPEG support
glantau
parents: 47
diff changeset
1271 avctx->height *= 2;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1272 avctx->width = s->width;
28
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
1273 /* XXX: not complete test ! */
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
1274 switch((s->h_count[0] << 4) | s->v_count[0]) {
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
1275 case 0x11:
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
1276 avctx->pix_fmt = PIX_FMT_YUV444P;
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
1277 break;
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
1278 case 0x21:
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
1279 avctx->pix_fmt = PIX_FMT_YUV422P;
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
1280 break;
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
1281 default:
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
1282 case 0x22:
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
1283 avctx->pix_fmt = PIX_FMT_YUV420P;
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
1284 break;
b611fafddf9e added 422P and 444P support - fixed block parsing error
glantau
parents: 26
diff changeset
1285 }
47
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
1286 /* dummy quality */
bd0dd8d0b759 return dummy quality to avoid bug in -sameq case - forgot emms in error case
glantau
parents: 44
diff changeset
1287 /* XXX: infer it with matrix */
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1288 avctx->quality = 3;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1289 goto the_end;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1290 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1291 break;
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1292 case DRI:
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1293 mjpeg_decode_dri(s, s->buffer, input_size);
354
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1294 break;
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1295 case SOF1:
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1296 case SOF2:
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1297 case SOF3:
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1298 case SOF5:
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1299 case SOF6:
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1300 case SOF7:
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1301 case SOF9:
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1302 case SOF10:
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1303 case SOF11:
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1304 case SOF13:
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1305 case SOF14:
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1306 case SOF15:
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1307 case JPG:
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1308 printf("mjpeg: unsupported coding type (%x)\n", start_code);
167aa21aa250 patch by Alex Beregszaszi <alex@naxine.org>
arpi_esp
parents: 349
diff changeset
1309 return -1;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1310 }
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1311 #if 1
427
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
1312 if (start_code >= 0xd0 && start_code <= 0xd7) {
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1313 dprintf("restart marker: %d\n", start_code&0x0f);
427
c058624083e1 fixed incorrect buffer handling
glantau
parents: 396
diff changeset
1314 } else if (s->first_picture) {
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1315 /* APP fields */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1316 if (start_code >= 0xe0 && start_code <= 0xef)
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1317 mjpeg_decode_app(s, s->buffer, input_size, start_code);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1318 /* Comment */
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1319 else if (start_code == COM)
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1320 mjpeg_decode_com(s, s->buffer, input_size);
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1321 }
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1322 #endif
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1323 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1324 }
540
4cee7ce37e10 don't exit decoder after decoding first field -> fixes angels.avi interlacing
arpi_esp
parents: 527
diff changeset
1325 not_the_end:
541
4273be971bf8 Warning fix.
mellum
parents: 540
diff changeset
1326 ;
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1327 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1328 the_end:
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1329 return buf_ptr - buf;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1330 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1331
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1332 static int mjpeg_decode_end(AVCodecContext *avctx)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1333 {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1334 MJpegDecodeContext *s = avctx->priv_data;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1335 int i, j;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1336
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1337 for(i=0;i<MAX_COMPONENTS;i++)
396
fce0a2520551 removed useless header includes - use av memory functions
glantau
parents: 375
diff changeset
1338 av_free(s->current_picture[i]);
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1339 for(i=0;i<2;i++) {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1340 for(j=0;j<4;j++)
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1341 free_vlc(&s->vlcs[i][j]);
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1342 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1343 return 0;
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1344 }
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1345
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1346 AVCodec mjpeg_decoder = {
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1347 "mjpeg",
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1348 CODEC_TYPE_VIDEO,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1349 CODEC_ID_MJPEG,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1350 sizeof(MJpegDecodeContext),
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1351 mjpeg_decode_init,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1352 NULL,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1353 mjpeg_decode_end,
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1354 mjpeg_decode_frame,
369
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1355 0,
c60869851bb4 added support for various app headers, and writin FFmpeg comment
al3x
parents: 357
diff changeset
1356 NULL
23
1e131bc21101 added MJPEG decoder, renamed mjpegenc.c to mjpeg.c
glantau
parents: 0
diff changeset
1357 };