FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/mjpegdec.c
Date: 2026-08-28 05:02:41
Exec Total Coverage
Lines: 1235 1853 66.6%
Functions: 31 34 91.2%
Branches: 901 1671 53.9%

Line Branch Exec Source
1 /*
2 * MJPEG decoder
3 * Copyright (c) 2000, 2001 Fabrice Bellard
4 * Copyright (c) 2003 Alex Beregszaszi
5 * Copyright (c) 2003-2004 Michael Niedermayer
6 *
7 * Support for external huffman table, various fixes (AVID workaround),
8 * aspecting, new decode_frame mechanism and apple mjpeg-b support
9 * by Alex Beregszaszi
10 *
11 * This file is part of FFmpeg.
12 *
13 * FFmpeg is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Lesser General Public
15 * License as published by the Free Software Foundation; either
16 * version 2.1 of the License, or (at your option) any later version.
17 *
18 * FFmpeg is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * Lesser General Public License for more details.
22 *
23 * You should have received a copy of the GNU Lesser General Public
24 * License along with FFmpeg; if not, write to the Free Software
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 */
27
28 /**
29 * @file
30 * MJPEG decoder.
31 */
32
33 #include "config_components.h"
34
35 #include "libavutil/attributes.h"
36 #include "libavutil/imgutils.h"
37 #include "libavutil/avassert.h"
38 #include "libavutil/mem.h"
39 #include "libavutil/opt.h"
40 #include "avcodec.h"
41 #include "blockdsp.h"
42 #include "codec_internal.h"
43 #include "copy_block.h"
44 #include "decode.h"
45 #include "exif.h"
46 #include "exif_internal.h"
47 #include "hwaccel_internal.h"
48 #include "hwconfig.h"
49 #include "idctdsp.h"
50 #include "internal.h"
51 #include "jpegtables.h"
52 #include "mjpeg.h"
53 #include "mjpegdec.h"
54 #include "jpeglsdec.h"
55 #include "profiles.h"
56 #include "put_bits.h"
57
58
59 static void mjpeg_find_raw_scan_data(MJpegDecodeContext *s,
60 const uint8_t **pbuf_ptr, size_t *pbuf_size);
61
62 253 static int init_default_huffman_tables(MJpegDecodeContext *s)
63 {
64 static const struct {
65 int class;
66 int index;
67 const uint8_t *bits;
68 const uint8_t *values;
69 int length;
70 } ht[] = {
71 { 0, 0, ff_mjpeg_bits_dc_luminance,
72 ff_mjpeg_val_dc, 12 },
73 { 0, 1, ff_mjpeg_bits_dc_chrominance,
74 ff_mjpeg_val_dc, 12 },
75 { 1, 0, ff_mjpeg_bits_ac_luminance,
76 ff_mjpeg_val_ac_luminance, 162 },
77 { 1, 1, ff_mjpeg_bits_ac_chrominance,
78 ff_mjpeg_val_ac_chrominance, 162 },
79 { 2, 0, ff_mjpeg_bits_ac_luminance,
80 ff_mjpeg_val_ac_luminance, 162 },
81 { 2, 1, ff_mjpeg_bits_ac_chrominance,
82 ff_mjpeg_val_ac_chrominance, 162 },
83 };
84 int i, ret;
85
86
2/2
✓ Branch 0 taken 1518 times.
✓ Branch 1 taken 253 times.
1771 for (i = 0; i < FF_ARRAY_ELEMS(ht); i++) {
87 1518 ff_vlc_free(&s->vlcs[ht[i].class][ht[i].index]);
88 1518 ret = ff_mjpeg_build_vlc(&s->vlcs[ht[i].class][ht[i].index],
89 1518 ht[i].bits, ht[i].values,
90 1518 ht[i].class == 1, s->avctx);
91
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1518 times.
1518 if (ret < 0)
92 return ret;
93
94
2/2
✓ Branch 0 taken 1012 times.
✓ Branch 1 taken 506 times.
1518 if (ht[i].class < 2) {
95 1012 memcpy(s->raw_huffman_lengths[ht[i].class][ht[i].index],
96 1012 ht[i].bits + 1, 16);
97 1012 memcpy(s->raw_huffman_values[ht[i].class][ht[i].index],
98 1012 ht[i].values, ht[i].length);
99 }
100 }
101
102 253 return 0;
103 }
104
105 11 static void parse_avid(MJpegDecodeContext *s, uint8_t *buf, int len)
106 {
107
2/4
✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 11 times.
✗ Branch 3 not taken.
11 if (len > 12 && buf[12] == 1) /* 1 - NTSC */
108 11 s->interlace_polarity = 1;
109
2/4
✓ Branch 0 taken 11 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 11 times.
11 if (len > 12 && buf[12] == 2) /* 2 - PAL */
110 s->interlace_polarity = 0;
111
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
11 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
112 av_log(s->avctx, AV_LOG_INFO, "AVID: len:%d %d\n", len, len > 12 ? buf[12] : -1);
113 11 }
114
115 380 static void init_idct(AVCodecContext *avctx)
116 {
117 380 MJpegDecodeContext *s = avctx->priv_data;
118
119 380 ff_idctdsp_init(&s->idsp, avctx);
120 380 ff_permute_scantable(s->permutated_scantable, ff_zigzag_direct,
121 380 s->idsp.idct_permutation);
122 380 }
123
124 253 av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
125 {
126 253 MJpegDecodeContext *s = avctx->priv_data;
127 int ret;
128
129
2/2
✓ Branch 0 taken 251 times.
✓ Branch 1 taken 2 times.
253 if (!s->picture_ptr) {
130 251 s->picture = av_frame_alloc();
131
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 251 times.
251 if (!s->picture)
132 return AVERROR(ENOMEM);
133 251 s->picture_ptr = s->picture;
134 }
135
136 253 s->avctx = avctx;
137 253 ff_blockdsp_init(&s->bdsp);
138 253 init_idct(avctx);
139 253 s->buffer_size = 0;
140 253 s->buffer = NULL;
141 253 s->first_picture = 1;
142 253 s->got_picture = 0;
143 253 s->orig_height = avctx->coded_height;
144 253 avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
145 253 avctx->colorspace = AVCOL_SPC_BT470BG;
146 253 s->hwaccel_pix_fmt = s->hwaccel_sw_pix_fmt = AV_PIX_FMT_NONE;
147
148
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 253 times.
253 if ((ret = init_default_huffman_tables(s)) < 0)
149 return ret;
150
151 #if FF_API_MJPEG_EXTERN_HUFF
152
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 253 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
253 if (s->extern_huff && avctx->extradata) {
153 av_log(avctx, AV_LOG_INFO, "using external huffman table\n");
154 bytestream2_init(&s->gB, avctx->extradata, avctx->extradata_size);
155 if (ff_mjpeg_decode_dht(s)) {
156 av_log(avctx, AV_LOG_ERROR,
157 "error using external huffman table, switching back to internal\n");
158 if ((ret = init_default_huffman_tables(s)) < 0)
159 return ret;
160 }
161 }
162 #endif
163
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 253 times.
253 if (avctx->field_order == AV_FIELD_BB) { /* quicktime icefloe 019 */
164 s->interlace_polarity = 1; /* bottom field first */
165 av_log(avctx, AV_LOG_DEBUG, "bottom field first\n");
166
2/2
✓ Branch 0 taken 251 times.
✓ Branch 1 taken 2 times.
253 } else if (avctx->field_order == AV_FIELD_UNKNOWN) {
167
2/2
✓ Branch 0 taken 51 times.
✓ Branch 1 taken 200 times.
251 if (avctx->codec_tag == AV_RL32("MJPG"))
168 51 s->interlace_polarity = 1;
169 }
170
171
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 251 times.
253 if (avctx->codec_id == AV_CODEC_ID_SMVJPEG) {
172
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if (avctx->extradata_size >= 4)
173 2 s->smv_frames_per_jpeg = AV_RL32(avctx->extradata);
174
175
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (s->smv_frames_per_jpeg <= 0) {
176 av_log(avctx, AV_LOG_ERROR, "Invalid number of frames per jpeg.\n");
177 return AVERROR_INVALIDDATA;
178 }
179
180 2 s->smv_frame = av_frame_alloc();
181
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!s->smv_frame)
182 return AVERROR(ENOMEM);
183
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 249 times.
251 } else if (avctx->extradata_size > 8
184
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 && AV_RL32(avctx->extradata) == 0x2C
185 && AV_RL32(avctx->extradata + 4) == 0x18) {
186 parse_avid(s, avctx->extradata, avctx->extradata_size);
187 }
188
189
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 242 times.
253 if (avctx->codec->id == AV_CODEC_ID_AMV)
190 11 s->flipped = 1;
191
192 253 return 0;
193 }
194
195
196 11024 static int mjpeg_parse_len(MJpegDecodeContext *s, int *plen, const char *name)
197 {
198 11024 int len = bytestream2_get_be16u(&s->gB);
199
2/4
✓ Branch 0 taken 11024 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 11024 times.
11024 if (len < 2 || bytestream2_get_bytes_left(&s->gB) < (len - 2)) {
200 av_log(s->avctx, AV_LOG_ERROR, "%s: invalid len %d\n", name, len);
201 return AVERROR_INVALIDDATA;
202 }
203 11024 *plen = len - 2;
204 11024 return 0;
205 }
206
207 /* quantize tables */
208 2628 int ff_mjpeg_decode_dqt(MJpegDecodeContext *s)
209 {
210 int len, index, i;
211
212 2628 int ret = mjpeg_parse_len(s, &len, "dqt");
213
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2628 times.
2628 if (ret < 0)
214 return ret;
215
216
2/2
✓ Branch 0 taken 3162 times.
✓ Branch 1 taken 2628 times.
5790 while (len >= 65) {
217 3162 uint8_t b = bytestream2_get_byteu(&s->gB);
218 3162 int pr = b >> 4;
219
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3162 times.
3162 if (pr > 1) {
220 av_log(s->avctx, AV_LOG_ERROR, "dqt: invalid precision\n");
221 return AVERROR_INVALIDDATA;
222 }
223
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3162 times.
3162 if (len < (1 + 64 * (1 + pr)))
224 return AVERROR_INVALIDDATA;
225 3162 index = b & 0x0F;
226
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3162 times.
3162 if (index >= 4)
227 return AVERROR_INVALIDDATA;
228 3162 av_log(s->avctx, AV_LOG_DEBUG, "index=%d\n", index);
229 /* read quant table */
230
2/2
✓ Branch 0 taken 202368 times.
✓ Branch 1 taken 3162 times.
205530 for (i = 0; i < 64; i++) {
231
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 202368 times.
202368 s->quant_matrixes[index][i] = pr ? bytestream2_get_be16u(&s->gB) : bytestream2_get_byteu(&s->gB);
232
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 202368 times.
202368 if (s->quant_matrixes[index][i] == 0) {
233 int log_level = s->avctx->err_recognition & AV_EF_EXPLODE ? AV_LOG_ERROR : AV_LOG_WARNING;
234 av_log(s->avctx, log_level, "dqt: 0 quant value\n");
235 if (s->avctx->err_recognition & AV_EF_EXPLODE)
236 return AVERROR_INVALIDDATA;
237 }
238 }
239
240 // XXX FIXME fine-tune, and perhaps add dc too
241 3162 s->qscale[index] = FFMAX(s->quant_matrixes[index][1],
242 3162 s->quant_matrixes[index][8]) >> 1;
243 3162 av_log(s->avctx, AV_LOG_DEBUG, "qscale[%d]: %d\n",
244 index, s->qscale[index]);
245 3162 len -= 1 + 64 * (1 + pr);
246 }
247 2628 return 0;
248 }
249
250 /* decode huffman tables and build VLC decoders */
251 2632 int ff_mjpeg_decode_dht(MJpegDecodeContext *s)
252 {
253 int len, index, i, class, n, v;
254 uint8_t bits_table[17];
255 uint8_t val_table[256];
256 2632 int ret = 0;
257
258 2632 ret = mjpeg_parse_len(s, &len, "dht");
259
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2632 times.
2632 if (ret < 0)
260 return ret;
261
262
2/2
✓ Branch 0 taken 9251 times.
✓ Branch 1 taken 2632 times.
11883 while (len > 0) {
263
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9251 times.
9251 if (len < 17)
264 return AVERROR_INVALIDDATA;
265 9251 uint8_t b = bytestream2_get_byteu(&s->gB);
266 9251 class = b >> 4;
267
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9251 times.
9251 if (class >= 2)
268 return AVERROR_INVALIDDATA;
269 9251 index = b & 0x0F;
270
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9251 times.
9251 if (index >= 4)
271 return AVERROR_INVALIDDATA;
272 9251 n = 0;
273
2/2
✓ Branch 0 taken 148016 times.
✓ Branch 1 taken 9251 times.
157267 for (i = 1; i <= 16; i++) {
274 148016 bits_table[i] = bytestream2_get_byteu(&s->gB);
275 148016 n += bits_table[i];
276 }
277 9251 len -= 17;
278
2/4
✓ Branch 0 taken 9251 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 9251 times.
9251 if (len < n || n > 256)
279 return AVERROR_INVALIDDATA;
280
281
2/2
✓ Branch 0 taken 558338 times.
✓ Branch 1 taken 9251 times.
567589 for (i = 0; i < n; i++) {
282 558338 v = bytestream2_get_byteu(&s->gB);
283 558338 val_table[i] = v;
284 }
285 9251 len -= n;
286
287 /* build VLC and flush previous vlc if present */
288 9251 ff_vlc_free(&s->vlcs[class][index]);
289 9251 av_log(s->avctx, AV_LOG_DEBUG, "class=%d index=%d nb_codes=%d\n",
290 class, index, n);
291
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9251 times.
9251 if ((ret = ff_mjpeg_build_vlc(&s->vlcs[class][index], bits_table,
292 9251 val_table, class > 0, s->avctx)) < 0)
293 return ret;
294
295
2/2
✓ Branch 0 taken 4645 times.
✓ Branch 1 taken 4606 times.
9251 if (class > 0) {
296 4645 ff_vlc_free(&s->vlcs[2][index]);
297
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4645 times.
4645 if ((ret = ff_mjpeg_build_vlc(&s->vlcs[2][index], bits_table,
298 4645 val_table, 0, s->avctx)) < 0)
299 return ret;
300 }
301
302
2/2
✓ Branch 0 taken 148016 times.
✓ Branch 1 taken 9251 times.
157267 for (i = 0; i < 16; i++)
303 148016 s->raw_huffman_lengths[class][index][i] = bits_table[i + 1];
304
2/2
✓ Branch 0 taken 2368256 times.
✓ Branch 1 taken 9251 times.
2377507 for (i = 0; i < 256; i++)
305 2368256 s->raw_huffman_values[class][index][i] = val_table[i];
306 }
307 2632 return 0;
308 }
309
310 2647 int ff_mjpeg_decode_sof(MJpegDecodeContext *s)
311 {
312 int len, nb_components, i, width, height, bits, ret, size_change;
313 unsigned pix_fmt_id;
314 2647 int h_count[MAX_COMPONENTS] = { 0 };
315 2647 int v_count[MAX_COMPONENTS] = { 0 };
316
317 2647 s->cur_scan = 0;
318 2647 memset(s->upscale_h, 0, sizeof(s->upscale_h));
319 2647 memset(s->upscale_v, 0, sizeof(s->upscale_v));
320
321 2647 ret = mjpeg_parse_len(s, &len, "sof");
322
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2647 times.
2647 if (ret < 0)
323 return ret;
324
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2647 times.
2647 if (len < 6)
325 return AVERROR_INVALIDDATA;
326 2647 bits = bytestream2_get_byteu(&s->gB);
327
328
2/4
✓ Branch 0 taken 2647 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2647 times.
2647 if (bits > 16 || bits < 1) {
329 av_log(s->avctx, AV_LOG_ERROR, "bits %d is invalid\n", bits);
330 return AVERROR_INVALIDDATA;
331 }
332
333
2/2
✓ Branch 0 taken 127 times.
✓ Branch 1 taken 2520 times.
2647 if (s->avctx->bits_per_raw_sample != bits) {
334
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 127 times.
127 av_log(s->avctx, s->avctx->bits_per_raw_sample > 0 ? AV_LOG_INFO : AV_LOG_DEBUG, "Changing bps from %d to %d\n", s->avctx->bits_per_raw_sample, bits);
335 127 s->avctx->bits_per_raw_sample = bits;
336 127 init_idct(s->avctx);
337 }
338
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2647 times.
2647 if (s->pegasus_rct)
339 bits = 9;
340
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2647 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2647 if (bits == 9 && !s->pegasus_rct)
341 s->rct = 1; // FIXME ugly
342
343
3/4
✓ Branch 0 taken 430 times.
✓ Branch 1 taken 2217 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 430 times.
2647 if (s->lossless && s->avctx->lowres) {
344 av_log(s->avctx, AV_LOG_ERROR, "lowres is not possible with lossless jpeg\n");
345 return AVERROR(ENOSYS);
346 }
347
348 2647 height = bytestream2_get_be16u(&s->gB);
349 2647 width = bytestream2_get_be16u(&s->gB);
350
351 // HACK for odd_height.mov
352
4/6
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 2617 times.
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
2647 if (s->interlaced && s->width == width && s->height == height + 1)
353 height = s->height;
354
355 2647 av_log(s->avctx, AV_LOG_DEBUG, "sof0: picture: %dx%d\n", width, height);
356
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2647 times.
2647 if (av_image_check_size(width, height, 0, s->avctx) < 0)
357 return AVERROR_INVALIDDATA;
358
359
4/4
✓ Branch 0 taken 2633 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 2408 times.
✓ Branch 3 taken 225 times.
2647 if (!s->progressive && !s->ls) {
360 // A valid frame requires at least 1 bit for DC + 1 bit for AC for each 8x8 block.
361
3/4
✓ Branch 0 taken 2406 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2406 times.
2408 if (s->buf_size && (width + 7) / 8 * ((height + 7) / 8) > s->buf_size * 4LL)
362 return AVERROR_INVALIDDATA;
363 }
364
365 2647 nb_components = bytestream2_get_byteu(&s->gB);
366
2/4
✓ Branch 0 taken 2647 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2647 times.
2647 if (nb_components <= 0 ||
367 nb_components > MAX_COMPONENTS)
368 return AVERROR_INVALIDDATA;
369
4/4
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 2617 times.
✓ Branch 2 taken 19 times.
✓ Branch 3 taken 11 times.
2647 if (s->interlaced && (s->bottom_field == !s->interlace_polarity)) {
370
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 19 times.
19 if (nb_components != s->nb_components) {
371 av_log(s->avctx, AV_LOG_ERROR,
372 "nb_components changing in interlaced picture\n");
373 return AVERROR_INVALIDDATA;
374 }
375 }
376
3/6
✓ Branch 0 taken 225 times.
✓ Branch 1 taken 2422 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 225 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2647 if (s->ls && !(bits <= 8 || nb_components == 1)) {
377 avpriv_report_missing_feature(s->avctx,
378 "JPEG-LS that is not <= 8 "
379 "bits/component or 16-bit gray");
380 return AVERROR_PATCHWELCOME;
381 }
382 2647 len -= 6;
383
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2647 times.
2647 if (len != 3 * nb_components) {
384 av_log(s->avctx, AV_LOG_ERROR, "decode_sof0: error, len(%d) mismatch %d components\n", len, nb_components);
385 return AVERROR_INVALIDDATA;
386 }
387
388 2647 s->nb_components = nb_components;
389 2647 s->nb_seq_component_scans = 0;
390 2647 s->h_max = 1;
391 2647 s->v_max = 1;
392
2/2
✓ Branch 0 taken 7905 times.
✓ Branch 1 taken 2647 times.
10552 for (i = 0; i < nb_components; i++) {
393 /* component id */
394 7905 s->component_id[i] = bytestream2_get_byteu(&s->gB);
395 7905 uint8_t b = bytestream2_get_byteu(&s->gB);
396 7905 h_count[i] = b >> 4;
397 7905 v_count[i] = b & 0x0F;
398 /* compute hmax and vmax (only used in interleaved case) */
399
2/2
✓ Branch 0 taken 2200 times.
✓ Branch 1 taken 5705 times.
7905 if (h_count[i] > s->h_max)
400 2200 s->h_max = h_count[i];
401
2/2
✓ Branch 0 taken 2340 times.
✓ Branch 1 taken 5565 times.
7905 if (v_count[i] > s->v_max)
402 2340 s->v_max = v_count[i];
403 7905 s->quant_index[i] = bytestream2_get_byteu(&s->gB);
404
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7905 times.
7905 if (s->quant_index[i] >= 4) {
405 av_log(s->avctx, AV_LOG_ERROR, "quant_index is invalid\n");
406 return AVERROR_INVALIDDATA;
407 }
408
2/4
✓ Branch 0 taken 7905 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 7905 times.
7905 if (!h_count[i] || !v_count[i]) {
409 av_log(s->avctx, AV_LOG_ERROR,
410 "Invalid sampling factor in component %d %d:%d\n",
411 i, h_count[i], v_count[i]);
412 return AVERROR_INVALIDDATA;
413 }
414
415 7905 av_log(s->avctx, AV_LOG_DEBUG, "component %d %d:%d id: %d quant:%d\n",
416 i, h_count[i], v_count[i],
417 s->component_id[i], s->quant_index[i]);
418 }
419
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2647 times.
2647 if ( nb_components == 4
420 && s->component_id[0] == 'C'
421 && s->component_id[1] == 'M'
422 && s->component_id[2] == 'Y'
423 && s->component_id[3] == 'K')
424 s->adobe_transform = 0;
425
426
4/6
✓ Branch 0 taken 225 times.
✓ Branch 1 taken 2422 times.
✓ Branch 2 taken 225 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 225 times.
2647 if (s->ls && (s->h_max > 1 || s->v_max > 1)) {
427 avpriv_report_missing_feature(s->avctx, "Subsampling in JPEG-LS");
428 return AVERROR_PATCHWELCOME;
429 }
430
431 /* if different size, realloc/alloc picture */
432
5/6
✓ Branch 0 taken 2243 times.
✓ Branch 1 taken 404 times.
✓ Branch 2 taken 2237 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2237 times.
✗ Branch 5 not taken.
2647 if (width != s->width || height != s->height || bits != s->bits ||
433
1/2
✓ Branch 0 taken 2237 times.
✗ Branch 1 not taken.
2237 memcmp(s->h_count, h_count, sizeof(h_count)) ||
434
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2237 times.
2237 memcmp(s->v_count, v_count, sizeof(v_count))) {
435 410 size_change = 1;
436
437 410 s->width = width;
438 410 s->height = height;
439 410 s->bits = bits;
440 410 memcpy(s->h_count, h_count, sizeof(h_count));
441 410 memcpy(s->v_count, v_count, sizeof(v_count));
442 410 s->interlaced = 0;
443 410 s->got_picture = 0;
444
445 /* test interlaced mode */
446
2/2
✓ Branch 0 taken 207 times.
✓ Branch 1 taken 203 times.
410 if (s->first_picture &&
447
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 207 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
207 (s->multiscope != 2 || s->avctx->pkt_timebase.den >= 25 * s->avctx->pkt_timebase.num) &&
448
2/2
✓ Branch 0 taken 148 times.
✓ Branch 1 taken 59 times.
207 s->orig_height != 0 &&
449
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 139 times.
148 s->height < ((s->orig_height * 3) / 4)) {
450 9 s->interlaced = 1;
451 9 s->bottom_field = s->interlace_polarity;
452 9 s->picture_ptr->flags |= AV_FRAME_FLAG_INTERLACED;
453
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 2 times.
9 s->picture_ptr->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST * !s->interlace_polarity;
454 9 height *= 2;
455 }
456
457 410 ret = ff_set_dimensions(s->avctx, width, height);
458
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 410 times.
410 if (ret < 0)
459 return ret;
460
461
2/2
✓ Branch 0 taken 408 times.
✓ Branch 1 taken 2 times.
410 if (s->avctx->codec_id != AV_CODEC_ID_SMVJPEG &&
462
1/2
✓ Branch 0 taken 408 times.
✗ Branch 1 not taken.
408 (s->avctx->codec_tag == MKTAG('A', 'V', 'R', 'n') ||
463
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 406 times.
408 s->avctx->codec_tag == MKTAG('A', 'V', 'D', 'J')) &&
464
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 s->orig_height < height)
465 2 s->avctx->height = AV_CEIL_RSHIFT(s->orig_height, s->avctx->lowres);
466
467
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 410 times.
410 if (s->bayer) {
468 if (nb_components == 2) {
469 /* Bayer images embedded in DNGs can contain 2 interleaved components and the
470 * width stored in their SOF3 markers is the width of each one. We only output
471 * a single component, therefore we need to adjust the output image width. We
472 * handle the deinterleaving (but not the debayering) in this file. */
473 s->avctx->width *= 2;
474 }
475 /* They can also contain 1 component, which is double the width and half the height
476 * of the final image (rows are interleaved). We don't handle the decoding in this
477 * file, but leave that to the TIFF/DNG decoder. */
478 }
479
480 410 s->first_picture = 0;
481 } else {
482 2237 size_change = 0;
483 }
484
485
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2644 times.
2647 if (s->avctx->codec_id == AV_CODEC_ID_SMVJPEG) {
486 3 s->avctx->height = s->avctx->coded_height / s->smv_frames_per_jpeg;
487
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (s->avctx->height <= 0)
488 return AVERROR_INVALIDDATA;
489 }
490
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2647 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2647 if (s->bayer && s->progressive) {
491 avpriv_request_sample(s->avctx, "progressively coded bayer picture");
492 return AVERROR_INVALIDDATA;
493 }
494
495
5/6
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 2620 times.
✓ Branch 2 taken 19 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 19 times.
✗ Branch 5 not taken.
2647 if (s->got_picture && s->interlaced && (s->bottom_field == !s->interlace_polarity)) {
496
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 19 times.
19 if (s->progressive) {
497 avpriv_request_sample(s->avctx, "progressively coded interlaced picture");
498 return AVERROR_INVALIDDATA;
499 }
500 } else {
501
9/10
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 2340 times.
✓ Branch 2 taken 239 times.
✓ Branch 3 taken 49 times.
✓ Branch 4 taken 225 times.
✓ Branch 5 taken 14 times.
✓ Branch 6 taken 16 times.
✓ Branch 7 taken 209 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 16 times.
2628 if (s->v_max == 1 && s->h_max == 1 && s->lossless == 1 && (nb_components == 3 || nb_components == 4))
502 209 s->rgb = 1;
503
2/2
✓ Branch 0 taken 2198 times.
✓ Branch 1 taken 221 times.
2419 else if (!s->lossless)
504 2198 s->rgb = 0;
505 /* XXX: not complete test ! */
506 2628 pix_fmt_id = ((unsigned)s->h_count[0] << 28) | (s->v_count[0] << 24) |
507 2628 (s->h_count[1] << 20) | (s->v_count[1] << 16) |
508 2628 (s->h_count[2] << 12) | (s->v_count[2] << 8) |
509 2628 (s->h_count[3] << 4) | s->v_count[3];
510 2628 av_log(s->avctx, AV_LOG_DEBUG, "pix fmt id %x\n", pix_fmt_id);
511 /* NOTE we do not allocate pictures large enough for the possible
512 * padding of h/v_count being 4 */
513
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2628 times.
2628 if (!(pix_fmt_id & 0xD0D0D0D0))
514 pix_fmt_id -= (pix_fmt_id & 0xF0F0F0F0) >> 1;
515
2/2
✓ Branch 0 taken 412 times.
✓ Branch 1 taken 2216 times.
2628 if (!(pix_fmt_id & 0x0D0D0D0D))
516 412 pix_fmt_id -= (pix_fmt_id & 0x0F0F0F0F) >> 1;
517
518
2/2
✓ Branch 0 taken 21024 times.
✓ Branch 1 taken 2628 times.
23652 for (i = 0; i < 8; i++) {
519 21024 int j = 6 + (i & 1) - (i & 6);
520 21024 int is = (pix_fmt_id >> (4 * i)) & 0xF;
521 21024 int js = (pix_fmt_id >> (4 * j)) & 0xF;
522
523
7/8
✓ Branch 0 taken 11577 times.
✓ Branch 1 taken 9447 times.
✓ Branch 2 taken 11569 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 11569 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1151 times.
✓ Branch 7 taken 10418 times.
21024 if (is == 1 && js != 2 && (i < 2 || i > 5))
524 1151 js = (pix_fmt_id >> ( 8 + 4 * (i & 1))) & 0xF;
525
7/8
✓ Branch 0 taken 11577 times.
✓ Branch 1 taken 9447 times.
✓ Branch 2 taken 11567 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 11567 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1149 times.
✓ Branch 7 taken 10418 times.
21024 if (is == 1 && js != 2 && (i < 2 || i > 5))
526 1149 js = (pix_fmt_id >> (16 + 4 * (i & 1))) & 0xF;
527
528
4/4
✓ Branch 0 taken 11577 times.
✓ Branch 1 taken 9447 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 11567 times.
21024 if (is == 1 && js == 2) {
529
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
10 if (i & 1) s->upscale_h[j / 2] = 1;
530 2 else s->upscale_v[j / 2] = 1;
531 }
532 }
533
534
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2628 times.
2628 if (s->bayer) {
535 if (pix_fmt_id != 0x11110000 && pix_fmt_id != 0x11000000)
536 goto unk_pixfmt;
537 }
538
539
9/15
✗ Branch 0 not taken.
✓ Branch 1 taken 429 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 18 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 243 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 2 times.
✓ Branch 12 taken 1926 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
2628 switch (pix_fmt_id) {
540 case 0x11110000: /* for bayer-encoded huffman lossless JPEGs embedded in DNGs */
541 if (!s->bayer)
542 goto unk_pixfmt;
543 s->avctx->pix_fmt = AV_PIX_FMT_GRAY16LE;
544 break;
545 429 case 0x11111100:
546
2/2
✓ Branch 0 taken 209 times.
✓ Branch 1 taken 220 times.
429 if (s->rgb)
547
1/2
✓ Branch 0 taken 209 times.
✗ Branch 1 not taken.
209 s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_BGR24 : AV_PIX_FMT_BGR48;
548 else {
549
2/2
✓ Branch 0 taken 216 times.
✓ Branch 1 taken 4 times.
220 if ( s->adobe_transform == 0
550
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 216 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
216 || s->component_id[0] == 'R' && s->component_id[1] == 'G' && s->component_id[2] == 'B') {
551
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_GBRP : AV_PIX_FMT_GBRP16;
552 } else {
553
2/4
✓ Branch 0 taken 216 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 216 times.
216 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
554 else s->avctx->pix_fmt = AV_PIX_FMT_YUV444P16;
555
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 216 times.
216 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
556 }
557 }
558
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 429 times.
429 av_assert0(s->nb_components == 3);
559 429 break;
560 case 0x11111111:
561 if (s->rgb)
562 s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_ABGR : AV_PIX_FMT_RGBA64;
563 else {
564 if (s->adobe_transform == 0 && s->bits <= 8) {
565 s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
566 } else {
567 s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_YUVA444P : AV_PIX_FMT_YUVA444P16;
568 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
569 }
570 }
571 av_assert0(s->nb_components == 4);
572 break;
573 2 case 0x11412100:
574
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (s->bits > 8)
575 goto unk_pixfmt;
576
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 if (s->component_id[0] == 'R' && s->component_id[1] == 'G' && s->component_id[2] == 'B') {
577 2 s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
578 2 s->upscale_h[0] = 4;
579 2 s->upscale_h[1] = 0;
580 2 s->upscale_h[2] = 1;
581 } else {
582 goto unk_pixfmt;
583 }
584 2 break;
585 case 0x22111122:
586 case 0x22111111:
587 if (s->adobe_transform == 0 && s->bits <= 8) {
588 s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
589 s->upscale_v[1] = s->upscale_v[2] = 1;
590 s->upscale_h[1] = s->upscale_h[2] = 1;
591 } else if (s->adobe_transform == 2 && s->bits <= 8) {
592 s->avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
593 s->upscale_v[1] = s->upscale_v[2] = 1;
594 s->upscale_h[1] = s->upscale_h[2] = 1;
595 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
596 } else {
597 if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
598 else s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P16;
599 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
600 }
601 av_assert0(s->nb_components == 4);
602 break;
603 4 case 0x12121100:
604 case 0x22122100:
605 case 0x21211100:
606 case 0x21112100:
607 case 0x22211200:
608 case 0x22221100:
609 case 0x22112200:
610 case 0x11222200:
611
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (s->bits > 8)
612 goto unk_pixfmt;
613
3/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 2 times.
4 if (s->adobe_transform == 0 || s->component_id[0] == 'R' &&
614
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 s->component_id[1] == 'G' && s->component_id[2] == 'B') {
615 2 s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
616 } else {
617
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
618
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
619 }
620 4 break;
621 18 case 0x11000000:
622 case 0x13000000:
623 case 0x14000000:
624 case 0x31000000:
625 case 0x33000000:
626 case 0x34000000:
627 case 0x41000000:
628 case 0x43000000:
629 case 0x44000000:
630
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 2 times.
18 if (s->bits <= 8)
631
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
16 s->avctx->pix_fmt = s->force_pal8 ? AV_PIX_FMT_PAL8 : AV_PIX_FMT_GRAY8;
632 else
633 2 s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
634 18 break;
635 case 0x12111100:
636 case 0x14121200:
637 case 0x14111100:
638 case 0x22211100:
639 case 0x22112100:
640 if (s->component_id[0] == 'R' && s->component_id[1] == 'G' && s->component_id[2] == 'B') {
641 if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
642 else
643 goto unk_pixfmt;
644 s->upscale_v[1] = s->upscale_v[2] = 1;
645 } else {
646 if (pix_fmt_id == 0x14111100)
647 s->upscale_v[1] = s->upscale_v[2] = 1;
648 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV440P : AV_PIX_FMT_YUVJ440P;
649 else
650 goto unk_pixfmt;
651 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
652 }
653 break;
654 243 case 0x21111100:
655
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 243 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
243 if (s->component_id[0] == 'R' && s->component_id[1] == 'G' && s->component_id[2] == 'B') {
656 if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
657 else
658 goto unk_pixfmt;
659 s->upscale_h[1] = s->upscale_h[2] = 1;
660 } else {
661
2/4
✓ Branch 0 taken 243 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 243 times.
243 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV422P : AV_PIX_FMT_YUVJ422P;
662 else s->avctx->pix_fmt = AV_PIX_FMT_YUV422P16;
663
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 243 times.
243 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
664 }
665 243 break;
666 2 case 0x11311100:
667
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (s->bits > 8)
668 goto unk_pixfmt;
669
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 if (s->component_id[0] == 'R' && s->component_id[1] == 'G' && s->component_id[2] == 'B')
670 2 s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
671 else
672 goto unk_pixfmt;
673 2 s->upscale_h[0] = s->upscale_h[2] = 2;
674 2 break;
675 2 case 0x31111100:
676
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (s->bits > 8)
677 goto unk_pixfmt;
678
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV444P : AV_PIX_FMT_YUVJ444P;
679
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
680 2 s->upscale_h[1] = s->upscale_h[2] = 2;
681 2 break;
682 2 case 0x22121100:
683 case 0x22111200:
684 case 0x41211100:
685
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
2 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV422P : AV_PIX_FMT_YUVJ422P;
686 else
687 goto unk_pixfmt;
688
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
689 2 break;
690 1926 case 0x22111100:
691 case 0x23111100:
692 case 0x42111100:
693 case 0x24111100:
694
3/4
✓ Branch 0 taken 1926 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 205 times.
✓ Branch 3 taken 1721 times.
1926 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_YUVJ420P;
695 else s->avctx->pix_fmt = AV_PIX_FMT_YUV420P16;
696
2/2
✓ Branch 0 taken 205 times.
✓ Branch 1 taken 1721 times.
1926 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
697
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1926 times.
1926 if (pix_fmt_id == 0x42111100) {
698 if (s->bits > 8)
699 goto unk_pixfmt;
700 s->upscale_h[1] = s->upscale_h[2] = 1;
701
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1926 times.
1926 } else if (pix_fmt_id == 0x24111100) {
702 if (s->bits > 8)
703 goto unk_pixfmt;
704 s->upscale_v[1] = s->upscale_v[2] = 1;
705
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1926 times.
1926 } else if (pix_fmt_id == 0x23111100) {
706 if (s->bits > 8)
707 goto unk_pixfmt;
708 s->upscale_v[1] = s->upscale_v[2] = 2;
709 }
710 1926 break;
711 case 0x41111100:
712 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV411P : AV_PIX_FMT_YUVJ411P;
713 else
714 goto unk_pixfmt;
715 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
716 break;
717 default:
718 unk_pixfmt:
719 avpriv_report_missing_feature(s->avctx, "Pixel format 0x%x bits:%d", pix_fmt_id, s->bits);
720 memset(s->upscale_h, 0, sizeof(s->upscale_h));
721 memset(s->upscale_v, 0, sizeof(s->upscale_v));
722 return AVERROR_PATCHWELCOME;
723 }
724
4/6
✓ Branch 0 taken 2616 times.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2616 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
2628 if ((AV_RB32(s->upscale_h) || AV_RB32(s->upscale_v)) && s->avctx->lowres) {
725 avpriv_report_missing_feature(s->avctx, "Lowres for weird subsampling");
726 return AVERROR_PATCHWELCOME;
727 }
728
2/2
✓ Branch 0 taken 225 times.
✓ Branch 1 taken 2403 times.
2628 if (s->ls) {
729 225 memset(s->upscale_h, 0, sizeof(s->upscale_h));
730 225 memset(s->upscale_v, 0, sizeof(s->upscale_v));
731
2/2
✓ Branch 0 taken 209 times.
✓ Branch 1 taken 16 times.
225 if (s->nb_components == 3) {
732 209 s->avctx->pix_fmt = AV_PIX_FMT_RGB24;
733
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
16 } else if (s->nb_components != 1) {
734 av_log(s->avctx, AV_LOG_ERROR, "Unsupported number of components %d\n", s->nb_components);
735 return AVERROR_PATCHWELCOME;
736
4/6
✓ Branch 0 taken 16 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
16 } else if ((s->palette_index || s->force_pal8) && s->bits <= 8)
737 8 s->avctx->pix_fmt = AV_PIX_FMT_PAL8;
738
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 else if (s->bits <= 8)
739 8 s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
740 else
741 s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
742 }
743
744 2628 s->pix_desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
745
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2628 times.
2628 if (!s->pix_desc) {
746 av_log(s->avctx, AV_LOG_ERROR, "Could not get a pixel format descriptor.\n");
747 return AVERROR_BUG;
748 }
749
750
4/4
✓ Branch 0 taken 2413 times.
✓ Branch 1 taken 215 times.
✓ Branch 2 taken 2210 times.
✓ Branch 3 taken 203 times.
2628 if (s->avctx->pix_fmt == s->hwaccel_sw_pix_fmt && !size_change) {
751 2210 s->avctx->pix_fmt = s->hwaccel_pix_fmt;
752 } else {
753 418 enum AVPixelFormat pix_fmts[] = {
754 #if CONFIG_MJPEG_NVDEC_HWACCEL
755 AV_PIX_FMT_CUDA,
756 #endif
757 #if CONFIG_MJPEG_VAAPI_HWACCEL
758 AV_PIX_FMT_VAAPI,
759 #endif
760 418 s->avctx->pix_fmt,
761 AV_PIX_FMT_NONE,
762 };
763 418 s->hwaccel_pix_fmt = ff_get_format(s->avctx, pix_fmts);
764
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 418 times.
418 if (s->hwaccel_pix_fmt < 0)
765 return AVERROR(EINVAL);
766
767 418 s->hwaccel_sw_pix_fmt = s->avctx->pix_fmt;
768 418 s->avctx->pix_fmt = s->hwaccel_pix_fmt;
769 }
770
771
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 2528 times.
2628 if (s->avctx->skip_frame == AVDISCARD_ALL) {
772 100 s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
773 100 s->picture_ptr->flags |= AV_FRAME_FLAG_KEY;
774 100 s->got_picture = 1;
775 100 return 0;
776 }
777
778 2528 av_frame_unref(s->picture_ptr);
779 2528 ret = ff_get_buffer(s->avctx, s->picture_ptr, AV_GET_BUFFER_FLAG_REF);
780
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2528 times.
2528 if (ret < 0)
781 return ret;
782 2528 s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
783 2528 s->picture_ptr->flags |= AV_FRAME_FLAG_KEY;
784 2528 s->got_picture = 1;
785
786 // Lets clear the palette to avoid leaving uninitialized values in it
787
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2520 times.
2528 if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
788 8 memset(s->picture_ptr->data[1], 0, 1024);
789
790
2/2
✓ Branch 0 taken 10112 times.
✓ Branch 1 taken 2528 times.
12640 for (i = 0; i < 4; i++)
791 10112 s->linesize[i] = s->picture_ptr->linesize[i] << s->interlaced;
792
793 ff_dlog(s->avctx, "%d %d %d %d %d %d\n",
794 s->width, s->height, s->linesize[0], s->linesize[1],
795 s->interlaced, s->avctx->height);
796
797 }
798
799
3/6
✓ Branch 0 taken 209 times.
✓ Branch 1 taken 2338 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 209 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2547 if ((s->rgb && !s->lossless && !s->ls) ||
800
5/6
✓ Branch 0 taken 2338 times.
✓ Branch 1 taken 209 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 2322 times.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
2547 (!s->rgb && s->ls && s->nb_components > 1) ||
801
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2539 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
2547 (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 && !s->ls)
802 ) {
803 av_log(s->avctx, AV_LOG_ERROR, "Unsupported coding and pixel format combination\n");
804 return AVERROR_PATCHWELCOME;
805 }
806
807 /* totally blank picture as progressive JPEG will only add details to it */
808
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 2540 times.
2547 if (s->progressive) {
809 7 int bw = (width + s->h_max * 8 - 1) / (s->h_max * 8);
810 7 int bh = (height + s->v_max * 8 - 1) / (s->v_max * 8);
811
2/2
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 7 times.
28 for (i = 0; i < s->nb_components; i++) {
812 21 int size = bw * bh * s->h_count[i] * s->v_count[i];
813 21 av_freep(&s->blocks[i]);
814 21 av_freep(&s->last_nnz[i]);
815 21 s->blocks[i] = av_calloc(size, sizeof(**s->blocks));
816 21 s->last_nnz[i] = av_calloc(size, sizeof(**s->last_nnz));
817
2/4
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 21 times.
21 if (!s->blocks[i] || !s->last_nnz[i])
818 return AVERROR(ENOMEM);
819 21 s->block_stride[i] = bw * s->h_count[i];
820 }
821 7 memset(s->coefs_finished, 0, sizeof(s->coefs_finished));
822 }
823
824
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2547 times.
2547 if (s->avctx->hwaccel) {
825 const FFHWAccel *hwaccel = ffhwaccel(s->avctx->hwaccel);
826 s->hwaccel_picture_private =
827 av_mallocz(hwaccel->frame_priv_data_size);
828 if (!s->hwaccel_picture_private)
829 return AVERROR(ENOMEM);
830
831 ret = hwaccel->start_frame(s->avctx, NULL, s->raw_image_buffer,
832 s->raw_image_buffer_size);
833 if (ret < 0)
834 return ret;
835 }
836
837 2547 return 0;
838 }
839
840 26940662 static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index, int *val)
841 {
842 int code;
843 26940662 code = get_vlc2(&s->gb, s->vlcs[0][dc_index].table, 9, 2);
844
2/4
✓ Branch 0 taken 26940662 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 26940662 times.
26940662 if (code < 0 || code > 16) {
845 av_log(s->avctx, AV_LOG_ERROR,
846 "mjpeg_decode_dc: bad vlc: %d\n", dc_index);
847 return AVERROR_INVALIDDATA;
848 }
849
850
2/2
✓ Branch 0 taken 23866264 times.
✓ Branch 1 taken 3074398 times.
26940662 *val = code ? get_xbits(&s->gb, code) : 0;
851 26940662 return 0;
852 }
853
854 /* decode block and dequantize */
855 4043486 static int decode_block(MJpegDecodeContext *s, int16_t *block, int component,
856 int dc_index, int ac_index, uint16_t *quant_matrix)
857 {
858 int code, i, j, level, val;
859
860 /* DC coef */
861 4043486 int ret = mjpeg_decode_dc(s, dc_index, &val);
862
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4043486 times.
4043486 if (ret < 0)
863 return ret;
864
865 4043486 val = val * (unsigned)quant_matrix[0] + s->last_dc[component];
866 4043486 s->last_dc[component] = val;
867 4043486 block[0] = av_clip_int16(val);
868 /* AC coefs */
869 4043486 i = 0;
870 {
871 4043486 OPEN_READER(re, &s->gb);
872 do {
873 37994565 UPDATE_CACHE(re, &s->gb);
874
2/2
✓ Branch 1 taken 555442 times.
✓ Branch 2 taken 37439123 times.
37994565 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2);
875
876 37994565 i += ((unsigned)code) >> 4;
877 37994565 code &= 0xf;
878
2/2
✓ Branch 0 taken 33995477 times.
✓ Branch 1 taken 3999088 times.
37994565 if (code) {
879 // GET_VLC updates the cache if parsing reaches the second stage.
880 // So we have at least MIN_CACHE_BITS - 9 > 15 bits left here
881 // and don't need to refill the cache.
882 {
883 33995477 int cache = GET_CACHE(re, &s->gb);
884 33995477 int sign = (~cache) >> 31;
885 33995477 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
886 }
887
888 33995477 LAST_SKIP_BITS(re, &s->gb, code);
889
890
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 33995477 times.
33995477 if (i > 63) {
891 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
892 return AVERROR_INVALIDDATA;
893 }
894 33995477 j = s->permutated_scantable[i];
895 33995477 block[j] = level * quant_matrix[i];
896 }
897
2/2
✓ Branch 0 taken 33951079 times.
✓ Branch 1 taken 4043486 times.
37994565 } while (i < 63);
898 4043486 CLOSE_READER(re, &s->gb);
899 }
900
901 4043486 return 0;
902 }
903
904 876 static int decode_dc_progressive(MJpegDecodeContext *s, int16_t *block,
905 int component, int dc_index,
906 uint16_t *quant_matrix, int Al)
907 {
908 unsigned val;
909 876 s->bdsp.clear_block(block);
910 876 int ret = mjpeg_decode_dc(s, dc_index, &val);
911
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 876 times.
876 if (ret < 0)
912 return ret;
913
914 876 val = (val * (quant_matrix[0] << Al)) + s->last_dc[component];
915 876 s->last_dc[component] = val;
916 876 block[0] = val;
917 876 return 0;
918 }
919
920 /* decode block and dequantize - progressive JPEG version */
921 1336 static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block,
922 uint8_t *last_nnz, int ac_index,
923 uint16_t *quant_matrix,
924 int Ss, int Se, int Al, int *EOBRUN)
925 {
926 int code, i, j, val, run;
927 unsigned level;
928
929
2/2
✓ Branch 0 taken 340 times.
✓ Branch 1 taken 996 times.
1336 if (*EOBRUN) {
930 340 (*EOBRUN)--;
931 340 return 0;
932 }
933
934 {
935 996 OPEN_READER(re, &s->gb);
936 996 for (i = Ss; ; i++) {
937 5910 UPDATE_CACHE(re, &s->gb);
938
2/2
✓ Branch 1 taken 15 times.
✓ Branch 2 taken 6891 times.
6906 GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2);
939
940 6906 run = ((unsigned) code) >> 4;
941 6906 code &= 0xF;
942
2/2
✓ Branch 0 taken 6037 times.
✓ Branch 1 taken 869 times.
6906 if (code) {
943 6037 i += run;
944
945 {
946 6037 int cache = GET_CACHE(re, &s->gb);
947 6037 int sign = (~cache) >> 31;
948 6037 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
949 }
950
951 6037 LAST_SKIP_BITS(re, &s->gb, code);
952
953
2/2
✓ Branch 0 taken 139 times.
✓ Branch 1 taken 5898 times.
6037 if (i >= Se) {
954
1/2
✓ Branch 0 taken 139 times.
✗ Branch 1 not taken.
139 if (i == Se) {
955 139 j = s->permutated_scantable[Se];
956 139 block[j] = level * (quant_matrix[Se] << Al);
957 139 break;
958 }
959 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
960 return AVERROR_INVALIDDATA;
961 }
962 5898 j = s->permutated_scantable[i];
963 5898 block[j] = level * (quant_matrix[i] << Al);
964 } else {
965
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 857 times.
869 if (run == 0xF) { // ZRL - skip 15 coefficients
966 12 i += 15;
967
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 if (i >= Se) {
968 av_log(s->avctx, AV_LOG_ERROR, "ZRL overflow: %d\n", i);
969 return AVERROR_INVALIDDATA;
970 }
971 } else {
972 857 val = (1 << run);
973
2/2
✓ Branch 0 taken 149 times.
✓ Branch 1 taken 708 times.
857 if (run) {
974 // Given that GET_VLC reloads internally, we always
975 // have at least 16 bits in the cache here.
976 149 val += NEG_USR32(GET_CACHE(re, &s->gb), run);
977 149 LAST_SKIP_BITS(re, &s->gb, run);
978 }
979 857 *EOBRUN = val - 1;
980 857 break;
981 }
982 }
983 }
984 996 CLOSE_READER(re, &s->gb);
985 }
986
987
1/2
✓ Branch 0 taken 996 times.
✗ Branch 1 not taken.
996 if (i > *last_nnz)
988 996 *last_nnz = i;
989
990 996 return 0;
991 }
992
993 #define REFINE_BIT(j) { \
994 UPDATE_CACHE(re, &s->gb); \
995 sign = block[j] >> 15; \
996 block[j] += SHOW_UBITS(re, &s->gb, 1) * \
997 ((quant_matrix[i] ^ sign) - sign) << Al; \
998 LAST_SKIP_BITS(re, &s->gb, 1); \
999 }
1000
1001 #define ZERO_RUN \
1002 for (; ; i++) { \
1003 if (i > last) { \
1004 i += run; \
1005 if (i > Se) { \
1006 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i); \
1007 return -1; \
1008 } \
1009 break; \
1010 } \
1011 j = s->permutated_scantable[i]; \
1012 if (block[j]) \
1013 REFINE_BIT(j) \
1014 else if (run-- == 0) \
1015 break; \
1016 }
1017
1018 /* decode block and dequantize - progressive JPEG refinement pass */
1019 1080 static int decode_block_refinement(MJpegDecodeContext *s, int16_t *block,
1020 uint8_t *last_nnz,
1021 int ac_index, uint16_t *quant_matrix,
1022 int Ss, int Se, int Al, int *EOBRUN)
1023 {
1024 1080 int code, i = Ss, j, sign, val, run;
1025 1080 int last = FFMIN(Se, *last_nnz);
1026
1027 1080 OPEN_READER(re, &s->gb);
1028
2/2
✓ Branch 0 taken 120 times.
✓ Branch 1 taken 960 times.
1080 if (*EOBRUN) {
1029 120 (*EOBRUN)--;
1030 } else {
1031 9339 for (; ; i++) {
1032 9339 UPDATE_CACHE(re, &s->gb);
1033
2/2
✓ Branch 1 taken 13 times.
✓ Branch 2 taken 10286 times.
10299 GET_VLC(code, re, &s->gb, s->vlcs[2][ac_index].table, 9, 2);
1034
1035
2/2
✓ Branch 0 taken 9342 times.
✓ Branch 1 taken 957 times.
10299 if (code & 0xF) {
1036 9342 run = ((unsigned) code) >> 4;
1037 9342 val = SHOW_UBITS(re, &s->gb, 1);
1038 9342 LAST_SKIP_BITS(re, &s->gb, 1);
1039
7/8
✓ Branch 0 taken 3889 times.
✓ Branch 1 taken 21930 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3889 times.
✓ Branch 5 taken 9094 times.
✓ Branch 6 taken 12836 times.
✓ Branch 8 taken 5453 times.
✓ Branch 9 taken 7383 times.
25819 ZERO_RUN;
1040 9342 j = s->permutated_scantable[i];
1041 9342 val--;
1042 9342 block[j] = ((quant_matrix[i] << Al) ^ val) - val;
1043
2/2
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 9279 times.
9342 if (i == Se) {
1044
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 if (i > *last_nnz)
1045 63 *last_nnz = i;
1046 63 CLOSE_READER(re, &s->gb);
1047 63 return 0;
1048 }
1049 } else {
1050 957 run = ((unsigned) code) >> 4;
1051
2/2
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 897 times.
957 if (run == 0xF) {
1052
7/8
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 621 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 42 times.
✓ Branch 5 taken 177 times.
✓ Branch 6 taken 444 times.
✓ Branch 8 taken 18 times.
✓ Branch 9 taken 426 times.
663 ZERO_RUN;
1053 } else {
1054 897 val = run;
1055 897 run = (1 << run);
1056
2/2
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 874 times.
897 if (val) {
1057 // Given that GET_VLC reloads internally, we always
1058 // have at least 16 bits in the cache here.
1059 23 run += SHOW_UBITS(re, &s->gb, val);
1060 23 LAST_SKIP_BITS(re, &s->gb, val);
1061 }
1062 897 *EOBRUN = run - 1;
1063 897 break;
1064 }
1065 }
1066 }
1067
1068
2/2
✓ Branch 0 taken 804 times.
✓ Branch 1 taken 93 times.
897 if (i > *last_nnz)
1069 804 *last_nnz = i;
1070 }
1071
1072
2/2
✓ Branch 0 taken 879 times.
✓ Branch 1 taken 1017 times.
1896 for (; i <= last; i++) {
1073 879 j = s->permutated_scantable[i];
1074
2/2
✓ Branch 0 taken 188 times.
✓ Branch 1 taken 691 times.
879 if (block[j])
1075 188 REFINE_BIT(j)
1076 }
1077 1017 CLOSE_READER(re, &s->gb);
1078
1079 1017 return 0;
1080 }
1081 #undef REFINE_BIT
1082 #undef ZERO_RUN
1083
1084 /* Handles 1 to 4 components */
1085 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s)
1086 {
1087 int nb_components = s->nb_components_sos;
1088 int predictor = s->Ss;
1089 int point_transform = s->Al;
1090 int i, mb_x, mb_y;
1091 uint16_t (*buffer)[4];
1092 int left[4], top[4], topleft[4];
1093 const int linesize = s->linesize[0];
1094 const int mask = ((1 << s->bits) - 1) << point_transform;
1095 int resync_mb_y = 0;
1096 int resync_mb_x = 0;
1097 int ret;
1098
1099 if (!s->bayer && s->nb_components < 3)
1100 return AVERROR_INVALIDDATA;
1101 if (s->bayer && s->nb_components > 2)
1102 return AVERROR_INVALIDDATA;
1103 if (s->nb_components <= 0 || s->nb_components > 4)
1104 return AVERROR_INVALIDDATA;
1105 if (s->v_max != 1 || s->h_max != 1 || !s->lossless)
1106 return AVERROR_INVALIDDATA;
1107 if (s->bayer) {
1108 if (s->rct || s->pegasus_rct)
1109 return AVERROR_INVALIDDATA;
1110 }
1111
1112 av_fast_malloc(&s->ljpeg_buffer, &s->ljpeg_buffer_size,
1113 (unsigned)s->mb_width * 4 * sizeof(s->ljpeg_buffer[0][0]));
1114 if (!s->ljpeg_buffer)
1115 return AVERROR(ENOMEM);
1116
1117 buffer = s->ljpeg_buffer;
1118
1119 for (i = 0; i < 4; i++)
1120 buffer[0][i] = 1 << (s->bits - 1);
1121
1122 s->restart_count = -1;
1123
1124 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1125 uint8_t *ptr = s->picture_ptr->data[0] + (linesize * mb_y);
1126
1127 if (s->interlaced && s->bottom_field)
1128 ptr += linesize >> 1;
1129
1130 for (i = 0; i < 4; i++)
1131 top[i] = left[i] = topleft[i] = buffer[0][i];
1132
1133 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1134 int modified_predictor = predictor;
1135 int restart;
1136
1137 ret = ff_mjpeg_handle_restart(s, &restart);
1138 if (ret < 0)
1139 return ret;
1140 if (restart) {
1141 resync_mb_x = mb_x;
1142 resync_mb_y = mb_y;
1143 for (i = 0; i < 4; i++)
1144 top[i] = left[i] = topleft[i] = 1 << (s->bits - 1);
1145 }
1146
1147 if (get_bits_left(&s->gb) < 1) {
1148 av_log(s->avctx, AV_LOG_ERROR, "bitstream end in rgb_scan\n");
1149 return AVERROR_INVALIDDATA;
1150 }
1151
1152 if (mb_y == resync_mb_y || mb_y == resync_mb_y + 1 && mb_x < resync_mb_x || !mb_x)
1153 modified_predictor = 1;
1154
1155 for (i = 0; i < nb_components; i++) {
1156 int pred, dc;
1157
1158 topleft[i] = top[i];
1159 top[i] = buffer[mb_x][i];
1160
1161 PREDICT(pred, topleft[i], top[i], left[i], modified_predictor);
1162
1163 ret = mjpeg_decode_dc(s, s->dc_index[i], &dc);
1164 if (ret < 0)
1165 return ret;
1166
1167 left[i] = buffer[mb_x][i] =
1168 mask & (pred + (unsigned)(dc * (1 << point_transform)));
1169 }
1170 }
1171 if (s->rct && s->nb_components == 4) {
1172 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1173 ptr[4 * mb_x + 2] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200) >> 2);
1174 ptr[4 * mb_x + 1] = buffer[mb_x][1] + ptr[4 * mb_x + 2];
1175 ptr[4 * mb_x + 3] = buffer[mb_x][2] + ptr[4 * mb_x + 2];
1176 ptr[4 * mb_x + 0] = buffer[mb_x][3];
1177 }
1178 } else if (s->nb_components == 4) {
1179 for (i = 0; i < nb_components; i++) {
1180 int c = s->comp_index[i];
1181 if (s->bits <= 8) {
1182 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1183 ptr[4 * mb_x + 3 - c] = buffer[mb_x][i];
1184 }
1185 } else if (s->bits == 9) {
1186 return AVERROR_PATCHWELCOME;
1187 } else {
1188 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1189 ((uint16_t*)ptr)[4 * mb_x + c] = buffer[mb_x][i];
1190 }
1191 }
1192 }
1193 } else if (s->rct) {
1194 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1195 ptr[3 * mb_x + 1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200) >> 2);
1196 ptr[3 * mb_x + 0] = buffer[mb_x][1] + ptr[3 * mb_x + 1];
1197 ptr[3 * mb_x + 2] = buffer[mb_x][2] + ptr[3 * mb_x + 1];
1198 }
1199 } else if (s->pegasus_rct) {
1200 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1201 ptr[3 * mb_x + 1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2]) >> 2);
1202 ptr[3 * mb_x + 0] = buffer[mb_x][1] + ptr[3 * mb_x + 1];
1203 ptr[3 * mb_x + 2] = buffer[mb_x][2] + ptr[3 * mb_x + 1];
1204 }
1205 } else if (s->bayer) {
1206 if (s->bits <= 8)
1207 return AVERROR_PATCHWELCOME;
1208 if (nb_components == 1) {
1209 /* Leave decoding to the TIFF/DNG decoder (see comment in ff_mjpeg_decode_sof) */
1210 for (mb_x = 0; mb_x < s->mb_width; mb_x++)
1211 ((uint16_t*)ptr)[mb_x] = buffer[mb_x][0];
1212 } else if (nb_components == 2) {
1213 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1214 ((uint16_t*)ptr)[2 * mb_x + 0] = buffer[mb_x][0];
1215 ((uint16_t*)ptr)[2 * mb_x + 1] = buffer[mb_x][1];
1216 }
1217 }
1218 } else {
1219 for (i = 0; i < nb_components; i++) {
1220 int c = s->comp_index[i];
1221 if (s->bits <= 8) {
1222 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1223 ptr[3 * mb_x + 2 - c] = buffer[mb_x][i];
1224 }
1225 } else if (s->bits == 9) {
1226 return AVERROR_PATCHWELCOME;
1227 } else {
1228 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1229 ((uint16_t*)ptr)[3 * mb_x + 2 - c] = buffer[mb_x][i];
1230 }
1231 }
1232 }
1233 }
1234 }
1235 return 0;
1236 }
1237
1238 200 static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s)
1239 {
1240 200 int predictor = s->Ss;
1241 200 int point_transform = s->Al;
1242 200 int nb_components = s->nb_components_sos;
1243 int i, mb_x, mb_y, mask;
1244 200 int bits = (s->bits + 7) & ~7;
1245 200 int resync_mb_y = 0;
1246 200 int resync_mb_x = 0;
1247 int ret;
1248
1249 200 point_transform += bits - s->bits;
1250 200 mask = ((1 << s->bits) - 1) << point_transform;
1251
1252
2/4
✓ Branch 0 taken 200 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 200 times.
200 av_assert0(nb_components >= 1 && nb_components <= 4);
1253
1254 200 s->restart_count = -1;
1255
1256
2/2
✓ Branch 0 taken 22450 times.
✓ Branch 1 taken 200 times.
22650 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1257
2/2
✓ Branch 0 taken 3816050 times.
✓ Branch 1 taken 22450 times.
3838500 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1258 int restart;
1259 3816050 ret = ff_mjpeg_handle_restart(s, &restart);
1260
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3816050 times.
3816050 if (ret < 0)
1261 return ret;
1262
2/2
✓ Branch 0 taken 200 times.
✓ Branch 1 taken 3815850 times.
3816050 if (restart) {
1263 200 resync_mb_x = mb_x;
1264 200 resync_mb_y = mb_y;
1265 }
1266
1267
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3816050 times.
3816050 if (get_bits_left(&s->gb) < 1) {
1268 av_log(s->avctx, AV_LOG_ERROR, "bitstream end in yuv_scan\n");
1269 return AVERROR_INVALIDDATA;
1270 }
1271
1272
8/10
✓ Branch 0 taken 3793600 times.
✓ Branch 1 taken 22450 times.
✓ Branch 2 taken 3766550 times.
✓ Branch 3 taken 27050 times.
✓ Branch 4 taken 27050 times.
✓ Branch 5 taken 3739500 times.
✓ Branch 6 taken 27050 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 3766550 times.
3865550 if (!mb_x || mb_y == resync_mb_y || mb_y == resync_mb_y + 1 && mb_x < resync_mb_x || s->interlaced) {
1273
5/6
✓ Branch 0 taken 22250 times.
✓ Branch 1 taken 27250 times.
✓ Branch 2 taken 200 times.
✓ Branch 3 taken 22050 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 200 times.
49500 int toprow = mb_y == resync_mb_y || mb_y == resync_mb_y + 1 && mb_x < resync_mb_x;
1274
4/6
✓ Branch 0 taken 27050 times.
✓ Branch 1 taken 22450 times.
✓ Branch 2 taken 27050 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 27050 times.
49500 int leftcol = !mb_x || mb_y == resync_mb_y && mb_x == resync_mb_x;
1275
2/2
✓ Branch 0 taken 148500 times.
✓ Branch 1 taken 49500 times.
198000 for (i = 0; i < nb_components; i++) {
1276 uint8_t *ptr;
1277 uint16_t *ptr16;
1278 int n, h, v, x, y, c, j, linesize;
1279 148500 n = s->nb_blocks[i];
1280 148500 c = s->comp_index[i];
1281 148500 h = s->h_scount[i];
1282 148500 v = s->v_scount[i];
1283 148500 x = 0;
1284 148500 y = 0;
1285 148500 linesize = s->linesize[c];
1286
1287
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 148500 times.
148500 if (bits > 8) linesize /= 2;
1288
1289
2/2
✓ Branch 0 taken 297000 times.
✓ Branch 1 taken 148500 times.
445500 for (j = 0; j < n; j++) {
1290 int pred, dc;
1291
1292 297000 ret = mjpeg_decode_dc(s, s->dc_index[i], &dc);
1293
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 297000 times.
297000 if (ret < 0)
1294 return ret;
1295
1296
1/2
✓ Branch 0 taken 297000 times.
✗ Branch 1 not taken.
297000 if ( h * mb_x + x >= s->width
1297
1/2
✓ Branch 0 taken 297000 times.
✗ Branch 1 not taken.
297000 || v * mb_y + y >= s->height) {
1298 // Nothing to do
1299
1/2
✓ Branch 0 taken 297000 times.
✗ Branch 1 not taken.
297000 } else if (bits <= 8) {
1300 297000 ptr = s->picture_ptr->data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); // FIXME optimize this crap
1301
4/4
✓ Branch 0 taken 198000 times.
✓ Branch 1 taken 99000 times.
✓ Branch 2 taken 109000 times.
✓ Branch 3 taken 89000 times.
297000 if (y == 0 && toprow) {
1302
4/4
✓ Branch 0 taken 81750 times.
✓ Branch 1 taken 27250 times.
✓ Branch 2 taken 600 times.
✓ Branch 3 taken 81150 times.
109000 if (x == 0 && leftcol) {
1303 600 pred = 1 << (bits - 1);
1304 } else {
1305 108400 pred = ptr[-1];
1306 }
1307 } else {
1308
4/4
✓ Branch 0 taken 116250 times.
✓ Branch 1 taken 71750 times.
✓ Branch 2 taken 89200 times.
✓ Branch 3 taken 27050 times.
188000 if (x == 0 && leftcol) {
1309 89200 pred = ptr[-linesize];
1310 } else {
1311
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 98800 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
98800 PREDICT(pred, ptr[-linesize - 1], ptr[-linesize], ptr[-1], predictor);
1312 }
1313 }
1314
1315
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 297000 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
297000 if (s->interlaced && s->bottom_field)
1316 ptr += linesize >> 1;
1317 297000 pred &= mask;
1318 297000 *ptr = pred + ((unsigned)dc << point_transform);
1319 } else {
1320 ptr16 = (uint16_t*)(s->picture_ptr->data[c] + 2 * (linesize * (v * mb_y + y)) + 2 * (h * mb_x + x)); // FIXME optimize this crap
1321 if (y == 0 && toprow) {
1322 if (x == 0 && leftcol) {
1323 pred = 1 << (bits - 1);
1324 } else {
1325 pred = ptr16[-1];
1326 }
1327 } else {
1328 if (x == 0 && leftcol) {
1329 pred = ptr16[-linesize];
1330 } else {
1331 PREDICT(pred, ptr16[-linesize - 1], ptr16[-linesize], ptr16[-1], predictor);
1332 }
1333 }
1334
1335 if (s->interlaced && s->bottom_field)
1336 ptr16 += linesize >> 1;
1337 pred &= mask;
1338 *ptr16 = pred + ((unsigned)dc << point_transform);
1339 }
1340
2/2
✓ Branch 0 taken 198000 times.
✓ Branch 1 taken 99000 times.
297000 if (++x == h) {
1341 198000 x = 0;
1342 198000 y++;
1343 }
1344 }
1345 }
1346 } else {
1347
2/2
✓ Branch 0 taken 11299650 times.
✓ Branch 1 taken 3766550 times.
15066200 for (i = 0; i < nb_components; i++) {
1348 uint8_t *ptr;
1349 uint16_t *ptr16;
1350 int n, h, v, x, y, c, j, linesize, dc;
1351 11299650 n = s->nb_blocks[i];
1352 11299650 c = s->comp_index[i];
1353 11299650 h = s->h_scount[i];
1354 11299650 v = s->v_scount[i];
1355 11299650 x = 0;
1356 11299650 y = 0;
1357 11299650 linesize = s->linesize[c];
1358
1359
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 11299650 times.
11299650 if (bits > 8) linesize /= 2;
1360
1361
2/2
✓ Branch 0 taken 22599300 times.
✓ Branch 1 taken 11299650 times.
33898950 for (j = 0; j < n; j++) {
1362 int pred;
1363
1364 22599300 ret = mjpeg_decode_dc(s, s->dc_index[i], &dc);
1365
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22599300 times.
22599300 if (ret < 0)
1366 return ret;
1367
1368
1/2
✓ Branch 0 taken 22599300 times.
✗ Branch 1 not taken.
22599300 if ( h * mb_x + x >= s->width
1369
1/2
✓ Branch 0 taken 22599300 times.
✗ Branch 1 not taken.
22599300 || v * mb_y + y >= s->height) {
1370 // Nothing to do
1371
1/2
✓ Branch 0 taken 22599300 times.
✗ Branch 1 not taken.
22599300 } else if (bits <= 8) {
1372 22599300 ptr = s->picture_ptr->data[c] +
1373 22599300 (linesize * (v * mb_y + y)) +
1374 22599300 (h * mb_x + x); // FIXME optimize this crap
1375
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 22599300 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
22599300 PREDICT(pred, ptr[-linesize - 1], ptr[-linesize], ptr[-1], predictor);
1376
1377 22599300 pred &= mask;
1378 22599300 *ptr = pred + ((unsigned)dc << point_transform);
1379 } else {
1380 ptr16 = (uint16_t*)(s->picture_ptr->data[c] + 2 * (linesize * (v * mb_y + y)) + 2 * (h * mb_x + x)); // FIXME optimize this crap
1381 PREDICT(pred, ptr16[-linesize - 1], ptr16[-linesize], ptr16[-1], predictor);
1382
1383 pred &= mask;
1384 *ptr16 = pred + ((unsigned)dc << point_transform);
1385 }
1386
1387
2/2
✓ Branch 0 taken 15066200 times.
✓ Branch 1 taken 7533100 times.
22599300 if (++x == h) {
1388 15066200 x = 0;
1389 15066200 y++;
1390 }
1391 }
1392 }
1393 }
1394 }
1395 }
1396 200 return 0;
1397 }
1398
1399 786684 static av_always_inline void mjpeg_copy_block(MJpegDecodeContext *s,
1400 uint8_t *dst, const uint8_t *src,
1401 int linesize, int lowres)
1402 {
1403
1/5
✓ Branch 0 taken 786684 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
786684 switch (lowres) {
1404 786684 case 0: s->copy_block(dst, src, linesize, 8);
1405 786684 break;
1406 case 1: copy_block4(dst, src, linesize, linesize, 4);
1407 break;
1408 case 2: copy_block2(dst, src, linesize, linesize, 2);
1409 break;
1410 case 3: *dst = *src;
1411 break;
1412 }
1413 786684 }
1414
1415 11750 static void shift_output(MJpegDecodeContext *s, uint8_t *ptr, int linesize)
1416 {
1417 int block_x, block_y;
1418 11750 int size = 8 >> s->avctx->lowres;
1419
1/2
✓ Branch 0 taken 11750 times.
✗ Branch 1 not taken.
11750 if (s->bits > 8) {
1420
2/2
✓ Branch 0 taken 94000 times.
✓ Branch 1 taken 11750 times.
105750 for (block_y = 0; block_y < size; block_y++)
1421
2/2
✓ Branch 0 taken 752000 times.
✓ Branch 1 taken 94000 times.
846000 for (block_x = 0; block_x < size; block_x++)
1422 752000 *(uint16_t*)(ptr + 2 * block_x + block_y * linesize) <<= 16 - s->bits;
1423 } else {
1424 for (block_y = 0; block_y < size; block_y++)
1425 for (block_x = 0; block_x < size; block_x++)
1426 *(ptr + block_x + block_y * linesize) <<= 8 - s->bits;
1427 }
1428 11750 }
1429
1430 2153 static int mjpeg_decode_scan(MJpegDecodeContext *s)
1431 {
1432 2153 int nb_components = s->nb_components_sos;
1433 2153 int Ah = s->Ah;
1434 2153 int Al = s->Al;
1435 2153 const uint8_t *mb_bitmask = NULL;
1436 2153 const AVFrame *reference = NULL;
1437 int i, mb_x, mb_y, chroma_h_shift, chroma_v_shift, chroma_width, chroma_height;
1438 uint8_t *data[MAX_COMPONENTS];
1439 const uint8_t *reference_data[MAX_COMPONENTS];
1440 int linesize[MAX_COMPONENTS];
1441 2153 GetBitContext mb_bitmask_gb = {0}; // initialize to silence gcc warning
1442
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2152 times.
2153 int bytes_per_pixel = 1 + (s->bits > 8);
1443 2153 int field_pos = -1;
1444 int ret;
1445
1446
2/2
✓ Branch 0 taken 31 times.
✓ Branch 1 taken 2122 times.
2153 if (s->avctx->codec_id == AV_CODEC_ID_MXPEG) {
1447 31 mb_bitmask = s->mb_bitmask;
1448 31 reference = s->reference;
1449 }
1450
1451
2/2
✓ Branch 0 taken 31 times.
✓ Branch 1 taken 2122 times.
2153 if (mb_bitmask) {
1452
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 31 times.
31 if (s->mb_bitmask_size != (s->mb_width * s->mb_height + 7) >> 3) {
1453 av_log(s->avctx, AV_LOG_ERROR, "mb_bitmask_size mismatches\n");
1454 return AVERROR_INVALIDDATA;
1455 }
1456 31 init_get_bits(&mb_bitmask_gb, mb_bitmask, s->mb_width * s->mb_height);
1457 }
1458
1459 2153 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &chroma_h_shift,
1460 &chroma_v_shift);
1461 2153 chroma_width = AV_CEIL_RSHIFT(s->width, chroma_h_shift);
1462 2153 chroma_height = AV_CEIL_RSHIFT(s->height, chroma_v_shift);
1463
1464
2/2
✓ Branch 0 taken 6451 times.
✓ Branch 1 taken 2153 times.
8604 for (i = 0; i < nb_components; i++) {
1465 6451 int c = s->comp_index[i];
1466 6451 data[c] = s->picture_ptr->data[c];
1467
2/2
✓ Branch 0 taken 93 times.
✓ Branch 1 taken 6358 times.
6451 reference_data[c] = reference ? reference->data[c] : NULL;
1468 6451 linesize[c] = s->linesize[c];
1469 6451 s->coefs_finished[c] |= 1;
1470 }
1471
1472 2153 next_field:
1473 2153 s->restart_count = -1;
1474
1475
2/2
✓ Branch 0 taken 28969 times.
✓ Branch 1 taken 2153 times.
31122 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1476
2/2
✓ Branch 0 taken 809657 times.
✓ Branch 1 taken 28969 times.
838626 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1477
4/4
✓ Branch 0 taken 148800 times.
✓ Branch 1 taken 660857 times.
✓ Branch 3 taken 131114 times.
✓ Branch 4 taken 17686 times.
809657 const int copy_mb = mb_bitmask && !get_bits1(&mb_bitmask_gb);
1478 int restart;
1479
1480
2/2
✓ Branch 0 taken 56240 times.
✓ Branch 1 taken 753417 times.
809657 if (s->avctx->codec_id == AV_CODEC_ID_THP) {
1481
2/2
✓ Branch 0 taken 74 times.
✓ Branch 1 taken 56166 times.
56240 if (s->restart_count < 0) {
1482 74 ret = ff_mjpeg_unescape_sos(s);
1483
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 74 times.
74 if (ret < 0)
1484 return ret;
1485 }
1486 56240 restart = ff_mjpeg_should_restart(s);
1487
2/2
✓ Branch 0 taken 74 times.
✓ Branch 1 taken 56166 times.
56240 if (restart)
1488 74 align_get_bits(&s->gb);
1489 } else {
1490 753417 ret = ff_mjpeg_handle_restart(s, &restart);
1491
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 753417 times.
753417 if (ret < 0)
1492 return ret;
1493 }
1494
2/2
✓ Branch 0 taken 4803 times.
✓ Branch 1 taken 804854 times.
809657 if (restart) {
1495
2/2
✓ Branch 0 taken 14401 times.
✓ Branch 1 taken 4803 times.
19204 for (i = 0; i < nb_components; i++)
1496 14401 s->last_dc[i] = (4 << s->bits);
1497 }
1498
1499
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 809657 times.
809657 if (get_bits_left(&s->gb) < 0) {
1500 av_log(s->avctx, AV_LOG_ERROR, "overread %d\n",
1501 -get_bits_left(&s->gb));
1502 return AVERROR_INVALIDDATA;
1503 }
1504
2/2
✓ Branch 0 taken 2405255 times.
✓ Branch 1 taken 809657 times.
3214912 for (i = 0; i < nb_components; i++) {
1505 uint8_t *ptr;
1506 int n, h, v, x, y, c, j;
1507 int block_offset;
1508 2405255 n = s->nb_blocks[i];
1509 2405255 c = s->comp_index[i];
1510 2405255 h = s->h_scount[i];
1511 2405255 v = s->v_scount[i];
1512 2405255 x = 0;
1513 2405255 y = 0;
1514
2/2
✓ Branch 0 taken 4831046 times.
✓ Branch 1 taken 2405255 times.
7236301 for (j = 0; j < n; j++) {
1515 4831046 block_offset = (((linesize[c] * (v * mb_y + y) * 8) +
1516 4831046 (h * mb_x + x) * 8 * bytes_per_pixel) >> s->avctx->lowres);
1517
1518
4/4
✓ Branch 0 taken 90560 times.
✓ Branch 1 taken 4740486 times.
✓ Branch 2 taken 45280 times.
✓ Branch 3 taken 45280 times.
4831046 if (s->interlaced && s->bottom_field)
1519 45280 block_offset += linesize[c] >> 1;
1520
6/6
✓ Branch 0 taken 3853431 times.
✓ Branch 1 taken 977615 times.
✓ Branch 2 taken 2875916 times.
✓ Branch 3 taken 977515 times.
✓ Branch 4 taken 4828521 times.
✓ Branch 5 taken 2525 times.
4831046 if ( 8 * (h * mb_x + x) < ((c == 1) || (c == 2) ? chroma_width : s->width)
1521
6/6
✓ Branch 0 taken 3850914 times.
✓ Branch 1 taken 977607 times.
✓ Branch 2 taken 2873399 times.
✓ Branch 3 taken 977515 times.
✓ Branch 4 taken 4822317 times.
✓ Branch 5 taken 6204 times.
4828521 && 8 * (v * mb_y + y) < ((c == 1) || (c == 2) ? chroma_height : s->height)) {
1522 4822317 ptr = data[c] + block_offset;
1523 } else
1524 8729 ptr = NULL;
1525
2/2
✓ Branch 0 taken 4830170 times.
✓ Branch 1 taken 876 times.
4831046 if (!s->progressive) {
1526
2/2
✓ Branch 0 taken 786684 times.
✓ Branch 1 taken 4043486 times.
4830170 if (copy_mb) {
1527
1/2
✓ Branch 0 taken 786684 times.
✗ Branch 1 not taken.
786684 if (ptr)
1528 786684 mjpeg_copy_block(s, ptr, reference_data[c] + block_offset,
1529 786684 linesize[c], s->avctx->lowres);
1530
1531 } else {
1532 4043486 s->bdsp.clear_block(s->block);
1533
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4043486 times.
4043486 if (decode_block(s, s->block, i,
1534 s->dc_index[i], s->ac_index[i],
1535 4043486 s->quant_matrixes[s->quant_sindex[i]]) < 0) {
1536 av_log(s->avctx, AV_LOG_ERROR,
1537 "error y=%d x=%d\n", mb_y, mb_x);
1538 return AVERROR_INVALIDDATA;
1539 }
1540
3/4
✓ Branch 0 taken 4034773 times.
✓ Branch 1 taken 8713 times.
✓ Branch 2 taken 4034773 times.
✗ Branch 3 not taken.
4043486 if (ptr && linesize[c]) {
1541 4034773 s->idsp.idct_put(ptr, linesize[c], s->block);
1542
2/2
✓ Branch 0 taken 11750 times.
✓ Branch 1 taken 4023023 times.
4034773 if (s->bits & 7)
1543 11750 shift_output(s, ptr, linesize[c]);
1544 }
1545 }
1546 } else {
1547 876 int block_idx = s->block_stride[c] * (v * mb_y + y) +
1548 876 (h * mb_x + x);
1549 876 int16_t *block = s->blocks[c][block_idx];
1550
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 876 times.
876 if (Ah)
1551 block[0] += get_bits1(&s->gb) *
1552 s->quant_matrixes[s->quant_sindex[i]][0] << Al;
1553
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 876 times.
876 else if (decode_dc_progressive(s, block, i, s->dc_index[i],
1554 876 s->quant_matrixes[s->quant_sindex[i]],
1555 Al) < 0) {
1556 av_log(s->avctx, AV_LOG_ERROR,
1557 "error y=%d x=%d\n", mb_y, mb_x);
1558 return AVERROR_INVALIDDATA;
1559 }
1560 }
1561 ff_dlog(s->avctx, "mb: %d %d processed\n", mb_y, mb_x);
1562 ff_dlog(s->avctx, "%d %d %d %d %d %d %d %d \n",
1563 mb_x, mb_y, x, y, c, s->bottom_field,
1564 (v * mb_y + y) * 8, (h * mb_x + x) * 8);
1565
2/2
✓ Branch 0 taken 3518673 times.
✓ Branch 1 taken 1312373 times.
4831046 if (++x == h) {
1566 3518673 x = 0;
1567 3518673 y++;
1568 }
1569 }
1570 }
1571 }
1572 }
1573
1574
3/4
✓ Branch 0 taken 38 times.
✓ Branch 1 taken 2115 times.
✓ Branch 2 taken 38 times.
✗ Branch 3 not taken.
2191 if (s->interlaced &&
1575
1/2
✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
76 bytestream2_get_bytes_left(&s->gB) > 2 &&
1576
1/2
✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
76 bytestream2_tell(&s->gB) > 2 &&
1577 38 bytestream2_tell(&s->gB) != field_pos &&
1578
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 38 times.
38 s->gB.buffer[-2] == 0xFF &&
1579 s->gB.buffer[-1] == 0xD1) {
1580 av_log(s->avctx, AV_LOG_DEBUG, "AVRn interlaced picture marker found\n");
1581 field_pos = bytestream2_tell(&s->gB);
1582 s->bottom_field ^= 1;
1583
1584 goto next_field;
1585 }
1586
1587 2153 return 0;
1588 }
1589
1590 59 static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s)
1591 {
1592 59 int Ss = s->Ss;
1593 59 int Se = s->Se;
1594 59 int Ah = s->Ah;
1595 59 int Al = s->Al;
1596 int mb_x, mb_y;
1597 59 int EOBRUN = 0;
1598 59 int c = s->comp_index[0];
1599 59 uint16_t *quant_matrix = s->quant_matrixes[s->quant_sindex[0]];
1600
1601
3/6
✓ Branch 0 taken 59 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 59 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 59 times.
59 av_assert0(Ss >= 0 && Ah >= 0 && Al >= 0);
1602
2/4
✓ Branch 0 taken 59 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 59 times.
59 if (Se < Ss || Se > 63) {
1603 av_log(s->avctx, AV_LOG_ERROR, "SS/SE %d/%d is invalid\n", Ss, Se);
1604 return AVERROR_INVALIDDATA;
1605 }
1606
1607 // s->coefs_finished is a bitmask for coefficients coded
1608 // Ss and Se are parameters telling start and end coefficients
1609 59 s->coefs_finished[c] |= (2ULL << Se) - (1ULL << Ss);
1610
1611 59 s->restart_count = -1;
1612
1613
2/2
✓ Branch 0 taken 412 times.
✓ Branch 1 taken 59 times.
471 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1614 412 int block_idx = mb_y * s->block_stride[c];
1615 412 int16_t (*block)[64] = &s->blocks[c][block_idx];
1616 412 uint8_t *last_nnz = &s->last_nnz[c][block_idx];
1617
2/2
✓ Branch 0 taken 2416 times.
✓ Branch 1 taken 412 times.
2828 for (mb_x = 0; mb_x < s->mb_width; mb_x++, block++, last_nnz++) {
1618 int ret;
1619 int restart;
1620 2416 ret = ff_mjpeg_handle_restart(s, &restart);
1621
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2416 times.
2416 if (ret < 0)
1622 return ret;
1623
2/2
✓ Branch 0 taken 59 times.
✓ Branch 1 taken 2357 times.
2416 if (restart)
1624 59 EOBRUN = 0;
1625
1626
2/2
✓ Branch 0 taken 1080 times.
✓ Branch 1 taken 1336 times.
2416 if (Ah)
1627 1080 ret = decode_block_refinement(s, *block, last_nnz, s->ac_index[0],
1628 quant_matrix, Ss, Se, Al, &EOBRUN);
1629 else
1630 1336 ret = decode_block_progressive(s, *block, last_nnz, s->ac_index[0],
1631 quant_matrix, Ss, Se, Al, &EOBRUN);
1632
1633
2/4
✓ Branch 0 taken 2416 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2416 times.
2416 if (ret >= 0 && get_bits_left(&s->gb) < 0)
1634 ret = AVERROR_INVALIDDATA;
1635
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2416 times.
2416 if (ret < 0) {
1636 av_log(s->avctx, AV_LOG_ERROR,
1637 "error y=%d x=%d\n", mb_y, mb_x);
1638 return AVERROR_INVALIDDATA;
1639 }
1640 }
1641 }
1642 59 return 0;
1643 }
1644
1645 7 static void mjpeg_idct_scan_progressive_ac(MJpegDecodeContext *s)
1646 {
1647 int mb_x, mb_y;
1648 int c;
1649
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 const int bytes_per_pixel = 1 + (s->bits > 8);
1650
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 const int block_size = s->lossless ? 1 : 8;
1651
1652
2/2
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 7 times.
28 for (c = 0; c < s->nb_components; c++) {
1653 21 uint8_t *data = s->picture_ptr->data[c];
1654 21 int linesize = s->linesize[c];
1655 21 int h = s->h_max / s->h_count[c];
1656 21 int v = s->v_max / s->v_count[c];
1657 21 int mb_width = (s->width + h * block_size - 1) / (h * block_size);
1658 21 int mb_height = (s->height + v * block_size - 1) / (v * block_size);
1659
1660
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 21 times.
21 if (~s->coefs_finished[c])
1661 av_log(s->avctx, AV_LOG_WARNING, "component %d is incomplete\n", c);
1662
1663
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
21 if (s->interlaced && s->bottom_field)
1664 data += linesize >> 1;
1665
1666
2/2
✓ Branch 0 taken 153 times.
✓ Branch 1 taken 21 times.
174 for (mb_y = 0; mb_y < mb_height; mb_y++) {
1667 153 uint8_t *ptr = data + (mb_y * linesize * 8 >> s->avctx->lowres);
1668 153 int block_idx = mb_y * s->block_stride[c];
1669 153 int16_t (*block)[64] = &s->blocks[c][block_idx];
1670
2/2
✓ Branch 0 taken 860 times.
✓ Branch 1 taken 153 times.
1013 for (mb_x = 0; mb_x < mb_width; mb_x++, block++) {
1671 860 s->idsp.idct_put(ptr, linesize, *block);
1672
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 860 times.
860 if (s->bits & 7)
1673 shift_output(s, ptr, linesize);
1674 860 ptr += bytes_per_pixel * 8 >> s->avctx->lowres;
1675 }
1676 }
1677 }
1678 7 }
1679
1680 2633 int ff_mjpeg_decode_sos(MJpegDecodeContext *s)
1681 {
1682 int len, i, h, v;
1683 int index, id, ret;
1684
2/2
✓ Branch 0 taken 421 times.
✓ Branch 1 taken 2212 times.
2633 const int block_size = s->lossless ? 1 : 8;
1685
1686
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2633 times.
2633 if (!s->got_picture) {
1687 av_log(s->avctx, AV_LOG_WARNING,
1688 "Can not process SOS before SOF, skipping\n");
1689 return AVERROR_INVALIDDATA;
1690 }
1691
1692 2633 ret = mjpeg_parse_len(s, &len, "sos");
1693
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2633 times.
2633 if (ret < 0)
1694 return ret;
1695
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2633 times.
2633 if (len < 1)
1696 return AVERROR_INVALIDDATA;
1697 2633 s->nb_components_sos = bytestream2_get_byteu(&s->gB);
1698
2/4
✓ Branch 0 taken 2633 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2633 times.
2633 if (s->nb_components_sos == 0 || s->nb_components_sos > MAX_COMPONENTS) {
1699 avpriv_report_missing_feature(s->avctx,
1700 "decode_sos: nb_components (%d)",
1701 s->nb_components_sos);
1702 return AVERROR_PATCHWELCOME;
1703 }
1704
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2633 times.
2633 if (len != 4 + 2 * s->nb_components_sos) {
1705 av_log(s->avctx, AV_LOG_ERROR, "decode_sos: len(%d) mismatch %d components\n", len, s->nb_components_sos);
1706 return AVERROR_INVALIDDATA;
1707 }
1708
2/2
✓ Branch 0 taken 7745 times.
✓ Branch 1 taken 2633 times.
10378 for (i = 0; i < s->nb_components_sos; i++) {
1709 7745 id = bytestream2_get_byteu(&s->gB);
1710 7745 av_log(s->avctx, AV_LOG_DEBUG, "component: %d\n", id);
1711 /* find component index */
1712
1/2
✓ Branch 0 taken 15479 times.
✗ Branch 1 not taken.
15479 for (index = 0; index < s->nb_components; index++)
1713
2/2
✓ Branch 0 taken 7745 times.
✓ Branch 1 taken 7734 times.
15479 if (id == s->component_id[index])
1714 7745 break;
1715
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7745 times.
7745 if (index == s->nb_components) {
1716 av_log(s->avctx, AV_LOG_ERROR,
1717 "decode_sos: index(%d) out of components\n", index);
1718 return AVERROR_INVALIDDATA;
1719 }
1720 /* Metasoft MJPEG codec has Cb and Cr swapped */
1721
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7745 times.
7745 if (s->avctx->codec_tag == MKTAG('M', 'T', 'S', 'J')
1722 && s->nb_components_sos == 3 && s->nb_components == 3 && i)
1723 index = 3 - i;
1724
1725 7745 s->quant_sindex[i] = s->quant_index[index];
1726 7745 s->nb_blocks[i] = s->h_count[index] * s->v_count[index];
1727 7745 s->h_scount[i] = s->h_count[index];
1728 7745 s->v_scount[i] = s->v_count[index];
1729
1730 7745 s->comp_index[i] = index;
1731
1732 7745 uint8_t b = bytestream2_get_byteu(&s->gB);
1733 7745 s->dc_index[i] = b >> 4;
1734 7745 s->ac_index[i] = b & 0x0F;
1735
1736
2/4
✓ Branch 0 taken 7745 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7745 times.
✗ Branch 3 not taken.
7745 if (s->dc_index[i] < 0 || s->ac_index[i] < 0 ||
1737
2/4
✓ Branch 0 taken 7745 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 7745 times.
7745 s->dc_index[i] >= 4 || s->ac_index[i] >= 4)
1738 goto out_of_range;
1739
5/8
✓ Branch 0 taken 7745 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 80 times.
✓ Branch 3 taken 7665 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 80 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 7665 times.
7745 if (!s->vlcs[0][s->dc_index[i]].table || !(s->progressive ? s->vlcs[2][s->ac_index[0]].table : s->vlcs[1][s->ac_index[i]].table))
1740 goto out_of_range;
1741 }
1742
1743 2633 s->Ss = bytestream2_get_byteu(&s->gB); /* JPEG Ss / lossless JPEG predictor / JPEG-LS NEAR */
1744 2633 s->Se = bytestream2_get_byteu(&s->gB); /* JPEG Se / JPEG-LS ILV */
1745 2633 uint8_t b = bytestream2_get_byteu(&s->gB);
1746 2633 s->Ah = b >> 4; /* Ah */
1747 2633 s->Al = b & 0x0F; /* Al */
1748
1749
2/2
✓ Branch 0 taken 2556 times.
✓ Branch 1 taken 77 times.
2633 if (s->nb_components_sos > 1) {
1750 /* interleaved stream */
1751 2556 s->mb_width = (s->width + s->h_max * block_size - 1) / (s->h_max * block_size);
1752 2556 s->mb_height = (s->height + s->v_max * block_size - 1) / (s->v_max * block_size);
1753
2/2
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 14 times.
77 } else if (!s->ls) { /* skip this for JPEG-LS */
1754 63 h = s->h_max / s->h_scount[0];
1755 63 v = s->v_max / s->v_scount[0];
1756 63 s->mb_width = (s->width + h * block_size - 1) / (h * block_size);
1757 63 s->mb_height = (s->height + v * block_size - 1) / (v * block_size);
1758 63 s->nb_blocks[0] = 1;
1759 63 s->h_scount[0] = 1;
1760 63 s->v_scount[0] = 1;
1761 }
1762
1763
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2633 times.
2633 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1764 av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d ilv:%d bits:%d skip:%d %s comp:%d\n",
1765 s->lossless ? "lossless" : "sequential DCT", s->rgb ? "RGB" : "",
1766 s->Ss, s->Al, s->Se, s->bits, s->mjpb_skiptosod,
1767 s->pegasus_rct ? "PRCT" : (s->rct ? "RCT" : ""), s->nb_components_sos);
1768
1769
1770 /* mjpeg-b can have padding bytes between sos and image data, skip them */
1771
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 2601 times.
2633 if (s->mjpb_skiptosod)
1772 32 bytestream2_skip(&s->gB, s->mjpb_skiptosod);
1773
1774
4/4
✓ Branch 0 taken 2565 times.
✓ Branch 1 taken 68 times.
✓ Branch 2 taken 2144 times.
✓ Branch 3 taken 421 times.
2633 if (!s->progressive && !s->lossless &&
1775
2/2
✓ Branch 0 taken 2113 times.
✓ Branch 1 taken 31 times.
2144 s->avctx->codec_id != AV_CODEC_ID_MXPEG) {
1776 2113 s->nb_seq_component_scans += s->nb_components_sos;
1777
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2113 times.
2113 if (s->nb_seq_component_scans > s->nb_components) {
1778 av_log(s->avctx, AV_LOG_ERROR,
1779 "too many scans for a sequential image\n");
1780 return AVERROR_INVALIDDATA;
1781 }
1782 }
1783
1784
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2633 times.
2633 if (s->avctx->hwaccel) {
1785 const uint8_t *buf_ptr;
1786 size_t buf_size;
1787
1788 mjpeg_find_raw_scan_data(s, &buf_ptr, &buf_size);
1789
1790 ret = FF_HW_CALL(s->avctx, decode_slice, buf_ptr, buf_size);
1791 if (ret < 0)
1792 return ret;
1793
1794 } else {
1795
2/2
✓ Branch 0 taken 421 times.
✓ Branch 1 taken 2212 times.
2633 if (s->lossless) {
1796
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 421 times.
421 av_assert0(s->picture_ptr == s->picture);
1797
2/2
✓ Branch 0 taken 221 times.
✓ Branch 1 taken 200 times.
421 if (CONFIG_JPEGLS_DECODER && s->ls) {
1798
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 221 times.
221 if ((ret = ff_jpegls_decode_picture(s)) < 0)
1799 return ret;
1800 } else {
1801
2/4
✓ Branch 0 taken 200 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 200 times.
200 if (s->rgb || s->bayer) {
1802 if ((ret = ljpeg_decode_rgb_scan(s)) < 0)
1803 return ret;
1804 } else {
1805
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 200 times.
200 if ((ret = ljpeg_decode_yuv_scan(s)) < 0)
1806 return ret;
1807 }
1808 }
1809 } else {
1810
4/4
✓ Branch 0 taken 68 times.
✓ Branch 1 taken 2144 times.
✓ Branch 2 taken 59 times.
✓ Branch 3 taken 9 times.
2212 if (s->progressive && s->Ss) {
1811
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 59 times.
59 av_assert0(s->picture_ptr == s->picture);
1812
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 59 times.
59 if ((ret = mjpeg_decode_scan_progressive_ac(s)) < 0)
1813 return ret;
1814 } else {
1815
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2153 times.
2153 if ((ret = mjpeg_decode_scan(s)) < 0)
1816 return ret;
1817 }
1818 }
1819 }
1820
1821
2/2
✓ Branch 0 taken 2627 times.
✓ Branch 1 taken 6 times.
2633 if (s->avctx->codec_id == AV_CODEC_ID_MEDIA100 ||
1822
2/2
✓ Branch 0 taken 2601 times.
✓ Branch 1 taken 26 times.
2627 s->avctx->codec_id == AV_CODEC_ID_MJPEGB ||
1823
2/2
✓ Branch 0 taken 74 times.
✓ Branch 1 taken 2527 times.
2601 s->avctx->codec_id == AV_CODEC_ID_THP) {
1824 /* Add the amount of bits read from the unescaped image data buffer
1825 * into the GetByteContext. */
1826 106 bytestream2_skipu(&s->gB, (get_bits_count(&s->gb) + 7) / 8);
1827 }
1828
1829 2633 return 0;
1830 out_of_range:
1831 av_log(s->avctx, AV_LOG_ERROR, "decode_sos: ac/dc index out of range\n");
1832 return AVERROR_INVALIDDATA;
1833 }
1834
1835 220 static int mjpeg_decode_dri(MJpegDecodeContext *s)
1836 {
1837
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 220 times.
220 if (bytestream2_get_be16u(&s->gB) != 4)
1838 return AVERROR_INVALIDDATA;
1839 220 s->restart_interval = bytestream2_get_be16u(&s->gB);
1840 220 av_log(s->avctx, AV_LOG_DEBUG, "restart interval: %d\n",
1841 s->restart_interval);
1842
1843 220 return 0;
1844 }
1845
1846 244 static int mjpeg_decode_app(MJpegDecodeContext *s, int start_code)
1847 {
1848 int len, id, i;
1849
1850 244 int ret = mjpeg_parse_len(s, &len, "app");
1851
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 244 times.
244 if (ret < 0)
1852 return AVERROR_INVALIDDATA;
1853
1854
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 244 times.
244 if (len < 4) {
1855 if (s->avctx->err_recognition & AV_EF_EXPLODE)
1856 return AVERROR_INVALIDDATA;
1857 av_log(s->avctx, AV_LOG_VERBOSE, "skipping APPx stub (len=%" PRId32 ")\n", len);
1858 goto out;
1859 }
1860
1861 244 id = bytestream2_get_be32u(&s->gB);
1862 244 len -= 4;
1863
1864
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 244 times.
244 if (s->avctx->debug & FF_DEBUG_STARTCODE)
1865 av_log(s->avctx, AV_LOG_DEBUG, "APPx (%s / %8X) len=%d\n",
1866 av_fourcc2str(av_bswap32(id)), id, len);
1867
1868 /* This fourcc is used by non-avid files too, it holds some
1869 information, but it's always present in AVID-created files. */
1870
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 226 times.
244 if (id == AV_RB32("AVI1")) {
1871 /* structure:
1872 4bytes AVI1
1873 1bytes polarity
1874 1bytes always zero
1875 4bytes field_size
1876 4bytes field_size_less_padding
1877 */
1878
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (len < 1)
1879 goto out;
1880 18 i = bytestream2_get_byteu(&s->gB); len--;
1881 18 av_log(s->avctx, AV_LOG_DEBUG, "polarity %d\n", i);
1882 18 goto out;
1883 }
1884
1885
2/2
✓ Branch 0 taken 156 times.
✓ Branch 1 taken 70 times.
226 if (id == AV_RB32("JFIF")) {
1886 int t_w, t_h, v1, v2;
1887
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 156 times.
156 if (len < 8)
1888 goto out;
1889 156 bytestream2_skipu(&s->gB, 1); /* the trailing zero-byte */
1890 156 v1 = bytestream2_get_byteu(&s->gB);
1891 156 v2 = bytestream2_get_byteu(&s->gB);
1892 156 bytestream2_skipu(&s->gB, 1);
1893
1894 156 s->avctx->sample_aspect_ratio.num = bytestream2_get_be16u(&s->gB);
1895 156 s->avctx->sample_aspect_ratio.den = bytestream2_get_be16u(&s->gB);
1896
1/2
✓ Branch 0 taken 156 times.
✗ Branch 1 not taken.
156 if ( s->avctx->sample_aspect_ratio.num <= 0
1897
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 156 times.
156 || s->avctx->sample_aspect_ratio.den <= 0) {
1898 s->avctx->sample_aspect_ratio.num = 0;
1899 s->avctx->sample_aspect_ratio.den = 1;
1900 }
1901
1902
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 156 times.
156 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1903 av_log(s->avctx, AV_LOG_INFO,
1904 "mjpeg: JFIF header found (version: %x.%x) SAR=%d/%d\n",
1905 v1, v2,
1906 s->avctx->sample_aspect_ratio.num,
1907 s->avctx->sample_aspect_ratio.den);
1908
1909 156 len -= 8;
1910
2/2
✓ Branch 0 taken 154 times.
✓ Branch 1 taken 2 times.
156 if (len >= 2) {
1911 154 t_w = bytestream2_get_byteu(&s->gB);
1912 154 t_h = bytestream2_get_byteu(&s->gB);
1913
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 154 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
154 if (t_w && t_h) {
1914 /* skip thumbnail */
1915 if (len - 10 - (t_w * t_h * 3) > 0)
1916 len -= t_w * t_h * 3;
1917 }
1918 154 len -= 2;
1919 }
1920 156 goto out;
1921 }
1922
1923
2/2
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 53 times.
70 if ( id == AV_RB32("Adob")
1924
1/2
✓ Branch 0 taken 17 times.
✗ Branch 1 not taken.
17 && len >= 8
1925
1/2
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
17 && bytestream2_peek_byteu(&s->gB) == 'e'
1926
1/2
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
17 && bytestream2_peek_be32u(&s->gB) != AV_RB32("e_CM")) {
1927 17 bytestream2_skipu(&s->gB, 1); /* 'e' */
1928 17 bytestream2_skipu(&s->gB, 2); /* version */
1929 17 bytestream2_skipu(&s->gB, 2); /* flags0 */
1930 17 bytestream2_skipu(&s->gB, 2); /* flags1 */
1931 17 s->adobe_transform = bytestream2_get_byteu(&s->gB);
1932
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
17 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1933 av_log(s->avctx, AV_LOG_INFO, "mjpeg: Adobe header found, transform=%d\n", s->adobe_transform);
1934 17 len -= 8;
1935 17 goto out;
1936 }
1937
1938
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 53 times.
53 if (id == AV_RB32("LJIF")) {
1939 int rgb = s->rgb;
1940 int pegasus_rct = s->pegasus_rct;
1941 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1942 av_log(s->avctx, AV_LOG_INFO,
1943 "Pegasus lossless jpeg header found\n");
1944 if (len < 9)
1945 goto out;
1946 bytestream2_skipu(&s->gB, 2); /* version ? */
1947 bytestream2_skipu(&s->gB, 2); /* unknown always 0? */
1948 bytestream2_skipu(&s->gB, 2); /* unknown always 0? */
1949 bytestream2_skipu(&s->gB, 2); /* unknown always 0? */
1950 switch (i = bytestream2_get_byteu(&s->gB)) {
1951 case 1:
1952 rgb = 1;
1953 pegasus_rct = 0;
1954 break;
1955 case 2:
1956 rgb = 1;
1957 pegasus_rct = 1;
1958 break;
1959 default:
1960 av_log(s->avctx, AV_LOG_ERROR, "unknown colorspace %d\n", i);
1961 }
1962
1963 len -= 9;
1964 if (s->bayer)
1965 goto out;
1966 if (s->got_picture)
1967 if (rgb != s->rgb || pegasus_rct != s->pegasus_rct) {
1968 av_log(s->avctx, AV_LOG_WARNING, "Mismatching LJIF tag\n");
1969 goto out;
1970 }
1971
1972 s->rgb = rgb;
1973 s->pegasus_rct = pegasus_rct;
1974
1975 goto out;
1976 }
1977
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 45 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
53 if (id == AV_RL32("colr") && len > 0) {
1978 8 s->colr = bytestream2_get_byteu(&s->gB);
1979
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1980 av_log(s->avctx, AV_LOG_INFO, "COLR %d\n", s->colr);
1981 8 len--;
1982 8 goto out;
1983 }
1984
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
45 if (id == AV_RL32("xfrm") && len > 0) {
1985 s->xfrm = bytestream2_get_byteu(&s->gB);
1986 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1987 av_log(s->avctx, AV_LOG_INFO, "XFRM %d\n", s->xfrm);
1988 len--;
1989 goto out;
1990 }
1991
1992 /* JPS extension by VRex */
1993
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
45 if (start_code == APP3 && id == AV_RB32("_JPS") && len >= 10) {
1994 int flags, layout, type;
1995 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1996 av_log(s->avctx, AV_LOG_INFO, "_JPSJPS_\n");
1997
1998 bytestream2_skipu(&s->gB, 4); len -= 4; /* JPS_ */
1999 bytestream2_skipu(&s->gB, 2); len -= 2; /* block length */
2000 bytestream2_skipu(&s->gB, 1); /* reserved */
2001 flags = bytestream2_get_byteu(&s->gB);
2002 layout = bytestream2_get_byteu(&s->gB);
2003 type = bytestream2_get_byteu(&s->gB);
2004 len -= 4;
2005
2006 av_freep(&s->stereo3d);
2007 s->stereo3d = av_stereo3d_alloc();
2008 if (!s->stereo3d) {
2009 goto out;
2010 }
2011 if (type == 0) {
2012 s->stereo3d->type = AV_STEREO3D_2D;
2013 } else if (type == 1) {
2014 switch (layout) {
2015 case 0x01:
2016 s->stereo3d->type = AV_STEREO3D_LINES;
2017 break;
2018 case 0x02:
2019 s->stereo3d->type = AV_STEREO3D_SIDEBYSIDE;
2020 break;
2021 case 0x03:
2022 s->stereo3d->type = AV_STEREO3D_TOPBOTTOM;
2023 break;
2024 }
2025 if (!(flags & 0x04)) {
2026 s->stereo3d->flags = AV_STEREO3D_FLAG_INVERT;
2027 }
2028 }
2029 goto out;
2030 }
2031
2032 /* EXIF metadata */
2033
5/6
✓ Branch 0 taken 31 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 29 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 29 times.
✗ Branch 5 not taken.
45 if (start_code == APP1 && id == AV_RB32("Exif") && len >= 2) {
2034 int ret;
2035
2036 29 bytestream2_skipu(&s->gB, 2); // skip padding
2037 29 len -= 2;
2038
2039
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 29 times.
29 if (s->exif_metadata.entries) {
2040 av_log(s->avctx, AV_LOG_WARNING, "multiple EXIF\n");
2041 goto out;
2042 }
2043
2044 29 ret = av_exif_parse_buffer(s->avctx, s->gB.buffer, len, &s->exif_metadata, AV_EXIF_TIFF_HEADER);
2045
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 29 times.
29 if (ret < 0) {
2046 av_log(s->avctx, AV_LOG_WARNING, "unable to parse EXIF buffer\n");
2047 goto out;
2048 }
2049
2050 29 bytestream2_skipu(&s->gB, ret);
2051 29 len -= ret;
2052
2053 29 goto out;
2054 }
2055
2056 /* Apple MJPEG-A */
2057
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
16 if ((start_code == APP1) && (len > (0x28 - 8))) {
2058 2 id = bytestream2_get_be32u(&s->gB);
2059 2 len -= 4;
2060 /* Apple MJPEG-A */
2061
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (id == AV_RB32("mjpg")) {
2062 /* structure:
2063 4bytes field size
2064 4bytes pad field size
2065 4bytes next off
2066 4bytes quant off
2067 4bytes huff off
2068 4bytes image off
2069 4bytes scan off
2070 4bytes data off
2071 */
2072 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
2073 av_log(s->avctx, AV_LOG_INFO, "mjpeg: Apple MJPEG-A header found\n");
2074 }
2075 }
2076
2077
4/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 10 times.
16 if (start_code == APP2 && id == AV_RB32("ICC_") && len >= 10) {
2078 int id2;
2079 unsigned seqno;
2080 unsigned nummarkers;
2081
2082 10 id = bytestream2_get_be32u(&s->gB);
2083 10 id2 = bytestream2_get_be24u(&s->gB);
2084 10 len -= 7;
2085
2/4
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
10 if (id != AV_RB32("PROF") || id2 != AV_RB24("ILE")) {
2086 av_log(s->avctx, AV_LOG_WARNING, "Invalid ICC_PROFILE header in APP2\n");
2087 goto out;
2088 }
2089
2090 10 bytestream2_skipu(&s->gB, 1);
2091 10 seqno = bytestream2_get_byteu(&s->gB);
2092 10 len -= 2;
2093
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (seqno == 0) {
2094 av_log(s->avctx, AV_LOG_WARNING, "Invalid sequence number in APP2\n");
2095 goto out;
2096 }
2097
2098 10 nummarkers = bytestream2_get_byteu(&s->gB);
2099 10 len -= 1;
2100
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (nummarkers == 0) {
2101 av_log(s->avctx, AV_LOG_WARNING, "Invalid number of markers coded in APP2\n");
2102 goto out;
2103
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
10 } else if (s->iccnum != 0 && nummarkers != s->iccnum) {
2104 av_log(s->avctx, AV_LOG_WARNING, "Mismatch in coded number of ICC markers between markers\n");
2105 goto out;
2106
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 } else if (seqno > nummarkers) {
2107 av_log(s->avctx, AV_LOG_WARNING, "Mismatching sequence number and coded number of ICC markers\n");
2108 goto out;
2109 }
2110
2111 /* Allocate if this is the first APP2 we've seen. */
2112
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (s->iccnum == 0) {
2113
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
10 if (!FF_ALLOCZ_TYPED_ARRAY(s->iccentries, nummarkers)) {
2114 av_log(s->avctx, AV_LOG_ERROR, "Could not allocate ICC data arrays\n");
2115 return AVERROR(ENOMEM);
2116 }
2117 10 s->iccnum = nummarkers;
2118 }
2119
2120
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (s->iccentries[seqno - 1].data) {
2121 av_log(s->avctx, AV_LOG_WARNING, "Duplicate ICC sequence number\n");
2122 goto out;
2123 }
2124
2125 10 s->iccentries[seqno - 1].length = len;
2126 10 s->iccentries[seqno - 1].data = av_malloc(len);
2127
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (!s->iccentries[seqno - 1].data) {
2128 av_log(s->avctx, AV_LOG_ERROR, "Could not allocate ICC data buffer\n");
2129 return AVERROR(ENOMEM);
2130 }
2131
2132 10 bytestream2_get_bufferu(&s->gB, s->iccentries[seqno - 1].data, len);
2133 10 len = 0;
2134 10 s->iccread++;
2135
2136
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (s->iccread > s->iccnum)
2137 av_log(s->avctx, AV_LOG_WARNING, "Read more ICC markers than are supposed to be coded\n");
2138 }
2139
2140 16 out:
2141 /* slow but needed for extreme adobe jpegs */
2142
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 244 times.
244 if (len < 0)
2143 av_log(s->avctx, AV_LOG_ERROR,
2144 "mjpeg: error, decode_app parser read over the end\n");
2145
2/2
✓ Branch 0 taken 53 times.
✓ Branch 1 taken 191 times.
244 if (len > 0)
2146 53 bytestream2_skipu(&s->gB, len);
2147
2148 244 return 0;
2149 }
2150
2151 240 static int mjpeg_decode_com(MJpegDecodeContext *s)
2152 {
2153 int len;
2154 240 int ret = mjpeg_parse_len(s, &len, "com");
2155
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 if (ret < 0)
2156 return ret;
2157
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 if (!len)
2158 return 0;
2159
2160 int i;
2161 240 char *cbuf = av_malloc(len + 1);
2162
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 if (!cbuf)
2163 return AVERROR(ENOMEM);
2164
2165
2/2
✓ Branch 0 taken 3655 times.
✓ Branch 1 taken 240 times.
3895 for (i = 0; i < len; i++)
2166 3655 cbuf[i] = bytestream2_get_byteu(&s->gB);
2167
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 230 times.
240 if (cbuf[i - 1] == '\n')
2168 10 cbuf[i - 1] = 0;
2169 else
2170 230 cbuf[i] = 0;
2171
2172
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
2173 av_log(s->avctx, AV_LOG_INFO, "comment: '%s'\n", cbuf);
2174
2175 /* buggy avid, it puts EOI only at every 10th frame */
2176
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 229 times.
240 if (!strncmp(cbuf, "AVID", 4)) {
2177 11 parse_avid(s, cbuf, len);
2178
2/2
✓ Branch 0 taken 205 times.
✓ Branch 1 taken 24 times.
229 } else if (!strcmp(cbuf, "CS=ITU601"))
2179 205 s->cs_itu601 = 1;
2180
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
24 else if ((!strncmp(cbuf, "Intel(R) JPEG Library, version 1", 32) && s->avctx->codec_tag) ||
2181
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 (!strncmp(cbuf, "Metasoft MJPEG Codec", 20)))
2182 s->flipped = 1;
2183
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 else if (!strcmp(cbuf, "MULTISCOPE II")) {
2184 s->avctx->sample_aspect_ratio = (AVRational) { 1, 2 };
2185 s->multiscope = 2;
2186 }
2187
2188 240 av_free(cbuf);
2189
2190 240 return 0;
2191 }
2192
2193 /* return the 8 bit start code value and update the search
2194 state. Return -1 if no start code found */
2195 16465 int ff_mjpeg_find_marker(const uint8_t **pbuf_ptr, const uint8_t *buf_end)
2196 {
2197 const uint8_t *buf_ptr;
2198 int val;
2199
2200 16465 buf_ptr = *pbuf_ptr;
2201
2/2
✓ Branch 0 taken 16464 times.
✓ Branch 1 taken 1 times.
32930 while ((buf_ptr = memchr(buf_ptr, 0xff, buf_end - buf_ptr))) {
2202 16464 buf_ptr++;
2203
1/2
✓ Branch 0 taken 16470 times.
✗ Branch 1 not taken.
16470 while (buf_ptr < buf_end) {
2204 16470 val = *buf_ptr++;
2205
2/2
✓ Branch 0 taken 16464 times.
✓ Branch 1 taken 6 times.
16470 if (val != 0xff) {
2206
2/4
✓ Branch 0 taken 16464 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 16464 times.
✗ Branch 3 not taken.
16464 if ((val >= SOF0) && (val <= COM))
2207 16464 goto found;
2208 break;
2209 }
2210 }
2211 }
2212 1 buf_ptr = buf_end;
2213 1 val = -1;
2214 16465 found:
2215 ff_dlog(NULL, "find_marker skipped %td bytes\n",
2216 (buf_ptr - *pbuf_ptr) - (val < 0 ? 0 : 2));
2217 16465 *pbuf_ptr = buf_ptr;
2218 16465 return val;
2219 }
2220
2221 static void mjpeg_find_raw_scan_data(MJpegDecodeContext *s,
2222 const uint8_t **pbuf_ptr, size_t *pbuf_size)
2223 {
2224 const uint8_t *buf_ptr = s->gB.buffer;
2225 const uint8_t *buf_end = buf_ptr + bytestream2_get_bytes_left(&s->gB);
2226
2227 /* Find size of image data buffer (including restart markers).
2228 * No unescaping is performed. */
2229 const uint8_t *ptr = buf_ptr;
2230 while ((ptr = memchr(ptr, 0xff, buf_end - ptr))) {
2231 ptr++;
2232 if (ptr < buf_end) {
2233 uint8_t x = *ptr++;
2234 /* Discard multiple optional 0xFF fill bytes. */
2235 while (x == 0xff && ptr < buf_end)
2236 x = *ptr++;
2237 if (x && (x < RST0 || x > RST7)) {
2238 /* Non-restart marker */
2239 ptr -= 2;
2240 goto found_hw;
2241 }
2242 }
2243 }
2244 ptr = buf_end;
2245 found_hw:
2246 *pbuf_ptr = buf_ptr;
2247 *pbuf_size = ptr - buf_ptr;
2248 bytestream2_skipu(&s->gB, *pbuf_size);
2249 }
2250
2251 5979 int ff_mjpeg_unescape_sos(MJpegDecodeContext *s)
2252 {
2253 5979 const uint8_t *buf_ptr = s->gB.buffer;
2254 5979 const uint8_t *buf_end = buf_ptr + bytestream2_get_bytes_left(&s->gB);
2255 const uint8_t *unescaped_buf_ptr;
2256 size_t unescaped_buf_size;
2257
2258
2/2
✓ Branch 0 taken 5973 times.
✓ Branch 1 taken 6 times.
5979 if (s->avctx->codec_id == AV_CODEC_ID_MEDIA100 ||
2259
2/2
✓ Branch 0 taken 5947 times.
✓ Branch 1 taken 26 times.
5973 s->avctx->codec_id == AV_CODEC_ID_MJPEGB ||
2260
2/2
✓ Branch 0 taken 74 times.
✓ Branch 1 taken 5873 times.
5947 s->avctx->codec_id == AV_CODEC_ID_THP) {
2261 /* The image data buffer is already unescaped. The only way to
2262 * find the size of the buffer is by fully decoding it. */
2263 106 unescaped_buf_ptr = buf_ptr;
2264 106 unescaped_buf_size = buf_end - buf_ptr;
2265 106 goto the_end;
2266 }
2267
2268 5873 av_fast_padded_malloc(&s->buffer, &s->buffer_size, buf_end - buf_ptr);
2269
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5873 times.
5873 if (!s->buffer)
2270 return AVERROR(ENOMEM);
2271
2272 /* unescape buffer of SOS, use special treatment for JPEG-LS */
2273
2/2
✓ Branch 0 taken 4956 times.
✓ Branch 1 taken 917 times.
5873 if (!s->ls) {
2274 4956 const uint8_t *src = buf_ptr;
2275 4956 const uint8_t *ptr = src;
2276 4956 uint8_t *dst = s->buffer;
2277 PutByteContext pb;
2278
2279 4956 bytestream2_init_writer(&pb, dst, buf_end - src);
2280
2281
1/2
✓ Branch 0 taken 209233 times.
✗ Branch 1 not taken.
214189 while ((ptr = memchr(ptr, 0xff, buf_end - ptr))) {
2282 209233 ptr++;
2283
1/2
✓ Branch 0 taken 209233 times.
✗ Branch 1 not taken.
209233 if (ptr < buf_end) {
2284 /* Copy verbatim data. */
2285 209233 ptrdiff_t length = (ptr - 1) - src;
2286
2/2
✓ Branch 0 taken 208999 times.
✓ Branch 1 taken 234 times.
209233 if (length > 0)
2287 208999 bytestream2_put_bufferu(&pb, src, length);
2288
2289 209233 uint8_t x = *ptr++;
2290 /* Discard multiple optional 0xFF fill bytes. */
2291
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 209233 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
209245 while (x == 0xff && ptr < buf_end)
2292 12 x = *ptr++;
2293
2294 209233 src = ptr;
2295
2/2
✓ Branch 0 taken 204277 times.
✓ Branch 1 taken 4956 times.
209233 if (x == 0) {
2296 /* Stuffed zero byte */
2297 204277 bytestream2_put_byteu(&pb, 0xff);
2298
4/4
✓ Branch 0 taken 4909 times.
✓ Branch 1 taken 47 times.
✓ Branch 2 taken 2650 times.
✓ Branch 3 taken 2259 times.
4956 } else if (x >= RST0 && x <= RST7) {
2299 /* Restart marker */
2300 2650 goto found;
2301 } else {
2302 /* Non-restart marker */
2303 2306 ptr -= 2;
2304 2306 goto found;
2305 }
2306 }
2307 }
2308 /* Copy remaining verbatim data. */
2309 ptr = buf_end;
2310 ptrdiff_t length = ptr - src;
2311 if (length > 0)
2312 bytestream2_put_bufferu(&pb, src, length);
2313
2314 found:
2315 4956 unescaped_buf_ptr = s->buffer;
2316 4956 unescaped_buf_size = bytestream2_tell_p(&pb);
2317 4956 memset(s->buffer + unescaped_buf_size, 0,
2318 AV_INPUT_BUFFER_PADDING_SIZE);
2319
2320 4956 bytestream2_skipu(&s->gB, ptr - buf_ptr);
2321
2322 4956 av_log(s->avctx, AV_LOG_DEBUG, "escaping removed %td bytes\n",
2323 4956 (buf_end - buf_ptr) - (unescaped_buf_size));
2324 } else {
2325 917 const uint8_t *src = buf_ptr;
2326 917 const uint8_t *ptr = src;
2327 917 uint8_t *dst = s->buffer;
2328 PutBitContext pb;
2329
2330 917 init_put_bits(&pb, dst, buf_end - src);
2331
2332
1/2
✓ Branch 0 taken 154921 times.
✗ Branch 1 not taken.
155838 while ((ptr = memchr(ptr, 0xff, buf_end - ptr))) {
2333 154921 ptr++;
2334
1/2
✓ Branch 0 taken 154921 times.
✗ Branch 1 not taken.
154921 if (ptr < buf_end) {
2335 /* Copy verbatim data. */
2336 154921 ptrdiff_t length = (ptr - 1) - src;
2337
2/2
✓ Branch 0 taken 145117 times.
✓ Branch 1 taken 9804 times.
154921 if (length > 0)
2338 145117 ff_copy_bits(&pb, src, length * 8);
2339
2340 154921 uint8_t x = *ptr++;
2341 /* Discard multiple optional 0xFF fill bytes. */
2342
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 154921 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
154921 while (x == 0xff && ptr < buf_end)
2343 x = *ptr++;
2344
2345 154921 src = ptr;
2346
2/2
✓ Branch 0 taken 154004 times.
✓ Branch 1 taken 917 times.
154921 if (!(x & 0x80)) {
2347 /* Stuffed zero bit */
2348 154004 put_bits(&pb, 15, 0x7f80 | x);
2349
3/4
✓ Branch 0 taken 917 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 696 times.
✓ Branch 3 taken 221 times.
917 } else if (x >= RST0 && x <= RST7) {
2350 /* Restart marker */
2351 696 goto found_ls;
2352 } else {
2353 /* Non-restart marker */
2354 221 ptr -= 2;
2355 221 goto found_ls;
2356 }
2357 }
2358 }
2359 /* Copy remaining verbatim data. */
2360 ptr = buf_end;
2361 ptrdiff_t length = ptr - src;
2362 if (length > 0)
2363 ff_copy_bits(&pb, src, length * 8);
2364
2365 found_ls:
2366 917 flush_put_bits(&pb);
2367
2368 917 unescaped_buf_ptr = dst;
2369 917 unescaped_buf_size = put_bytes_output(&pb);
2370 917 memset(s->buffer + unescaped_buf_size, 0,
2371 AV_INPUT_BUFFER_PADDING_SIZE);
2372
2373 917 bytestream2_skipu(&s->gB, ptr - buf_ptr);
2374 }
2375
2376 5979 the_end:
2377 5979 return init_get_bits8(&s->gb, unescaped_buf_ptr, unescaped_buf_size);
2378 }
2379
2380 253 static void reset_icc_profile(MJpegDecodeContext *s)
2381 {
2382 int i;
2383
2384
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 243 times.
253 if (s->iccentries) {
2385
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
20 for (i = 0; i < s->iccnum; i++)
2386 10 av_freep(&s->iccentries[i].data);
2387 10 av_freep(&s->iccentries);
2388 }
2389
2390 253 s->iccread = 0;
2391 253 s->iccnum = 0;
2392 253 }
2393
2394 2603 int ff_mjpeg_decode_frame_from_buf(AVCodecContext *avctx, AVFrame *frame,
2395 int *got_frame, const AVPacket *avpkt,
2396 const uint8_t *buf, const int buf_size)
2397 {
2398 2603 MJpegDecodeContext *s = avctx->priv_data;
2399 const uint8_t *buf_end, *buf_ptr;
2400 int hshift, vshift;
2401 int start_code;
2402 int index;
2403 2603 int ret = 0;
2404 int is16bit;
2405
2406 2603 s->force_pal8 = 0;
2407 2603 s->total_ls_decoded_height = 0;
2408
2409 2603 s->buf_size = buf_size;
2410
2411 2603 av_exif_free(&s->exif_metadata);
2412 2603 av_freep(&s->stereo3d);
2413 2603 s->adobe_transform = -1;
2414
2415
1/2
✓ Branch 0 taken 2603 times.
✗ Branch 1 not taken.
2603 if (s->iccnum != 0)
2416 reset_icc_profile(s);
2417
2418 2603 redo_for_pal8:
2419 2611 buf_ptr = buf;
2420 2611 buf_end = buf + buf_size;
2421
1/2
✓ Branch 0 taken 16263 times.
✗ Branch 1 not taken.
16263 while (buf_ptr < buf_end) {
2422 /* find start next marker */
2423 16263 start_code = ff_mjpeg_find_marker(&buf_ptr, buf_end);
2424 /* EOF */
2425
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 16262 times.
16263 if (start_code < 0)
2426 1 break;
2427
2428 16262 ptrdiff_t bytes_left = buf_end - buf_ptr;
2429
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16262 times.
16262 if (bytes_left > INT_MAX / 8) {
2430 av_log(avctx, AV_LOG_ERROR,
2431 "MJPEG packet 0x%x too big (%td/%d), corrupt data?\n",
2432 start_code, bytes_left, buf_size);
2433 return AVERROR_INVALIDDATA;
2434 }
2435 16262 av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%td\n",
2436 start_code, buf_end - buf_ptr);
2437
2438 16262 bytestream2_init(&s->gB, buf_ptr, bytes_left);
2439
2440
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16262 times.
16262 if (avctx->debug & FF_DEBUG_STARTCODE)
2441 av_log(avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code);
2442
2443 /* process markers */
2444
3/4
✓ Branch 0 taken 11232 times.
✓ Branch 1 taken 5030 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 11232 times.
16262 if (start_code >= RST0 && start_code <= RST7) {
2445 av_log(avctx, AV_LOG_DEBUG,
2446 "restart marker: %d\n", start_code & 0x0f);
2447 /* APP fields */
2448
4/4
✓ Branch 0 taken 725 times.
✓ Branch 1 taken 15537 times.
✓ Branch 2 taken 244 times.
✓ Branch 3 taken 481 times.
16262 } else if (start_code >= APP0 && start_code <= APP15) {
2449
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 244 times.
244 if ((ret = mjpeg_decode_app(s, start_code)) < 0)
2450 av_log(avctx, AV_LOG_ERROR, "unable to decode APP fields: %s\n",
2451 av_err2str(ret));
2452 /* Comment */
2453
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 15778 times.
16018 } else if (start_code == COM) {
2454 240 ret = mjpeg_decode_com(s);
2455
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 if (ret < 0)
2456 return ret;
2457
2/2
✓ Branch 0 taken 2592 times.
✓ Branch 1 taken 13186 times.
15778 } else if (start_code == DQT) {
2458 2592 ret = ff_mjpeg_decode_dqt(s);
2459
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2592 times.
2592 if (ret < 0)
2460 return ret;
2461 }
2462
2463 16262 ret = -1;
2464
2465 if (!CONFIG_JPEGLS_DECODER &&
2466 (start_code == SOF55 || start_code == LSE)) {
2467 av_log(avctx, AV_LOG_ERROR, "JPEG-LS support not enabled.\n");
2468 return AVERROR(ENOSYS);
2469 }
2470
2471
2/2
✓ Branch 0 taken 507 times.
✓ Branch 1 taken 15755 times.
16262 if (avctx->skip_frame == AVDISCARD_ALL) {
2472
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 407 times.
507 switch (start_code) {
2473 100 case SOF0:
2474 case SOF1:
2475 case SOF2:
2476 case SOF3:
2477 case SOF55:
2478 100 break;
2479 407 default:
2480 407 goto skip;
2481 }
2482 }
2483
2484
11/12
✓ Branch 0 taken 2513 times.
✓ Branch 1 taken 2602 times.
✓ Branch 2 taken 2169 times.
✓ Branch 3 taken 14 times.
✓ Branch 4 taken 205 times.
✓ Branch 5 taken 225 times.
✓ Branch 6 taken 16 times.
✓ Branch 7 taken 2505 times.
✓ Branch 8 taken 2570 times.
✓ Branch 9 taken 220 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2816 times.
15855 switch (start_code) {
2485 2513 case SOI:
2486 2513 s->restart_interval = 0;
2487 2513 s->raw_image_buffer = buf_ptr;
2488 2513 s->raw_image_buffer_size = buf_end - buf_ptr;
2489 /* nothing to do on SOI */
2490 2513 break;
2491 2602 case DHT:
2492
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2602 times.
2602 if ((ret = ff_mjpeg_decode_dht(s)) < 0) {
2493 av_log(avctx, AV_LOG_ERROR, "huffman table decode error\n");
2494 goto fail;
2495 }
2496 2602 break;
2497 2169 case SOF0:
2498 case SOF1:
2499
2/2
✓ Branch 0 taken 2167 times.
✓ Branch 1 taken 2 times.
2169 if (start_code == SOF0)
2500 2167 avctx->profile = AV_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT;
2501 else
2502 2 avctx->profile = AV_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT;
2503 2169 s->lossless = 0;
2504 2169 s->ls = 0;
2505 2169 s->progressive = 0;
2506
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2169 times.
2169 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2507 goto fail;
2508 2169 break;
2509 14 case SOF2:
2510 14 avctx->profile = AV_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT;
2511 14 s->lossless = 0;
2512 14 s->ls = 0;
2513 14 s->progressive = 1;
2514
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 14 times.
14 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2515 goto fail;
2516 14 break;
2517 205 case SOF3:
2518 205 avctx->profile = AV_PROFILE_MJPEG_HUFFMAN_LOSSLESS;
2519 205 s->lossless = 1;
2520 205 s->ls = 0;
2521 205 s->progressive = 0;
2522
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 205 times.
205 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2523 goto fail;
2524 205 break;
2525 225 case SOF55:
2526 225 avctx->profile = AV_PROFILE_MJPEG_JPEG_LS;
2527 225 s->lossless = 1;
2528 225 s->ls = 1;
2529 225 s->progressive = 0;
2530
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 225 times.
225 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2531 goto fail;
2532 225 break;
2533 16 case LSE:
2534
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
16 if (!CONFIG_JPEGLS_DECODER ||
2535 16 (ret = ff_jpegls_decode_lse(s)) < 0)
2536 goto fail;
2537
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
16 if (ret == 1)
2538 8 goto redo_for_pal8;
2539 8 break;
2540 case EOI:
2541 2505 eoi_parser:
2542
1/2
✓ Branch 0 taken 2505 times.
✗ Branch 1 not taken.
2505 if (!avctx->hwaccel &&
2543
4/6
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 2498 times.
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
2505 s->progressive && s->cur_scan && s->got_picture)
2544 7 mjpeg_idct_scan_progressive_ac(s);
2545 2505 s->cur_scan = 0;
2546
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2505 times.
2505 if (!s->got_picture) {
2547 av_log(avctx, AV_LOG_WARNING,
2548 "Found EOI before any SOF, ignoring\n");
2549 break;
2550 }
2551
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2499 times.
2505 if (s->interlaced) {
2552 6 s->bottom_field ^= 1;
2553 /* if not bottom field, do not output image yet */
2554
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 if (s->bottom_field == !s->interlace_polarity)
2555 3 break;
2556 }
2557
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2502 times.
2502 if (avctx->hwaccel) {
2558 ret = FF_HW_SIMPLE_CALL(avctx, end_frame);
2559 if (ret < 0)
2560 return ret;
2561
2562 av_freep(&s->hwaccel_picture_private);
2563 }
2564
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2502 times.
2502 if ((ret = av_frame_ref(frame, s->picture_ptr)) < 0)
2565 return ret;
2566
2/2
✓ Branch 0 taken 417 times.
✓ Branch 1 taken 2085 times.
2502 if (s->lossless)
2567 417 frame->flags |= AV_FRAME_FLAG_LOSSLESS;
2568 2502 *got_frame = 1;
2569 2502 s->got_picture = 0;
2570
2571
3/4
✓ Branch 0 taken 2085 times.
✓ Branch 1 taken 417 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2085 times.
2502 if (!s->lossless && avctx->debug & FF_DEBUG_QP) {
2572 int qp = FFMAX3(s->qscale[0],
2573 s->qscale[1],
2574 s->qscale[2]);
2575
2576 av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", qp);
2577 }
2578
2579 2502 goto the_end;
2580 2570 case SOS:
2581 2570 s->cur_scan++;
2582
2583
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2570 times.
2570 if ((ret = ff_mjpeg_decode_sos(s)) < 0 &&
2584 (avctx->err_recognition & AV_EF_EXPLODE))
2585 goto fail;
2586 2570 break;
2587 220 case DRI:
2588
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 220 times.
220 if ((ret = mjpeg_decode_dri(s)) < 0)
2589 return ret;
2590 220 break;
2591 case SOF5:
2592 case SOF6:
2593 case SOF7:
2594 case SOF9:
2595 case SOF10:
2596 case SOF11:
2597 case SOF13:
2598 case SOF14:
2599 case SOF15:
2600 case JPG:
2601 av_log(avctx, AV_LOG_ERROR,
2602 "mjpeg: unsupported coding type (%x)\n", start_code);
2603 break;
2604 }
2605
2606
2/2
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 13245 times.
13345 if (avctx->skip_frame == AVDISCARD_ALL) {
2607
1/2
✓ Branch 0 taken 100 times.
✗ Branch 1 not taken.
100 switch (start_code) {
2608 100 case SOF0:
2609 case SOF1:
2610 case SOF2:
2611 case SOF3:
2612 case SOF55:
2613 100 s->got_picture = 0;
2614 100 goto the_end_no_picture;
2615 }
2616 }
2617
2618 13245 skip:
2619 /* eof process start code */
2620 13652 buf_ptr += bytestream2_tell(&s->gB);
2621 13652 av_log(avctx, AV_LOG_DEBUG,
2622 "marker parser used %d bytes\n",
2623 13652 bytestream2_tell(&s->gB));
2624 }
2625
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1 if (s->got_picture && s->cur_scan) {
2626 av_log(avctx, AV_LOG_WARNING, "EOI missing, emulating\n");
2627 goto eoi_parser;
2628 }
2629 1 av_log(avctx, AV_LOG_FATAL, "No JPEG data found in image\n");
2630 1 return AVERROR_INVALIDDATA;
2631 fail:
2632 s->got_picture = 0;
2633 return ret;
2634 2502 the_end:
2635
2636 2502 is16bit = av_pix_fmt_desc_get(avctx->pix_fmt)->comp[0].step > 1;
2637
2638
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2496 times.
2502 if (AV_RB32(s->upscale_h)) {
2639 int p;
2640
15/28
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 3 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 3 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 3 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 3 times.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 3 times.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
6 av_assert0(avctx->pix_fmt == AV_PIX_FMT_YUVJ444P ||
2641 avctx->pix_fmt == AV_PIX_FMT_YUV444P ||
2642 avctx->pix_fmt == AV_PIX_FMT_YUVJ440P ||
2643 avctx->pix_fmt == AV_PIX_FMT_YUV440P ||
2644 avctx->pix_fmt == AV_PIX_FMT_YUVA444P ||
2645 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
2646 avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
2647 avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
2648 avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
2649 avctx->pix_fmt == AV_PIX_FMT_YUV420P16||
2650 avctx->pix_fmt == AV_PIX_FMT_YUVA420P ||
2651 avctx->pix_fmt == AV_PIX_FMT_YUVA420P16||
2652 avctx->pix_fmt == AV_PIX_FMT_GBRP ||
2653 avctx->pix_fmt == AV_PIX_FMT_GBRAP
2654 );
2655 6 ret = av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &hshift, &vshift);
2656
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (ret)
2657 return ret;
2658
2659
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 av_assert0(s->nb_components == av_pix_fmt_count_planes(s->picture_ptr->format));
2660
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
24 for (p = 0; p < s->nb_components; p++) {
2661 18 uint8_t *line = s->picture_ptr->data[p];
2662 18 int w = s->width;
2663 18 int h = s->height;
2664
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 9 times.
18 if (!s->upscale_h[p])
2665 9 continue;
2666
4/4
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 2 times.
9 if (p == 1 || p == 2) {
2667 7 w = AV_CEIL_RSHIFT(w, hshift);
2668 7 h = AV_CEIL_RSHIFT(h, vshift);
2669 }
2670
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 8 times.
9 if (s->upscale_v[p] == 1)
2671 1 h = (h + 1) >> 1;
2672
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
9 av_assert0(w > 0);
2673
2/2
✓ Branch 0 taken 534 times.
✓ Branch 1 taken 9 times.
543 for (int i = 0; i < h; i++) {
2674
2/2
✓ Branch 0 taken 214 times.
✓ Branch 1 taken 320 times.
534 if (s->upscale_h[p] == 1) {
2675
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 214 times.
214 if (is16bit) ((uint16_t*)line)[w - 1] = ((uint16_t*)line)[(w - 1) / 2];
2676 214 else line[w - 1] = line[(w - 1) / 2];
2677
2/2
✓ Branch 0 taken 11220 times.
✓ Branch 1 taken 214 times.
11434 for (index = w - 2; index > 0; index--) {
2678
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 11220 times.
11220 if (is16bit)
2679 ((uint16_t*)line)[index] = (((uint16_t*)line)[index / 2] + ((uint16_t*)line)[(index + 1) / 2]) >> 1;
2680 else
2681 11220 line[index] = (line[index / 2] + line[(index + 1) / 2]) >> 1;
2682 }
2683
2/2
✓ Branch 0 taken 256 times.
✓ Branch 1 taken 64 times.
320 } else if (s->upscale_h[p] == 2) {
2684
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 256 times.
256 if (is16bit) {
2685 ((uint16_t*)line)[w - 1] = ((uint16_t*)line)[(w - 1) / 3];
2686 if (w > 1)
2687 ((uint16_t*)line)[w - 2] = ((uint16_t*)line)[w - 1];
2688 } else {
2689 256 line[w - 1] = line[(w - 1) / 3];
2690
1/2
✓ Branch 0 taken 256 times.
✗ Branch 1 not taken.
256 if (w > 1)
2691 256 line[w - 2] = line[w - 1];
2692 }
2693
2/2
✓ Branch 0 taken 15616 times.
✓ Branch 1 taken 256 times.
15872 for (index = w - 3; index > 0; index--) {
2694 15616 line[index] = (line[index / 3] + line[(index + 1) / 3] + line[(index + 2) / 3] + 1) / 3;
2695 }
2696
1/2
✓ Branch 0 taken 64 times.
✗ Branch 1 not taken.
64 } else if (s->upscale_h[p] == 4) {
2697
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
64 if (is16bit) {
2698 uint16_t *line16 = (uint16_t *) line;
2699 line16[w - 1] = line16[(w - 1) >> 2];
2700 if (w > 1)
2701 line16[w - 2] = (line16[(w - 1) >> 2] * 3 + line16[(w - 2) >> 2]) >> 2;
2702 if (w > 2)
2703 line16[w - 3] = (line16[(w - 1) >> 2] + line16[(w - 2) >> 2]) >> 1;
2704 } else {
2705 64 line[w - 1] = line[(w - 1) >> 2];
2706
1/2
✓ Branch 0 taken 64 times.
✗ Branch 1 not taken.
64 if (w > 1)
2707 64 line[w - 2] = (line[(w - 1) >> 2] * 3 + line[(w - 2) >> 2]) >> 2;
2708
1/2
✓ Branch 0 taken 64 times.
✗ Branch 1 not taken.
64 if (w > 2)
2709 64 line[w - 3] = (line[(w - 1) >> 2] + line[(w - 2) >> 2]) >> 1;
2710 }
2711
2/2
✓ Branch 0 taken 3840 times.
✓ Branch 1 taken 64 times.
3904 for (index = w - 4; index > 0; index--)
2712 3840 line[index] = (line[(index + 3) >> 2] + line[(index + 2) >> 2]
2713 3840 + line[(index + 1) >> 2] + line[index >> 2]) >> 2;
2714 }
2715 534 line += s->linesize[p];
2716 }
2717 }
2718 }
2719
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2501 times.
2502 if (AV_RB32(s->upscale_v)) {
2720 int p;
2721
12/26
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
1 av_assert0(avctx->pix_fmt == AV_PIX_FMT_YUVJ444P ||
2722 avctx->pix_fmt == AV_PIX_FMT_YUV444P ||
2723 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
2724 avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
2725 avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
2726 avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
2727 avctx->pix_fmt == AV_PIX_FMT_YUV440P ||
2728 avctx->pix_fmt == AV_PIX_FMT_YUVJ440P ||
2729 avctx->pix_fmt == AV_PIX_FMT_YUVA444P ||
2730 avctx->pix_fmt == AV_PIX_FMT_YUVA420P ||
2731 avctx->pix_fmt == AV_PIX_FMT_YUVA420P16||
2732 avctx->pix_fmt == AV_PIX_FMT_GBRP ||
2733 avctx->pix_fmt == AV_PIX_FMT_GBRAP
2734 );
2735 1 ret = av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &hshift, &vshift);
2736
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (ret)
2737 return ret;
2738
2739
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
1 av_assert0(s->nb_components == av_pix_fmt_count_planes(s->picture_ptr->format));
2740
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
4 for (p = 0; p < s->nb_components; p++) {
2741 uint8_t *dst;
2742 3 int w = s->width;
2743 3 int h = s->height;
2744
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
3 if (!s->upscale_v[p])
2745 2 continue;
2746
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 if (p == 1 || p == 2) {
2747 1 w = AV_CEIL_RSHIFT(w, hshift);
2748 1 h = AV_CEIL_RSHIFT(h, vshift);
2749 }
2750 1 dst = &((uint8_t *)s->picture_ptr->data[p])[(h - 1) * s->linesize[p]];
2751
2/2
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 1 times.
43 for (int i = h - 1; i; i--) {
2752 42 uint8_t *src1 = &((uint8_t *)s->picture_ptr->data[p])[i * s->upscale_v[p] / (s->upscale_v[p] + 1) * s->linesize[p]];
2753 42 uint8_t *src2 = &((uint8_t *)s->picture_ptr->data[p])[(i + 1) * s->upscale_v[p] / (s->upscale_v[p] + 1) * s->linesize[p]];
2754
4/6
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 21 times.
✓ Branch 3 taken 21 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 21 times.
42 if (s->upscale_v[p] != 2 && (src1 == src2 || i == h - 1)) {
2755 21 memcpy(dst, src1, w);
2756 } else {
2757
2/2
✓ Branch 0 taken 1344 times.
✓ Branch 1 taken 21 times.
1365 for (index = 0; index < w; index++)
2758 1344 dst[index] = (src1[index] + src2[index]) >> 1;
2759 }
2760 42 dst -= s->linesize[p];
2761 }
2762 }
2763 }
2764
4/6
✓ Branch 0 taken 369 times.
✓ Branch 1 taken 2133 times.
✓ Branch 2 taken 369 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 369 times.
✗ Branch 5 not taken.
2502 if (s->flipped && !s->rgb && !s->bayer) {
2765 369 ret = av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &hshift, &vshift);
2766
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 369 times.
369 if (ret)
2767 return ret;
2768
2769
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 369 times.
369 av_assert0(s->nb_components == av_pix_fmt_count_planes(frame->format));
2770
2/2
✓ Branch 0 taken 1107 times.
✓ Branch 1 taken 369 times.
1476 for (index = 0; index < s->nb_components; index++) {
2771 1107 int h = frame->height;
2772
3/4
✓ Branch 0 taken 738 times.
✓ Branch 1 taken 369 times.
✓ Branch 2 taken 738 times.
✗ Branch 3 not taken.
1107 if (index && index < 3)
2773 738 h = AV_CEIL_RSHIFT(h, vshift);
2774
1/2
✓ Branch 0 taken 1107 times.
✗ Branch 1 not taken.
1107 if (frame->data[index]) {
2775 1107 frame->data[index] += (h - 1) * frame->linesize[index];
2776 1107 frame->linesize[index] *= -1;
2777 }
2778 }
2779 }
2780
2781
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2497 times.
2502 if (avctx->pix_fmt == AV_PIX_FMT_GBRP) {
2782
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
5 av_assert0(s->nb_components == 3);
2783 5 FFSWAP(uint8_t *, frame->data[0], frame->data[2]);
2784 5 FFSWAP(uint8_t *, frame->data[0], frame->data[1]);
2785 5 FFSWAP(int, frame->linesize[0], frame->linesize[2]);
2786 5 FFSWAP(int, frame->linesize[0], frame->linesize[1]);
2787 }
2788
2789
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2494 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
2502 if (s->adobe_transform == 0 && avctx->pix_fmt == AV_PIX_FMT_GBRAP) {
2790 int w = s->picture_ptr->width;
2791 int h = s->picture_ptr->height;
2792 av_assert0(s->nb_components == 4);
2793 for (int i = 0; i < h; i++) {
2794 int j;
2795 uint8_t *dst[4];
2796 for (index = 0; index < 4; index++) {
2797 dst[index] = s->picture_ptr->data[index]
2798 + s->picture_ptr->linesize[index]*i;
2799 }
2800 for (j = 0; j < w; j++) {
2801 int k = dst[3][j];
2802 int r = dst[0][j] * k;
2803 int g = dst[1][j] * k;
2804 int b = dst[2][j] * k;
2805 dst[0][j] = g * 257 >> 16;
2806 dst[1][j] = b * 257 >> 16;
2807 dst[2][j] = r * 257 >> 16;
2808 }
2809 memset(dst[3], 255, w);
2810 }
2811 }
2812
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2502 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2502 if (s->adobe_transform == 2 && avctx->pix_fmt == AV_PIX_FMT_YUVA444P) {
2813 int w = s->picture_ptr->width;
2814 int h = s->picture_ptr->height;
2815 av_assert0(s->nb_components == 4);
2816 for (int i = 0; i < h; i++) {
2817 int j;
2818 uint8_t *dst[4];
2819 for (index = 0; index < 4; index++) {
2820 dst[index] = s->picture_ptr->data[index]
2821 + s->picture_ptr->linesize[index]*i;
2822 }
2823 for (j = 0; j < w; j++) {
2824 int k = dst[3][j];
2825 int r = (255 - dst[0][j]) * k;
2826 int g = (128 - dst[1][j]) * k;
2827 int b = (128 - dst[2][j]) * k;
2828 dst[0][j] = r * 257 >> 16;
2829 dst[1][j] = (g * 257 >> 16) + 128;
2830 dst[2][j] = (b * 257 >> 16) + 128;
2831 }
2832 memset(dst[3], 255, w);
2833 }
2834 }
2835
2836
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2502 times.
2502 if (s->stereo3d) {
2837 AVStereo3D *stereo = av_stereo3d_create_side_data(frame);
2838 if (stereo) {
2839 stereo->type = s->stereo3d->type;
2840 stereo->flags = s->stereo3d->flags;
2841 }
2842 av_freep(&s->stereo3d);
2843 }
2844
2845
3/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2497 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
2502 if (s->iccnum != 0 && s->iccnum == s->iccread) {
2846 AVFrameSideData *sd;
2847 5 size_t offset = 0;
2848 5 int total_size = 0;
2849
2850 /* Sum size of all parts. */
2851
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10 for (int i = 0; i < s->iccnum; i++)
2852 5 total_size += s->iccentries[i].length;
2853
2854 5 ret = ff_frame_new_side_data(avctx, frame, AV_FRAME_DATA_ICC_PROFILE, total_size, &sd);
2855
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
5 if (ret < 0) {
2856 av_log(avctx, AV_LOG_ERROR, "Could not allocate frame side data\n");
2857 return ret;
2858 }
2859
2860
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
5 if (sd) {
2861 /* Reassemble the parts, which are now in-order. */
2862
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10 for (int i = 0; i < s->iccnum; i++) {
2863 5 memcpy(sd->data + offset, s->iccentries[i].data, s->iccentries[i].length);
2864 5 offset += s->iccentries[i].length;
2865 }
2866 }
2867 }
2868
2869
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2494 times.
2502 if (s->exif_metadata.entries) {
2870 8 ret = ff_decode_exif_attach_ifd(avctx, frame, &s->exif_metadata);
2871 8 av_exif_free(&s->exif_metadata);
2872
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (ret < 0)
2873 av_log(avctx, AV_LOG_WARNING, "couldn't attach EXIF metadata\n");
2874 }
2875
2876
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2499 times.
2502 if (avctx->codec_id != AV_CODEC_ID_SMVJPEG &&
2877
1/2
✓ Branch 0 taken 2499 times.
✗ Branch 1 not taken.
2499 (avctx->codec_tag == MKTAG('A', 'V', 'R', 'n') ||
2878
2/2
✓ Branch 0 taken 2489 times.
✓ Branch 1 taken 10 times.
2499 avctx->codec_tag == MKTAG('A', 'V', 'D', 'J')) &&
2879
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 avctx->coded_height > s->orig_height) {
2880 10 frame->height = AV_CEIL_RSHIFT(avctx->coded_height, avctx->lowres);
2881 10 frame->crop_top = frame->height - avctx->height;
2882 }
2883
2884 2492 the_end_no_picture:
2885 2602 av_log(avctx, AV_LOG_DEBUG, "decode frame unused %td bytes\n",
2886 buf_end - buf_ptr);
2887 2602 return buf_ptr - buf;
2888 }
2889
2890 2223 int ff_mjpeg_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame,
2891 AVPacket *avpkt)
2892 {
2893 4446 return ff_mjpeg_decode_frame_from_buf(avctx, frame, got_frame,
2894 2223 avpkt, avpkt->data, avpkt->size);
2895 }
2896
2897
2898 /* mxpeg may call the following function (with a blank MJpegDecodeContext)
2899 * even without having called ff_mjpeg_decode_init(). */
2900 253 av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
2901 {
2902 253 MJpegDecodeContext *s = avctx->priv_data;
2903 int i, j;
2904
2905
3/8
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 244 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
253 if (s->interlaced && s->bottom_field == !s->interlace_polarity && s->got_picture && !avctx->frame_num) {
2906 av_log(avctx, AV_LOG_INFO, "Single field\n");
2907 }
2908
2909 253 av_frame_free(&s->picture);
2910 253 s->picture_ptr = NULL;
2911
2912 253 av_frame_free(&s->smv_frame);
2913
2914 253 av_freep(&s->buffer);
2915 253 av_freep(&s->stereo3d);
2916 253 av_freep(&s->ljpeg_buffer);
2917 253 s->ljpeg_buffer_size = 0;
2918
2919
2/2
✓ Branch 0 taken 759 times.
✓ Branch 1 taken 253 times.
1012 for (i = 0; i < 3; i++) {
2920
2/2
✓ Branch 0 taken 3036 times.
✓ Branch 1 taken 759 times.
3795 for (j = 0; j < 4; j++)
2921 3036 ff_vlc_free(&s->vlcs[i][j]);
2922 }
2923
2/2
✓ Branch 0 taken 1012 times.
✓ Branch 1 taken 253 times.
1265 for (i = 0; i < MAX_COMPONENTS; i++) {
2924 1012 av_freep(&s->blocks[i]);
2925 1012 av_freep(&s->last_nnz[i]);
2926 }
2927 253 av_exif_free(&s->exif_metadata);
2928
2929 253 reset_icc_profile(s);
2930
2931 253 av_freep(&s->hwaccel_picture_private);
2932 253 av_freep(&s->jls_state);
2933
2934 253 return 0;
2935 }
2936
2937 static av_cold void decode_flush(AVCodecContext *avctx)
2938 {
2939 MJpegDecodeContext *s = avctx->priv_data;
2940 s->got_picture = 0;
2941
2942 s->smv_next_frame = 0;
2943 av_frame_unref(s->smv_frame);
2944 }
2945
2946 #if CONFIG_MJPEG_DECODER
2947 #if FF_API_MJPEG_EXTERN_HUFF
2948 #define OFFSET(x) offsetof(MJpegDecodeContext, x)
2949 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2950 static const AVOption options[] = {
2951 { "extern_huff", "Use external huffman table.",
2952 OFFSET(extern_huff), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD | AV_OPT_FLAG_DEPRECATED },
2953 { NULL },
2954 };
2955 #endif
2956
2957 static const AVClass mjpegdec_class = {
2958 .class_name = "MJPEG decoder",
2959 .item_name = av_default_item_name,
2960 #if FF_API_MJPEG_EXTERN_HUFF
2961 .option = options,
2962 #endif
2963 .version = LIBAVUTIL_VERSION_INT,
2964 };
2965
2966 const FFCodec ff_mjpeg_decoder = {
2967 .p.name = "mjpeg",
2968 CODEC_LONG_NAME("MJPEG (Motion JPEG)"),
2969 .p.type = AVMEDIA_TYPE_VIDEO,
2970 .p.id = AV_CODEC_ID_MJPEG,
2971 .priv_data_size = sizeof(MJpegDecodeContext),
2972 .init = ff_mjpeg_decode_init,
2973 .close = ff_mjpeg_decode_end,
2974 FF_CODEC_DECODE_CB(ff_mjpeg_decode_frame),
2975 .flush = decode_flush,
2976 .p.capabilities = AV_CODEC_CAP_DR1,
2977 .p.max_lowres = 3,
2978 .p.priv_class = &mjpegdec_class,
2979 .p.profiles = NULL_IF_CONFIG_SMALL(ff_mjpeg_profiles),
2980 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP |
2981 FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM |
2982 FF_CODEC_CAP_ICC_PROFILES,
2983 .hw_configs = (const AVCodecHWConfigInternal *const []) {
2984 #if CONFIG_MJPEG_NVDEC_HWACCEL
2985 HWACCEL_NVDEC(mjpeg),
2986 #endif
2987 #if CONFIG_MJPEG_VAAPI_HWACCEL
2988 HWACCEL_VAAPI(mjpeg),
2989 #endif
2990 NULL
2991 },
2992 };
2993 #endif
2994 #if CONFIG_THP_DECODER
2995 const FFCodec ff_thp_decoder = {
2996 .p.name = "thp",
2997 CODEC_LONG_NAME("Nintendo Gamecube THP video"),
2998 .p.type = AVMEDIA_TYPE_VIDEO,
2999 .p.id = AV_CODEC_ID_THP,
3000 .priv_data_size = sizeof(MJpegDecodeContext),
3001 .init = ff_mjpeg_decode_init,
3002 .close = ff_mjpeg_decode_end,
3003 FF_CODEC_DECODE_CB(ff_mjpeg_decode_frame),
3004 .flush = decode_flush,
3005 .p.capabilities = AV_CODEC_CAP_DR1,
3006 .p.max_lowres = 3,
3007 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
3008 };
3009 #endif
3010
3011 #if CONFIG_SMVJPEG_DECODER
3012 // SMV JPEG just stacks several output frames into one JPEG picture
3013 // we handle that by setting up the cropping parameters appropriately
3014 13 static void smv_process_frame(AVCodecContext *avctx, AVFrame *frame)
3015 {
3016 13 MJpegDecodeContext *s = avctx->priv_data;
3017
3018
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 av_assert0((s->smv_next_frame + 1) * avctx->height <= avctx->coded_height);
3019
3020 13 frame->width = avctx->coded_width;
3021 13 frame->height = avctx->coded_height;
3022 13 frame->crop_top = FFMIN(s->smv_next_frame * avctx->height, frame->height);
3023 13 frame->crop_bottom = frame->height - (s->smv_next_frame + 1) * avctx->height;
3024
3025
1/2
✓ Branch 0 taken 13 times.
✗ Branch 1 not taken.
13 if (s->smv_frame->pts != AV_NOPTS_VALUE)
3026 13 s->smv_frame->pts += s->smv_frame->duration;
3027 13 s->smv_next_frame = (s->smv_next_frame + 1) % s->smv_frames_per_jpeg;
3028
3029
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 11 times.
13 if (s->smv_next_frame == 0)
3030 2 av_frame_unref(s->smv_frame);
3031 13 }
3032
3033 16 static int smvjpeg_receive_frame(AVCodecContext *avctx, AVFrame *frame)
3034 {
3035 16 MJpegDecodeContext *s = avctx->priv_data;
3036 16 AVPacket *const pkt = avctx->internal->in_pkt;
3037 16 int got_frame = 0;
3038 int ret;
3039
3040
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
16 if (s->smv_next_frame > 0)
3041 10 goto return_frame;
3042
3043 6 ret = ff_decode_get_packet(avctx, pkt);
3044
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 if (ret < 0)
3045 3 return ret;
3046
3047 3 av_frame_unref(s->smv_frame);
3048
3049 3 ret = ff_mjpeg_decode_frame(avctx, s->smv_frame, &got_frame, pkt);
3050 3 s->smv_frame->pkt_dts = pkt->dts;
3051 3 av_packet_unref(pkt);
3052
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (ret < 0)
3053 return ret;
3054
3055
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (!got_frame)
3056 return AVERROR(EAGAIN);
3057
3058 // packet duration covers all the frames in the packet
3059 3 s->smv_frame->duration /= s->smv_frames_per_jpeg;
3060
3061 13 return_frame:
3062
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 av_assert0(s->smv_frame->buf[0]);
3063 13 ret = av_frame_ref(frame, s->smv_frame);
3064
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 if (ret < 0)
3065 return ret;
3066
3067 13 smv_process_frame(avctx, frame);
3068 13 return 0;
3069 }
3070
3071 const FFCodec ff_smvjpeg_decoder = {
3072 .p.name = "smvjpeg",
3073 CODEC_LONG_NAME("SMV JPEG"),
3074 .p.type = AVMEDIA_TYPE_VIDEO,
3075 .p.id = AV_CODEC_ID_SMVJPEG,
3076 .priv_data_size = sizeof(MJpegDecodeContext),
3077 .init = ff_mjpeg_decode_init,
3078 .close = ff_mjpeg_decode_end,
3079 FF_CODEC_RECEIVE_FRAME_CB(smvjpeg_receive_frame),
3080 .flush = decode_flush,
3081 .p.capabilities = AV_CODEC_CAP_DR1,
3082 .caps_internal = FF_CODEC_CAP_EXPORTS_CROPPING |
3083 FF_CODEC_CAP_INIT_CLEANUP,
3084 };
3085 #endif
3086