FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/mjpegdec.c
Date: 2026-09-25 11:37:27
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 258 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 1548 times.
✓ Branch 1 taken 258 times.
1806 for (i = 0; i < FF_ARRAY_ELEMS(ht); i++) {
87 1548 ff_vlc_free(&s->vlcs[ht[i].class][ht[i].index]);
88 1548 ret = ff_mjpeg_build_vlc(&s->vlcs[ht[i].class][ht[i].index],
89 1548 ht[i].bits, ht[i].values,
90 1548 ht[i].class == 1, s->avctx);
91
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1548 times.
1548 if (ret < 0)
92 ✗ return ret;
93
94
2/2
✓ Branch 0 taken 1032 times.
✓ Branch 1 taken 516 times.
1548 if (ht[i].class < 2) {
95 1032 memcpy(s->raw_huffman_lengths[ht[i].class][ht[i].index],
96 1032 ht[i].bits + 1, 16);
97 1032 memcpy(s->raw_huffman_values[ht[i].class][ht[i].index],
98 1032 ht[i].values, ht[i].length);
99 }
100 }
101
102 258 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 386 static void init_idct(AVCodecContext *avctx)
116 {
117 386 MJpegDecodeContext *s = avctx->priv_data;
118
119 386 ff_idctdsp_init(&s->idsp, avctx);
120 386 ff_permute_scantable(s->permutated_scantable, ff_zigzag_direct,
121 386 s->idsp.idct_permutation);
122 386 }
123
124 258 av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
125 {
126 258 MJpegDecodeContext *s = avctx->priv_data;
127 int ret;
128
129
2/2
✓ Branch 0 taken 256 times.
✓ Branch 1 taken 2 times.
258 if (!s->picture_ptr) {
130 256 s->picture = av_frame_alloc();
131
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 256 times.
256 if (!s->picture)
132 ✗ return AVERROR(ENOMEM);
133 256 s->picture_ptr = s->picture;
134 }
135
136 258 s->avctx = avctx;
137 258 ff_blockdsp_init(&s->bdsp);
138 258 init_idct(avctx);
139 258 s->buffer_size = 0;
140 258 s->buffer = NULL;
141 258 s->first_picture = 1;
142 258 s->got_picture = 0;
143 258 s->orig_height = avctx->coded_height;
144 258 avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
145 258 avctx->colorspace = AVCOL_SPC_BT470BG;
146 258 s->hwaccel_pix_fmt = s->hwaccel_sw_pix_fmt = AV_PIX_FMT_NONE;
147
148
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 258 times.
258 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 258 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
258 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 258 times.
258 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 256 times.
✓ Branch 1 taken 2 times.
258 } else if (avctx->field_order == AV_FIELD_UNKNOWN) {
167
2/2
✓ Branch 0 taken 51 times.
✓ Branch 1 taken 205 times.
256 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 256 times.
258 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 254 times.
256 } 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 247 times.
258 if (avctx->codec->id == AV_CODEC_ID_AMV)
190 11 s->flipped = 1;
191
192 258 return 0;
193 }
194
195
196 11038 static int mjpeg_parse_len(MJpegDecodeContext *s, int *plen, const char *name)
197 {
198 11038 int len = bytestream2_get_be16u(&s->gB);
199
2/4
✓ Branch 0 taken 11038 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 11038 times.
11038 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 11038 *plen = len - 2;
204 11038 return 0;
205 }
206
207 /* quantize tables */
208 2632 int ff_mjpeg_decode_dqt(MJpegDecodeContext *s)
209 {
210 int len, index, i;
211
212 2632 int ret = mjpeg_parse_len(s, &len, "dqt");
213
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2632 times.
2632 if (ret < 0)
214 ✗ return ret;
215
216
2/2
✓ Branch 0 taken 3166 times.
✓ Branch 1 taken 2632 times.
5798 while (len >= 65) {
217 3166 uint8_t b = bytestream2_get_byteu(&s->gB);
218 3166 int pr = b >> 4;
219
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3166 times.
3166 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 3166 times.
3166 if (len < (1 + 64 * (1 + pr)))
224 ✗ return AVERROR_INVALIDDATA;
225 3166 index = b & 0x0F;
226
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3166 times.
3166 if (index >= 4)
227 ✗ return AVERROR_INVALIDDATA;
228 3166 av_log(s->avctx, AV_LOG_DEBUG, "index=%d\n", index);
229 /* read quant table */
230
2/2
✓ Branch 0 taken 202624 times.
✓ Branch 1 taken 3166 times.
205790 for (i = 0; i < 64; i++) {
231
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 202624 times.
202624 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 202624 times.
202624 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 3166 s->qscale[index] = FFMAX(s->quant_matrixes[index][1],
242 3166 s->quant_matrixes[index][8]) >> 1;
243 3166 av_log(s->avctx, AV_LOG_DEBUG, "qscale[%d]: %d\n",
244 index, s->qscale[index]);
245 3166 len -= 1 + 64 * (1 + pr);
246 }
247 2632 return 0;
248 }
249
250 /* decode huffman tables and build VLC decoders */
251 2636 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 2636 int ret = 0;
257
258 2636 ret = mjpeg_parse_len(s, &len, "dht");
259
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2636 times.
2636 if (ret < 0)
260 ✗ return ret;
261
262
2/2
✓ Branch 0 taken 9255 times.
✓ Branch 1 taken 2636 times.
11891 while (len > 0) {
263
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9255 times.
9255 if (len < 17)
264 ✗ return AVERROR_INVALIDDATA;
265 9255 uint8_t b = bytestream2_get_byteu(&s->gB);
266 9255 class = b >> 4;
267
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9255 times.
9255 if (class >= 2)
268 ✗ return AVERROR_INVALIDDATA;
269 9255 index = b & 0x0F;
270
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9255 times.
9255 if (index >= 4)
271 ✗ return AVERROR_INVALIDDATA;
272 9255 n = 0;
273
2/2
✓ Branch 0 taken 148080 times.
✓ Branch 1 taken 9255 times.
157335 for (i = 1; i <= 16; i++) {
274 148080 bits_table[i] = bytestream2_get_byteu(&s->gB);
275 148080 n += bits_table[i];
276 }
277 9255 len -= 17;
278
2/4
✓ Branch 0 taken 9255 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 9255 times.
9255 if (len < n || n > 256)
279 ✗ return AVERROR_INVALIDDATA;
280
281
2/2
✓ Branch 0 taken 558401 times.
✓ Branch 1 taken 9255 times.
567656 for (i = 0; i < n; i++) {
282 558401 v = bytestream2_get_byteu(&s->gB);
283 558401 val_table[i] = v;
284 }
285 9255 len -= n;
286
287 /* build VLC and flush previous vlc if present */
288 9255 ff_vlc_free(&s->vlcs[class][index]);
289 9255 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 9255 times.
9255 if ((ret = ff_mjpeg_build_vlc(&s->vlcs[class][index], bits_table,
292 9255 val_table, class > 0, s->avctx)) < 0)
293 ✗ return ret;
294
295
2/2
✓ Branch 0 taken 4647 times.
✓ Branch 1 taken 4608 times.
9255 if (class > 0) {
296 4647 ff_vlc_free(&s->vlcs[2][index]);
297
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4647 times.
4647 if ((ret = ff_mjpeg_build_vlc(&s->vlcs[2][index], bits_table,
298 4647 val_table, 0, s->avctx)) < 0)
299 ✗ return ret;
300 }
301
302
2/2
✓ Branch 0 taken 148080 times.
✓ Branch 1 taken 9255 times.
157335 for (i = 0; i < 16; i++)
303 148080 s->raw_huffman_lengths[class][index][i] = bits_table[i + 1];
304
2/2
✓ Branch 0 taken 2369280 times.
✓ Branch 1 taken 9255 times.
2378535 for (i = 0; i < 256; i++)
305 2369280 s->raw_huffman_values[class][index][i] = val_table[i];
306 }
307 2636 return 0;
308 }
309
310 2649 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 2649 int h_count[MAX_COMPONENTS] = { 0 };
315 2649 int v_count[MAX_COMPONENTS] = { 0 };
316
317 2649 s->cur_scan = 0;
318 2649 memset(s->upscale_h, 0, sizeof(s->upscale_h));
319 2649 memset(s->upscale_v, 0, sizeof(s->upscale_v));
320
321 2649 ret = mjpeg_parse_len(s, &len, "sof");
322
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2649 times.
2649 if (ret < 0)
323 ✗ return ret;
324
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2649 times.
2649 if (len < 6)
325 ✗ return AVERROR_INVALIDDATA;
326 2649 bits = bytestream2_get_byteu(&s->gB);
327
328
2/4
✓ Branch 0 taken 2649 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2649 times.
2649 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 128 times.
✓ Branch 1 taken 2521 times.
2649 if (s->avctx->bits_per_raw_sample != bits) {
334
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 128 times.
128 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 128 s->avctx->bits_per_raw_sample = bits;
336 128 init_idct(s->avctx);
337 }
338
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2649 times.
2649 if (s->pegasus_rct)
339 ✗ bits = 9;
340
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2649 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2649 if (bits == 9 && !s->pegasus_rct)
341 ✗ s->rct = 1; // FIXME ugly
342
343
3/4
✓ Branch 0 taken 430 times.
✓ Branch 1 taken 2219 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 430 times.
2649 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 2649 height = bytestream2_get_be16u(&s->gB);
349 2649 width = bytestream2_get_be16u(&s->gB);
350
351 // HACK for odd_height.mov
352
4/6
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 2619 times.
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
2649 if (s->interlaced && s->width == width && s->height == height + 1)
353 ✗ height = s->height;
354
355 2649 av_log(s->avctx, AV_LOG_DEBUG, "sof0: picture: %dx%d\n", width, height);
356
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2649 times.
2649 if (av_image_check_size(width, height, 0, s->avctx) < 0)
357 ✗ return AVERROR_INVALIDDATA;
358
359
4/4
✓ Branch 0 taken 2635 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 2410 times.
✓ Branch 3 taken 225 times.
2649 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 2408 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2408 times.
2410 if (s->buf_size && (width + 7) / 8 * ((height + 7) / 8) > s->buf_size * 4LL)
362 ✗ return AVERROR_INVALIDDATA;
363 }
364
365 2649 nb_components = bytestream2_get_byteu(&s->gB);
366
2/4
✓ Branch 0 taken 2649 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2649 times.
2649 if (nb_components <= 0 ||
367 nb_components > MAX_COMPONENTS)
368 ✗ return AVERROR_INVALIDDATA;
369
4/4
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 2619 times.
✓ Branch 2 taken 19 times.
✓ Branch 3 taken 11 times.
2649 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 2424 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 225 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2649 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 2649 len -= 6;
383
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2649 times.
2649 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 2649 s->nb_components = nb_components;
389 2649 s->nb_seq_component_scans = 0;
390 2649 s->h_max = 1;
391 2649 s->v_max = 1;
392
2/2
✓ Branch 0 taken 7911 times.
✓ Branch 1 taken 2649 times.
10560 for (i = 0; i < nb_components; i++) {
393 /* component id */
394 7911 s->component_id[i] = bytestream2_get_byteu(&s->gB);
395 7911 uint8_t b = bytestream2_get_byteu(&s->gB);
396 7911 h_count[i] = b >> 4;
397 7911 v_count[i] = b & 0x0F;
398 /* compute hmax and vmax (only used in interleaved case) */
399
2/2
✓ Branch 0 taken 2202 times.
✓ Branch 1 taken 5709 times.
7911 if (h_count[i] > s->h_max)
400 2202 s->h_max = h_count[i];
401
2/2
✓ Branch 0 taken 2342 times.
✓ Branch 1 taken 5569 times.
7911 if (v_count[i] > s->v_max)
402 2342 s->v_max = v_count[i];
403 7911 s->quant_index[i] = bytestream2_get_byteu(&s->gB);
404
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7911 times.
7911 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 7911 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 7911 times.
7911 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 7911 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 2649 times.
2649 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 2424 times.
✓ Branch 2 taken 225 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 225 times.
2649 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 2244 times.
✓ Branch 1 taken 405 times.
✓ Branch 2 taken 2238 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2238 times.
✗ Branch 5 not taken.
2649 if (width != s->width || height != s->height || bits != s->bits ||
433
1/2
✓ Branch 0 taken 2238 times.
✗ Branch 1 not taken.
2238 memcmp(s->h_count, h_count, sizeof(h_count)) ||
434
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2238 times.
2238 memcmp(s->v_count, v_count, sizeof(v_count))) {
435 411 size_change = 1;
436
437 411 s->width = width;
438 411 s->height = height;
439 411 s->bits = bits;
440 411 memcpy(s->h_count, h_count, sizeof(h_count));
441 411 memcpy(s->v_count, v_count, sizeof(v_count));
442 411 s->interlaced = 0;
443 411 s->got_picture = 0;
444
445 /* test interlaced mode */
446
2/2
✓ Branch 0 taken 208 times.
✓ Branch 1 taken 203 times.
411 if (s->first_picture &&
447
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 208 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
208 (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 60 times.
208 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 411 ret = ff_set_dimensions(s->avctx, width, height);
458
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 411 times.
411 if (ret < 0)
459 ✗ return ret;
460
461
2/2
✓ Branch 0 taken 409 times.
✓ Branch 1 taken 2 times.
411 if (s->avctx->codec_id != AV_CODEC_ID_SMVJPEG &&
462
1/2
✓ Branch 0 taken 409 times.
✗ Branch 1 not taken.
409 (s->avctx->codec_tag == MKTAG('A', 'V', 'R', 'n') ||
463
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 407 times.
409 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 411 times.
411 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 411 s->first_picture = 0;
481 } else {
482 2238 size_change = 0;
483 }
484
485
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2646 times.
2649 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 2649 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2649 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 2622 times.
✓ Branch 2 taken 19 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 19 times.
✗ Branch 5 not taken.
2649 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 2342 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.
2630 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 2200 times.
✓ Branch 1 taken 221 times.
2421 else if (!s->lossless)
504 2200 s->rgb = 0;
505 /* XXX: not complete test ! */
506 2630 pix_fmt_id = ((unsigned)s->h_count[0] << 28) | (s->v_count[0] << 24) |
507 2630 (s->h_count[1] << 20) | (s->v_count[1] << 16) |
508 2630 (s->h_count[2] << 12) | (s->v_count[2] << 8) |
509 2630 (s->h_count[3] << 4) | s->v_count[3];
510 2630 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 2630 times.
2630 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 2218 times.
2630 if (!(pix_fmt_id & 0x0D0D0D0D))
516 412 pix_fmt_id -= (pix_fmt_id & 0x0F0F0F0F) >> 1;
517
518
2/2
✓ Branch 0 taken 21040 times.
✓ Branch 1 taken 2630 times.
23670 for (i = 0; i < 8; i++) {
519 21040 int j = 6 + (i & 1) - (i & 6);
520 21040 int is = (pix_fmt_id >> (4 * i)) & 0xF;
521 21040 int js = (pix_fmt_id >> (4 * j)) & 0xF;
522
523
7/8
✓ Branch 0 taken 11585 times.
✓ Branch 1 taken 9455 times.
✓ Branch 2 taken 11577 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 11577 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1151 times.
✓ Branch 7 taken 10426 times.
21040 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 11585 times.
✓ Branch 1 taken 9455 times.
✓ Branch 2 taken 11575 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 11575 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1149 times.
✓ Branch 7 taken 10426 times.
21040 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 11585 times.
✓ Branch 1 taken 9455 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 11575 times.
21040 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 2630 times.
2630 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 1928 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
2630 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 1928 case 0x22111100:
691 case 0x23111100:
692 case 0x42111100:
693 case 0x24111100:
694
3/4
✓ Branch 0 taken 1928 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 205 times.
✓ Branch 3 taken 1723 times.
1928 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 1723 times.
1928 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
697
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1928 times.
1928 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 1928 times.
1928 } 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 1928 times.
1928 } 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 1928 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 2618 times.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2618 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
2630 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 2405 times.
2630 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 2630 s->pix_desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
745
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2630 times.
2630 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 2414 times.
✓ Branch 1 taken 216 times.
✓ Branch 2 taken 2211 times.
✓ Branch 3 taken 203 times.
2630 if (s->avctx->pix_fmt == s->hwaccel_sw_pix_fmt && !size_change) {
751 2211 s->avctx->pix_fmt = s->hwaccel_pix_fmt;
752 } else {
753 419 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 419 s->avctx->pix_fmt,
761 AV_PIX_FMT_NONE,
762 };
763 419 s->hwaccel_pix_fmt = ff_get_format(s->avctx, pix_fmts);
764
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 419 times.
419 if (s->hwaccel_pix_fmt < 0)
765 ✗ return AVERROR(EINVAL);
766
767 419 s->hwaccel_sw_pix_fmt = s->avctx->pix_fmt;
768 419 s->avctx->pix_fmt = s->hwaccel_pix_fmt;
769 }
770
771
2/2
✓ Branch 0 taken 101 times.
✓ Branch 1 taken 2529 times.
2630 if (s->avctx->skip_frame == AVDISCARD_ALL) {
772 101 s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
773 101 s->picture_ptr->flags |= AV_FRAME_FLAG_KEY;
774 101 s->got_picture = 1;
775 101 return 0;
776 }
777
778 2529 av_frame_unref(s->picture_ptr);
779 2529 ret = ff_get_buffer(s->avctx, s->picture_ptr, AV_GET_BUFFER_FLAG_REF);
780
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2529 times.
2529 if (ret < 0)
781 ✗ return ret;
782 2529 s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
783 2529 s->picture_ptr->flags |= AV_FRAME_FLAG_KEY;
784 2529 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 2521 times.
2529 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 10116 times.
✓ Branch 1 taken 2529 times.
12645 for (i = 0; i < 4; i++)
791 10116 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 2339 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 209 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2548 if ((s->rgb && !s->lossless && !s->ls) ||
800
5/6
✓ Branch 0 taken 2339 times.
✓ Branch 1 taken 209 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 2323 times.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
2548 (!s->rgb && s->ls && s->nb_components > 1) ||
801
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2540 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
2548 (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 2541 times.
2548 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 2548 times.
2548 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 2548 return 0;
838 }
839
840 26942462 static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index, int *val)
841 {
842 int code;
843 26942462 code = get_vlc2(&s->gb, s->vlcs[0][dc_index].table, 9, 2);
844
2/4
✓ Branch 0 taken 26942462 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 26942462 times.
26942462 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 23867726 times.
✓ Branch 1 taken 3074736 times.
26942462 *val = code ? get_xbits(&s->gb, code) : 0;
851 26942462 return 0;
852 }
853
854 /* decode block and dequantize */
855 4045286 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 4045286 int ret = mjpeg_decode_dc(s, dc_index, &val);
862
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4045286 times.
4045286 if (ret < 0)
863 ✗ return ret;
864
865 4045286 val = val * (unsigned)quant_matrix[0] + s->last_dc[component];
866 4045286 s->last_dc[component] = val;
867 4045286 block[0] = av_clip_int16(val);
868 /* AC coefs */
869 4045286 i = 0;
870 {
871 4045286 OPEN_READER(re, &s->gb);
872 do {
873 38003626 UPDATE_CACHE(re, &s->gb);
874
2/2
✓ Branch 1 taken 555527 times.
✓ Branch 2 taken 37448099 times.
38003626 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2);
875
876 38003626 i += ((unsigned)code) >> 4;
877 38003626 code &= 0xf;
878
2/2
✓ Branch 0 taken 34002738 times.
✓ Branch 1 taken 4000888 times.
38003626 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 34002738 int cache = GET_CACHE(re, &s->gb);
884 34002738 int sign = (~cache) >> 31;
885 34002738 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
886 }
887
888 34002738 LAST_SKIP_BITS(re, &s->gb, code);
889
890
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 34002738 times.
34002738 if (i > 63) {
891 ✗ av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
892 ✗ return AVERROR_INVALIDDATA;
893 }
894 34002738 j = s->permutated_scantable[i];
895 34002738 block[j] = level * quant_matrix[i];
896 }
897
2/2
✓ Branch 0 taken 33958340 times.
✓ Branch 1 taken 4045286 times.
38003626 } while (i < 63);
898 4045286 CLOSE_READER(re, &s->gb);
899 }
900
901 4045286 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 2154 static int mjpeg_decode_scan(MJpegDecodeContext *s)
1431 {
1432 2154 int nb_components = s->nb_components_sos;
1433 2154 int Ah = s->Ah;
1434 2154 int Al = s->Al;
1435 2154 const uint8_t *mb_bitmask = NULL;
1436 2154 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 2154 GetBitContext mb_bitmask_gb = {0}; // initialize to silence gcc warning
1442
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2153 times.
2154 int bytes_per_pixel = 1 + (s->bits > 8);
1443 2154 int field_pos = -1;
1444 int ret;
1445
1446
2/2
✓ Branch 0 taken 31 times.
✓ Branch 1 taken 2123 times.
2154 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 2123 times.
2154 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 2154 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &chroma_h_shift,
1460 &chroma_v_shift);
1461 2154 chroma_width = AV_CEIL_RSHIFT(s->width, chroma_h_shift);
1462 2154 chroma_height = AV_CEIL_RSHIFT(s->height, chroma_v_shift);
1463
1464
2/2
✓ Branch 0 taken 6454 times.
✓ Branch 1 taken 2154 times.
8608 for (i = 0; i < nb_components; i++) {
1465 6454 int c = s->comp_index[i];
1466 6454 data[c] = s->picture_ptr->data[c];
1467
2/2
✓ Branch 0 taken 93 times.
✓ Branch 1 taken 6361 times.
6454 reference_data[c] = reference ? reference->data[c] : NULL;
1468 6454 linesize[c] = s->linesize[c];
1469 6454 s->coefs_finished[c] |= 1;
1470 }
1471
1472 2154 next_field:
1473 2154 s->restart_count = -1;
1474
1475
2/2
✓ Branch 0 taken 28984 times.
✓ Branch 1 taken 2154 times.
31138 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1476
2/2
✓ Branch 0 taken 809957 times.
✓ Branch 1 taken 28984 times.
838941 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1477
4/4
✓ Branch 0 taken 148800 times.
✓ Branch 1 taken 661157 times.
✓ Branch 3 taken 131114 times.
✓ Branch 4 taken 17686 times.
809957 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 753717 times.
809957 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 753717 ret = ff_mjpeg_handle_restart(s, &restart);
1491
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 753717 times.
753717 if (ret < 0)
1492 ✗ return ret;
1493 }
1494
2/2
✓ Branch 0 taken 4804 times.
✓ Branch 1 taken 805153 times.
809957 if (restart) {
1495
2/2
✓ Branch 0 taken 14404 times.
✓ Branch 1 taken 4804 times.
19208 for (i = 0; i < nb_components; i++)
1496 14404 s->last_dc[i] = (4 << s->bits);
1497 }
1498
1499
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 809957 times.
809957 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 2406155 times.
✓ Branch 1 taken 809957 times.
3216112 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 2406155 n = s->nb_blocks[i];
1509 2406155 c = s->comp_index[i];
1510 2406155 h = s->h_scount[i];
1511 2406155 v = s->v_scount[i];
1512 2406155 x = 0;
1513 2406155 y = 0;
1514
2/2
✓ Branch 0 taken 4832846 times.
✓ Branch 1 taken 2406155 times.
7239001 for (j = 0; j < n; j++) {
1515 4832846 block_offset = (((linesize[c] * (v * mb_y + y) * 8) +
1516 4832846 (h * mb_x + x) * 8 * bytes_per_pixel) >> s->avctx->lowres);
1517
1518
4/4
✓ Branch 0 taken 90560 times.
✓ Branch 1 taken 4742286 times.
✓ Branch 2 taken 45280 times.
✓ Branch 3 taken 45280 times.
4832846 if (s->interlaced && s->bottom_field)
1519 45280 block_offset += linesize[c] >> 1;
1520
6/6
✓ Branch 0 taken 3854931 times.
✓ Branch 1 taken 977915 times.
✓ Branch 2 taken 2877116 times.
✓ Branch 3 taken 977815 times.
✓ Branch 4 taken 4830321 times.
✓ Branch 5 taken 2525 times.
4832846 if ( 8 * (h * mb_x + x) < ((c == 1) || (c == 2) ? chroma_width : s->width)
1521
6/6
✓ Branch 0 taken 3852414 times.
✓ Branch 1 taken 977907 times.
✓ Branch 2 taken 2874599 times.
✓ Branch 3 taken 977815 times.
✓ Branch 4 taken 4824117 times.
✓ Branch 5 taken 6204 times.
4830321 && 8 * (v * mb_y + y) < ((c == 1) || (c == 2) ? chroma_height : s->height)) {
1522 4824117 ptr = data[c] + block_offset;
1523 } else
1524 8729 ptr = NULL;
1525
2/2
✓ Branch 0 taken 4831970 times.
✓ Branch 1 taken 876 times.
4832846 if (!s->progressive) {
1526
2/2
✓ Branch 0 taken 786684 times.
✓ Branch 1 taken 4045286 times.
4831970 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 4045286 s->bdsp.clear_block(s->block);
1533
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4045286 times.
4045286 if (decode_block(s, s->block, i,
1534 s->dc_index[i], s->ac_index[i],
1535 4045286 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 4036573 times.
✓ Branch 1 taken 8713 times.
✓ Branch 2 taken 4036573 times.
✗ Branch 3 not taken.
4045286 if (ptr && linesize[c]) {
1541 4036573 s->idsp.idct_put(ptr, linesize[c], s->block);
1542
2/2
✓ Branch 0 taken 11750 times.
✓ Branch 1 taken 4024823 times.
4036573 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 3519873 times.
✓ Branch 1 taken 1312973 times.
4832846 if (++x == h) {
1566 3519873 x = 0;
1567 3519873 y++;
1568 }
1569 }
1570 }
1571 }
1572 }
1573
1574
3/4
✓ Branch 0 taken 38 times.
✓ Branch 1 taken 2116 times.
✓ Branch 2 taken 38 times.
✗ Branch 3 not taken.
2192 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 2154 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 2634 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 2213 times.
2634 const int block_size = s->lossless ? 1 : 8;
1685
1686
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2634 times.
2634 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 2634 ret = mjpeg_parse_len(s, &len, "sos");
1693
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2634 times.
2634 if (ret < 0)
1694 ✗ return ret;
1695
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2634 times.
2634 if (len < 1)
1696 ✗ return AVERROR_INVALIDDATA;
1697 2634 s->nb_components_sos = bytestream2_get_byteu(&s->gB);
1698
2/4
✓ Branch 0 taken 2634 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2634 times.
2634 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 2634 times.
2634 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 7748 times.
✓ Branch 1 taken 2634 times.
10382 for (i = 0; i < s->nb_components_sos; i++) {
1709 7748 id = bytestream2_get_byteu(&s->gB);
1710 7748 av_log(s->avctx, AV_LOG_DEBUG, "component: %d\n", id);
1711 /* find component index */
1712
1/2
✓ Branch 0 taken 15485 times.
✗ Branch 1 not taken.
15485 for (index = 0; index < s->nb_components; index++)
1713
2/2
✓ Branch 0 taken 7748 times.
✓ Branch 1 taken 7737 times.
15485 if (id == s->component_id[index])
1714 7748 break;
1715
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7748 times.
7748 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 7748 times.
7748 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 7748 s->quant_sindex[i] = s->quant_index[index];
1726 7748 s->nb_blocks[i] = s->h_count[index] * s->v_count[index];
1727 7748 s->h_scount[i] = s->h_count[index];
1728 7748 s->v_scount[i] = s->v_count[index];
1729
1730 7748 s->comp_index[i] = index;
1731
1732 7748 uint8_t b = bytestream2_get_byteu(&s->gB);
1733 7748 s->dc_index[i] = b >> 4;
1734 7748 s->ac_index[i] = b & 0x0F;
1735
1736
2/4
✓ Branch 0 taken 7748 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7748 times.
✗ Branch 3 not taken.
7748 if (s->dc_index[i] < 0 || s->ac_index[i] < 0 ||
1737
2/4
✓ Branch 0 taken 7748 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 7748 times.
7748 s->dc_index[i] >= 4 || s->ac_index[i] >= 4)
1738 ✗ goto out_of_range;
1739
5/8
✓ Branch 0 taken 7748 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 80 times.
✓ Branch 3 taken 7668 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 80 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 7668 times.
7748 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 2634 s->Ss = bytestream2_get_byteu(&s->gB); /* JPEG Ss / lossless JPEG predictor / JPEG-LS NEAR */
1744 2634 s->Se = bytestream2_get_byteu(&s->gB); /* JPEG Se / JPEG-LS ILV */
1745 2634 uint8_t b = bytestream2_get_byteu(&s->gB);
1746 2634 s->Ah = b >> 4; /* Ah */
1747 2634 s->Al = b & 0x0F; /* Al */
1748
1749
2/2
✓ Branch 0 taken 2557 times.
✓ Branch 1 taken 77 times.
2634 if (s->nb_components_sos > 1) {
1750 /* interleaved stream */
1751 2557 s->mb_width = (s->width + s->h_max * block_size - 1) / (s->h_max * block_size);
1752 2557 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 2634 times.
2634 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 2602 times.
2634 if (s->mjpb_skiptosod)
1772 32 bytestream2_skip(&s->gB, s->mjpb_skiptosod);
1773
1774
4/4
✓ Branch 0 taken 2566 times.
✓ Branch 1 taken 68 times.
✓ Branch 2 taken 2145 times.
✓ Branch 3 taken 421 times.
2634 if (!s->progressive && !s->lossless &&
1775
2/2
✓ Branch 0 taken 2114 times.
✓ Branch 1 taken 31 times.
2145 s->avctx->codec_id != AV_CODEC_ID_MXPEG) {
1776 2114 s->nb_seq_component_scans += s->nb_components_sos;
1777
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2114 times.
2114 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 2634 times.
2634 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 2213 times.
2634 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 2145 times.
✓ Branch 2 taken 59 times.
✓ Branch 3 taken 9 times.
2213 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 2154 times.
2154 if ((ret = mjpeg_decode_scan(s)) < 0)
1816 ✗ return ret;
1817 }
1818 }
1819 }
1820
1821
2/2
✓ Branch 0 taken 2628 times.
✓ Branch 1 taken 6 times.
2634 if (s->avctx->codec_id == AV_CODEC_ID_MEDIA100 ||
1822
2/2
✓ Branch 0 taken 2602 times.
✓ Branch 1 taken 26 times.
2628 s->avctx->codec_id == AV_CODEC_ID_MJPEGB ||
1823
2/2
✓ Branch 0 taken 74 times.
✓ Branch 1 taken 2528 times.
2602 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 2634 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 247 static int mjpeg_decode_app(MJpegDecodeContext *s, int start_code)
1847 {
1848 int len, id, i;
1849
1850 247 int ret = mjpeg_parse_len(s, &len, "app");
1851
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 247 times.
247 if (ret < 0)
1852 ✗ return AVERROR_INVALIDDATA;
1853
1854
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 247 times.
247 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 247 id = bytestream2_get_be32u(&s->gB);
1862 247 len -= 4;
1863
1864
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 247 times.
247 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 229 times.
247 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 158 times.
✓ Branch 1 taken 71 times.
229 if (id == AV_RB32("JFIF")) {
1886 int t_w, t_h, v1, v2;
1887
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 158 times.
158 if (len < 8)
1888 ✗ goto out;
1889 158 bytestream2_skipu(&s->gB, 1); /* the trailing zero-byte */
1890 158 v1 = bytestream2_get_byteu(&s->gB);
1891 158 v2 = bytestream2_get_byteu(&s->gB);
1892 158 bytestream2_skipu(&s->gB, 1);
1893
1894 158 s->avctx->sample_aspect_ratio.num = bytestream2_get_be16u(&s->gB);
1895 158 s->avctx->sample_aspect_ratio.den = bytestream2_get_be16u(&s->gB);
1896
1/2
✓ Branch 0 taken 158 times.
✗ Branch 1 not taken.
158 if ( s->avctx->sample_aspect_ratio.num <= 0
1897
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 158 times.
158 || 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 158 times.
158 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 158 len -= 8;
1910
2/2
✓ Branch 0 taken 156 times.
✓ Branch 1 taken 2 times.
158 if (len >= 2) {
1911 156 t_w = bytestream2_get_byteu(&s->gB);
1912 156 t_h = bytestream2_get_byteu(&s->gB);
1913
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 156 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
156 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 156 len -= 2;
1919 }
1920 158 goto out;
1921 }
1922
1923
2/2
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 54 times.
71 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 54 times.
54 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 46 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
54 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 46 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
46 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 46 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
46 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 32 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 30 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 30 times.
✗ Branch 5 not taken.
46 if (start_code == APP1 && id == AV_RB32("Exif") && len >= 2) {
2034 int ret;
2035
2036 30 bytestream2_skipu(&s->gB, 2); // skip padding
2037 30 len -= 2;
2038
2039
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
30 if (s->exif_metadata.entries) {
2040 ✗ av_log(s->avctx, AV_LOG_WARNING, "multiple EXIF\n");
2041 ✗ goto out;
2042 }
2043
2044 30 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 30 times.
30 if (ret < 0) {
2046 ✗ av_log(s->avctx, AV_LOG_WARNING, "unable to parse EXIF buffer\n");
2047 ✗ goto out;
2048 }
2049
2050 30 bytestream2_skipu(&s->gB, ret);
2051 30 len -= ret;
2052
2053 30 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 247 times.
247 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 54 times.
✓ Branch 1 taken 193 times.
247 if (len > 0)
2146 54 bytestream2_skipu(&s->gB, len);
2147
2148 247 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 16482 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 16482 buf_ptr = *pbuf_ptr;
2201
2/2
✓ Branch 0 taken 16481 times.
✓ Branch 1 taken 1 times.
32964 while ((buf_ptr = memchr(buf_ptr, 0xff, buf_end - buf_ptr))) {
2202 16481 buf_ptr++;
2203
1/2
✓ Branch 0 taken 16487 times.
✗ Branch 1 not taken.
16487 while (buf_ptr < buf_end) {
2204 16487 val = *buf_ptr++;
2205
2/2
✓ Branch 0 taken 16481 times.
✓ Branch 1 taken 6 times.
16487 if (val != 0xff) {
2206
2/4
✓ Branch 0 taken 16481 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 16481 times.
✗ Branch 3 not taken.
16481 if ((val >= SOF0) && (val <= COM))
2207 16481 goto found;
2208 ✗ break;
2209 }
2210 }
2211 }
2212 1 buf_ptr = buf_end;
2213 1 val = -1;
2214 16482 found:
2215 ff_dlog(NULL, "find_marker skipped %td bytes\n",
2216 (buf_ptr - *pbuf_ptr) - (val < 0 ? 0 : 2));
2217 16482 *pbuf_ptr = buf_ptr;
2218 16482 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 5980 int ff_mjpeg_unescape_sos(MJpegDecodeContext *s)
2252 {
2253 5980 const uint8_t *buf_ptr = s->gB.buffer;
2254 5980 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 5974 times.
✓ Branch 1 taken 6 times.
5980 if (s->avctx->codec_id == AV_CODEC_ID_MEDIA100 ||
2259
2/2
✓ Branch 0 taken 5948 times.
✓ Branch 1 taken 26 times.
5974 s->avctx->codec_id == AV_CODEC_ID_MJPEGB ||
2260
2/2
✓ Branch 0 taken 74 times.
✓ Branch 1 taken 5874 times.
5948 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 5874 av_fast_padded_malloc(&s->buffer, &s->buffer_size, buf_end - buf_ptr);
2269
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5874 times.
5874 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 4957 times.
✓ Branch 1 taken 917 times.
5874 if (!s->ls) {
2274 4957 const uint8_t *src = buf_ptr;
2275 4957 const uint8_t *ptr = src;
2276 4957 uint8_t *dst = s->buffer;
2277 PutByteContext pb;
2278
2279 4957 bytestream2_init_writer(&pb, dst, buf_end - src);
2280
2281
1/2
✓ Branch 0 taken 209253 times.
✗ Branch 1 not taken.
214210 while ((ptr = memchr(ptr, 0xff, buf_end - ptr))) {
2282 209253 ptr++;
2283
1/2
✓ Branch 0 taken 209253 times.
✗ Branch 1 not taken.
209253 if (ptr < buf_end) {
2284 /* Copy verbatim data. */
2285 209253 ptrdiff_t length = (ptr - 1) - src;
2286
2/2
✓ Branch 0 taken 209019 times.
✓ Branch 1 taken 234 times.
209253 if (length > 0)
2287 209019 bytestream2_put_bufferu(&pb, src, length);
2288
2289 209253 uint8_t x = *ptr++;
2290 /* Discard multiple optional 0xFF fill bytes. */
2291
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 209253 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
209265 while (x == 0xff && ptr < buf_end)
2292 12 x = *ptr++;
2293
2294 209253 src = ptr;
2295
2/2
✓ Branch 0 taken 204296 times.
✓ Branch 1 taken 4957 times.
209253 if (x == 0) {
2296 /* Stuffed zero byte */
2297 204296 bytestream2_put_byteu(&pb, 0xff);
2298
4/4
✓ Branch 0 taken 4910 times.
✓ Branch 1 taken 47 times.
✓ Branch 2 taken 2650 times.
✓ Branch 3 taken 2260 times.
4957 } else if (x >= RST0 && x <= RST7) {
2299 /* Restart marker */
2300 2650 goto found;
2301 } else {
2302 /* Non-restart marker */
2303 2307 ptr -= 2;
2304 2307 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 4957 unescaped_buf_ptr = s->buffer;
2316 4957 unescaped_buf_size = bytestream2_tell_p(&pb);
2317 4957 memset(s->buffer + unescaped_buf_size, 0,
2318 AV_INPUT_BUFFER_PADDING_SIZE);
2319
2320 4957 bytestream2_skipu(&s->gB, ptr - buf_ptr);
2321
2322 4957 av_log(s->avctx, AV_LOG_DEBUG, "escaping removed %td bytes\n",
2323 4957 (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 5980 the_end:
2377 5980 return init_get_bits8(&s->gb, unescaped_buf_ptr, unescaped_buf_size);
2378 }
2379
2380 258 static void reset_icc_profile(MJpegDecodeContext *s)
2381 {
2382 int i;
2383
2384
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 248 times.
258 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 258 s->iccread = 0;
2391 258 s->iccnum = 0;
2392 258 }
2393
2394 2605 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 2605 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 2605 int ret = 0;
2404 int is16bit;
2405
2406 2605 s->force_pal8 = 0;
2407 2605 s->total_ls_decoded_height = 0;
2408
2409 2605 s->buf_size = buf_size;
2410
2411 2605 av_exif_free(&s->exif_metadata);
2412 2605 av_freep(&s->stereo3d);
2413 2605 s->adobe_transform = -1;
2414
2415
1/2
✓ Branch 0 taken 2605 times.
✗ Branch 1 not taken.
2605 if (s->iccnum != 0)
2416 ✗ reset_icc_profile(s);
2417
2418 2605 redo_for_pal8:
2419 2613 buf_ptr = buf;
2420 2613 buf_end = buf + buf_size;
2421
1/2
✓ Branch 0 taken 16280 times.
✗ Branch 1 not taken.
16280 while (buf_ptr < buf_end) {
2422 /* find start next marker */
2423 16280 start_code = ff_mjpeg_find_marker(&buf_ptr, buf_end);
2424 /* EOF */
2425
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 16279 times.
16280 if (start_code < 0)
2426 1 break;
2427
2428 16279 ptrdiff_t bytes_left = buf_end - buf_ptr;
2429
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16279 times.
16279 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 16279 av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%td\n",
2436 start_code, buf_end - buf_ptr);
2437
2438 16279 bytestream2_init(&s->gB, buf_ptr, bytes_left);
2439
2440
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16279 times.
16279 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 11243 times.
✓ Branch 1 taken 5036 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 11243 times.
16279 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 728 times.
✓ Branch 1 taken 15551 times.
✓ Branch 2 taken 247 times.
✓ Branch 3 taken 481 times.
16279 } else if (start_code >= APP0 && start_code <= APP15) {
2449
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 247 times.
247 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 15792 times.
16032 } 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 2596 times.
✓ Branch 1 taken 13196 times.
15792 } else if (start_code == DQT) {
2458 2596 ret = ff_mjpeg_decode_dqt(s);
2459
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2596 times.
2596 if (ret < 0)
2460 ✗ return ret;
2461 }
2462
2463 16279 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 513 times.
✓ Branch 1 taken 15766 times.
16279 if (avctx->skip_frame == AVDISCARD_ALL) {
2472
2/2
✓ Branch 0 taken 101 times.
✓ Branch 1 taken 412 times.
513 switch (start_code) {
2473 101 case SOF0:
2474 case SOF1:
2475 case SOF2:
2476 case SOF3:
2477 case SOF55:
2478 101 break;
2479 412 default:
2480 412 goto skip;
2481 }
2482 }
2483
2484
11/12
✓ Branch 0 taken 2514 times.
✓ Branch 1 taken 2606 times.
✓ Branch 2 taken 2171 times.
✓ Branch 3 taken 14 times.
✓ Branch 4 taken 205 times.
✓ Branch 5 taken 225 times.
✓ Branch 6 taken 16 times.
✓ Branch 7 taken 2506 times.
✓ Branch 8 taken 2571 times.
✓ Branch 9 taken 220 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2819 times.
15867 switch (start_code) {
2485 2514 case SOI:
2486 2514 s->restart_interval = 0;
2487 2514 s->raw_image_buffer = buf_ptr;
2488 2514 s->raw_image_buffer_size = buf_end - buf_ptr;
2489 /* nothing to do on SOI */
2490 2514 break;
2491 2606 case DHT:
2492
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2606 times.
2606 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 2606 break;
2497 2171 case SOF0:
2498 case SOF1:
2499
2/2
✓ Branch 0 taken 2169 times.
✓ Branch 1 taken 2 times.
2171 if (start_code == SOF0)
2500 2169 avctx->profile = AV_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT;
2501 else
2502 2 avctx->profile = AV_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT;
2503 2171 s->lossless = 0;
2504 2171 s->ls = 0;
2505 2171 s->progressive = 0;
2506
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2171 times.
2171 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2507 ✗ goto fail;
2508 2171 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 2506 eoi_parser:
2542
1/2
✓ Branch 0 taken 2506 times.
✗ Branch 1 not taken.
2506 if (!avctx->hwaccel &&
2543
4/6
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 2499 times.
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
2506 s->progressive && s->cur_scan && s->got_picture)
2544 7 mjpeg_idct_scan_progressive_ac(s);
2545 2506 s->cur_scan = 0;
2546
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2506 times.
2506 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 2500 times.
2506 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 2503 times.
2503 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 2503 times.
2503 if ((ret = av_frame_ref(frame, s->picture_ptr)) < 0)
2565 ✗ return ret;
2566
2/2
✓ Branch 0 taken 417 times.
✓ Branch 1 taken 2086 times.
2503 if (s->lossless)
2567 417 frame->flags |= AV_FRAME_FLAG_LOSSLESS;
2568 2503 *got_frame = 1;
2569 2503 s->got_picture = 0;
2570
2571
3/4
✓ Branch 0 taken 2086 times.
✓ Branch 1 taken 417 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2086 times.
2503 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 2503 goto the_end;
2580 2571 case SOS:
2581 2571 s->cur_scan++;
2582
2583
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2571 times.
2571 if ((ret = ff_mjpeg_decode_sos(s)) < 0 &&
2584 ✗ (avctx->err_recognition & AV_EF_EXPLODE))
2585 ✗ goto fail;
2586 2571 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 101 times.
✓ Branch 1 taken 13255 times.
13356 if (avctx->skip_frame == AVDISCARD_ALL) {
2607
1/2
✓ Branch 0 taken 101 times.
✗ Branch 1 not taken.
101 switch (start_code) {
2608 101 case SOF0:
2609 case SOF1:
2610 case SOF2:
2611 case SOF3:
2612 case SOF55:
2613 101 s->got_picture = 0;
2614 101 goto the_end_no_picture;
2615 }
2616 }
2617
2618 13255 skip:
2619 /* eof process start code */
2620 13667 buf_ptr += bytestream2_tell(&s->gB);
2621 13667 av_log(avctx, AV_LOG_DEBUG,
2622 "marker parser used %d bytes\n",
2623 13667 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 2503 the_end:
2635
2636 2503 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 2497 times.
2503 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 2502 times.
2503 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 2134 times.
✓ Branch 2 taken 369 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 369 times.
✗ Branch 5 not taken.
2503 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 2498 times.
2503 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 2495 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
2503 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 2503 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2503 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 2503 times.
2503 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 2498 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
2503 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 2495 times.
2503 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 2500 times.
2503 if (avctx->codec_id != AV_CODEC_ID_SMVJPEG &&
2877
1/2
✓ Branch 0 taken 2500 times.
✗ Branch 1 not taken.
2500 (avctx->codec_tag == MKTAG('A', 'V', 'R', 'n') ||
2878
2/2
✓ Branch 0 taken 2490 times.
✓ Branch 1 taken 10 times.
2500 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 2493 the_end_no_picture:
2885 2604 av_log(avctx, AV_LOG_DEBUG, "decode frame unused %td bytes\n",
2886 buf_end - buf_ptr);
2887 2604 return buf_ptr - buf;
2888 }
2889
2890 2225 int ff_mjpeg_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame,
2891 AVPacket *avpkt)
2892 {
2893 4450 return ff_mjpeg_decode_frame_from_buf(avctx, frame, got_frame,
2894 2225 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 258 av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
2901 {
2902 258 MJpegDecodeContext *s = avctx->priv_data;
2903 int i, j;
2904
2905
3/8
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 249 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.
258 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 258 av_frame_free(&s->picture);
2910 258 s->picture_ptr = NULL;
2911
2912 258 av_frame_free(&s->smv_frame);
2913
2914 258 av_freep(&s->buffer);
2915 258 av_freep(&s->stereo3d);
2916 258 av_freep(&s->ljpeg_buffer);
2917 258 s->ljpeg_buffer_size = 0;
2918
2919
2/2
✓ Branch 0 taken 774 times.
✓ Branch 1 taken 258 times.
1032 for (i = 0; i < 3; i++) {
2920
2/2
✓ Branch 0 taken 3096 times.
✓ Branch 1 taken 774 times.
3870 for (j = 0; j < 4; j++)
2921 3096 ff_vlc_free(&s->vlcs[i][j]);
2922 }
2923
2/2
✓ Branch 0 taken 1032 times.
✓ Branch 1 taken 258 times.
1290 for (i = 0; i < MAX_COMPONENTS; i++) {
2924 1032 av_freep(&s->blocks[i]);
2925 1032 av_freep(&s->last_nnz[i]);
2926 }
2927 258 av_exif_free(&s->exif_metadata);
2928
2929 258 reset_icc_profile(s);
2930
2931 258 av_freep(&s->hwaccel_picture_private);
2932 258 av_freep(&s->jls_state);
2933
2934 258 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