FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/mjpegdec.c
Date: 2026-10-14 20:10:01
Exec Total Coverage
Lines: 1228 1845 66.6%
Functions: 31 34 91.2%
Branches: 894 1663 53.8%

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 809957 ret = ff_mjpeg_handle_restart(s, &restart);
1481
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 809957 times.
809957 if (ret < 0)
1482 ✗ return ret;
1483
2/2
✓ Branch 0 taken 4804 times.
✓ Branch 1 taken 805153 times.
809957 if (restart) {
1484
2/2
✓ Branch 0 taken 14404 times.
✓ Branch 1 taken 4804 times.
19208 for (i = 0; i < nb_components; i++)
1485 14404 s->last_dc[i] = (4 << s->bits);
1486 }
1487
1488
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 809957 times.
809957 if (get_bits_left(&s->gb) < 0) {
1489 ✗ av_log(s->avctx, AV_LOG_ERROR, "overread %d\n",
1490 ✗ -get_bits_left(&s->gb));
1491 ✗ return AVERROR_INVALIDDATA;
1492 }
1493
2/2
✓ Branch 0 taken 2406155 times.
✓ Branch 1 taken 809957 times.
3216112 for (i = 0; i < nb_components; i++) {
1494 uint8_t *ptr;
1495 int n, h, v, x, y, c, j;
1496 int block_offset;
1497 2406155 n = s->nb_blocks[i];
1498 2406155 c = s->comp_index[i];
1499 2406155 h = s->h_scount[i];
1500 2406155 v = s->v_scount[i];
1501 2406155 x = 0;
1502 2406155 y = 0;
1503
2/2
✓ Branch 0 taken 4832846 times.
✓ Branch 1 taken 2406155 times.
7239001 for (j = 0; j < n; j++) {
1504 4832846 block_offset = (((linesize[c] * (v * mb_y + y) * 8) +
1505 4832846 (h * mb_x + x) * 8 * bytes_per_pixel) >> s->avctx->lowres);
1506
1507
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)
1508 45280 block_offset += linesize[c] >> 1;
1509
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)
1510
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)) {
1511 4824117 ptr = data[c] + block_offset;
1512 } else
1513 8729 ptr = NULL;
1514
2/2
✓ Branch 0 taken 4831970 times.
✓ Branch 1 taken 876 times.
4832846 if (!s->progressive) {
1515
2/2
✓ Branch 0 taken 786684 times.
✓ Branch 1 taken 4045286 times.
4831970 if (copy_mb) {
1516
1/2
✓ Branch 0 taken 786684 times.
✗ Branch 1 not taken.
786684 if (ptr)
1517 786684 mjpeg_copy_block(s, ptr, reference_data[c] + block_offset,
1518 786684 linesize[c], s->avctx->lowres);
1519
1520 } else {
1521 4045286 s->bdsp.clear_block(s->block);
1522
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4045286 times.
4045286 if (decode_block(s, s->block, i,
1523 s->dc_index[i], s->ac_index[i],
1524 4045286 s->quant_matrixes[s->quant_sindex[i]]) < 0) {
1525 ✗ av_log(s->avctx, AV_LOG_ERROR,
1526 "error y=%d x=%d\n", mb_y, mb_x);
1527 ✗ return AVERROR_INVALIDDATA;
1528 }
1529
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]) {
1530 4036573 s->idsp.idct_put(ptr, linesize[c], s->block);
1531
2/2
✓ Branch 0 taken 11750 times.
✓ Branch 1 taken 4024823 times.
4036573 if (s->bits & 7)
1532 11750 shift_output(s, ptr, linesize[c]);
1533 }
1534 }
1535 } else {
1536 876 int block_idx = s->block_stride[c] * (v * mb_y + y) +
1537 876 (h * mb_x + x);
1538 876 int16_t *block = s->blocks[c][block_idx];
1539
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 876 times.
876 if (Ah)
1540 ✗ block[0] += get_bits1(&s->gb) *
1541 ✗ s->quant_matrixes[s->quant_sindex[i]][0] << Al;
1542
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 876 times.
876 else if (decode_dc_progressive(s, block, i, s->dc_index[i],
1543 876 s->quant_matrixes[s->quant_sindex[i]],
1544 Al) < 0) {
1545 ✗ av_log(s->avctx, AV_LOG_ERROR,
1546 "error y=%d x=%d\n", mb_y, mb_x);
1547 ✗ return AVERROR_INVALIDDATA;
1548 }
1549 }
1550 ff_dlog(s->avctx, "mb: %d %d processed\n", mb_y, mb_x);
1551 ff_dlog(s->avctx, "%d %d %d %d %d %d %d %d \n",
1552 mb_x, mb_y, x, y, c, s->bottom_field,
1553 (v * mb_y + y) * 8, (h * mb_x + x) * 8);
1554
2/2
✓ Branch 0 taken 3519873 times.
✓ Branch 1 taken 1312973 times.
4832846 if (++x == h) {
1555 3519873 x = 0;
1556 3519873 y++;
1557 }
1558 }
1559 }
1560 }
1561 }
1562
1563
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 &&
1564
1/2
✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
76 bytestream2_get_bytes_left(&s->gB) > 2 &&
1565
1/2
✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
76 bytestream2_tell(&s->gB) > 2 &&
1566 38 bytestream2_tell(&s->gB) != field_pos &&
1567
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 38 times.
38 s->gB.buffer[-2] == 0xFF &&
1568 ✗ s->gB.buffer[-1] == 0xD1) {
1569 ✗ av_log(s->avctx, AV_LOG_DEBUG, "AVRn interlaced picture marker found\n");
1570 ✗ field_pos = bytestream2_tell(&s->gB);
1571 ✗ s->bottom_field ^= 1;
1572
1573 ✗ goto next_field;
1574 }
1575
1576 2154 return 0;
1577 }
1578
1579 59 static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s)
1580 {
1581 59 int Ss = s->Ss;
1582 59 int Se = s->Se;
1583 59 int Ah = s->Ah;
1584 59 int Al = s->Al;
1585 int mb_x, mb_y;
1586 59 int EOBRUN = 0;
1587 59 int c = s->comp_index[0];
1588 59 uint16_t *quant_matrix = s->quant_matrixes[s->quant_sindex[0]];
1589
1590
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);
1591
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) {
1592 ✗ av_log(s->avctx, AV_LOG_ERROR, "SS/SE %d/%d is invalid\n", Ss, Se);
1593 ✗ return AVERROR_INVALIDDATA;
1594 }
1595
1596 // s->coefs_finished is a bitmask for coefficients coded
1597 // Ss and Se are parameters telling start and end coefficients
1598 59 s->coefs_finished[c] |= (2ULL << Se) - (1ULL << Ss);
1599
1600 59 s->restart_count = -1;
1601
1602
2/2
✓ Branch 0 taken 412 times.
✓ Branch 1 taken 59 times.
471 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1603 412 int block_idx = mb_y * s->block_stride[c];
1604 412 int16_t (*block)[64] = &s->blocks[c][block_idx];
1605 412 uint8_t *last_nnz = &s->last_nnz[c][block_idx];
1606
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++) {
1607 int ret;
1608 int restart;
1609 2416 ret = ff_mjpeg_handle_restart(s, &restart);
1610
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2416 times.
2416 if (ret < 0)
1611 ✗ return ret;
1612
2/2
✓ Branch 0 taken 59 times.
✓ Branch 1 taken 2357 times.
2416 if (restart)
1613 59 EOBRUN = 0;
1614
1615
2/2
✓ Branch 0 taken 1080 times.
✓ Branch 1 taken 1336 times.
2416 if (Ah)
1616 1080 ret = decode_block_refinement(s, *block, last_nnz, s->ac_index[0],
1617 quant_matrix, Ss, Se, Al, &EOBRUN);
1618 else
1619 1336 ret = decode_block_progressive(s, *block, last_nnz, s->ac_index[0],
1620 quant_matrix, Ss, Se, Al, &EOBRUN);
1621
1622
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)
1623 ✗ ret = AVERROR_INVALIDDATA;
1624
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2416 times.
2416 if (ret < 0) {
1625 ✗ av_log(s->avctx, AV_LOG_ERROR,
1626 "error y=%d x=%d\n", mb_y, mb_x);
1627 ✗ return AVERROR_INVALIDDATA;
1628 }
1629 }
1630 }
1631 59 return 0;
1632 }
1633
1634 7 static void mjpeg_idct_scan_progressive_ac(MJpegDecodeContext *s)
1635 {
1636 int mb_x, mb_y;
1637 int c;
1638
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 const int bytes_per_pixel = 1 + (s->bits > 8);
1639
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 const int block_size = s->lossless ? 1 : 8;
1640
1641
2/2
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 7 times.
28 for (c = 0; c < s->nb_components; c++) {
1642 21 uint8_t *data = s->picture_ptr->data[c];
1643 21 int linesize = s->linesize[c];
1644 21 int h = s->h_max / s->h_count[c];
1645 21 int v = s->v_max / s->v_count[c];
1646 21 int mb_width = (s->width + h * block_size - 1) / (h * block_size);
1647 21 int mb_height = (s->height + v * block_size - 1) / (v * block_size);
1648
1649
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 21 times.
21 if (~s->coefs_finished[c])
1650 ✗ av_log(s->avctx, AV_LOG_WARNING, "component %d is incomplete\n", c);
1651
1652
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)
1653 ✗ data += linesize >> 1;
1654
1655
2/2
✓ Branch 0 taken 153 times.
✓ Branch 1 taken 21 times.
174 for (mb_y = 0; mb_y < mb_height; mb_y++) {
1656 153 uint8_t *ptr = data + (mb_y * linesize * 8 >> s->avctx->lowres);
1657 153 int block_idx = mb_y * s->block_stride[c];
1658 153 int16_t (*block)[64] = &s->blocks[c][block_idx];
1659
2/2
✓ Branch 0 taken 860 times.
✓ Branch 1 taken 153 times.
1013 for (mb_x = 0; mb_x < mb_width; mb_x++, block++) {
1660 860 s->idsp.idct_put(ptr, linesize, *block);
1661
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 860 times.
860 if (s->bits & 7)
1662 ✗ shift_output(s, ptr, linesize);
1663 860 ptr += bytes_per_pixel * 8 >> s->avctx->lowres;
1664 }
1665 }
1666 }
1667 7 }
1668
1669 2634 int ff_mjpeg_decode_sos(MJpegDecodeContext *s)
1670 {
1671 int len, i, h, v;
1672 int index, id, ret;
1673
2/2
✓ Branch 0 taken 421 times.
✓ Branch 1 taken 2213 times.
2634 const int block_size = s->lossless ? 1 : 8;
1674
1675
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2634 times.
2634 if (!s->got_picture) {
1676 ✗ av_log(s->avctx, AV_LOG_WARNING,
1677 "Can not process SOS before SOF, skipping\n");
1678 ✗ return AVERROR_INVALIDDATA;
1679 }
1680
1681 2634 ret = mjpeg_parse_len(s, &len, "sos");
1682
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2634 times.
2634 if (ret < 0)
1683 ✗ return ret;
1684
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2634 times.
2634 if (len < 1)
1685 ✗ return AVERROR_INVALIDDATA;
1686 2634 s->nb_components_sos = bytestream2_get_byteu(&s->gB);
1687
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) {
1688 ✗ avpriv_report_missing_feature(s->avctx,
1689 "decode_sos: nb_components (%d)",
1690 s->nb_components_sos);
1691 ✗ return AVERROR_PATCHWELCOME;
1692 }
1693
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2634 times.
2634 if (len != 4 + 2 * s->nb_components_sos) {
1694 ✗ av_log(s->avctx, AV_LOG_ERROR, "decode_sos: len(%d) mismatch %d components\n", len, s->nb_components_sos);
1695 ✗ return AVERROR_INVALIDDATA;
1696 }
1697
2/2
✓ Branch 0 taken 7748 times.
✓ Branch 1 taken 2634 times.
10382 for (i = 0; i < s->nb_components_sos; i++) {
1698 7748 id = bytestream2_get_byteu(&s->gB);
1699 7748 av_log(s->avctx, AV_LOG_DEBUG, "component: %d\n", id);
1700 /* find component index */
1701
1/2
✓ Branch 0 taken 15485 times.
✗ Branch 1 not taken.
15485 for (index = 0; index < s->nb_components; index++)
1702
2/2
✓ Branch 0 taken 7748 times.
✓ Branch 1 taken 7737 times.
15485 if (id == s->component_id[index])
1703 7748 break;
1704
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7748 times.
7748 if (index == s->nb_components) {
1705 ✗ av_log(s->avctx, AV_LOG_ERROR,
1706 "decode_sos: index(%d) out of components\n", index);
1707 ✗ return AVERROR_INVALIDDATA;
1708 }
1709 /* Metasoft MJPEG codec has Cb and Cr swapped */
1710
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7748 times.
7748 if (s->avctx->codec_tag == MKTAG('M', 'T', 'S', 'J')
1711 ✗ && s->nb_components_sos == 3 && s->nb_components == 3 && i)
1712 ✗ index = 3 - i;
1713
1714 7748 s->quant_sindex[i] = s->quant_index[index];
1715 7748 s->nb_blocks[i] = s->h_count[index] * s->v_count[index];
1716 7748 s->h_scount[i] = s->h_count[index];
1717 7748 s->v_scount[i] = s->v_count[index];
1718
1719 7748 s->comp_index[i] = index;
1720
1721 7748 uint8_t b = bytestream2_get_byteu(&s->gB);
1722 7748 s->dc_index[i] = b >> 4;
1723 7748 s->ac_index[i] = b & 0x0F;
1724
1725
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 ||
1726
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)
1727 ✗ goto out_of_range;
1728
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))
1729 ✗ goto out_of_range;
1730 }
1731
1732 2634 s->Ss = bytestream2_get_byteu(&s->gB); /* JPEG Ss / lossless JPEG predictor / JPEG-LS NEAR */
1733 2634 s->Se = bytestream2_get_byteu(&s->gB); /* JPEG Se / JPEG-LS ILV */
1734 2634 uint8_t b = bytestream2_get_byteu(&s->gB);
1735 2634 s->Ah = b >> 4; /* Ah */
1736 2634 s->Al = b & 0x0F; /* Al */
1737
1738
2/2
✓ Branch 0 taken 2557 times.
✓ Branch 1 taken 77 times.
2634 if (s->nb_components_sos > 1) {
1739 /* interleaved stream */
1740 2557 s->mb_width = (s->width + s->h_max * block_size - 1) / (s->h_max * block_size);
1741 2557 s->mb_height = (s->height + s->v_max * block_size - 1) / (s->v_max * block_size);
1742
2/2
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 14 times.
77 } else if (!s->ls) { /* skip this for JPEG-LS */
1743 63 h = s->h_max / s->h_scount[0];
1744 63 v = s->v_max / s->v_scount[0];
1745 63 s->mb_width = (s->width + h * block_size - 1) / (h * block_size);
1746 63 s->mb_height = (s->height + v * block_size - 1) / (v * block_size);
1747 63 s->nb_blocks[0] = 1;
1748 63 s->h_scount[0] = 1;
1749 63 s->v_scount[0] = 1;
1750 }
1751
1752
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2634 times.
2634 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1753 ✗ av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d ilv:%d bits:%d skip:%d %s comp:%d\n",
1754 ✗ s->lossless ? "lossless" : "sequential DCT", s->rgb ? "RGB" : "",
1755 s->Ss, s->Al, s->Se, s->bits, s->mjpb_skiptosod,
1756 ✗ s->pegasus_rct ? "PRCT" : (s->rct ? "RCT" : ""), s->nb_components_sos);
1757
1758
1759 /* mjpeg-b can have padding bytes between sos and image data, skip them */
1760
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 2602 times.
2634 if (s->mjpb_skiptosod)
1761 32 bytestream2_skip(&s->gB, s->mjpb_skiptosod);
1762
1763
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 &&
1764
2/2
✓ Branch 0 taken 2114 times.
✓ Branch 1 taken 31 times.
2145 s->avctx->codec_id != AV_CODEC_ID_MXPEG) {
1765 2114 s->nb_seq_component_scans += s->nb_components_sos;
1766
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2114 times.
2114 if (s->nb_seq_component_scans > s->nb_components) {
1767 ✗ av_log(s->avctx, AV_LOG_ERROR,
1768 "too many scans for a sequential image\n");
1769 ✗ return AVERROR_INVALIDDATA;
1770 }
1771 }
1772
1773
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2634 times.
2634 if (s->avctx->hwaccel) {
1774 const uint8_t *buf_ptr;
1775 size_t buf_size;
1776
1777 ✗ mjpeg_find_raw_scan_data(s, &buf_ptr, &buf_size);
1778
1779 ✗ ret = FF_HW_CALL(s->avctx, decode_slice, buf_ptr, buf_size);
1780 ✗ if (ret < 0)
1781 ✗ return ret;
1782
1783 } else {
1784
2/2
✓ Branch 0 taken 421 times.
✓ Branch 1 taken 2213 times.
2634 if (s->lossless) {
1785
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 421 times.
421 av_assert0(s->picture_ptr == s->picture);
1786
2/2
✓ Branch 0 taken 221 times.
✓ Branch 1 taken 200 times.
421 if (CONFIG_JPEGLS_DECODER && s->ls) {
1787
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 221 times.
221 if ((ret = ff_jpegls_decode_picture(s)) < 0)
1788 ✗ return ret;
1789 } else {
1790
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) {
1791 ✗ if ((ret = ljpeg_decode_rgb_scan(s)) < 0)
1792 ✗ return ret;
1793 } else {
1794
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 200 times.
200 if ((ret = ljpeg_decode_yuv_scan(s)) < 0)
1795 ✗ return ret;
1796 }
1797 }
1798 } else {
1799
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) {
1800
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 59 times.
59 av_assert0(s->picture_ptr == s->picture);
1801
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 59 times.
59 if ((ret = mjpeg_decode_scan_progressive_ac(s)) < 0)
1802 ✗ return ret;
1803 } else {
1804
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2154 times.
2154 if ((ret = mjpeg_decode_scan(s)) < 0)
1805 ✗ return ret;
1806 }
1807 }
1808 }
1809
1810
2/2
✓ Branch 0 taken 2628 times.
✓ Branch 1 taken 6 times.
2634 if (s->avctx->codec_id == AV_CODEC_ID_MEDIA100 ||
1811
2/2
✓ Branch 0 taken 2602 times.
✓ Branch 1 taken 26 times.
2628 s->avctx->codec_id == AV_CODEC_ID_MJPEGB ||
1812
2/2
✓ Branch 0 taken 74 times.
✓ Branch 1 taken 2528 times.
2602 s->avctx->codec_id == AV_CODEC_ID_THP) {
1813 /* Add the amount of bits read from the unescaped image data buffer
1814 * into the GetByteContext. */
1815 106 bytestream2_skipu(&s->gB, (get_bits_count(&s->gb) + 7) / 8);
1816 }
1817
1818 2634 return 0;
1819 ✗ out_of_range:
1820 ✗ av_log(s->avctx, AV_LOG_ERROR, "decode_sos: ac/dc index out of range\n");
1821 ✗ return AVERROR_INVALIDDATA;
1822 }
1823
1824 220 static int mjpeg_decode_dri(MJpegDecodeContext *s)
1825 {
1826
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 220 times.
220 if (bytestream2_get_be16u(&s->gB) != 4)
1827 ✗ return AVERROR_INVALIDDATA;
1828 220 s->restart_interval = bytestream2_get_be16u(&s->gB);
1829 220 av_log(s->avctx, AV_LOG_DEBUG, "restart interval: %d\n",
1830 s->restart_interval);
1831
1832 220 return 0;
1833 }
1834
1835 247 static int mjpeg_decode_app(MJpegDecodeContext *s, int start_code)
1836 {
1837 int len, id, i;
1838
1839 247 int ret = mjpeg_parse_len(s, &len, "app");
1840
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 247 times.
247 if (ret < 0)
1841 ✗ return AVERROR_INVALIDDATA;
1842
1843
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 247 times.
247 if (len < 4) {
1844 ✗ if (s->avctx->err_recognition & AV_EF_EXPLODE)
1845 ✗ return AVERROR_INVALIDDATA;
1846 ✗ av_log(s->avctx, AV_LOG_VERBOSE, "skipping APPx stub (len=%" PRId32 ")\n", len);
1847 ✗ goto out;
1848 }
1849
1850 247 id = bytestream2_get_be32u(&s->gB);
1851 247 len -= 4;
1852
1853
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 247 times.
247 if (s->avctx->debug & FF_DEBUG_STARTCODE)
1854 ✗ av_log(s->avctx, AV_LOG_DEBUG, "APPx (%s / %8X) len=%d\n",
1855 ✗ av_fourcc2str(av_bswap32(id)), id, len);
1856
1857 /* This fourcc is used by non-avid files too, it holds some
1858 information, but it's always present in AVID-created files. */
1859
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 229 times.
247 if (id == AV_RB32("AVI1")) {
1860 /* structure:
1861 4bytes AVI1
1862 1bytes polarity
1863 1bytes always zero
1864 4bytes field_size
1865 4bytes field_size_less_padding
1866 */
1867
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (len < 1)
1868 ✗ goto out;
1869 18 i = bytestream2_get_byteu(&s->gB); len--;
1870 18 av_log(s->avctx, AV_LOG_DEBUG, "polarity %d\n", i);
1871 18 goto out;
1872 }
1873
1874
2/2
✓ Branch 0 taken 158 times.
✓ Branch 1 taken 71 times.
229 if (id == AV_RB32("JFIF")) {
1875 int t_w, t_h, v1, v2;
1876
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 158 times.
158 if (len < 8)
1877 ✗ goto out;
1878 158 bytestream2_skipu(&s->gB, 1); /* the trailing zero-byte */
1879 158 v1 = bytestream2_get_byteu(&s->gB);
1880 158 v2 = bytestream2_get_byteu(&s->gB);
1881 158 bytestream2_skipu(&s->gB, 1);
1882
1883 158 s->avctx->sample_aspect_ratio.num = bytestream2_get_be16u(&s->gB);
1884 158 s->avctx->sample_aspect_ratio.den = bytestream2_get_be16u(&s->gB);
1885
1/2
✓ Branch 0 taken 158 times.
✗ Branch 1 not taken.
158 if ( s->avctx->sample_aspect_ratio.num <= 0
1886
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 158 times.
158 || s->avctx->sample_aspect_ratio.den <= 0) {
1887 ✗ s->avctx->sample_aspect_ratio.num = 0;
1888 ✗ s->avctx->sample_aspect_ratio.den = 1;
1889 }
1890
1891
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 158 times.
158 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1892 ✗ av_log(s->avctx, AV_LOG_INFO,
1893 "mjpeg: JFIF header found (version: %x.%x) SAR=%d/%d\n",
1894 v1, v2,
1895 ✗ s->avctx->sample_aspect_ratio.num,
1896 ✗ s->avctx->sample_aspect_ratio.den);
1897
1898 158 len -= 8;
1899
2/2
✓ Branch 0 taken 156 times.
✓ Branch 1 taken 2 times.
158 if (len >= 2) {
1900 156 t_w = bytestream2_get_byteu(&s->gB);
1901 156 t_h = bytestream2_get_byteu(&s->gB);
1902
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) {
1903 /* skip thumbnail */
1904 ✗ if (len - 10 - (t_w * t_h * 3) > 0)
1905 ✗ len -= t_w * t_h * 3;
1906 }
1907 156 len -= 2;
1908 }
1909 158 goto out;
1910 }
1911
1912
2/2
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 54 times.
71 if ( id == AV_RB32("Adob")
1913
1/2
✓ Branch 0 taken 17 times.
✗ Branch 1 not taken.
17 && len >= 8
1914
1/2
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
17 && bytestream2_peek_byteu(&s->gB) == 'e'
1915
1/2
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
17 && bytestream2_peek_be32u(&s->gB) != AV_RB32("e_CM")) {
1916 17 bytestream2_skipu(&s->gB, 1); /* 'e' */
1917 17 bytestream2_skipu(&s->gB, 2); /* version */
1918 17 bytestream2_skipu(&s->gB, 2); /* flags0 */
1919 17 bytestream2_skipu(&s->gB, 2); /* flags1 */
1920 17 s->adobe_transform = bytestream2_get_byteu(&s->gB);
1921
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
17 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1922 ✗ av_log(s->avctx, AV_LOG_INFO, "mjpeg: Adobe header found, transform=%d\n", s->adobe_transform);
1923 17 len -= 8;
1924 17 goto out;
1925 }
1926
1927
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
54 if (id == AV_RB32("LJIF")) {
1928 ✗ int rgb = s->rgb;
1929 ✗ int pegasus_rct = s->pegasus_rct;
1930 ✗ if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1931 ✗ av_log(s->avctx, AV_LOG_INFO,
1932 "Pegasus lossless jpeg header found\n");
1933 ✗ if (len < 9)
1934 ✗ goto out;
1935 ✗ bytestream2_skipu(&s->gB, 2); /* version ? */
1936 ✗ bytestream2_skipu(&s->gB, 2); /* unknown always 0? */
1937 ✗ bytestream2_skipu(&s->gB, 2); /* unknown always 0? */
1938 ✗ bytestream2_skipu(&s->gB, 2); /* unknown always 0? */
1939 ✗ switch (i = bytestream2_get_byteu(&s->gB)) {
1940 ✗ case 1:
1941 ✗ rgb = 1;
1942 ✗ pegasus_rct = 0;
1943 ✗ break;
1944 ✗ case 2:
1945 ✗ rgb = 1;
1946 ✗ pegasus_rct = 1;
1947 ✗ break;
1948 ✗ default:
1949 ✗ av_log(s->avctx, AV_LOG_ERROR, "unknown colorspace %d\n", i);
1950 }
1951
1952 ✗ len -= 9;
1953 ✗ if (s->bayer)
1954 ✗ goto out;
1955 ✗ if (s->got_picture)
1956 ✗ if (rgb != s->rgb || pegasus_rct != s->pegasus_rct) {
1957 ✗ av_log(s->avctx, AV_LOG_WARNING, "Mismatching LJIF tag\n");
1958 ✗ goto out;
1959 }
1960
1961 ✗ s->rgb = rgb;
1962 ✗ s->pegasus_rct = pegasus_rct;
1963
1964 ✗ goto out;
1965 }
1966
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) {
1967 8 s->colr = bytestream2_get_byteu(&s->gB);
1968
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1969 ✗ av_log(s->avctx, AV_LOG_INFO, "COLR %d\n", s->colr);
1970 8 len--;
1971 8 goto out;
1972 }
1973
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) {
1974 ✗ s->xfrm = bytestream2_get_byteu(&s->gB);
1975 ✗ if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1976 ✗ av_log(s->avctx, AV_LOG_INFO, "XFRM %d\n", s->xfrm);
1977 ✗ len--;
1978 ✗ goto out;
1979 }
1980
1981 /* JPS extension by VRex */
1982
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) {
1983 int flags, layout, type;
1984 ✗ if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1985 ✗ av_log(s->avctx, AV_LOG_INFO, "_JPSJPS_\n");
1986
1987 ✗ bytestream2_skipu(&s->gB, 4); len -= 4; /* JPS_ */
1988 ✗ bytestream2_skipu(&s->gB, 2); len -= 2; /* block length */
1989 ✗ bytestream2_skipu(&s->gB, 1); /* reserved */
1990 ✗ flags = bytestream2_get_byteu(&s->gB);
1991 ✗ layout = bytestream2_get_byteu(&s->gB);
1992 ✗ type = bytestream2_get_byteu(&s->gB);
1993 ✗ len -= 4;
1994
1995 ✗ av_freep(&s->stereo3d);
1996 ✗ s->stereo3d = av_stereo3d_alloc();
1997 ✗ if (!s->stereo3d) {
1998 ✗ goto out;
1999 }
2000 ✗ if (type == 0) {
2001 ✗ s->stereo3d->type = AV_STEREO3D_2D;
2002 ✗ } else if (type == 1) {
2003 ✗ switch (layout) {
2004 ✗ case 0x01:
2005 ✗ s->stereo3d->type = AV_STEREO3D_LINES;
2006 ✗ break;
2007 ✗ case 0x02:
2008 ✗ s->stereo3d->type = AV_STEREO3D_SIDEBYSIDE;
2009 ✗ break;
2010 ✗ case 0x03:
2011 ✗ s->stereo3d->type = AV_STEREO3D_TOPBOTTOM;
2012 ✗ break;
2013 }
2014 ✗ if (!(flags & 0x04)) {
2015 ✗ s->stereo3d->flags = AV_STEREO3D_FLAG_INVERT;
2016 }
2017 }
2018 ✗ goto out;
2019 }
2020
2021 /* EXIF metadata */
2022
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) {
2023 int ret;
2024
2025 30 bytestream2_skipu(&s->gB, 2); // skip padding
2026 30 len -= 2;
2027
2028
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
30 if (s->exif_metadata.entries) {
2029 ✗ av_log(s->avctx, AV_LOG_WARNING, "multiple EXIF\n");
2030 ✗ goto out;
2031 }
2032
2033 30 ret = av_exif_parse_buffer(s->avctx, s->gB.buffer, len, &s->exif_metadata, AV_EXIF_TIFF_HEADER);
2034
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
30 if (ret < 0) {
2035 ✗ av_log(s->avctx, AV_LOG_WARNING, "unable to parse EXIF buffer\n");
2036 ✗ goto out;
2037 }
2038
2039 30 bytestream2_skipu(&s->gB, ret);
2040 30 len -= ret;
2041
2042 30 goto out;
2043 }
2044
2045 /* Apple MJPEG-A */
2046
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))) {
2047 2 id = bytestream2_get_be32u(&s->gB);
2048 2 len -= 4;
2049 /* Apple MJPEG-A */
2050
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (id == AV_RB32("mjpg")) {
2051 /* structure:
2052 4bytes field size
2053 4bytes pad field size
2054 4bytes next off
2055 4bytes quant off
2056 4bytes huff off
2057 4bytes image off
2058 4bytes scan off
2059 4bytes data off
2060 */
2061 ✗ if (s->avctx->debug & FF_DEBUG_PICT_INFO)
2062 ✗ av_log(s->avctx, AV_LOG_INFO, "mjpeg: Apple MJPEG-A header found\n");
2063 }
2064 }
2065
2066
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) {
2067 int id2;
2068 unsigned seqno;
2069 unsigned nummarkers;
2070
2071 10 id = bytestream2_get_be32u(&s->gB);
2072 10 id2 = bytestream2_get_be24u(&s->gB);
2073 10 len -= 7;
2074
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")) {
2075 ✗ av_log(s->avctx, AV_LOG_WARNING, "Invalid ICC_PROFILE header in APP2\n");
2076 ✗ goto out;
2077 }
2078
2079 10 bytestream2_skipu(&s->gB, 1);
2080 10 seqno = bytestream2_get_byteu(&s->gB);
2081 10 len -= 2;
2082
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (seqno == 0) {
2083 ✗ av_log(s->avctx, AV_LOG_WARNING, "Invalid sequence number in APP2\n");
2084 ✗ goto out;
2085 }
2086
2087 10 nummarkers = bytestream2_get_byteu(&s->gB);
2088 10 len -= 1;
2089
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (nummarkers == 0) {
2090 ✗ av_log(s->avctx, AV_LOG_WARNING, "Invalid number of markers coded in APP2\n");
2091 ✗ goto out;
2092
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) {
2093 ✗ av_log(s->avctx, AV_LOG_WARNING, "Mismatch in coded number of ICC markers between markers\n");
2094 ✗ goto out;
2095
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 } else if (seqno > nummarkers) {
2096 ✗ av_log(s->avctx, AV_LOG_WARNING, "Mismatching sequence number and coded number of ICC markers\n");
2097 ✗ goto out;
2098 }
2099
2100 /* Allocate if this is the first APP2 we've seen. */
2101
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (s->iccnum == 0) {
2102
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
10 if (!FF_ALLOCZ_TYPED_ARRAY(s->iccentries, nummarkers)) {
2103 ✗ av_log(s->avctx, AV_LOG_ERROR, "Could not allocate ICC data arrays\n");
2104 ✗ return AVERROR(ENOMEM);
2105 }
2106 10 s->iccnum = nummarkers;
2107 }
2108
2109
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (s->iccentries[seqno - 1].data) {
2110 ✗ av_log(s->avctx, AV_LOG_WARNING, "Duplicate ICC sequence number\n");
2111 ✗ goto out;
2112 }
2113
2114 10 s->iccentries[seqno - 1].length = len;
2115 10 s->iccentries[seqno - 1].data = av_malloc(len);
2116
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (!s->iccentries[seqno - 1].data) {
2117 ✗ av_log(s->avctx, AV_LOG_ERROR, "Could not allocate ICC data buffer\n");
2118 ✗ return AVERROR(ENOMEM);
2119 }
2120
2121 10 bytestream2_get_bufferu(&s->gB, s->iccentries[seqno - 1].data, len);
2122 10 len = 0;
2123 10 s->iccread++;
2124
2125
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (s->iccread > s->iccnum)
2126 ✗ av_log(s->avctx, AV_LOG_WARNING, "Read more ICC markers than are supposed to be coded\n");
2127 }
2128
2129 16 out:
2130 /* slow but needed for extreme adobe jpegs */
2131
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 247 times.
247 if (len < 0)
2132 ✗ av_log(s->avctx, AV_LOG_ERROR,
2133 "mjpeg: error, decode_app parser read over the end\n");
2134
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 193 times.
247 if (len > 0)
2135 54 bytestream2_skipu(&s->gB, len);
2136
2137 247 return 0;
2138 }
2139
2140 240 static int mjpeg_decode_com(MJpegDecodeContext *s)
2141 {
2142 int len;
2143 240 int ret = mjpeg_parse_len(s, &len, "com");
2144
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 if (ret < 0)
2145 ✗ return ret;
2146
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 if (!len)
2147 ✗ return 0;
2148
2149 int i;
2150 240 char *cbuf = av_malloc(len + 1);
2151
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 if (!cbuf)
2152 ✗ return AVERROR(ENOMEM);
2153
2154
2/2
✓ Branch 0 taken 3655 times.
✓ Branch 1 taken 240 times.
3895 for (i = 0; i < len; i++)
2155 3655 cbuf[i] = bytestream2_get_byteu(&s->gB);
2156
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 230 times.
240 if (cbuf[i - 1] == '\n')
2157 10 cbuf[i - 1] = 0;
2158 else
2159 230 cbuf[i] = 0;
2160
2161
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
2162 ✗ av_log(s->avctx, AV_LOG_INFO, "comment: '%s'\n", cbuf);
2163
2164 /* buggy avid, it puts EOI only at every 10th frame */
2165
2/2
✓ Branch 0 taken 11 times.
✓ Branch 1 taken 229 times.
240 if (!strncmp(cbuf, "AVID", 4)) {
2166 11 parse_avid(s, cbuf, len);
2167
2/2
✓ Branch 0 taken 205 times.
✓ Branch 1 taken 24 times.
229 } else if (!strcmp(cbuf, "CS=ITU601"))
2168 205 s->cs_itu601 = 1;
2169
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) ||
2170
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 (!strncmp(cbuf, "Metasoft MJPEG Codec", 20)))
2171 ✗ s->flipped = 1;
2172
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 else if (!strcmp(cbuf, "MULTISCOPE II")) {
2173 ✗ s->avctx->sample_aspect_ratio = (AVRational) { 1, 2 };
2174 ✗ s->multiscope = 2;
2175 }
2176
2177 240 av_free(cbuf);
2178
2179 240 return 0;
2180 }
2181
2182 /* return the 8 bit start code value and update the search
2183 state. Return -1 if no start code found */
2184 16482 int ff_mjpeg_find_marker(const uint8_t **pbuf_ptr, const uint8_t *buf_end)
2185 {
2186 const uint8_t *buf_ptr;
2187 int val;
2188
2189 16482 buf_ptr = *pbuf_ptr;
2190
2/2
✓ Branch 0 taken 16481 times.
✓ Branch 1 taken 1 times.
32964 while ((buf_ptr = memchr(buf_ptr, 0xff, buf_end - buf_ptr))) {
2191 16481 buf_ptr++;
2192
1/2
✓ Branch 0 taken 16487 times.
✗ Branch 1 not taken.
16487 while (buf_ptr < buf_end) {
2193 16487 val = *buf_ptr++;
2194
2/2
✓ Branch 0 taken 16481 times.
✓ Branch 1 taken 6 times.
16487 if (val != 0xff) {
2195
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))
2196 16481 goto found;
2197 ✗ break;
2198 }
2199 }
2200 }
2201 1 buf_ptr = buf_end;
2202 1 val = -1;
2203 16482 found:
2204 ff_dlog(NULL, "find_marker skipped %td bytes\n",
2205 (buf_ptr - *pbuf_ptr) - (val < 0 ? 0 : 2));
2206 16482 *pbuf_ptr = buf_ptr;
2207 16482 return val;
2208 }
2209
2210 ✗ static void mjpeg_find_raw_scan_data(MJpegDecodeContext *s,
2211 const uint8_t **pbuf_ptr, size_t *pbuf_size)
2212 {
2213 ✗ const uint8_t *buf_ptr = s->gB.buffer;
2214 ✗ const uint8_t *buf_end = buf_ptr + bytestream2_get_bytes_left(&s->gB);
2215
2216 /* Find size of image data buffer (including restart markers).
2217 * No unescaping is performed. */
2218 ✗ const uint8_t *ptr = buf_ptr;
2219 ✗ while ((ptr = memchr(ptr, 0xff, buf_end - ptr))) {
2220 ✗ ptr++;
2221 ✗ if (ptr < buf_end) {
2222 ✗ uint8_t x = *ptr++;
2223 /* Discard multiple optional 0xFF fill bytes. */
2224 ✗ while (x == 0xff && ptr < buf_end)
2225 ✗ x = *ptr++;
2226 ✗ if (x && (x < RST0 || x > RST7)) {
2227 /* Non-restart marker */
2228 ✗ ptr -= 2;
2229 ✗ goto found_hw;
2230 }
2231 }
2232 }
2233 ✗ ptr = buf_end;
2234 ✗ found_hw:
2235 ✗ *pbuf_ptr = buf_ptr;
2236 ✗ *pbuf_size = ptr - buf_ptr;
2237 ✗ bytestream2_skipu(&s->gB, *pbuf_size);
2238 ✗ }
2239
2240 5980 int ff_mjpeg_unescape_sos(MJpegDecodeContext *s)
2241 {
2242 5980 const uint8_t *buf_ptr = s->gB.buffer;
2243 5980 const uint8_t *buf_end = buf_ptr + bytestream2_get_bytes_left(&s->gB);
2244 const uint8_t *unescaped_buf_ptr;
2245 size_t unescaped_buf_size;
2246
2247
2/2
✓ Branch 0 taken 5974 times.
✓ Branch 1 taken 6 times.
5980 if (s->avctx->codec_id == AV_CODEC_ID_MEDIA100 ||
2248
2/2
✓ Branch 0 taken 5948 times.
✓ Branch 1 taken 26 times.
5974 s->avctx->codec_id == AV_CODEC_ID_MJPEGB ||
2249
2/2
✓ Branch 0 taken 74 times.
✓ Branch 1 taken 5874 times.
5948 s->avctx->codec_id == AV_CODEC_ID_THP) {
2250 /* The image data buffer is already unescaped. The only way to
2251 * find the size of the buffer is by fully decoding it. */
2252 106 unescaped_buf_ptr = buf_ptr;
2253 106 unescaped_buf_size = buf_end - buf_ptr;
2254 106 goto the_end;
2255 }
2256
2257 5874 av_fast_padded_malloc(&s->buffer, &s->buffer_size, buf_end - buf_ptr);
2258
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5874 times.
5874 if (!s->buffer)
2259 ✗ return AVERROR(ENOMEM);
2260
2261 /* unescape buffer of SOS, use special treatment for JPEG-LS */
2262
2/2
✓ Branch 0 taken 4957 times.
✓ Branch 1 taken 917 times.
5874 if (!s->ls) {
2263 4957 const uint8_t *src = buf_ptr;
2264 4957 const uint8_t *ptr = src;
2265 4957 uint8_t *dst = s->buffer;
2266 PutByteContext pb;
2267
2268 4957 bytestream2_init_writer(&pb, dst, buf_end - src);
2269
2270
1/2
✓ Branch 0 taken 209253 times.
✗ Branch 1 not taken.
214210 while ((ptr = memchr(ptr, 0xff, buf_end - ptr))) {
2271 209253 ptr++;
2272
1/2
✓ Branch 0 taken 209253 times.
✗ Branch 1 not taken.
209253 if (ptr < buf_end) {
2273 /* Copy verbatim data. */
2274 209253 ptrdiff_t length = (ptr - 1) - src;
2275
2/2
✓ Branch 0 taken 209019 times.
✓ Branch 1 taken 234 times.
209253 if (length > 0)
2276 209019 bytestream2_put_bufferu(&pb, src, length);
2277
2278 209253 uint8_t x = *ptr++;
2279 /* Discard multiple optional 0xFF fill bytes. */
2280
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)
2281 12 x = *ptr++;
2282
2283 209253 src = ptr;
2284
2/2
✓ Branch 0 taken 204296 times.
✓ Branch 1 taken 4957 times.
209253 if (x == 0) {
2285 /* Stuffed zero byte */
2286 204296 bytestream2_put_byteu(&pb, 0xff);
2287
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) {
2288 /* Restart marker */
2289 2650 goto found;
2290 } else {
2291 /* Non-restart marker */
2292 2307 ptr -= 2;
2293 2307 goto found;
2294 }
2295 }
2296 }
2297 /* Copy remaining verbatim data. */
2298 ✗ ptr = buf_end;
2299 ✗ ptrdiff_t length = ptr - src;
2300 ✗ if (length > 0)
2301 ✗ bytestream2_put_bufferu(&pb, src, length);
2302
2303 ✗ found:
2304 4957 unescaped_buf_ptr = s->buffer;
2305 4957 unescaped_buf_size = bytestream2_tell_p(&pb);
2306 4957 memset(s->buffer + unescaped_buf_size, 0,
2307 AV_INPUT_BUFFER_PADDING_SIZE);
2308
2309 4957 bytestream2_skipu(&s->gB, ptr - buf_ptr);
2310
2311 4957 av_log(s->avctx, AV_LOG_DEBUG, "escaping removed %td bytes\n",
2312 4957 (buf_end - buf_ptr) - (unescaped_buf_size));
2313 } else {
2314 917 const uint8_t *src = buf_ptr;
2315 917 const uint8_t *ptr = src;
2316 917 uint8_t *dst = s->buffer;
2317 PutBitContext pb;
2318
2319 917 init_put_bits(&pb, dst, buf_end - src);
2320
2321
1/2
✓ Branch 0 taken 154921 times.
✗ Branch 1 not taken.
155838 while ((ptr = memchr(ptr, 0xff, buf_end - ptr))) {
2322 154921 ptr++;
2323
1/2
✓ Branch 0 taken 154921 times.
✗ Branch 1 not taken.
154921 if (ptr < buf_end) {
2324 /* Copy verbatim data. */
2325 154921 ptrdiff_t length = (ptr - 1) - src;
2326
2/2
✓ Branch 0 taken 145117 times.
✓ Branch 1 taken 9804 times.
154921 if (length > 0)
2327 145117 ff_copy_bits(&pb, src, length * 8);
2328
2329 154921 uint8_t x = *ptr++;
2330 /* Discard multiple optional 0xFF fill bytes. */
2331
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)
2332 ✗ x = *ptr++;
2333
2334 154921 src = ptr;
2335
2/2
✓ Branch 0 taken 154004 times.
✓ Branch 1 taken 917 times.
154921 if (!(x & 0x80)) {
2336 /* Stuffed zero bit */
2337 154004 put_bits(&pb, 15, 0x7f80 | x);
2338
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) {
2339 /* Restart marker */
2340 696 goto found_ls;
2341 } else {
2342 /* Non-restart marker */
2343 221 ptr -= 2;
2344 221 goto found_ls;
2345 }
2346 }
2347 }
2348 /* Copy remaining verbatim data. */
2349 ✗ ptr = buf_end;
2350 ✗ ptrdiff_t length = ptr - src;
2351 ✗ if (length > 0)
2352 ✗ ff_copy_bits(&pb, src, length * 8);
2353
2354 ✗ found_ls:
2355 917 flush_put_bits(&pb);
2356
2357 917 unescaped_buf_ptr = dst;
2358 917 unescaped_buf_size = put_bytes_output(&pb);
2359 917 memset(s->buffer + unescaped_buf_size, 0,
2360 AV_INPUT_BUFFER_PADDING_SIZE);
2361
2362 917 bytestream2_skipu(&s->gB, ptr - buf_ptr);
2363 }
2364
2365 5980 the_end:
2366 5980 return init_get_bits8(&s->gb, unescaped_buf_ptr, unescaped_buf_size);
2367 }
2368
2369 258 static void reset_icc_profile(MJpegDecodeContext *s)
2370 {
2371 int i;
2372
2373
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 248 times.
258 if (s->iccentries) {
2374
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 10 times.
20 for (i = 0; i < s->iccnum; i++)
2375 10 av_freep(&s->iccentries[i].data);
2376 10 av_freep(&s->iccentries);
2377 }
2378
2379 258 s->iccread = 0;
2380 258 s->iccnum = 0;
2381 258 }
2382
2383 2605 int ff_mjpeg_decode_frame_from_buf(AVCodecContext *avctx, AVFrame *frame,
2384 int *got_frame, const AVPacket *avpkt,
2385 const uint8_t *buf, const int buf_size)
2386 {
2387 2605 MJpegDecodeContext *s = avctx->priv_data;
2388 const uint8_t *buf_end, *buf_ptr;
2389 int hshift, vshift;
2390 int start_code;
2391 int index;
2392 2605 int ret = 0;
2393 int is16bit;
2394
2395 2605 s->force_pal8 = 0;
2396 2605 s->total_ls_decoded_height = 0;
2397
2398 2605 s->buf_size = buf_size;
2399
2400 2605 av_exif_free(&s->exif_metadata);
2401 2605 av_freep(&s->stereo3d);
2402 2605 s->adobe_transform = -1;
2403
2404
1/2
✓ Branch 0 taken 2605 times.
✗ Branch 1 not taken.
2605 if (s->iccnum != 0)
2405 ✗ reset_icc_profile(s);
2406
2407 2605 redo_for_pal8:
2408 2613 buf_ptr = buf;
2409 2613 buf_end = buf + buf_size;
2410
1/2
✓ Branch 0 taken 16280 times.
✗ Branch 1 not taken.
16280 while (buf_ptr < buf_end) {
2411 /* find start next marker */
2412 16280 start_code = ff_mjpeg_find_marker(&buf_ptr, buf_end);
2413 /* EOF */
2414
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 16279 times.
16280 if (start_code < 0)
2415 1 break;
2416
2417 16279 ptrdiff_t bytes_left = buf_end - buf_ptr;
2418
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16279 times.
16279 if (bytes_left > INT_MAX / 8) {
2419 ✗ av_log(avctx, AV_LOG_ERROR,
2420 "MJPEG packet 0x%x too big (%td/%d), corrupt data?\n",
2421 start_code, bytes_left, buf_size);
2422 ✗ return AVERROR_INVALIDDATA;
2423 }
2424 16279 av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%td\n",
2425 start_code, buf_end - buf_ptr);
2426
2427 16279 bytestream2_init(&s->gB, buf_ptr, bytes_left);
2428
2429
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16279 times.
16279 if (avctx->debug & FF_DEBUG_STARTCODE)
2430 ✗ av_log(avctx, AV_LOG_DEBUG, "startcode: %X\n", start_code);
2431
2432 /* process markers */
2433
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) {
2434 ✗ av_log(avctx, AV_LOG_DEBUG,
2435 "restart marker: %d\n", start_code & 0x0f);
2436 /* APP fields */
2437
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) {
2438
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 247 times.
247 if ((ret = mjpeg_decode_app(s, start_code)) < 0)
2439 ✗ av_log(avctx, AV_LOG_ERROR, "unable to decode APP fields: %s\n",
2440 ✗ av_err2str(ret));
2441 /* Comment */
2442
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 15792 times.
16032 } else if (start_code == COM) {
2443 240 ret = mjpeg_decode_com(s);
2444
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 if (ret < 0)
2445 ✗ return ret;
2446
2/2
✓ Branch 0 taken 2596 times.
✓ Branch 1 taken 13196 times.
15792 } else if (start_code == DQT) {
2447 2596 ret = ff_mjpeg_decode_dqt(s);
2448
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2596 times.
2596 if (ret < 0)
2449 ✗ return ret;
2450 }
2451
2452 16279 ret = -1;
2453
2454 if (!CONFIG_JPEGLS_DECODER &&
2455 (start_code == SOF55 || start_code == LSE)) {
2456 av_log(avctx, AV_LOG_ERROR, "JPEG-LS support not enabled.\n");
2457 return AVERROR(ENOSYS);
2458 }
2459
2460
2/2
✓ Branch 0 taken 513 times.
✓ Branch 1 taken 15766 times.
16279 if (avctx->skip_frame == AVDISCARD_ALL) {
2461
2/2
✓ Branch 0 taken 101 times.
✓ Branch 1 taken 412 times.
513 switch (start_code) {
2462 101 case SOF0:
2463 case SOF1:
2464 case SOF2:
2465 case SOF3:
2466 case SOF55:
2467 101 break;
2468 412 default:
2469 412 goto skip;
2470 }
2471 }
2472
2473
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) {
2474 2514 case SOI:
2475 2514 s->restart_interval = 0;
2476 2514 s->raw_image_buffer = buf_ptr;
2477 2514 s->raw_image_buffer_size = buf_end - buf_ptr;
2478 /* nothing to do on SOI */
2479 2514 break;
2480 2606 case DHT:
2481
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2606 times.
2606 if ((ret = ff_mjpeg_decode_dht(s)) < 0) {
2482 ✗ av_log(avctx, AV_LOG_ERROR, "huffman table decode error\n");
2483 ✗ goto fail;
2484 }
2485 2606 break;
2486 2171 case SOF0:
2487 case SOF1:
2488
2/2
✓ Branch 0 taken 2169 times.
✓ Branch 1 taken 2 times.
2171 if (start_code == SOF0)
2489 2169 avctx->profile = AV_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT;
2490 else
2491 2 avctx->profile = AV_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT;
2492 2171 s->lossless = 0;
2493 2171 s->ls = 0;
2494 2171 s->progressive = 0;
2495
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2171 times.
2171 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2496 ✗ goto fail;
2497 2171 break;
2498 14 case SOF2:
2499 14 avctx->profile = AV_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT;
2500 14 s->lossless = 0;
2501 14 s->ls = 0;
2502 14 s->progressive = 1;
2503
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 14 times.
14 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2504 ✗ goto fail;
2505 14 break;
2506 205 case SOF3:
2507 205 avctx->profile = AV_PROFILE_MJPEG_HUFFMAN_LOSSLESS;
2508 205 s->lossless = 1;
2509 205 s->ls = 0;
2510 205 s->progressive = 0;
2511
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 205 times.
205 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2512 ✗ goto fail;
2513 205 break;
2514 225 case SOF55:
2515 225 avctx->profile = AV_PROFILE_MJPEG_JPEG_LS;
2516 225 s->lossless = 1;
2517 225 s->ls = 1;
2518 225 s->progressive = 0;
2519
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 225 times.
225 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2520 ✗ goto fail;
2521 225 break;
2522 16 case LSE:
2523
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
16 if (!CONFIG_JPEGLS_DECODER ||
2524 16 (ret = ff_jpegls_decode_lse(s)) < 0)
2525 ✗ goto fail;
2526
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
16 if (ret == 1)
2527 8 goto redo_for_pal8;
2528 8 break;
2529 case EOI:
2530 2506 eoi_parser:
2531
1/2
✓ Branch 0 taken 2506 times.
✗ Branch 1 not taken.
2506 if (!avctx->hwaccel &&
2532
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)
2533 7 mjpeg_idct_scan_progressive_ac(s);
2534 2506 s->cur_scan = 0;
2535
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2506 times.
2506 if (!s->got_picture) {
2536 ✗ av_log(avctx, AV_LOG_WARNING,
2537 "Found EOI before any SOF, ignoring\n");
2538 ✗ break;
2539 }
2540
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2500 times.
2506 if (s->interlaced) {
2541 6 s->bottom_field ^= 1;
2542 /* if not bottom field, do not output image yet */
2543
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 if (s->bottom_field == !s->interlace_polarity)
2544 3 break;
2545 }
2546
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2503 times.
2503 if (avctx->hwaccel) {
2547 ✗ ret = FF_HW_SIMPLE_CALL(avctx, end_frame);
2548 ✗ if (ret < 0)
2549 ✗ return ret;
2550
2551 ✗ av_freep(&s->hwaccel_picture_private);
2552 }
2553
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2503 times.
2503 if ((ret = av_frame_ref(frame, s->picture_ptr)) < 0)
2554 ✗ return ret;
2555
2/2
✓ Branch 0 taken 417 times.
✓ Branch 1 taken 2086 times.
2503 if (s->lossless)
2556 417 frame->flags |= AV_FRAME_FLAG_LOSSLESS;
2557 2503 *got_frame = 1;
2558 2503 s->got_picture = 0;
2559
2560
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) {
2561 ✗ int qp = FFMAX3(s->qscale[0],
2562 s->qscale[1],
2563 s->qscale[2]);
2564
2565 ✗ av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", qp);
2566 }
2567
2568 2503 goto the_end;
2569 2571 case SOS:
2570 2571 s->cur_scan++;
2571
2572
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2571 times.
2571 if ((ret = ff_mjpeg_decode_sos(s)) < 0 &&
2573 ✗ (avctx->err_recognition & AV_EF_EXPLODE))
2574 ✗ goto fail;
2575 2571 break;
2576 220 case DRI:
2577
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 220 times.
220 if ((ret = mjpeg_decode_dri(s)) < 0)
2578 ✗ return ret;
2579 220 break;
2580 ✗ case SOF5:
2581 case SOF6:
2582 case SOF7:
2583 case SOF9:
2584 case SOF10:
2585 case SOF11:
2586 case SOF13:
2587 case SOF14:
2588 case SOF15:
2589 case JPG:
2590 ✗ av_log(avctx, AV_LOG_ERROR,
2591 "mjpeg: unsupported coding type (%x)\n", start_code);
2592 ✗ break;
2593 }
2594
2595
2/2
✓ Branch 0 taken 101 times.
✓ Branch 1 taken 13255 times.
13356 if (avctx->skip_frame == AVDISCARD_ALL) {
2596
1/2
✓ Branch 0 taken 101 times.
✗ Branch 1 not taken.
101 switch (start_code) {
2597 101 case SOF0:
2598 case SOF1:
2599 case SOF2:
2600 case SOF3:
2601 case SOF55:
2602 101 s->got_picture = 0;
2603 101 goto the_end_no_picture;
2604 }
2605 }
2606
2607 13255 skip:
2608 /* eof process start code */
2609 13667 buf_ptr += bytestream2_tell(&s->gB);
2610 13667 av_log(avctx, AV_LOG_DEBUG,
2611 "marker parser used %d bytes\n",
2612 13667 bytestream2_tell(&s->gB));
2613 }
2614
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) {
2615 ✗ av_log(avctx, AV_LOG_WARNING, "EOI missing, emulating\n");
2616 ✗ goto eoi_parser;
2617 }
2618 1 av_log(avctx, AV_LOG_FATAL, "No JPEG data found in image\n");
2619 1 return AVERROR_INVALIDDATA;
2620 ✗ fail:
2621 ✗ s->got_picture = 0;
2622 ✗ return ret;
2623 2503 the_end:
2624
2625 2503 is16bit = av_pix_fmt_desc_get(avctx->pix_fmt)->comp[0].step > 1;
2626
2627
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2497 times.
2503 if (AV_RB32(s->upscale_h)) {
2628 int p;
2629
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 ||
2630 avctx->pix_fmt == AV_PIX_FMT_YUV444P ||
2631 avctx->pix_fmt == AV_PIX_FMT_YUVJ440P ||
2632 avctx->pix_fmt == AV_PIX_FMT_YUV440P ||
2633 avctx->pix_fmt == AV_PIX_FMT_YUVA444P ||
2634 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
2635 avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
2636 avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
2637 avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
2638 avctx->pix_fmt == AV_PIX_FMT_YUV420P16||
2639 avctx->pix_fmt == AV_PIX_FMT_YUVA420P ||
2640 avctx->pix_fmt == AV_PIX_FMT_YUVA420P16||
2641 avctx->pix_fmt == AV_PIX_FMT_GBRP ||
2642 avctx->pix_fmt == AV_PIX_FMT_GBRAP
2643 );
2644 6 ret = av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &hshift, &vshift);
2645
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (ret)
2646 ✗ return ret;
2647
2648
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));
2649
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
24 for (p = 0; p < s->nb_components; p++) {
2650 18 uint8_t *line = s->picture_ptr->data[p];
2651 18 int w = s->width;
2652 18 int h = s->height;
2653
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 9 times.
18 if (!s->upscale_h[p])
2654 9 continue;
2655
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) {
2656 7 w = AV_CEIL_RSHIFT(w, hshift);
2657 7 h = AV_CEIL_RSHIFT(h, vshift);
2658 }
2659
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 8 times.
9 if (s->upscale_v[p] == 1)
2660 1 h = (h + 1) >> 1;
2661
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
9 av_assert0(w > 0);
2662
2/2
✓ Branch 0 taken 534 times.
✓ Branch 1 taken 9 times.
543 for (int i = 0; i < h; i++) {
2663
2/2
✓ Branch 0 taken 214 times.
✓ Branch 1 taken 320 times.
534 if (s->upscale_h[p] == 1) {
2664
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];
2665 214 else line[w - 1] = line[(w - 1) / 2];
2666
2/2
✓ Branch 0 taken 11220 times.
✓ Branch 1 taken 214 times.
11434 for (index = w - 2; index > 0; index--) {
2667
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 11220 times.
11220 if (is16bit)
2668 ✗ ((uint16_t*)line)[index] = (((uint16_t*)line)[index / 2] + ((uint16_t*)line)[(index + 1) / 2]) >> 1;
2669 else
2670 11220 line[index] = (line[index / 2] + line[(index + 1) / 2]) >> 1;
2671 }
2672
2/2
✓ Branch 0 taken 256 times.
✓ Branch 1 taken 64 times.
320 } else if (s->upscale_h[p] == 2) {
2673
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 256 times.
256 if (is16bit) {
2674 ✗ ((uint16_t*)line)[w - 1] = ((uint16_t*)line)[(w - 1) / 3];
2675 ✗ if (w > 1)
2676 ✗ ((uint16_t*)line)[w - 2] = ((uint16_t*)line)[w - 1];
2677 } else {
2678 256 line[w - 1] = line[(w - 1) / 3];
2679
1/2
✓ Branch 0 taken 256 times.
✗ Branch 1 not taken.
256 if (w > 1)
2680 256 line[w - 2] = line[w - 1];
2681 }
2682
2/2
✓ Branch 0 taken 15616 times.
✓ Branch 1 taken 256 times.
15872 for (index = w - 3; index > 0; index--) {
2683 15616 line[index] = (line[index / 3] + line[(index + 1) / 3] + line[(index + 2) / 3] + 1) / 3;
2684 }
2685
1/2
✓ Branch 0 taken 64 times.
✗ Branch 1 not taken.
64 } else if (s->upscale_h[p] == 4) {
2686
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
64 if (is16bit) {
2687 ✗ uint16_t *line16 = (uint16_t *) line;
2688 ✗ line16[w - 1] = line16[(w - 1) >> 2];
2689 ✗ if (w > 1)
2690 ✗ line16[w - 2] = (line16[(w - 1) >> 2] * 3 + line16[(w - 2) >> 2]) >> 2;
2691 ✗ if (w > 2)
2692 ✗ line16[w - 3] = (line16[(w - 1) >> 2] + line16[(w - 2) >> 2]) >> 1;
2693 } else {
2694 64 line[w - 1] = line[(w - 1) >> 2];
2695
1/2
✓ Branch 0 taken 64 times.
✗ Branch 1 not taken.
64 if (w > 1)
2696 64 line[w - 2] = (line[(w - 1) >> 2] * 3 + line[(w - 2) >> 2]) >> 2;
2697
1/2
✓ Branch 0 taken 64 times.
✗ Branch 1 not taken.
64 if (w > 2)
2698 64 line[w - 3] = (line[(w - 1) >> 2] + line[(w - 2) >> 2]) >> 1;
2699 }
2700
2/2
✓ Branch 0 taken 3840 times.
✓ Branch 1 taken 64 times.
3904 for (index = w - 4; index > 0; index--)
2701 3840 line[index] = (line[(index + 3) >> 2] + line[(index + 2) >> 2]
2702 3840 + line[(index + 1) >> 2] + line[index >> 2]) >> 2;
2703 }
2704 534 line += s->linesize[p];
2705 }
2706 }
2707 }
2708
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2502 times.
2503 if (AV_RB32(s->upscale_v)) {
2709 int p;
2710
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 ||
2711 avctx->pix_fmt == AV_PIX_FMT_YUV444P ||
2712 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
2713 avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
2714 avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
2715 avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
2716 avctx->pix_fmt == AV_PIX_FMT_YUV440P ||
2717 avctx->pix_fmt == AV_PIX_FMT_YUVJ440P ||
2718 avctx->pix_fmt == AV_PIX_FMT_YUVA444P ||
2719 avctx->pix_fmt == AV_PIX_FMT_YUVA420P ||
2720 avctx->pix_fmt == AV_PIX_FMT_YUVA420P16||
2721 avctx->pix_fmt == AV_PIX_FMT_GBRP ||
2722 avctx->pix_fmt == AV_PIX_FMT_GBRAP
2723 );
2724 1 ret = av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &hshift, &vshift);
2725
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (ret)
2726 ✗ return ret;
2727
2728
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));
2729
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
4 for (p = 0; p < s->nb_components; p++) {
2730 uint8_t *dst;
2731 3 int w = s->width;
2732 3 int h = s->height;
2733
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
3 if (!s->upscale_v[p])
2734 2 continue;
2735
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) {
2736 1 w = AV_CEIL_RSHIFT(w, hshift);
2737 1 h = AV_CEIL_RSHIFT(h, vshift);
2738 }
2739 1 dst = &((uint8_t *)s->picture_ptr->data[p])[(h - 1) * s->linesize[p]];
2740
2/2
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 1 times.
43 for (int i = h - 1; i; i--) {
2741 42 uint8_t *src1 = &((uint8_t *)s->picture_ptr->data[p])[i * s->upscale_v[p] / (s->upscale_v[p] + 1) * s->linesize[p]];
2742 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]];
2743
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)) {
2744 21 memcpy(dst, src1, w);
2745 } else {
2746
2/2
✓ Branch 0 taken 1344 times.
✓ Branch 1 taken 21 times.
1365 for (index = 0; index < w; index++)
2747 1344 dst[index] = (src1[index] + src2[index]) >> 1;
2748 }
2749 42 dst -= s->linesize[p];
2750 }
2751 }
2752 }
2753
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) {
2754 369 ret = av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &hshift, &vshift);
2755
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 369 times.
369 if (ret)
2756 ✗ return ret;
2757
2758
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 369 times.
369 av_assert0(s->nb_components == av_pix_fmt_count_planes(frame->format));
2759
2/2
✓ Branch 0 taken 1107 times.
✓ Branch 1 taken 369 times.
1476 for (index = 0; index < s->nb_components; index++) {
2760 1107 int h = frame->height;
2761
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)
2762 738 h = AV_CEIL_RSHIFT(h, vshift);
2763
1/2
✓ Branch 0 taken 1107 times.
✗ Branch 1 not taken.
1107 if (frame->data[index]) {
2764 1107 frame->data[index] += (h - 1) * frame->linesize[index];
2765 1107 frame->linesize[index] *= -1;
2766 }
2767 }
2768 }
2769
2770
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2498 times.
2503 if (avctx->pix_fmt == AV_PIX_FMT_GBRP) {
2771
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
5 av_assert0(s->nb_components == 3);
2772 5 FFSWAP(uint8_t *, frame->data[0], frame->data[2]);
2773 5 FFSWAP(uint8_t *, frame->data[0], frame->data[1]);
2774 5 FFSWAP(int, frame->linesize[0], frame->linesize[2]);
2775 5 FFSWAP(int, frame->linesize[0], frame->linesize[1]);
2776 }
2777
2778
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) {
2779 ✗ int w = s->picture_ptr->width;
2780 ✗ int h = s->picture_ptr->height;
2781 ✗ av_assert0(s->nb_components == 4);
2782 ✗ for (int i = 0; i < h; i++) {
2783 int j;
2784 uint8_t *dst[4];
2785 ✗ for (index = 0; index < 4; index++) {
2786 ✗ dst[index] = s->picture_ptr->data[index]
2787 ✗ + s->picture_ptr->linesize[index]*i;
2788 }
2789 ✗ for (j = 0; j < w; j++) {
2790 ✗ int k = dst[3][j];
2791 ✗ int r = dst[0][j] * k;
2792 ✗ int g = dst[1][j] * k;
2793 ✗ int b = dst[2][j] * k;
2794 ✗ dst[0][j] = g * 257 >> 16;
2795 ✗ dst[1][j] = b * 257 >> 16;
2796 ✗ dst[2][j] = r * 257 >> 16;
2797 }
2798 ✗ memset(dst[3], 255, w);
2799 }
2800 }
2801
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) {
2802 ✗ int w = s->picture_ptr->width;
2803 ✗ int h = s->picture_ptr->height;
2804 ✗ av_assert0(s->nb_components == 4);
2805 ✗ for (int i = 0; i < h; i++) {
2806 int j;
2807 uint8_t *dst[4];
2808 ✗ for (index = 0; index < 4; index++) {
2809 ✗ dst[index] = s->picture_ptr->data[index]
2810 ✗ + s->picture_ptr->linesize[index]*i;
2811 }
2812 ✗ for (j = 0; j < w; j++) {
2813 ✗ int k = dst[3][j];
2814 ✗ int r = (255 - dst[0][j]) * k;
2815 ✗ int g = (128 - dst[1][j]) * k;
2816 ✗ int b = (128 - dst[2][j]) * k;
2817 ✗ dst[0][j] = r * 257 >> 16;
2818 ✗ dst[1][j] = (g * 257 >> 16) + 128;
2819 ✗ dst[2][j] = (b * 257 >> 16) + 128;
2820 }
2821 ✗ memset(dst[3], 255, w);
2822 }
2823 }
2824
2825
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2503 times.
2503 if (s->stereo3d) {
2826 ✗ AVStereo3D *stereo = av_stereo3d_create_side_data(frame);
2827 ✗ if (stereo) {
2828 ✗ stereo->type = s->stereo3d->type;
2829 ✗ stereo->flags = s->stereo3d->flags;
2830 }
2831 ✗ av_freep(&s->stereo3d);
2832 }
2833
2834
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) {
2835 AVFrameSideData *sd;
2836 5 size_t offset = 0;
2837 5 int total_size = 0;
2838
2839 /* Sum size of all parts. */
2840
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10 for (int i = 0; i < s->iccnum; i++)
2841 5 total_size += s->iccentries[i].length;
2842
2843 5 ret = ff_frame_new_side_data(avctx, frame, AV_FRAME_DATA_ICC_PROFILE, total_size, &sd);
2844
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
5 if (ret < 0) {
2845 ✗ av_log(avctx, AV_LOG_ERROR, "Could not allocate frame side data\n");
2846 ✗ return ret;
2847 }
2848
2849
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
5 if (sd) {
2850 /* Reassemble the parts, which are now in-order. */
2851
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10 for (int i = 0; i < s->iccnum; i++) {
2852 5 memcpy(sd->data + offset, s->iccentries[i].data, s->iccentries[i].length);
2853 5 offset += s->iccentries[i].length;
2854 }
2855 }
2856 }
2857
2858
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2495 times.
2503 if (s->exif_metadata.entries) {
2859 8 ret = ff_decode_exif_attach_ifd(avctx, frame, &s->exif_metadata);
2860 8 av_exif_free(&s->exif_metadata);
2861
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (ret < 0)
2862 ✗ av_log(avctx, AV_LOG_WARNING, "couldn't attach EXIF metadata\n");
2863 }
2864
2865
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2500 times.
2503 if (avctx->codec_id != AV_CODEC_ID_SMVJPEG &&
2866
1/2
✓ Branch 0 taken 2500 times.
✗ Branch 1 not taken.
2500 (avctx->codec_tag == MKTAG('A', 'V', 'R', 'n') ||
2867
2/2
✓ Branch 0 taken 2490 times.
✓ Branch 1 taken 10 times.
2500 avctx->codec_tag == MKTAG('A', 'V', 'D', 'J')) &&
2868
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 avctx->coded_height > s->orig_height) {
2869 10 frame->height = AV_CEIL_RSHIFT(avctx->coded_height, avctx->lowres);
2870 10 frame->crop_top = frame->height - avctx->height;
2871 }
2872
2873 2493 the_end_no_picture:
2874 2604 av_log(avctx, AV_LOG_DEBUG, "decode frame unused %td bytes\n",
2875 buf_end - buf_ptr);
2876 2604 return buf_ptr - buf;
2877 }
2878
2879 2225 int ff_mjpeg_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame,
2880 AVPacket *avpkt)
2881 {
2882 4450 return ff_mjpeg_decode_frame_from_buf(avctx, frame, got_frame,
2883 2225 avpkt, avpkt->data, avpkt->size);
2884 }
2885
2886
2887 /* mxpeg may call the following function (with a blank MJpegDecodeContext)
2888 * even without having called ff_mjpeg_decode_init(). */
2889 258 av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
2890 {
2891 258 MJpegDecodeContext *s = avctx->priv_data;
2892 int i, j;
2893
2894
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) {
2895 ✗ av_log(avctx, AV_LOG_INFO, "Single field\n");
2896 }
2897
2898 258 av_frame_free(&s->picture);
2899 258 s->picture_ptr = NULL;
2900
2901 258 av_frame_free(&s->smv_frame);
2902
2903 258 av_freep(&s->buffer);
2904 258 av_freep(&s->stereo3d);
2905 258 av_freep(&s->ljpeg_buffer);
2906 258 s->ljpeg_buffer_size = 0;
2907
2908
2/2
✓ Branch 0 taken 774 times.
✓ Branch 1 taken 258 times.
1032 for (i = 0; i < 3; i++) {
2909
2/2
✓ Branch 0 taken 3096 times.
✓ Branch 1 taken 774 times.
3870 for (j = 0; j < 4; j++)
2910 3096 ff_vlc_free(&s->vlcs[i][j]);
2911 }
2912
2/2
✓ Branch 0 taken 1032 times.
✓ Branch 1 taken 258 times.
1290 for (i = 0; i < MAX_COMPONENTS; i++) {
2913 1032 av_freep(&s->blocks[i]);
2914 1032 av_freep(&s->last_nnz[i]);
2915 }
2916 258 av_exif_free(&s->exif_metadata);
2917
2918 258 reset_icc_profile(s);
2919
2920 258 av_freep(&s->hwaccel_picture_private);
2921 258 av_freep(&s->jls_state);
2922
2923 258 return 0;
2924 }
2925
2926 ✗ static av_cold void decode_flush(AVCodecContext *avctx)
2927 {
2928 ✗ MJpegDecodeContext *s = avctx->priv_data;
2929 ✗ s->got_picture = 0;
2930
2931 ✗ s->smv_next_frame = 0;
2932 ✗ av_frame_unref(s->smv_frame);
2933 ✗ }
2934
2935 #if CONFIG_MJPEG_DECODER
2936 #if FF_API_MJPEG_EXTERN_HUFF
2937 #define OFFSET(x) offsetof(MJpegDecodeContext, x)
2938 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2939 static const AVOption options[] = {
2940 { "extern_huff", "Use external huffman table.",
2941 OFFSET(extern_huff), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD | AV_OPT_FLAG_DEPRECATED },
2942 { NULL },
2943 };
2944 #endif
2945
2946 static const AVClass mjpegdec_class = {
2947 .class_name = "MJPEG decoder",
2948 .item_name = av_default_item_name,
2949 #if FF_API_MJPEG_EXTERN_HUFF
2950 .option = options,
2951 #endif
2952 .version = LIBAVUTIL_VERSION_INT,
2953 };
2954
2955 const FFCodec ff_mjpeg_decoder = {
2956 .p.name = "mjpeg",
2957 CODEC_LONG_NAME("MJPEG (Motion JPEG)"),
2958 .p.type = AVMEDIA_TYPE_VIDEO,
2959 .p.id = AV_CODEC_ID_MJPEG,
2960 .priv_data_size = sizeof(MJpegDecodeContext),
2961 .init = ff_mjpeg_decode_init,
2962 .close = ff_mjpeg_decode_end,
2963 FF_CODEC_DECODE_CB(ff_mjpeg_decode_frame),
2964 .flush = decode_flush,
2965 .p.capabilities = AV_CODEC_CAP_DR1,
2966 .p.max_lowres = 3,
2967 .p.priv_class = &mjpegdec_class,
2968 .p.profiles = NULL_IF_CONFIG_SMALL(ff_mjpeg_profiles),
2969 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP |
2970 FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM |
2971 FF_CODEC_CAP_ICC_PROFILES,
2972 .hw_configs = (const AVCodecHWConfigInternal *const []) {
2973 #if CONFIG_MJPEG_NVDEC_HWACCEL
2974 HWACCEL_NVDEC(mjpeg),
2975 #endif
2976 #if CONFIG_MJPEG_VAAPI_HWACCEL
2977 HWACCEL_VAAPI(mjpeg),
2978 #endif
2979 NULL
2980 },
2981 };
2982 #endif
2983 #if CONFIG_THP_DECODER
2984 const FFCodec ff_thp_decoder = {
2985 .p.name = "thp",
2986 CODEC_LONG_NAME("Nintendo Gamecube THP video"),
2987 .p.type = AVMEDIA_TYPE_VIDEO,
2988 .p.id = AV_CODEC_ID_THP,
2989 .priv_data_size = sizeof(MJpegDecodeContext),
2990 .init = ff_mjpeg_decode_init,
2991 .close = ff_mjpeg_decode_end,
2992 FF_CODEC_DECODE_CB(ff_mjpeg_decode_frame),
2993 .flush = decode_flush,
2994 .p.capabilities = AV_CODEC_CAP_DR1,
2995 .p.max_lowres = 3,
2996 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
2997 };
2998 #endif
2999
3000 #if CONFIG_SMVJPEG_DECODER
3001 // SMV JPEG just stacks several output frames into one JPEG picture
3002 // we handle that by setting up the cropping parameters appropriately
3003 13 static void smv_process_frame(AVCodecContext *avctx, AVFrame *frame)
3004 {
3005 13 MJpegDecodeContext *s = avctx->priv_data;
3006
3007
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 av_assert0((s->smv_next_frame + 1) * avctx->height <= avctx->coded_height);
3008
3009 13 frame->width = avctx->coded_width;
3010 13 frame->height = avctx->coded_height;
3011 13 frame->crop_top = FFMIN(s->smv_next_frame * avctx->height, frame->height);
3012 13 frame->crop_bottom = frame->height - (s->smv_next_frame + 1) * avctx->height;
3013
3014
1/2
✓ Branch 0 taken 13 times.
✗ Branch 1 not taken.
13 if (s->smv_frame->pts != AV_NOPTS_VALUE)
3015 13 s->smv_frame->pts += s->smv_frame->duration;
3016 13 s->smv_next_frame = (s->smv_next_frame + 1) % s->smv_frames_per_jpeg;
3017
3018
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 11 times.
13 if (s->smv_next_frame == 0)
3019 2 av_frame_unref(s->smv_frame);
3020 13 }
3021
3022 16 static int smvjpeg_receive_frame(AVCodecContext *avctx, AVFrame *frame)
3023 {
3024 16 MJpegDecodeContext *s = avctx->priv_data;
3025 16 AVPacket *const pkt = avctx->internal->in_pkt;
3026 16 int got_frame = 0;
3027 int ret;
3028
3029
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
16 if (s->smv_next_frame > 0)
3030 10 goto return_frame;
3031
3032 6 ret = ff_decode_get_packet(avctx, pkt);
3033
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 if (ret < 0)
3034 3 return ret;
3035
3036 3 av_frame_unref(s->smv_frame);
3037
3038 3 ret = ff_mjpeg_decode_frame(avctx, s->smv_frame, &got_frame, pkt);
3039 3 s->smv_frame->pkt_dts = pkt->dts;
3040 3 av_packet_unref(pkt);
3041
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (ret < 0)
3042 ✗ return ret;
3043
3044
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (!got_frame)
3045 ✗ return AVERROR(EAGAIN);
3046
3047 // packet duration covers all the frames in the packet
3048 3 s->smv_frame->duration /= s->smv_frames_per_jpeg;
3049
3050 13 return_frame:
3051
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 av_assert0(s->smv_frame->buf[0]);
3052 13 ret = av_frame_ref(frame, s->smv_frame);
3053
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 if (ret < 0)
3054 ✗ return ret;
3055
3056 13 smv_process_frame(avctx, frame);
3057 13 return 0;
3058 }
3059
3060 const FFCodec ff_smvjpeg_decoder = {
3061 .p.name = "smvjpeg",
3062 CODEC_LONG_NAME("SMV JPEG"),
3063 .p.type = AVMEDIA_TYPE_VIDEO,
3064 .p.id = AV_CODEC_ID_SMVJPEG,
3065 .priv_data_size = sizeof(MJpegDecodeContext),
3066 .init = ff_mjpeg_decode_init,
3067 .close = ff_mjpeg_decode_end,
3068 FF_CODEC_RECEIVE_FRAME_CB(smvjpeg_receive_frame),
3069 .flush = decode_flush,
3070 .p.capabilities = AV_CODEC_CAP_DR1,
3071 .caps_internal = FF_CODEC_CAP_EXPORTS_CROPPING |
3072 FF_CODEC_CAP_INIT_CLEANUP,
3073 };
3074 #endif
3075