FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/mjpegdec.c
Date: 2026-06-16 12:54:33
Exec Total Coverage
Lines: 1232 1848 66.7%
Functions: 31 34 91.2%
Branches: 893 1661 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 244 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 1464 times.
✓ Branch 1 taken 244 times.
1708 for (i = 0; i < FF_ARRAY_ELEMS(ht); i++) {
87 1464 ff_vlc_free(&s->vlcs[ht[i].class][ht[i].index]);
88 1464 ret = ff_mjpeg_build_vlc(&s->vlcs[ht[i].class][ht[i].index],
89 1464 ht[i].bits, ht[i].values,
90 1464 ht[i].class == 1, s->avctx);
91
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1464 times.
1464 if (ret < 0)
92 return ret;
93
94
2/2
✓ Branch 0 taken 976 times.
✓ Branch 1 taken 488 times.
1464 if (ht[i].class < 2) {
95 976 memcpy(s->raw_huffman_lengths[ht[i].class][ht[i].index],
96 976 ht[i].bits + 1, 16);
97 976 memcpy(s->raw_huffman_values[ht[i].class][ht[i].index],
98 976 ht[i].values, ht[i].length);
99 }
100 }
101
102 244 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 365 static void init_idct(AVCodecContext *avctx)
116 {
117 365 MJpegDecodeContext *s = avctx->priv_data;
118
119 365 ff_idctdsp_init(&s->idsp, avctx);
120 365 ff_permute_scantable(s->permutated_scantable, ff_zigzag_direct,
121 365 s->idsp.idct_permutation);
122 365 }
123
124 244 av_cold int ff_mjpeg_decode_init(AVCodecContext *avctx)
125 {
126 244 MJpegDecodeContext *s = avctx->priv_data;
127 int ret;
128
129
2/2
✓ Branch 0 taken 242 times.
✓ Branch 1 taken 2 times.
244 if (!s->picture_ptr) {
130 242 s->picture = av_frame_alloc();
131
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 242 times.
242 if (!s->picture)
132 return AVERROR(ENOMEM);
133 242 s->picture_ptr = s->picture;
134 }
135
136 244 s->avctx = avctx;
137 244 ff_blockdsp_init(&s->bdsp);
138 244 init_idct(avctx);
139 244 s->buffer_size = 0;
140 244 s->buffer = NULL;
141 244 s->first_picture = 1;
142 244 s->got_picture = 0;
143 244 s->orig_height = avctx->coded_height;
144 244 avctx->chroma_sample_location = AVCHROMA_LOC_CENTER;
145 244 avctx->colorspace = AVCOL_SPC_BT470BG;
146 244 s->hwaccel_pix_fmt = s->hwaccel_sw_pix_fmt = AV_PIX_FMT_NONE;
147
148
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 244 times.
244 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 244 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
244 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 244 times.
244 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 242 times.
✓ Branch 1 taken 2 times.
244 } else if (avctx->field_order == AV_FIELD_UNKNOWN) {
167
2/2
✓ Branch 0 taken 51 times.
✓ Branch 1 taken 191 times.
242 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 242 times.
244 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 240 times.
242 } 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 233 times.
244 if (avctx->codec->id == AV_CODEC_ID_AMV)
190 11 s->flipped = 1;
191
192 244 return 0;
193 }
194
195
196 10982 static int mjpeg_parse_len(MJpegDecodeContext *s, int *plen, const char *name)
197 {
198 10982 int len = bytestream2_get_be16u(&s->gB);
199
2/4
✓ Branch 0 taken 10982 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 10982 times.
10982 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 10982 *plen = len - 2;
204 10982 return 0;
205 }
206
207 /* quantize tables */
208 2613 int ff_mjpeg_decode_dqt(MJpegDecodeContext *s)
209 {
210 int len, index, i;
211
212 2613 int ret = mjpeg_parse_len(s, &len, "dqt");
213
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2613 times.
2613 if (ret < 0)
214 return ret;
215
216
2/2
✓ Branch 0 taken 3146 times.
✓ Branch 1 taken 2613 times.
5759 while (len >= 65) {
217 3146 uint8_t b = bytestream2_get_byteu(&s->gB);
218 3146 int pr = b >> 4;
219
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3146 times.
3146 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 3146 times.
3146 if (len < (1 + 64 * (1 + pr)))
224 return AVERROR_INVALIDDATA;
225 3146 index = b & 0x0F;
226
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3146 times.
3146 if (index >= 4)
227 return AVERROR_INVALIDDATA;
228 3146 av_log(s->avctx, AV_LOG_DEBUG, "index=%d\n", index);
229 /* read quant table */
230
2/2
✓ Branch 0 taken 201344 times.
✓ Branch 1 taken 3146 times.
204490 for (i = 0; i < 64; i++) {
231
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 201344 times.
201344 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 201344 times.
201344 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 3146 s->qscale[index] = FFMAX(s->quant_matrixes[index][1],
242 3146 s->quant_matrixes[index][8]) >> 1;
243 3146 av_log(s->avctx, AV_LOG_DEBUG, "qscale[%d]: %d\n",
244 index, s->qscale[index]);
245 3146 len -= 1 + 64 * (1 + pr);
246 }
247 2613 return 0;
248 }
249
250 /* decode huffman tables and build VLC decoders */
251 2627 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 2627 int ret = 0;
257
258 2627 ret = mjpeg_parse_len(s, &len, "dht");
259
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2627 times.
2627 if (ret < 0)
260 return ret;
261
262
2/2
✓ Branch 0 taken 9243 times.
✓ Branch 1 taken 2627 times.
11870 while (len > 0) {
263
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9243 times.
9243 if (len < 17)
264 return AVERROR_INVALIDDATA;
265 9243 uint8_t b = bytestream2_get_byteu(&s->gB);
266 9243 class = b >> 4;
267
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9243 times.
9243 if (class >= 2)
268 return AVERROR_INVALIDDATA;
269 9243 index = b & 0x0F;
270
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9243 times.
9243 if (index >= 4)
271 return AVERROR_INVALIDDATA;
272 9243 n = 0;
273
2/2
✓ Branch 0 taken 147888 times.
✓ Branch 1 taken 9243 times.
157131 for (i = 1; i <= 16; i++) {
274 147888 bits_table[i] = bytestream2_get_byteu(&s->gB);
275 147888 n += bits_table[i];
276 }
277 9243 len -= 17;
278
2/4
✓ Branch 0 taken 9243 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 9243 times.
9243 if (len < n || n > 256)
279 return AVERROR_INVALIDDATA;
280
281
2/2
✓ Branch 0 taken 557642 times.
✓ Branch 1 taken 9243 times.
566885 for (i = 0; i < n; i++) {
282 557642 v = bytestream2_get_byteu(&s->gB);
283 557642 val_table[i] = v;
284 }
285 9243 len -= n;
286
287 /* build VLC and flush previous vlc if present */
288 9243 ff_vlc_free(&s->vlcs[class][index]);
289 9243 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 9243 times.
9243 if ((ret = ff_mjpeg_build_vlc(&s->vlcs[class][index], bits_table,
292 9243 val_table, class > 0, s->avctx)) < 0)
293 return ret;
294
295
2/2
✓ Branch 0 taken 4641 times.
✓ Branch 1 taken 4602 times.
9243 if (class > 0) {
296 4641 ff_vlc_free(&s->vlcs[2][index]);
297
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4641 times.
4641 if ((ret = ff_mjpeg_build_vlc(&s->vlcs[2][index], bits_table,
298 4641 val_table, 0, s->avctx)) < 0)
299 return ret;
300 }
301
302
2/2
✓ Branch 0 taken 147888 times.
✓ Branch 1 taken 9243 times.
157131 for (i = 0; i < 16; i++)
303 147888 s->raw_huffman_lengths[class][index][i] = bits_table[i + 1];
304
2/2
✓ Branch 0 taken 2366208 times.
✓ Branch 1 taken 9243 times.
2375451 for (i = 0; i < 256; i++)
305 2366208 s->raw_huffman_values[class][index][i] = val_table[i];
306 }
307 2627 return 0;
308 }
309
310 2639 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 2639 int h_count[MAX_COMPONENTS] = { 0 };
315 2639 int v_count[MAX_COMPONENTS] = { 0 };
316
317 2639 s->cur_scan = 0;
318 2639 memset(s->upscale_h, 0, sizeof(s->upscale_h));
319 2639 memset(s->upscale_v, 0, sizeof(s->upscale_v));
320
321 2639 ret = mjpeg_parse_len(s, &len, "sof");
322
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2639 times.
2639 if (ret < 0)
323 return ret;
324
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2639 times.
2639 if (len < 6)
325 return AVERROR_INVALIDDATA;
326 2639 bits = bytestream2_get_byteu(&s->gB);
327
328
2/4
✓ Branch 0 taken 2639 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2639 times.
2639 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 121 times.
✓ Branch 1 taken 2518 times.
2639 if (s->avctx->bits_per_raw_sample != bits) {
334
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 121 times.
121 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 121 s->avctx->bits_per_raw_sample = bits;
336 121 init_idct(s->avctx);
337 }
338
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2639 times.
2639 if (s->pegasus_rct)
339 bits = 9;
340
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2639 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2639 if (bits == 9 && !s->pegasus_rct)
341 s->rct = 1; // FIXME ugly
342
343
3/4
✓ Branch 0 taken 430 times.
✓ Branch 1 taken 2209 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 430 times.
2639 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 2639 height = bytestream2_get_be16u(&s->gB);
349 2639 width = bytestream2_get_be16u(&s->gB);
350
351 // HACK for odd_height.mov
352
4/6
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 2609 times.
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 30 times.
2639 if (s->interlaced && s->width == width && s->height == height + 1)
353 height = s->height;
354
355 2639 av_log(s->avctx, AV_LOG_DEBUG, "sof0: picture: %dx%d\n", width, height);
356
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2639 times.
2639 if (av_image_check_size(width, height, 0, s->avctx) < 0)
357 return AVERROR_INVALIDDATA;
358
359
4/4
✓ Branch 0 taken 2625 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 2400 times.
✓ Branch 3 taken 225 times.
2639 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 2398 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2398 times.
2400 if (s->buf_size && (width + 7) / 8 * ((height + 7) / 8) > s->buf_size * 4LL)
362 return AVERROR_INVALIDDATA;
363 }
364
365 2639 nb_components = bytestream2_get_byteu(&s->gB);
366
2/4
✓ Branch 0 taken 2639 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2639 times.
2639 if (nb_components <= 0 ||
367 nb_components > MAX_COMPONENTS)
368 return AVERROR_INVALIDDATA;
369
4/4
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 2609 times.
✓ Branch 2 taken 19 times.
✓ Branch 3 taken 11 times.
2639 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 2414 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 225 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2639 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 2639 len -= 6;
383
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2639 times.
2639 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 2639 s->nb_components = nb_components;
389 2639 s->h_max = 1;
390 2639 s->v_max = 1;
391
2/2
✓ Branch 0 taken 7881 times.
✓ Branch 1 taken 2639 times.
10520 for (i = 0; i < nb_components; i++) {
392 /* component id */
393 7881 s->component_id[i] = bytestream2_get_byteu(&s->gB);
394 7881 uint8_t b = bytestream2_get_byteu(&s->gB);
395 7881 h_count[i] = b >> 4;
396 7881 v_count[i] = b & 0x0F;
397 /* compute hmax and vmax (only used in interleaved case) */
398
2/2
✓ Branch 0 taken 2192 times.
✓ Branch 1 taken 5689 times.
7881 if (h_count[i] > s->h_max)
399 2192 s->h_max = h_count[i];
400
2/2
✓ Branch 0 taken 2332 times.
✓ Branch 1 taken 5549 times.
7881 if (v_count[i] > s->v_max)
401 2332 s->v_max = v_count[i];
402 7881 s->quant_index[i] = bytestream2_get_byteu(&s->gB);
403
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7881 times.
7881 if (s->quant_index[i] >= 4) {
404 av_log(s->avctx, AV_LOG_ERROR, "quant_index is invalid\n");
405 return AVERROR_INVALIDDATA;
406 }
407
2/4
✓ Branch 0 taken 7881 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 7881 times.
7881 if (!h_count[i] || !v_count[i]) {
408 av_log(s->avctx, AV_LOG_ERROR,
409 "Invalid sampling factor in component %d %d:%d\n",
410 i, h_count[i], v_count[i]);
411 return AVERROR_INVALIDDATA;
412 }
413
414 7881 av_log(s->avctx, AV_LOG_DEBUG, "component %d %d:%d id: %d quant:%d\n",
415 i, h_count[i], v_count[i],
416 s->component_id[i], s->quant_index[i]);
417 }
418
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2639 times.
2639 if ( nb_components == 4
419 && s->component_id[0] == 'C'
420 && s->component_id[1] == 'M'
421 && s->component_id[2] == 'Y'
422 && s->component_id[3] == 'K')
423 s->adobe_transform = 0;
424
425
4/6
✓ Branch 0 taken 225 times.
✓ Branch 1 taken 2414 times.
✓ Branch 2 taken 225 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 225 times.
2639 if (s->ls && (s->h_max > 1 || s->v_max > 1)) {
426 avpriv_report_missing_feature(s->avctx, "Subsampling in JPEG-LS");
427 return AVERROR_PATCHWELCOME;
428 }
429
430 /* if different size, realloc/alloc picture */
431
5/6
✓ Branch 0 taken 2242 times.
✓ Branch 1 taken 397 times.
✓ Branch 2 taken 2236 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 2236 times.
✗ Branch 5 not taken.
2639 if (width != s->width || height != s->height || bits != s->bits ||
432
1/2
✓ Branch 0 taken 2236 times.
✗ Branch 1 not taken.
2236 memcmp(s->h_count, h_count, sizeof(h_count)) ||
433
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2236 times.
2236 memcmp(s->v_count, v_count, sizeof(v_count))) {
434 403 size_change = 1;
435
436 403 s->width = width;
437 403 s->height = height;
438 403 s->bits = bits;
439 403 memcpy(s->h_count, h_count, sizeof(h_count));
440 403 memcpy(s->v_count, v_count, sizeof(v_count));
441 403 s->interlaced = 0;
442 403 s->got_picture = 0;
443
444 /* test interlaced mode */
445
2/2
✓ Branch 0 taken 200 times.
✓ Branch 1 taken 203 times.
403 if (s->first_picture &&
446
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 200 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
200 (s->multiscope != 2 || s->avctx->pkt_timebase.den >= 25 * s->avctx->pkt_timebase.num) &&
447
2/2
✓ Branch 0 taken 147 times.
✓ Branch 1 taken 53 times.
200 s->orig_height != 0 &&
448
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 138 times.
147 s->height < ((s->orig_height * 3) / 4)) {
449 9 s->interlaced = 1;
450 9 s->bottom_field = s->interlace_polarity;
451 9 s->picture_ptr->flags |= AV_FRAME_FLAG_INTERLACED;
452
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;
453 9 height *= 2;
454 }
455
456 403 ret = ff_set_dimensions(s->avctx, width, height);
457
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 403 times.
403 if (ret < 0)
458 return ret;
459
460
2/2
✓ Branch 0 taken 401 times.
✓ Branch 1 taken 2 times.
403 if (s->avctx->codec_id != AV_CODEC_ID_SMVJPEG &&
461
1/2
✓ Branch 0 taken 401 times.
✗ Branch 1 not taken.
401 (s->avctx->codec_tag == MKTAG('A', 'V', 'R', 'n') ||
462
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 399 times.
401 s->avctx->codec_tag == MKTAG('A', 'V', 'D', 'J')) &&
463
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 s->orig_height < height)
464 2 s->avctx->height = AV_CEIL_RSHIFT(s->orig_height, s->avctx->lowres);
465
466
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 403 times.
403 if (s->bayer) {
467 if (nb_components == 2) {
468 /* Bayer images embedded in DNGs can contain 2 interleaved components and the
469 * width stored in their SOF3 markers is the width of each one. We only output
470 * a single component, therefore we need to adjust the output image width. We
471 * handle the deinterleaving (but not the debayering) in this file. */
472 s->avctx->width *= 2;
473 }
474 /* They can also contain 1 component, which is double the width and half the height
475 * of the final image (rows are interleaved). We don't handle the decoding in this
476 * file, but leave that to the TIFF/DNG decoder. */
477 }
478
479 403 s->first_picture = 0;
480 } else {
481 2236 size_change = 0;
482 }
483
484
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2636 times.
2639 if (s->avctx->codec_id == AV_CODEC_ID_SMVJPEG) {
485 3 s->avctx->height = s->avctx->coded_height / s->smv_frames_per_jpeg;
486
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (s->avctx->height <= 0)
487 return AVERROR_INVALIDDATA;
488 }
489
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2639 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2639 if (s->bayer && s->progressive) {
490 avpriv_request_sample(s->avctx, "progressively coded bayer picture");
491 return AVERROR_INVALIDDATA;
492 }
493
494
5/6
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 2612 times.
✓ Branch 2 taken 19 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 19 times.
✗ Branch 5 not taken.
2639 if (s->got_picture && s->interlaced && (s->bottom_field == !s->interlace_polarity)) {
495
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 19 times.
19 if (s->progressive) {
496 avpriv_request_sample(s->avctx, "progressively coded interlaced picture");
497 return AVERROR_INVALIDDATA;
498 }
499 } else {
500
9/10
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 2332 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.
2620 if (s->v_max == 1 && s->h_max == 1 && s->lossless == 1 && (nb_components == 3 || nb_components == 4))
501 209 s->rgb = 1;
502
2/2
✓ Branch 0 taken 2190 times.
✓ Branch 1 taken 221 times.
2411 else if (!s->lossless)
503 2190 s->rgb = 0;
504 /* XXX: not complete test ! */
505 2620 pix_fmt_id = ((unsigned)s->h_count[0] << 28) | (s->v_count[0] << 24) |
506 2620 (s->h_count[1] << 20) | (s->v_count[1] << 16) |
507 2620 (s->h_count[2] << 12) | (s->v_count[2] << 8) |
508 2620 (s->h_count[3] << 4) | s->v_count[3];
509 2620 av_log(s->avctx, AV_LOG_DEBUG, "pix fmt id %x\n", pix_fmt_id);
510 /* NOTE we do not allocate pictures large enough for the possible
511 * padding of h/v_count being 4 */
512
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2620 times.
2620 if (!(pix_fmt_id & 0xD0D0D0D0))
513 pix_fmt_id -= (pix_fmt_id & 0xF0F0F0F0) >> 1;
514
2/2
✓ Branch 0 taken 412 times.
✓ Branch 1 taken 2208 times.
2620 if (!(pix_fmt_id & 0x0D0D0D0D))
515 412 pix_fmt_id -= (pix_fmt_id & 0x0F0F0F0F) >> 1;
516
517
2/2
✓ Branch 0 taken 20960 times.
✓ Branch 1 taken 2620 times.
23580 for (i = 0; i < 8; i++) {
518 20960 int j = 6 + (i & 1) - (i & 6);
519 20960 int is = (pix_fmt_id >> (4 * i)) & 0xF;
520 20960 int js = (pix_fmt_id >> (4 * j)) & 0xF;
521
522
7/8
✓ Branch 0 taken 11545 times.
✓ Branch 1 taken 9415 times.
✓ Branch 2 taken 11537 times.
✓ Branch 3 taken 8 times.
✓ Branch 4 taken 11537 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1151 times.
✓ Branch 7 taken 10386 times.
20960 if (is == 1 && js != 2 && (i < 2 || i > 5))
523 1151 js = (pix_fmt_id >> ( 8 + 4 * (i & 1))) & 0xF;
524
7/8
✓ Branch 0 taken 11545 times.
✓ Branch 1 taken 9415 times.
✓ Branch 2 taken 11535 times.
✓ Branch 3 taken 10 times.
✓ Branch 4 taken 11535 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1149 times.
✓ Branch 7 taken 10386 times.
20960 if (is == 1 && js != 2 && (i < 2 || i > 5))
525 1149 js = (pix_fmt_id >> (16 + 4 * (i & 1))) & 0xF;
526
527
4/4
✓ Branch 0 taken 11545 times.
✓ Branch 1 taken 9415 times.
✓ Branch 2 taken 10 times.
✓ Branch 3 taken 11535 times.
20960 if (is == 1 && js == 2) {
528
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2 times.
10 if (i & 1) s->upscale_h[j / 2] = 1;
529 2 else s->upscale_v[j / 2] = 1;
530 }
531 }
532
533
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2620 times.
2620 if (s->bayer) {
534 if (pix_fmt_id != 0x11110000 && pix_fmt_id != 0x11000000)
535 goto unk_pixfmt;
536 }
537
538
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 1918 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
2620 switch (pix_fmt_id) {
539 case 0x11110000: /* for bayer-encoded huffman lossless JPEGs embedded in DNGs */
540 if (!s->bayer)
541 goto unk_pixfmt;
542 s->avctx->pix_fmt = AV_PIX_FMT_GRAY16LE;
543 break;
544 429 case 0x11111100:
545
2/2
✓ Branch 0 taken 209 times.
✓ Branch 1 taken 220 times.
429 if (s->rgb)
546
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;
547 else {
548
2/2
✓ Branch 0 taken 216 times.
✓ Branch 1 taken 4 times.
220 if ( s->adobe_transform == 0
549
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') {
550
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;
551 } else {
552
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;
553 else s->avctx->pix_fmt = AV_PIX_FMT_YUV444P16;
554
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;
555 }
556 }
557
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 429 times.
429 av_assert0(s->nb_components == 3);
558 429 break;
559 case 0x11111111:
560 if (s->rgb)
561 s->avctx->pix_fmt = s->bits <= 9 ? AV_PIX_FMT_ABGR : AV_PIX_FMT_RGBA64;
562 else {
563 if (s->adobe_transform == 0 && s->bits <= 8) {
564 s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
565 } else {
566 s->avctx->pix_fmt = s->bits <= 8 ? AV_PIX_FMT_YUVA444P : AV_PIX_FMT_YUVA444P16;
567 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
568 }
569 }
570 av_assert0(s->nb_components == 4);
571 break;
572 2 case 0x11412100:
573
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (s->bits > 8)
574 goto unk_pixfmt;
575
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') {
576 2 s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
577 2 s->upscale_h[0] = 4;
578 2 s->upscale_h[1] = 0;
579 2 s->upscale_h[2] = 1;
580 } else {
581 goto unk_pixfmt;
582 }
583 2 break;
584 case 0x22111122:
585 case 0x22111111:
586 if (s->adobe_transform == 0 && s->bits <= 8) {
587 s->avctx->pix_fmt = AV_PIX_FMT_GBRAP;
588 s->upscale_v[1] = s->upscale_v[2] = 1;
589 s->upscale_h[1] = s->upscale_h[2] = 1;
590 } else if (s->adobe_transform == 2 && s->bits <= 8) {
591 s->avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
592 s->upscale_v[1] = s->upscale_v[2] = 1;
593 s->upscale_h[1] = s->upscale_h[2] = 1;
594 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
595 } else {
596 if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
597 else s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P16;
598 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
599 }
600 av_assert0(s->nb_components == 4);
601 break;
602 4 case 0x12121100:
603 case 0x22122100:
604 case 0x21211100:
605 case 0x21112100:
606 case 0x22211200:
607 case 0x22221100:
608 case 0x22112200:
609 case 0x11222200:
610
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (s->bits > 8)
611 goto unk_pixfmt;
612
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' &&
613
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') {
614 2 s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
615 } else {
616
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;
617
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;
618 }
619 4 break;
620 18 case 0x11000000:
621 case 0x13000000:
622 case 0x14000000:
623 case 0x31000000:
624 case 0x33000000:
625 case 0x34000000:
626 case 0x41000000:
627 case 0x43000000:
628 case 0x44000000:
629
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 2 times.
18 if (s->bits <= 8)
630
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;
631 else
632 2 s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
633 18 break;
634 case 0x12111100:
635 case 0x14121200:
636 case 0x14111100:
637 case 0x22211100:
638 case 0x22112100:
639 if (s->component_id[0] == 'R' && s->component_id[1] == 'G' && s->component_id[2] == 'B') {
640 if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
641 else
642 goto unk_pixfmt;
643 s->upscale_v[1] = s->upscale_v[2] = 1;
644 } else {
645 if (pix_fmt_id == 0x14111100)
646 s->upscale_v[1] = s->upscale_v[2] = 1;
647 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV440P : AV_PIX_FMT_YUVJ440P;
648 else
649 goto unk_pixfmt;
650 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
651 }
652 break;
653 243 case 0x21111100:
654
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') {
655 if (s->bits <= 8) s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
656 else
657 goto unk_pixfmt;
658 s->upscale_h[1] = s->upscale_h[2] = 1;
659 } else {
660
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;
661 else s->avctx->pix_fmt = AV_PIX_FMT_YUV422P16;
662
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;
663 }
664 243 break;
665 2 case 0x11311100:
666
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (s->bits > 8)
667 goto unk_pixfmt;
668
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')
669 2 s->avctx->pix_fmt = AV_PIX_FMT_GBRP;
670 else
671 goto unk_pixfmt;
672 2 s->upscale_h[0] = s->upscale_h[2] = 2;
673 2 break;
674 2 case 0x31111100:
675
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (s->bits > 8)
676 goto unk_pixfmt;
677
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;
678
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;
679 2 s->upscale_h[1] = s->upscale_h[2] = 2;
680 2 break;
681 2 case 0x22121100:
682 case 0x22111200:
683 case 0x41211100:
684
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;
685 else
686 goto unk_pixfmt;
687
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;
688 2 break;
689 1918 case 0x22111100:
690 case 0x23111100:
691 case 0x42111100:
692 case 0x24111100:
693
3/4
✓ Branch 0 taken 1918 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 205 times.
✓ Branch 3 taken 1713 times.
1918 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV420P : AV_PIX_FMT_YUVJ420P;
694 else s->avctx->pix_fmt = AV_PIX_FMT_YUV420P16;
695
2/2
✓ Branch 0 taken 205 times.
✓ Branch 1 taken 1713 times.
1918 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
696
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1918 times.
1918 if (pix_fmt_id == 0x42111100) {
697 if (s->bits > 8)
698 goto unk_pixfmt;
699 s->upscale_h[1] = s->upscale_h[2] = 1;
700
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1918 times.
1918 } else if (pix_fmt_id == 0x24111100) {
701 if (s->bits > 8)
702 goto unk_pixfmt;
703 s->upscale_v[1] = s->upscale_v[2] = 1;
704
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1918 times.
1918 } else if (pix_fmt_id == 0x23111100) {
705 if (s->bits > 8)
706 goto unk_pixfmt;
707 s->upscale_v[1] = s->upscale_v[2] = 2;
708 }
709 1918 break;
710 case 0x41111100:
711 if (s->bits <= 8) s->avctx->pix_fmt = s->cs_itu601 ? AV_PIX_FMT_YUV411P : AV_PIX_FMT_YUVJ411P;
712 else
713 goto unk_pixfmt;
714 s->avctx->color_range = s->cs_itu601 ? AVCOL_RANGE_MPEG : AVCOL_RANGE_JPEG;
715 break;
716 default:
717 unk_pixfmt:
718 avpriv_report_missing_feature(s->avctx, "Pixel format 0x%x bits:%d", pix_fmt_id, s->bits);
719 memset(s->upscale_h, 0, sizeof(s->upscale_h));
720 memset(s->upscale_v, 0, sizeof(s->upscale_v));
721 return AVERROR_PATCHWELCOME;
722 }
723
4/6
✓ Branch 0 taken 2608 times.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2608 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
2620 if ((AV_RB32(s->upscale_h) || AV_RB32(s->upscale_v)) && s->avctx->lowres) {
724 avpriv_report_missing_feature(s->avctx, "Lowres for weird subsampling");
725 return AVERROR_PATCHWELCOME;
726 }
727
2/2
✓ Branch 0 taken 225 times.
✓ Branch 1 taken 2395 times.
2620 if (s->ls) {
728 225 memset(s->upscale_h, 0, sizeof(s->upscale_h));
729 225 memset(s->upscale_v, 0, sizeof(s->upscale_v));
730
2/2
✓ Branch 0 taken 209 times.
✓ Branch 1 taken 16 times.
225 if (s->nb_components == 3) {
731 209 s->avctx->pix_fmt = AV_PIX_FMT_RGB24;
732
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
16 } else if (s->nb_components != 1) {
733 av_log(s->avctx, AV_LOG_ERROR, "Unsupported number of components %d\n", s->nb_components);
734 return AVERROR_PATCHWELCOME;
735
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)
736 8 s->avctx->pix_fmt = AV_PIX_FMT_PAL8;
737
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 else if (s->bits <= 8)
738 8 s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
739 else
740 s->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
741 }
742
743 2620 s->pix_desc = av_pix_fmt_desc_get(s->avctx->pix_fmt);
744
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2620 times.
2620 if (!s->pix_desc) {
745 av_log(s->avctx, AV_LOG_ERROR, "Could not get a pixel format descriptor.\n");
746 return AVERROR_BUG;
747 }
748
749
4/4
✓ Branch 0 taken 2412 times.
✓ Branch 1 taken 208 times.
✓ Branch 2 taken 2209 times.
✓ Branch 3 taken 203 times.
2620 if (s->avctx->pix_fmt == s->hwaccel_sw_pix_fmt && !size_change) {
750 2209 s->avctx->pix_fmt = s->hwaccel_pix_fmt;
751 } else {
752 411 enum AVPixelFormat pix_fmts[] = {
753 #if CONFIG_MJPEG_NVDEC_HWACCEL
754 AV_PIX_FMT_CUDA,
755 #endif
756 #if CONFIG_MJPEG_VAAPI_HWACCEL
757 AV_PIX_FMT_VAAPI,
758 #endif
759 411 s->avctx->pix_fmt,
760 AV_PIX_FMT_NONE,
761 };
762 411 s->hwaccel_pix_fmt = ff_get_format(s->avctx, pix_fmts);
763
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 411 times.
411 if (s->hwaccel_pix_fmt < 0)
764 return AVERROR(EINVAL);
765
766 411 s->hwaccel_sw_pix_fmt = s->avctx->pix_fmt;
767 411 s->avctx->pix_fmt = s->hwaccel_pix_fmt;
768 }
769
770
2/2
✓ Branch 0 taken 94 times.
✓ Branch 1 taken 2526 times.
2620 if (s->avctx->skip_frame == AVDISCARD_ALL) {
771 94 s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
772 94 s->picture_ptr->flags |= AV_FRAME_FLAG_KEY;
773 94 s->got_picture = 1;
774 94 return 0;
775 }
776
777 2526 av_frame_unref(s->picture_ptr);
778 2526 ret = ff_get_buffer(s->avctx, s->picture_ptr, AV_GET_BUFFER_FLAG_REF);
779
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2526 times.
2526 if (ret < 0)
780 return ret;
781 2526 s->picture_ptr->pict_type = AV_PICTURE_TYPE_I;
782 2526 s->picture_ptr->flags |= AV_FRAME_FLAG_KEY;
783 2526 s->got_picture = 1;
784
785 // Lets clear the palette to avoid leaving uninitialized values in it
786
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2518 times.
2526 if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
787 8 memset(s->picture_ptr->data[1], 0, 1024);
788
789
2/2
✓ Branch 0 taken 10104 times.
✓ Branch 1 taken 2526 times.
12630 for (i = 0; i < 4; i++)
790 10104 s->linesize[i] = s->picture_ptr->linesize[i] << s->interlaced;
791
792 ff_dlog(s->avctx, "%d %d %d %d %d %d\n",
793 s->width, s->height, s->linesize[0], s->linesize[1],
794 s->interlaced, s->avctx->height);
795
796 }
797
798
3/6
✓ Branch 0 taken 209 times.
✓ Branch 1 taken 2336 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 209 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2545 if ((s->rgb && !s->lossless && !s->ls) ||
799
5/6
✓ Branch 0 taken 2336 times.
✓ Branch 1 taken 209 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 2320 times.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
2545 (!s->rgb && s->ls && s->nb_components > 1) ||
800
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2537 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
2545 (s->avctx->pix_fmt == AV_PIX_FMT_PAL8 && !s->ls)
801 ) {
802 av_log(s->avctx, AV_LOG_ERROR, "Unsupported coding and pixel format combination\n");
803 return AVERROR_PATCHWELCOME;
804 }
805
806 /* totally blank picture as progressive JPEG will only add details to it */
807
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 2538 times.
2545 if (s->progressive) {
808 7 int bw = (width + s->h_max * 8 - 1) / (s->h_max * 8);
809 7 int bh = (height + s->v_max * 8 - 1) / (s->v_max * 8);
810
2/2
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 7 times.
28 for (i = 0; i < s->nb_components; i++) {
811 21 int size = bw * bh * s->h_count[i] * s->v_count[i];
812 21 av_freep(&s->blocks[i]);
813 21 av_freep(&s->last_nnz[i]);
814 21 s->blocks[i] = av_calloc(size, sizeof(**s->blocks));
815 21 s->last_nnz[i] = av_calloc(size, sizeof(**s->last_nnz));
816
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])
817 return AVERROR(ENOMEM);
818 21 s->block_stride[i] = bw * s->h_count[i];
819 }
820 7 memset(s->coefs_finished, 0, sizeof(s->coefs_finished));
821 }
822
823
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2545 times.
2545 if (s->avctx->hwaccel) {
824 const FFHWAccel *hwaccel = ffhwaccel(s->avctx->hwaccel);
825 s->hwaccel_picture_private =
826 av_mallocz(hwaccel->frame_priv_data_size);
827 if (!s->hwaccel_picture_private)
828 return AVERROR(ENOMEM);
829
830 ret = hwaccel->start_frame(s->avctx, NULL, s->raw_image_buffer,
831 s->raw_image_buffer_size);
832 if (ret < 0)
833 return ret;
834 }
835
836 2545 return 0;
837 }
838
839 26931518 static inline int mjpeg_decode_dc(MJpegDecodeContext *s, int dc_index, int *val)
840 {
841 int code;
842 26931518 code = get_vlc2(&s->gb, s->vlcs[0][dc_index].table, 9, 2);
843
2/4
✓ Branch 0 taken 26931518 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 26931518 times.
26931518 if (code < 0 || code > 16) {
844 av_log(s->avctx, AV_LOG_ERROR,
845 "mjpeg_decode_dc: bad vlc: %d\n", dc_index);
846 return AVERROR_INVALIDDATA;
847 }
848
849
2/2
✓ Branch 0 taken 23865105 times.
✓ Branch 1 taken 3066413 times.
26931518 *val = code ? get_xbits(&s->gb, code) : 0;
850 26931518 return 0;
851 }
852
853 /* decode block and dequantize */
854 4034342 static int decode_block(MJpegDecodeContext *s, int16_t *block, int component,
855 int dc_index, int ac_index, uint16_t *quant_matrix)
856 {
857 int code, i, j, level, val;
858
859 /* DC coef */
860 4034342 int ret = mjpeg_decode_dc(s, dc_index, &val);
861
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4034342 times.
4034342 if (ret < 0)
862 return ret;
863
864 4034342 val = val * (unsigned)quant_matrix[0] + s->last_dc[component];
865 4034342 s->last_dc[component] = val;
866 4034342 block[0] = av_clip_int16(val);
867 /* AC coefs */
868 4034342 i = 0;
869 {
870 4034342 OPEN_READER(re, &s->gb);
871 do {
872 37963104 UPDATE_CACHE(re, &s->gb);
873
2/2
✓ Branch 1 taken 554109 times.
✓ Branch 2 taken 37408995 times.
37963104 GET_VLC(code, re, &s->gb, s->vlcs[1][ac_index].table, 9, 2);
874
875 37963104 i += ((unsigned)code) >> 4;
876 37963104 code &= 0xf;
877
2/2
✓ Branch 0 taken 33973076 times.
✓ Branch 1 taken 3990028 times.
37963104 if (code) {
878 // GET_VLC updates the cache if parsing reaches the second stage.
879 // So we have at least MIN_CACHE_BITS - 9 > 15 bits left here
880 // and don't need to refill the cache.
881 {
882 33973076 int cache = GET_CACHE(re, &s->gb);
883 33973076 int sign = (~cache) >> 31;
884 33973076 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
885 }
886
887 33973076 LAST_SKIP_BITS(re, &s->gb, code);
888
889
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 33973076 times.
33973076 if (i > 63) {
890 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
891 return AVERROR_INVALIDDATA;
892 }
893 33973076 j = s->permutated_scantable[i];
894 33973076 block[j] = level * quant_matrix[i];
895 }
896
2/2
✓ Branch 0 taken 33928762 times.
✓ Branch 1 taken 4034342 times.
37963104 } while (i < 63);
897 4034342 CLOSE_READER(re, &s->gb);
898 }
899
900 4034342 return 0;
901 }
902
903 876 static int decode_dc_progressive(MJpegDecodeContext *s, int16_t *block,
904 int component, int dc_index,
905 uint16_t *quant_matrix, int Al)
906 {
907 unsigned val;
908 876 s->bdsp.clear_block(block);
909 876 int ret = mjpeg_decode_dc(s, dc_index, &val);
910
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 876 times.
876 if (ret < 0)
911 return ret;
912
913 876 val = (val * (quant_matrix[0] << Al)) + s->last_dc[component];
914 876 s->last_dc[component] = val;
915 876 block[0] = val;
916 876 return 0;
917 }
918
919 /* decode block and dequantize - progressive JPEG version */
920 1336 static int decode_block_progressive(MJpegDecodeContext *s, int16_t *block,
921 uint8_t *last_nnz, int ac_index,
922 uint16_t *quant_matrix,
923 int Ss, int Se, int Al, int *EOBRUN)
924 {
925 int code, i, j, val, run;
926 unsigned level;
927
928
2/2
✓ Branch 0 taken 340 times.
✓ Branch 1 taken 996 times.
1336 if (*EOBRUN) {
929 340 (*EOBRUN)--;
930 340 return 0;
931 }
932
933 {
934 996 OPEN_READER(re, &s->gb);
935 996 for (i = Ss; ; i++) {
936 5910 UPDATE_CACHE(re, &s->gb);
937
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);
938
939 6906 run = ((unsigned) code) >> 4;
940 6906 code &= 0xF;
941
2/2
✓ Branch 0 taken 6037 times.
✓ Branch 1 taken 869 times.
6906 if (code) {
942 6037 i += run;
943
944 {
945 6037 int cache = GET_CACHE(re, &s->gb);
946 6037 int sign = (~cache) >> 31;
947 6037 level = (NEG_USR32(sign ^ cache,code) ^ sign) - sign;
948 }
949
950 6037 LAST_SKIP_BITS(re, &s->gb, code);
951
952
2/2
✓ Branch 0 taken 139 times.
✓ Branch 1 taken 5898 times.
6037 if (i >= Se) {
953
1/2
✓ Branch 0 taken 139 times.
✗ Branch 1 not taken.
139 if (i == Se) {
954 139 j = s->permutated_scantable[Se];
955 139 block[j] = level * (quant_matrix[Se] << Al);
956 139 break;
957 }
958 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i);
959 return AVERROR_INVALIDDATA;
960 }
961 5898 j = s->permutated_scantable[i];
962 5898 block[j] = level * (quant_matrix[i] << Al);
963 } else {
964
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 857 times.
869 if (run == 0xF) { // ZRL - skip 15 coefficients
965 12 i += 15;
966
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 if (i >= Se) {
967 av_log(s->avctx, AV_LOG_ERROR, "ZRL overflow: %d\n", i);
968 return AVERROR_INVALIDDATA;
969 }
970 } else {
971 857 val = (1 << run);
972
2/2
✓ Branch 0 taken 149 times.
✓ Branch 1 taken 708 times.
857 if (run) {
973 // Given that GET_VLC reloads internally, we always
974 // have at least 16 bits in the cache here.
975 149 val += NEG_USR32(GET_CACHE(re, &s->gb), run);
976 149 LAST_SKIP_BITS(re, &s->gb, run);
977 }
978 857 *EOBRUN = val - 1;
979 857 break;
980 }
981 }
982 }
983 996 CLOSE_READER(re, &s->gb);
984 }
985
986
1/2
✓ Branch 0 taken 996 times.
✗ Branch 1 not taken.
996 if (i > *last_nnz)
987 996 *last_nnz = i;
988
989 996 return 0;
990 }
991
992 #define REFINE_BIT(j) { \
993 UPDATE_CACHE(re, &s->gb); \
994 sign = block[j] >> 15; \
995 block[j] += SHOW_UBITS(re, &s->gb, 1) * \
996 ((quant_matrix[i] ^ sign) - sign) << Al; \
997 LAST_SKIP_BITS(re, &s->gb, 1); \
998 }
999
1000 #define ZERO_RUN \
1001 for (; ; i++) { \
1002 if (i > last) { \
1003 i += run; \
1004 if (i > Se) { \
1005 av_log(s->avctx, AV_LOG_ERROR, "error count: %d\n", i); \
1006 return -1; \
1007 } \
1008 break; \
1009 } \
1010 j = s->permutated_scantable[i]; \
1011 if (block[j]) \
1012 REFINE_BIT(j) \
1013 else if (run-- == 0) \
1014 break; \
1015 }
1016
1017 /* decode block and dequantize - progressive JPEG refinement pass */
1018 1080 static int decode_block_refinement(MJpegDecodeContext *s, int16_t *block,
1019 uint8_t *last_nnz,
1020 int ac_index, uint16_t *quant_matrix,
1021 int Ss, int Se, int Al, int *EOBRUN)
1022 {
1023 1080 int code, i = Ss, j, sign, val, run;
1024 1080 int last = FFMIN(Se, *last_nnz);
1025
1026 1080 OPEN_READER(re, &s->gb);
1027
2/2
✓ Branch 0 taken 120 times.
✓ Branch 1 taken 960 times.
1080 if (*EOBRUN) {
1028 120 (*EOBRUN)--;
1029 } else {
1030 9339 for (; ; i++) {
1031 9339 UPDATE_CACHE(re, &s->gb);
1032
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);
1033
1034
2/2
✓ Branch 0 taken 9342 times.
✓ Branch 1 taken 957 times.
10299 if (code & 0xF) {
1035 9342 run = ((unsigned) code) >> 4;
1036 9342 val = SHOW_UBITS(re, &s->gb, 1);
1037 9342 LAST_SKIP_BITS(re, &s->gb, 1);
1038
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;
1039 9342 j = s->permutated_scantable[i];
1040 9342 val--;
1041 9342 block[j] = ((quant_matrix[i] << Al) ^ val) - val;
1042
2/2
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 9279 times.
9342 if (i == Se) {
1043
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 if (i > *last_nnz)
1044 63 *last_nnz = i;
1045 63 CLOSE_READER(re, &s->gb);
1046 63 return 0;
1047 }
1048 } else {
1049 957 run = ((unsigned) code) >> 4;
1050
2/2
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 897 times.
957 if (run == 0xF) {
1051
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;
1052 } else {
1053 897 val = run;
1054 897 run = (1 << run);
1055
2/2
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 874 times.
897 if (val) {
1056 // Given that GET_VLC reloads internally, we always
1057 // have at least 16 bits in the cache here.
1058 23 run += SHOW_UBITS(re, &s->gb, val);
1059 23 LAST_SKIP_BITS(re, &s->gb, val);
1060 }
1061 897 *EOBRUN = run - 1;
1062 897 break;
1063 }
1064 }
1065 }
1066
1067
2/2
✓ Branch 0 taken 804 times.
✓ Branch 1 taken 93 times.
897 if (i > *last_nnz)
1068 804 *last_nnz = i;
1069 }
1070
1071
2/2
✓ Branch 0 taken 879 times.
✓ Branch 1 taken 1017 times.
1896 for (; i <= last; i++) {
1072 879 j = s->permutated_scantable[i];
1073
2/2
✓ Branch 0 taken 188 times.
✓ Branch 1 taken 691 times.
879 if (block[j])
1074 188 REFINE_BIT(j)
1075 }
1076 1017 CLOSE_READER(re, &s->gb);
1077
1078 1017 return 0;
1079 }
1080 #undef REFINE_BIT
1081 #undef ZERO_RUN
1082
1083 /* Handles 1 to 4 components */
1084 static int ljpeg_decode_rgb_scan(MJpegDecodeContext *s)
1085 {
1086 int nb_components = s->nb_components_sos;
1087 int predictor = s->Ss;
1088 int point_transform = s->Al;
1089 int i, mb_x, mb_y;
1090 uint16_t (*buffer)[4];
1091 int left[4], top[4], topleft[4];
1092 const int linesize = s->linesize[0];
1093 const int mask = ((1 << s->bits) - 1) << point_transform;
1094 int resync_mb_y = 0;
1095 int resync_mb_x = 0;
1096 int ret;
1097
1098 if (!s->bayer && s->nb_components < 3)
1099 return AVERROR_INVALIDDATA;
1100 if (s->bayer && s->nb_components > 2)
1101 return AVERROR_INVALIDDATA;
1102 if (s->nb_components <= 0 || s->nb_components > 4)
1103 return AVERROR_INVALIDDATA;
1104 if (s->v_max != 1 || s->h_max != 1 || !s->lossless)
1105 return AVERROR_INVALIDDATA;
1106 if (s->bayer) {
1107 if (s->rct || s->pegasus_rct)
1108 return AVERROR_INVALIDDATA;
1109 }
1110
1111 av_fast_malloc(&s->ljpeg_buffer, &s->ljpeg_buffer_size,
1112 (unsigned)s->mb_width * 4 * sizeof(s->ljpeg_buffer[0][0]));
1113 if (!s->ljpeg_buffer)
1114 return AVERROR(ENOMEM);
1115
1116 buffer = s->ljpeg_buffer;
1117
1118 for (i = 0; i < 4; i++)
1119 buffer[0][i] = 1 << (s->bits - 1);
1120
1121 s->restart_count = -1;
1122
1123 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1124 uint8_t *ptr = s->picture_ptr->data[0] + (linesize * mb_y);
1125
1126 if (s->interlaced && s->bottom_field)
1127 ptr += linesize >> 1;
1128
1129 for (i = 0; i < 4; i++)
1130 top[i] = left[i] = topleft[i] = buffer[0][i];
1131
1132 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1133 int modified_predictor = predictor;
1134 int restart;
1135
1136 ret = ff_mjpeg_handle_restart(s, &restart);
1137 if (ret < 0)
1138 return ret;
1139 if (restart) {
1140 resync_mb_x = mb_x;
1141 resync_mb_y = mb_y;
1142 for (i = 0; i < 4; i++)
1143 top[i] = left[i] = topleft[i] = 1 << (s->bits - 1);
1144 }
1145
1146 if (get_bits_left(&s->gb) < 1) {
1147 av_log(s->avctx, AV_LOG_ERROR, "bitstream end in rgb_scan\n");
1148 return AVERROR_INVALIDDATA;
1149 }
1150
1151 if (mb_y == resync_mb_y || mb_y == resync_mb_y + 1 && mb_x < resync_mb_x || !mb_x)
1152 modified_predictor = 1;
1153
1154 for (i = 0; i < nb_components; i++) {
1155 int pred, dc;
1156
1157 topleft[i] = top[i];
1158 top[i] = buffer[mb_x][i];
1159
1160 PREDICT(pred, topleft[i], top[i], left[i], modified_predictor);
1161
1162 ret = mjpeg_decode_dc(s, s->dc_index[i], &dc);
1163 if (ret < 0)
1164 return ret;
1165
1166 left[i] = buffer[mb_x][i] =
1167 mask & (pred + (unsigned)(dc * (1 << point_transform)));
1168 }
1169 }
1170 if (s->rct && s->nb_components == 4) {
1171 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1172 ptr[4 * mb_x + 2] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200) >> 2);
1173 ptr[4 * mb_x + 1] = buffer[mb_x][1] + ptr[4 * mb_x + 2];
1174 ptr[4 * mb_x + 3] = buffer[mb_x][2] + ptr[4 * mb_x + 2];
1175 ptr[4 * mb_x + 0] = buffer[mb_x][3];
1176 }
1177 } else if (s->nb_components == 4) {
1178 for (i = 0; i < nb_components; i++) {
1179 int c = s->comp_index[i];
1180 if (s->bits <= 8) {
1181 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1182 ptr[4 * mb_x + 3 - c] = buffer[mb_x][i];
1183 }
1184 } else if (s->bits == 9) {
1185 return AVERROR_PATCHWELCOME;
1186 } else {
1187 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1188 ((uint16_t*)ptr)[4 * mb_x + c] = buffer[mb_x][i];
1189 }
1190 }
1191 }
1192 } else if (s->rct) {
1193 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1194 ptr[3 * mb_x + 1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2] - 0x200) >> 2);
1195 ptr[3 * mb_x + 0] = buffer[mb_x][1] + ptr[3 * mb_x + 1];
1196 ptr[3 * mb_x + 2] = buffer[mb_x][2] + ptr[3 * mb_x + 1];
1197 }
1198 } else if (s->pegasus_rct) {
1199 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1200 ptr[3 * mb_x + 1] = buffer[mb_x][0] - ((buffer[mb_x][1] + buffer[mb_x][2]) >> 2);
1201 ptr[3 * mb_x + 0] = buffer[mb_x][1] + ptr[3 * mb_x + 1];
1202 ptr[3 * mb_x + 2] = buffer[mb_x][2] + ptr[3 * mb_x + 1];
1203 }
1204 } else if (s->bayer) {
1205 if (s->bits <= 8)
1206 return AVERROR_PATCHWELCOME;
1207 if (nb_components == 1) {
1208 /* Leave decoding to the TIFF/DNG decoder (see comment in ff_mjpeg_decode_sof) */
1209 for (mb_x = 0; mb_x < s->mb_width; mb_x++)
1210 ((uint16_t*)ptr)[mb_x] = buffer[mb_x][0];
1211 } else if (nb_components == 2) {
1212 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1213 ((uint16_t*)ptr)[2 * mb_x + 0] = buffer[mb_x][0];
1214 ((uint16_t*)ptr)[2 * mb_x + 1] = buffer[mb_x][1];
1215 }
1216 }
1217 } else {
1218 for (i = 0; i < nb_components; i++) {
1219 int c = s->comp_index[i];
1220 if (s->bits <= 8) {
1221 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1222 ptr[3 * mb_x + 2 - c] = buffer[mb_x][i];
1223 }
1224 } else if (s->bits == 9) {
1225 return AVERROR_PATCHWELCOME;
1226 } else {
1227 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1228 ((uint16_t*)ptr)[3 * mb_x + 2 - c] = buffer[mb_x][i];
1229 }
1230 }
1231 }
1232 }
1233 }
1234 return 0;
1235 }
1236
1237 200 static int ljpeg_decode_yuv_scan(MJpegDecodeContext *s)
1238 {
1239 200 int predictor = s->Ss;
1240 200 int point_transform = s->Al;
1241 200 int nb_components = s->nb_components_sos;
1242 int i, mb_x, mb_y, mask;
1243 200 int bits = (s->bits + 7) & ~7;
1244 200 int resync_mb_y = 0;
1245 200 int resync_mb_x = 0;
1246 int ret;
1247
1248 200 point_transform += bits - s->bits;
1249 200 mask = ((1 << s->bits) - 1) << point_transform;
1250
1251
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);
1252
1253 200 s->restart_count = -1;
1254
1255
2/2
✓ Branch 0 taken 22450 times.
✓ Branch 1 taken 200 times.
22650 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1256
2/2
✓ Branch 0 taken 3816050 times.
✓ Branch 1 taken 22450 times.
3838500 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1257 int restart;
1258 3816050 ret = ff_mjpeg_handle_restart(s, &restart);
1259
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3816050 times.
3816050 if (ret < 0)
1260 return ret;
1261
2/2
✓ Branch 0 taken 200 times.
✓ Branch 1 taken 3815850 times.
3816050 if (restart) {
1262 200 resync_mb_x = mb_x;
1263 200 resync_mb_y = mb_y;
1264 }
1265
1266
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3816050 times.
3816050 if (get_bits_left(&s->gb) < 1) {
1267 av_log(s->avctx, AV_LOG_ERROR, "bitstream end in yuv_scan\n");
1268 return AVERROR_INVALIDDATA;
1269 }
1270
1271
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) {
1272
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;
1273
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;
1274
2/2
✓ Branch 0 taken 148500 times.
✓ Branch 1 taken 49500 times.
198000 for (i = 0; i < nb_components; i++) {
1275 uint8_t *ptr;
1276 uint16_t *ptr16;
1277 int n, h, v, x, y, c, j, linesize;
1278 148500 n = s->nb_blocks[i];
1279 148500 c = s->comp_index[i];
1280 148500 h = s->h_scount[i];
1281 148500 v = s->v_scount[i];
1282 148500 x = 0;
1283 148500 y = 0;
1284 148500 linesize = s->linesize[c];
1285
1286
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 148500 times.
148500 if (bits > 8) linesize /= 2;
1287
1288
2/2
✓ Branch 0 taken 297000 times.
✓ Branch 1 taken 148500 times.
445500 for (j = 0; j < n; j++) {
1289 int pred, dc;
1290
1291 297000 ret = mjpeg_decode_dc(s, s->dc_index[i], &dc);
1292
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 297000 times.
297000 if (ret < 0)
1293 return ret;
1294
1295
1/2
✓ Branch 0 taken 297000 times.
✗ Branch 1 not taken.
297000 if ( h * mb_x + x >= s->width
1296
1/2
✓ Branch 0 taken 297000 times.
✗ Branch 1 not taken.
297000 || v * mb_y + y >= s->height) {
1297 // Nothing to do
1298
1/2
✓ Branch 0 taken 297000 times.
✗ Branch 1 not taken.
297000 } else if (bits <= 8) {
1299 297000 ptr = s->picture_ptr->data[c] + (linesize * (v * mb_y + y)) + (h * mb_x + x); // FIXME optimize this crap
1300
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) {
1301
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) {
1302 600 pred = 1 << (bits - 1);
1303 } else {
1304 108400 pred = ptr[-1];
1305 }
1306 } else {
1307
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) {
1308 89200 pred = ptr[-linesize];
1309 } else {
1310
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);
1311 }
1312 }
1313
1314
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)
1315 ptr += linesize >> 1;
1316 297000 pred &= mask;
1317 297000 *ptr = pred + ((unsigned)dc << point_transform);
1318 } else {
1319 ptr16 = (uint16_t*)(s->picture_ptr->data[c] + 2 * (linesize * (v * mb_y + y)) + 2 * (h * mb_x + x)); // FIXME optimize this crap
1320 if (y == 0 && toprow) {
1321 if (x == 0 && leftcol) {
1322 pred = 1 << (bits - 1);
1323 } else {
1324 pred = ptr16[-1];
1325 }
1326 } else {
1327 if (x == 0 && leftcol) {
1328 pred = ptr16[-linesize];
1329 } else {
1330 PREDICT(pred, ptr16[-linesize - 1], ptr16[-linesize], ptr16[-1], predictor);
1331 }
1332 }
1333
1334 if (s->interlaced && s->bottom_field)
1335 ptr16 += linesize >> 1;
1336 pred &= mask;
1337 *ptr16 = pred + ((unsigned)dc << point_transform);
1338 }
1339
2/2
✓ Branch 0 taken 198000 times.
✓ Branch 1 taken 99000 times.
297000 if (++x == h) {
1340 198000 x = 0;
1341 198000 y++;
1342 }
1343 }
1344 }
1345 } else {
1346
2/2
✓ Branch 0 taken 11299650 times.
✓ Branch 1 taken 3766550 times.
15066200 for (i = 0; i < nb_components; i++) {
1347 uint8_t *ptr;
1348 uint16_t *ptr16;
1349 int n, h, v, x, y, c, j, linesize, dc;
1350 11299650 n = s->nb_blocks[i];
1351 11299650 c = s->comp_index[i];
1352 11299650 h = s->h_scount[i];
1353 11299650 v = s->v_scount[i];
1354 11299650 x = 0;
1355 11299650 y = 0;
1356 11299650 linesize = s->linesize[c];
1357
1358
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 11299650 times.
11299650 if (bits > 8) linesize /= 2;
1359
1360
2/2
✓ Branch 0 taken 22599300 times.
✓ Branch 1 taken 11299650 times.
33898950 for (j = 0; j < n; j++) {
1361 int pred;
1362
1363 22599300 ret = mjpeg_decode_dc(s, s->dc_index[i], &dc);
1364
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 22599300 times.
22599300 if (ret < 0)
1365 return ret;
1366
1367
1/2
✓ Branch 0 taken 22599300 times.
✗ Branch 1 not taken.
22599300 if ( h * mb_x + x >= s->width
1368
1/2
✓ Branch 0 taken 22599300 times.
✗ Branch 1 not taken.
22599300 || v * mb_y + y >= s->height) {
1369 // Nothing to do
1370
1/2
✓ Branch 0 taken 22599300 times.
✗ Branch 1 not taken.
22599300 } else if (bits <= 8) {
1371 22599300 ptr = s->picture_ptr->data[c] +
1372 22599300 (linesize * (v * mb_y + y)) +
1373 22599300 (h * mb_x + x); // FIXME optimize this crap
1374
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);
1375
1376 22599300 pred &= mask;
1377 22599300 *ptr = pred + ((unsigned)dc << point_transform);
1378 } else {
1379 ptr16 = (uint16_t*)(s->picture_ptr->data[c] + 2 * (linesize * (v * mb_y + y)) + 2 * (h * mb_x + x)); // FIXME optimize this crap
1380 PREDICT(pred, ptr16[-linesize - 1], ptr16[-linesize], ptr16[-1], predictor);
1381
1382 pred &= mask;
1383 *ptr16 = pred + ((unsigned)dc << point_transform);
1384 }
1385
1386
2/2
✓ Branch 0 taken 15066200 times.
✓ Branch 1 taken 7533100 times.
22599300 if (++x == h) {
1387 15066200 x = 0;
1388 15066200 y++;
1389 }
1390 }
1391 }
1392 }
1393 }
1394 }
1395 200 return 0;
1396 }
1397
1398 786684 static av_always_inline void mjpeg_copy_block(MJpegDecodeContext *s,
1399 uint8_t *dst, const uint8_t *src,
1400 int linesize, int lowres)
1401 {
1402
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) {
1403 786684 case 0: s->copy_block(dst, src, linesize, 8);
1404 786684 break;
1405 case 1: copy_block4(dst, src, linesize, linesize, 4);
1406 break;
1407 case 2: copy_block2(dst, src, linesize, linesize, 2);
1408 break;
1409 case 3: *dst = *src;
1410 break;
1411 }
1412 786684 }
1413
1414 11750 static void shift_output(MJpegDecodeContext *s, uint8_t *ptr, int linesize)
1415 {
1416 int block_x, block_y;
1417 11750 int size = 8 >> s->avctx->lowres;
1418
1/2
✓ Branch 0 taken 11750 times.
✗ Branch 1 not taken.
11750 if (s->bits > 8) {
1419
2/2
✓ Branch 0 taken 94000 times.
✓ Branch 1 taken 11750 times.
105750 for (block_y = 0; block_y < size; block_y++)
1420
2/2
✓ Branch 0 taken 752000 times.
✓ Branch 1 taken 94000 times.
846000 for (block_x = 0; block_x < size; block_x++)
1421 752000 *(uint16_t*)(ptr + 2 * block_x + block_y * linesize) <<= 16 - s->bits;
1422 } else {
1423 for (block_y = 0; block_y < size; block_y++)
1424 for (block_x = 0; block_x < size; block_x++)
1425 *(ptr + block_x + block_y * linesize) <<= 8 - s->bits;
1426 }
1427 11750 }
1428
1429 2151 static int mjpeg_decode_scan(MJpegDecodeContext *s)
1430 {
1431 2151 int nb_components = s->nb_components_sos;
1432 2151 int Ah = s->Ah;
1433 2151 int Al = s->Al;
1434 2151 const uint8_t *mb_bitmask = NULL;
1435 2151 const AVFrame *reference = NULL;
1436 int i, mb_x, mb_y, chroma_h_shift, chroma_v_shift, chroma_width, chroma_height;
1437 uint8_t *data[MAX_COMPONENTS];
1438 const uint8_t *reference_data[MAX_COMPONENTS];
1439 int linesize[MAX_COMPONENTS];
1440 2151 GetBitContext mb_bitmask_gb = {0}; // initialize to silence gcc warning
1441
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2150 times.
2151 int bytes_per_pixel = 1 + (s->bits > 8);
1442 2151 int field_pos = -1;
1443 int ret;
1444
1445
2/2
✓ Branch 0 taken 31 times.
✓ Branch 1 taken 2120 times.
2151 if (s->avctx->codec_id == AV_CODEC_ID_MXPEG) {
1446 31 mb_bitmask = s->mb_bitmask;
1447 31 reference = s->reference;
1448 }
1449
1450
2/2
✓ Branch 0 taken 31 times.
✓ Branch 1 taken 2120 times.
2151 if (mb_bitmask) {
1451
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) {
1452 av_log(s->avctx, AV_LOG_ERROR, "mb_bitmask_size mismatches\n");
1453 return AVERROR_INVALIDDATA;
1454 }
1455 31 init_get_bits(&mb_bitmask_gb, mb_bitmask, s->mb_width * s->mb_height);
1456 }
1457
1458 2151 av_pix_fmt_get_chroma_sub_sample(s->avctx->pix_fmt, &chroma_h_shift,
1459 &chroma_v_shift);
1460 2151 chroma_width = AV_CEIL_RSHIFT(s->width, chroma_h_shift);
1461 2151 chroma_height = AV_CEIL_RSHIFT(s->height, chroma_v_shift);
1462
1463
2/2
✓ Branch 0 taken 6445 times.
✓ Branch 1 taken 2151 times.
8596 for (i = 0; i < nb_components; i++) {
1464 6445 int c = s->comp_index[i];
1465 6445 data[c] = s->picture_ptr->data[c];
1466
2/2
✓ Branch 0 taken 93 times.
✓ Branch 1 taken 6352 times.
6445 reference_data[c] = reference ? reference->data[c] : NULL;
1467 6445 linesize[c] = s->linesize[c];
1468 6445 s->coefs_finished[c] |= 1;
1469 }
1470
1471 2151 next_field:
1472 2151 s->restart_count = -1;
1473
1474
2/2
✓ Branch 0 taken 28923 times.
✓ Branch 1 taken 2151 times.
31074 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1475
2/2
✓ Branch 0 taken 808133 times.
✓ Branch 1 taken 28923 times.
837056 for (mb_x = 0; mb_x < s->mb_width; mb_x++) {
1476
4/4
✓ Branch 0 taken 148800 times.
✓ Branch 1 taken 659333 times.
✓ Branch 3 taken 131114 times.
✓ Branch 4 taken 17686 times.
808133 const int copy_mb = mb_bitmask && !get_bits1(&mb_bitmask_gb);
1477 int restart;
1478
1479
2/2
✓ Branch 0 taken 56240 times.
✓ Branch 1 taken 751893 times.
808133 if (s->avctx->codec_id == AV_CODEC_ID_THP) {
1480
2/2
✓ Branch 0 taken 74 times.
✓ Branch 1 taken 56166 times.
56240 if (s->restart_count < 0) {
1481 74 ret = ff_mjpeg_unescape_sos(s);
1482
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 74 times.
74 if (ret < 0)
1483 return ret;
1484 }
1485 56240 restart = ff_mjpeg_should_restart(s);
1486
2/2
✓ Branch 0 taken 74 times.
✓ Branch 1 taken 56166 times.
56240 if (restart)
1487 74 align_get_bits(&s->gb);
1488 } else {
1489 751893 ret = ff_mjpeg_handle_restart(s, &restart);
1490
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 751893 times.
751893 if (ret < 0)
1491 return ret;
1492 }
1493
2/2
✓ Branch 0 taken 4801 times.
✓ Branch 1 taken 803332 times.
808133 if (restart) {
1494
2/2
✓ Branch 0 taken 14395 times.
✓ Branch 1 taken 4801 times.
19196 for (i = 0; i < nb_components; i++)
1495 14395 s->last_dc[i] = (4 << s->bits);
1496 }
1497
1498
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 808133 times.
808133 if (get_bits_left(&s->gb) < 0) {
1499 av_log(s->avctx, AV_LOG_ERROR, "overread %d\n",
1500 -get_bits_left(&s->gb));
1501 return AVERROR_INVALIDDATA;
1502 }
1503
2/2
✓ Branch 0 taken 2400683 times.
✓ Branch 1 taken 808133 times.
3208816 for (i = 0; i < nb_components; i++) {
1504 uint8_t *ptr;
1505 int n, h, v, x, y, c, j;
1506 int block_offset;
1507 2400683 n = s->nb_blocks[i];
1508 2400683 c = s->comp_index[i];
1509 2400683 h = s->h_scount[i];
1510 2400683 v = s->v_scount[i];
1511 2400683 x = 0;
1512 2400683 y = 0;
1513
2/2
✓ Branch 0 taken 4821902 times.
✓ Branch 1 taken 2400683 times.
7222585 for (j = 0; j < n; j++) {
1514 4821902 block_offset = (((linesize[c] * (v * mb_y + y) * 8) +
1515 4821902 (h * mb_x + x) * 8 * bytes_per_pixel) >> s->avctx->lowres);
1516
1517
4/4
✓ Branch 0 taken 90560 times.
✓ Branch 1 taken 4731342 times.
✓ Branch 2 taken 45280 times.
✓ Branch 3 taken 45280 times.
4821902 if (s->interlaced && s->bottom_field)
1518 45280 block_offset += linesize[c] >> 1;
1519
6/6
✓ Branch 0 taken 3845811 times.
✓ Branch 1 taken 976091 times.
✓ Branch 2 taken 2869820 times.
✓ Branch 3 taken 975991 times.
✓ Branch 4 taken 4819453 times.
✓ Branch 5 taken 2449 times.
4821902 if ( 8 * (h * mb_x + x) < ((c == 1) || (c == 2) ? chroma_width : s->width)
1520
6/6
✓ Branch 0 taken 3843370 times.
✓ Branch 1 taken 976083 times.
✓ Branch 2 taken 2867379 times.
✓ Branch 3 taken 975991 times.
✓ Branch 4 taken 4813344 times.
✓ Branch 5 taken 6109 times.
4819453 && 8 * (v * mb_y + y) < ((c == 1) || (c == 2) ? chroma_height : s->height)) {
1521 4813344 ptr = data[c] + block_offset;
1522 } else
1523 8558 ptr = NULL;
1524
2/2
✓ Branch 0 taken 4821026 times.
✓ Branch 1 taken 876 times.
4821902 if (!s->progressive) {
1525
2/2
✓ Branch 0 taken 786684 times.
✓ Branch 1 taken 4034342 times.
4821026 if (copy_mb) {
1526
1/2
✓ Branch 0 taken 786684 times.
✗ Branch 1 not taken.
786684 if (ptr)
1527 786684 mjpeg_copy_block(s, ptr, reference_data[c] + block_offset,
1528 786684 linesize[c], s->avctx->lowres);
1529
1530 } else {
1531 4034342 s->bdsp.clear_block(s->block);
1532
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4034342 times.
4034342 if (decode_block(s, s->block, i,
1533 s->dc_index[i], s->ac_index[i],
1534 4034342 s->quant_matrixes[s->quant_sindex[i]]) < 0) {
1535 av_log(s->avctx, AV_LOG_ERROR,
1536 "error y=%d x=%d\n", mb_y, mb_x);
1537 return AVERROR_INVALIDDATA;
1538 }
1539
3/4
✓ Branch 0 taken 4025800 times.
✓ Branch 1 taken 8542 times.
✓ Branch 2 taken 4025800 times.
✗ Branch 3 not taken.
4034342 if (ptr && linesize[c]) {
1540 4025800 s->idsp.idct_put(ptr, linesize[c], s->block);
1541
2/2
✓ Branch 0 taken 11750 times.
✓ Branch 1 taken 4014050 times.
4025800 if (s->bits & 7)
1542 11750 shift_output(s, ptr, linesize[c]);
1543 }
1544 }
1545 } else {
1546 876 int block_idx = s->block_stride[c] * (v * mb_y + y) +
1547 876 (h * mb_x + x);
1548 876 int16_t *block = s->blocks[c][block_idx];
1549
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 876 times.
876 if (Ah)
1550 block[0] += get_bits1(&s->gb) *
1551 s->quant_matrixes[s->quant_sindex[i]][0] << Al;
1552
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 876 times.
876 else if (decode_dc_progressive(s, block, i, s->dc_index[i],
1553 876 s->quant_matrixes[s->quant_sindex[i]],
1554 Al) < 0) {
1555 av_log(s->avctx, AV_LOG_ERROR,
1556 "error y=%d x=%d\n", mb_y, mb_x);
1557 return AVERROR_INVALIDDATA;
1558 }
1559 }
1560 ff_dlog(s->avctx, "mb: %d %d processed\n", mb_y, mb_x);
1561 ff_dlog(s->avctx, "%d %d %d %d %d %d %d %d \n",
1562 mb_x, mb_y, x, y, c, s->bottom_field,
1563 (v * mb_y + y) * 8, (h * mb_x + x) * 8);
1564
2/2
✓ Branch 0 taken 3512577 times.
✓ Branch 1 taken 1309325 times.
4821902 if (++x == h) {
1565 3512577 x = 0;
1566 3512577 y++;
1567 }
1568 }
1569 }
1570 }
1571 }
1572
1573
3/4
✓ Branch 0 taken 38 times.
✓ Branch 1 taken 2113 times.
✓ Branch 2 taken 38 times.
✗ Branch 3 not taken.
2189 if (s->interlaced &&
1574
1/2
✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
76 bytestream2_get_bytes_left(&s->gB) > 2 &&
1575
1/2
✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
76 bytestream2_tell(&s->gB) > 2 &&
1576 38 bytestream2_tell(&s->gB) != field_pos &&
1577
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 38 times.
38 s->gB.buffer[-2] == 0xFF &&
1578 s->gB.buffer[-1] == 0xD1) {
1579 av_log(s->avctx, AV_LOG_DEBUG, "AVRn interlaced picture marker found\n");
1580 field_pos = bytestream2_tell(&s->gB);
1581 s->bottom_field ^= 1;
1582
1583 goto next_field;
1584 }
1585
1586 2151 return 0;
1587 }
1588
1589 59 static int mjpeg_decode_scan_progressive_ac(MJpegDecodeContext *s)
1590 {
1591 59 int Ss = s->Ss;
1592 59 int Se = s->Se;
1593 59 int Ah = s->Ah;
1594 59 int Al = s->Al;
1595 int mb_x, mb_y;
1596 59 int EOBRUN = 0;
1597 59 int c = s->comp_index[0];
1598 59 uint16_t *quant_matrix = s->quant_matrixes[s->quant_sindex[0]];
1599
1600
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);
1601
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) {
1602 av_log(s->avctx, AV_LOG_ERROR, "SS/SE %d/%d is invalid\n", Ss, Se);
1603 return AVERROR_INVALIDDATA;
1604 }
1605
1606 // s->coefs_finished is a bitmask for coefficients coded
1607 // Ss and Se are parameters telling start and end coefficients
1608 59 s->coefs_finished[c] |= (2ULL << Se) - (1ULL << Ss);
1609
1610 59 s->restart_count = -1;
1611
1612
2/2
✓ Branch 0 taken 412 times.
✓ Branch 1 taken 59 times.
471 for (mb_y = 0; mb_y < s->mb_height; mb_y++) {
1613 412 int block_idx = mb_y * s->block_stride[c];
1614 412 int16_t (*block)[64] = &s->blocks[c][block_idx];
1615 412 uint8_t *last_nnz = &s->last_nnz[c][block_idx];
1616
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++) {
1617 int ret;
1618 int restart;
1619 2416 ret = ff_mjpeg_handle_restart(s, &restart);
1620
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2416 times.
2416 if (ret < 0)
1621 return ret;
1622
2/2
✓ Branch 0 taken 59 times.
✓ Branch 1 taken 2357 times.
2416 if (restart)
1623 59 EOBRUN = 0;
1624
1625
2/2
✓ Branch 0 taken 1080 times.
✓ Branch 1 taken 1336 times.
2416 if (Ah)
1626 1080 ret = decode_block_refinement(s, *block, last_nnz, s->ac_index[0],
1627 quant_matrix, Ss, Se, Al, &EOBRUN);
1628 else
1629 1336 ret = decode_block_progressive(s, *block, last_nnz, s->ac_index[0],
1630 quant_matrix, Ss, Se, Al, &EOBRUN);
1631
1632
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)
1633 ret = AVERROR_INVALIDDATA;
1634
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2416 times.
2416 if (ret < 0) {
1635 av_log(s->avctx, AV_LOG_ERROR,
1636 "error y=%d x=%d\n", mb_y, mb_x);
1637 return AVERROR_INVALIDDATA;
1638 }
1639 }
1640 }
1641 59 return 0;
1642 }
1643
1644 7 static void mjpeg_idct_scan_progressive_ac(MJpegDecodeContext *s)
1645 {
1646 int mb_x, mb_y;
1647 int c;
1648
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 const int bytes_per_pixel = 1 + (s->bits > 8);
1649
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 const int block_size = s->lossless ? 1 : 8;
1650
1651
2/2
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 7 times.
28 for (c = 0; c < s->nb_components; c++) {
1652 21 uint8_t *data = s->picture_ptr->data[c];
1653 21 int linesize = s->linesize[c];
1654 21 int h = s->h_max / s->h_count[c];
1655 21 int v = s->v_max / s->v_count[c];
1656 21 int mb_width = (s->width + h * block_size - 1) / (h * block_size);
1657 21 int mb_height = (s->height + v * block_size - 1) / (v * block_size);
1658
1659
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 21 times.
21 if (~s->coefs_finished[c])
1660 av_log(s->avctx, AV_LOG_WARNING, "component %d is incomplete\n", c);
1661
1662
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)
1663 data += linesize >> 1;
1664
1665
2/2
✓ Branch 0 taken 153 times.
✓ Branch 1 taken 21 times.
174 for (mb_y = 0; mb_y < mb_height; mb_y++) {
1666 153 uint8_t *ptr = data + (mb_y * linesize * 8 >> s->avctx->lowres);
1667 153 int block_idx = mb_y * s->block_stride[c];
1668 153 int16_t (*block)[64] = &s->blocks[c][block_idx];
1669
2/2
✓ Branch 0 taken 860 times.
✓ Branch 1 taken 153 times.
1013 for (mb_x = 0; mb_x < mb_width; mb_x++, block++) {
1670 860 s->idsp.idct_put(ptr, linesize, *block);
1671
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 860 times.
860 if (s->bits & 7)
1672 shift_output(s, ptr, linesize);
1673 860 ptr += bytes_per_pixel * 8 >> s->avctx->lowres;
1674 }
1675 }
1676 }
1677 7 }
1678
1679 2631 int ff_mjpeg_decode_sos(MJpegDecodeContext *s)
1680 {
1681 int len, i, h, v;
1682 int index, id, ret;
1683
2/2
✓ Branch 0 taken 421 times.
✓ Branch 1 taken 2210 times.
2631 const int block_size = s->lossless ? 1 : 8;
1684
1685
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2631 times.
2631 if (!s->got_picture) {
1686 av_log(s->avctx, AV_LOG_WARNING,
1687 "Can not process SOS before SOF, skipping\n");
1688 return AVERROR_INVALIDDATA;
1689 }
1690
1691 2631 ret = mjpeg_parse_len(s, &len, "sos");
1692
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2631 times.
2631 if (ret < 0)
1693 return ret;
1694
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2631 times.
2631 if (len < 1)
1695 return AVERROR_INVALIDDATA;
1696 2631 s->nb_components_sos = bytestream2_get_byteu(&s->gB);
1697
2/4
✓ Branch 0 taken 2631 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2631 times.
2631 if (s->nb_components_sos == 0 || s->nb_components_sos > MAX_COMPONENTS) {
1698 avpriv_report_missing_feature(s->avctx,
1699 "decode_sos: nb_components (%d)",
1700 s->nb_components_sos);
1701 return AVERROR_PATCHWELCOME;
1702 }
1703
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2631 times.
2631 if (len != 4 + 2 * s->nb_components_sos) {
1704 av_log(s->avctx, AV_LOG_ERROR, "decode_sos: len(%d) mismatch %d components\n", len, s->nb_components_sos);
1705 return AVERROR_INVALIDDATA;
1706 }
1707
2/2
✓ Branch 0 taken 7739 times.
✓ Branch 1 taken 2631 times.
10370 for (i = 0; i < s->nb_components_sos; i++) {
1708 7739 id = bytestream2_get_byteu(&s->gB);
1709 7739 av_log(s->avctx, AV_LOG_DEBUG, "component: %d\n", id);
1710 /* find component index */
1711
1/2
✓ Branch 0 taken 15467 times.
✗ Branch 1 not taken.
15467 for (index = 0; index < s->nb_components; index++)
1712
2/2
✓ Branch 0 taken 7739 times.
✓ Branch 1 taken 7728 times.
15467 if (id == s->component_id[index])
1713 7739 break;
1714
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7739 times.
7739 if (index == s->nb_components) {
1715 av_log(s->avctx, AV_LOG_ERROR,
1716 "decode_sos: index(%d) out of components\n", index);
1717 return AVERROR_INVALIDDATA;
1718 }
1719 /* Metasoft MJPEG codec has Cb and Cr swapped */
1720
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7739 times.
7739 if (s->avctx->codec_tag == MKTAG('M', 'T', 'S', 'J')
1721 && s->nb_components_sos == 3 && s->nb_components == 3 && i)
1722 index = 3 - i;
1723
1724 7739 s->quant_sindex[i] = s->quant_index[index];
1725 7739 s->nb_blocks[i] = s->h_count[index] * s->v_count[index];
1726 7739 s->h_scount[i] = s->h_count[index];
1727 7739 s->v_scount[i] = s->v_count[index];
1728
1729 7739 s->comp_index[i] = index;
1730
1731 7739 uint8_t b = bytestream2_get_byteu(&s->gB);
1732 7739 s->dc_index[i] = b >> 4;
1733 7739 s->ac_index[i] = b & 0x0F;
1734
1735
2/4
✓ Branch 0 taken 7739 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7739 times.
✗ Branch 3 not taken.
7739 if (s->dc_index[i] < 0 || s->ac_index[i] < 0 ||
1736
2/4
✓ Branch 0 taken 7739 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 7739 times.
7739 s->dc_index[i] >= 4 || s->ac_index[i] >= 4)
1737 goto out_of_range;
1738
5/8
✓ Branch 0 taken 7739 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 80 times.
✓ Branch 3 taken 7659 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 80 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 7659 times.
7739 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))
1739 goto out_of_range;
1740 }
1741
1742 2631 s->Ss = bytestream2_get_byteu(&s->gB); /* JPEG Ss / lossless JPEG predictor / JPEG-LS NEAR */
1743 2631 s->Se = bytestream2_get_byteu(&s->gB); /* JPEG Se / JPEG-LS ILV */
1744 2631 uint8_t b = bytestream2_get_byteu(&s->gB);
1745 2631 s->Ah = b >> 4; /* Ah */
1746 2631 s->Al = b & 0x0F; /* Al */
1747
1748
2/2
✓ Branch 0 taken 2554 times.
✓ Branch 1 taken 77 times.
2631 if (s->nb_components_sos > 1) {
1749 /* interleaved stream */
1750 2554 s->mb_width = (s->width + s->h_max * block_size - 1) / (s->h_max * block_size);
1751 2554 s->mb_height = (s->height + s->v_max * block_size - 1) / (s->v_max * block_size);
1752
2/2
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 14 times.
77 } else if (!s->ls) { /* skip this for JPEG-LS */
1753 63 h = s->h_max / s->h_scount[0];
1754 63 v = s->v_max / s->v_scount[0];
1755 63 s->mb_width = (s->width + h * block_size - 1) / (h * block_size);
1756 63 s->mb_height = (s->height + v * block_size - 1) / (v * block_size);
1757 63 s->nb_blocks[0] = 1;
1758 63 s->h_scount[0] = 1;
1759 63 s->v_scount[0] = 1;
1760 }
1761
1762
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2631 times.
2631 if (s->avctx->debug & FF_DEBUG_PICT_INFO)
1763 av_log(s->avctx, AV_LOG_DEBUG, "%s %s p:%d >>:%d ilv:%d bits:%d skip:%d %s comp:%d\n",
1764 s->lossless ? "lossless" : "sequential DCT", s->rgb ? "RGB" : "",
1765 s->Ss, s->Al, s->Se, s->bits, s->mjpb_skiptosod,
1766 s->pegasus_rct ? "PRCT" : (s->rct ? "RCT" : ""), s->nb_components_sos);
1767
1768
1769 /* mjpeg-b can have padding bytes between sos and image data, skip them */
1770
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 2599 times.
2631 if (s->mjpb_skiptosod)
1771 32 bytestream2_skip(&s->gB, s->mjpb_skiptosod);
1772
1773
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2631 times.
2631 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 2210 times.
2631 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 2142 times.
✓ Branch 2 taken 59 times.
✓ Branch 3 taken 9 times.
2210 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 2151 times.
2151 if ((ret = mjpeg_decode_scan(s)) < 0)
1805 return ret;
1806 }
1807 }
1808 }
1809
1810
2/2
✓ Branch 0 taken 2625 times.
✓ Branch 1 taken 6 times.
2631 if (s->avctx->codec_id == AV_CODEC_ID_MEDIA100 ||
1811
2/2
✓ Branch 0 taken 2599 times.
✓ Branch 1 taken 26 times.
2625 s->avctx->codec_id == AV_CODEC_ID_MJPEGB ||
1812
2/2
✓ Branch 0 taken 74 times.
✓ Branch 1 taken 2525 times.
2599 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 2631 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 232 static int mjpeg_decode_app(MJpegDecodeContext *s, int start_code)
1836 {
1837 int len, id, i;
1838
1839 232 int ret = mjpeg_parse_len(s, &len, "app");
1840
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 232 times.
232 if (ret < 0)
1841 return AVERROR_INVALIDDATA;
1842
1843
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 232 times.
232 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 232 id = bytestream2_get_be32u(&s->gB);
1851 232 len -= 4;
1852
1853
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 232 times.
232 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 214 times.
232 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 149 times.
✓ Branch 1 taken 65 times.
214 if (id == AV_RB32("JFIF")) {
1875 int t_w, t_h, v1, v2;
1876
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 149 times.
149 if (len < 8)
1877 goto out;
1878 149 bytestream2_skipu(&s->gB, 1); /* the trailing zero-byte */
1879 149 v1 = bytestream2_get_byteu(&s->gB);
1880 149 v2 = bytestream2_get_byteu(&s->gB);
1881 149 bytestream2_skipu(&s->gB, 1);
1882
1883 149 s->avctx->sample_aspect_ratio.num = bytestream2_get_be16u(&s->gB);
1884 149 s->avctx->sample_aspect_ratio.den = bytestream2_get_be16u(&s->gB);
1885
1/2
✓ Branch 0 taken 149 times.
✗ Branch 1 not taken.
149 if ( s->avctx->sample_aspect_ratio.num <= 0
1886
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 149 times.
149 || 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 149 times.
149 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 149 len -= 8;
1899
2/2
✓ Branch 0 taken 147 times.
✓ Branch 1 taken 2 times.
149 if (len >= 2) {
1900 147 t_w = bytestream2_get_byteu(&s->gB);
1901 147 t_h = bytestream2_get_byteu(&s->gB);
1902
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 147 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
147 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 147 len -= 2;
1908 }
1909 149 goto out;
1910 }
1911
1912
2/2
✓ Branch 0 taken 17 times.
✓ Branch 1 taken 48 times.
65 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 48 times.
48 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 40 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
48 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 40 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
40 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 40 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
40 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 26 times.
✓ Branch 1 taken 14 times.
✓ Branch 2 taken 24 times.
✓ Branch 3 taken 2 times.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
40 if (start_code == APP1 && id == AV_RB32("Exif") && len >= 2) {
2023 int ret;
2024
2025 24 bytestream2_skipu(&s->gB, 2); // skip padding
2026 24 len -= 2;
2027
2028
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 if (s->exif_metadata.entries) {
2029 av_log(s->avctx, AV_LOG_WARNING, "multiple EXIF\n");
2030 goto out;
2031 }
2032
2033 24 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 24 times.
24 if (ret < 0) {
2035 av_log(s->avctx, AV_LOG_WARNING, "unable to parse EXIF buffer\n");
2036 goto out;
2037 }
2038
2039 24 bytestream2_skipu(&s->gB, ret);
2040 24 len -= ret;
2041
2042 24 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 232 times.
232 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 48 times.
✓ Branch 1 taken 184 times.
232 if (len > 0)
2135 48 bytestream2_skipu(&s->gB, len);
2136
2137 232 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 16413 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 16413 buf_ptr = *pbuf_ptr;
2190
2/2
✓ Branch 0 taken 16412 times.
✓ Branch 1 taken 1 times.
32826 while ((buf_ptr = memchr(buf_ptr, 0xff, buf_end - buf_ptr))) {
2191 16412 buf_ptr++;
2192
1/2
✓ Branch 0 taken 16418 times.
✗ Branch 1 not taken.
16418 while (buf_ptr < buf_end) {
2193 16418 val = *buf_ptr++;
2194
2/2
✓ Branch 0 taken 16412 times.
✓ Branch 1 taken 6 times.
16418 if (val != 0xff) {
2195
2/4
✓ Branch 0 taken 16412 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 16412 times.
✗ Branch 3 not taken.
16412 if ((val >= SOF0) && (val <= COM))
2196 16412 goto found;
2197 break;
2198 }
2199 }
2200 }
2201 1 buf_ptr = buf_end;
2202 1 val = -1;
2203 16413 found:
2204 ff_dlog(NULL, "find_marker skipped %td bytes\n",
2205 (buf_ptr - *pbuf_ptr) - (val < 0 ? 0 : 2));
2206 16413 *pbuf_ptr = buf_ptr;
2207 16413 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 5977 int ff_mjpeg_unescape_sos(MJpegDecodeContext *s)
2241 {
2242 5977 const uint8_t *buf_ptr = s->gB.buffer;
2243 5977 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 5971 times.
✓ Branch 1 taken 6 times.
5977 if (s->avctx->codec_id == AV_CODEC_ID_MEDIA100 ||
2248
2/2
✓ Branch 0 taken 5945 times.
✓ Branch 1 taken 26 times.
5971 s->avctx->codec_id == AV_CODEC_ID_MJPEGB ||
2249
2/2
✓ Branch 0 taken 74 times.
✓ Branch 1 taken 5871 times.
5945 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 5871 av_fast_padded_malloc(&s->buffer, &s->buffer_size, buf_end - buf_ptr);
2258
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5871 times.
5871 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 4954 times.
✓ Branch 1 taken 917 times.
5871 if (!s->ls) {
2263 4954 const uint8_t *src = buf_ptr;
2264 4954 const uint8_t *ptr = src;
2265 4954 uint8_t *dst = s->buffer;
2266 PutByteContext pb;
2267
2268 4954 bytestream2_init_writer(&pb, dst, buf_end - src);
2269
2270
1/2
✓ Branch 0 taken 208913 times.
✗ Branch 1 not taken.
213867 while ((ptr = memchr(ptr, 0xff, buf_end - ptr))) {
2271 208913 ptr++;
2272
1/2
✓ Branch 0 taken 208913 times.
✗ Branch 1 not taken.
208913 if (ptr < buf_end) {
2273 /* Copy verbatim data. */
2274 208913 ptrdiff_t length = (ptr - 1) - src;
2275
2/2
✓ Branch 0 taken 208679 times.
✓ Branch 1 taken 234 times.
208913 if (length > 0)
2276 208679 bytestream2_put_bufferu(&pb, src, length);
2277
2278 208913 uint8_t x = *ptr++;
2279 /* Discard multiple optional 0xFF fill bytes. */
2280
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 208913 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
208925 while (x == 0xff && ptr < buf_end)
2281 12 x = *ptr++;
2282
2283 208913 src = ptr;
2284
2/2
✓ Branch 0 taken 203959 times.
✓ Branch 1 taken 4954 times.
208913 if (x == 0) {
2285 /* Stuffed zero byte */
2286 203959 bytestream2_put_byteu(&pb, 0xff);
2287
4/4
✓ Branch 0 taken 4907 times.
✓ Branch 1 taken 47 times.
✓ Branch 2 taken 2650 times.
✓ Branch 3 taken 2257 times.
4954 } else if (x >= RST0 && x <= RST7) {
2288 /* Restart marker */
2289 2650 goto found;
2290 } else {
2291 /* Non-restart marker */
2292 2304 ptr -= 2;
2293 2304 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 4954 unescaped_buf_ptr = s->buffer;
2305 4954 unescaped_buf_size = bytestream2_tell_p(&pb);
2306 4954 memset(s->buffer + unescaped_buf_size, 0,
2307 AV_INPUT_BUFFER_PADDING_SIZE);
2308
2309 4954 bytestream2_skipu(&s->gB, ptr - buf_ptr);
2310
2311 4954 av_log(s->avctx, AV_LOG_DEBUG, "escaping removed %td bytes\n",
2312 4954 (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 5977 the_end:
2366 5977 return init_get_bits8(&s->gb, unescaped_buf_ptr, unescaped_buf_size);
2367 }
2368
2369 244 static void reset_icc_profile(MJpegDecodeContext *s)
2370 {
2371 int i;
2372
2373
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 234 times.
244 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 244 s->iccread = 0;
2380 244 s->iccnum = 0;
2381 244 }
2382
2383 2595 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 2595 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 2595 int ret = 0;
2393 int is16bit;
2394
2395 2595 s->force_pal8 = 0;
2396 2595 s->total_ls_decoded_height = 0;
2397
2398 2595 s->buf_size = buf_size;
2399
2400 2595 av_exif_free(&s->exif_metadata);
2401 2595 av_freep(&s->stereo3d);
2402 2595 s->adobe_transform = -1;
2403
2404
1/2
✓ Branch 0 taken 2595 times.
✗ Branch 1 not taken.
2595 if (s->iccnum != 0)
2405 reset_icc_profile(s);
2406
2407 2595 redo_for_pal8:
2408 2603 buf_ptr = buf;
2409 2603 buf_end = buf + buf_size;
2410
1/2
✓ Branch 0 taken 16211 times.
✗ Branch 1 not taken.
16211 while (buf_ptr < buf_end) {
2411 /* find start next marker */
2412 16211 start_code = ff_mjpeg_find_marker(&buf_ptr, buf_end);
2413 /* EOF */
2414
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 16210 times.
16211 if (start_code < 0)
2415 1 break;
2416
2417 16210 ptrdiff_t bytes_left = buf_end - buf_ptr;
2418
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16210 times.
16210 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 16210 av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%td\n",
2425 start_code, buf_end - buf_ptr);
2426
2427 16210 bytestream2_init(&s->gB, buf_ptr, bytes_left);
2428
2429
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16210 times.
16210 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 11193 times.
✓ Branch 1 taken 5017 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 11193 times.
16210 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 713 times.
✓ Branch 1 taken 15497 times.
✓ Branch 2 taken 232 times.
✓ Branch 3 taken 481 times.
16210 } else if (start_code >= APP0 && start_code <= APP15) {
2438
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 232 times.
232 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 15738 times.
15978 } 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 2577 times.
✓ Branch 1 taken 13161 times.
15738 } else if (start_code == DQT) {
2447 2577 ret = ff_mjpeg_decode_dqt(s);
2448
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2577 times.
2577 if (ret < 0)
2449 return ret;
2450 }
2451
2452 16210 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 473 times.
✓ Branch 1 taken 15737 times.
16210 if (avctx->skip_frame == AVDISCARD_ALL) {
2461
2/2
✓ Branch 0 taken 94 times.
✓ Branch 1 taken 379 times.
473 switch (start_code) {
2462 94 case SOF0:
2463 case SOF1:
2464 case SOF2:
2465 case SOF3:
2466 case SOF55:
2467 94 break;
2468 379 default:
2469 379 goto skip;
2470 }
2471 }
2472
2473
11/12
✓ Branch 0 taken 2511 times.
✓ Branch 1 taken 2597 times.
✓ Branch 2 taken 2161 times.
✓ Branch 3 taken 14 times.
✓ Branch 4 taken 205 times.
✓ Branch 5 taken 225 times.
✓ Branch 6 taken 16 times.
✓ Branch 7 taken 2503 times.
✓ Branch 8 taken 2568 times.
✓ Branch 9 taken 220 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2811 times.
15831 switch (start_code) {
2474 2511 case SOI:
2475 2511 s->restart_interval = 0;
2476 2511 s->raw_image_buffer = buf_ptr;
2477 2511 s->raw_image_buffer_size = buf_end - buf_ptr;
2478 /* nothing to do on SOI */
2479 2511 break;
2480 2597 case DHT:
2481
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2597 times.
2597 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 2597 break;
2486 2161 case SOF0:
2487 case SOF1:
2488
2/2
✓ Branch 0 taken 2159 times.
✓ Branch 1 taken 2 times.
2161 if (start_code == SOF0)
2489 2159 avctx->profile = AV_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT;
2490 else
2491 2 avctx->profile = AV_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT;
2492 2161 s->lossless = 0;
2493 2161 s->ls = 0;
2494 2161 s->progressive = 0;
2495
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2161 times.
2161 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2496 goto fail;
2497 2161 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 #if FF_API_CODEC_PROPS
2509 FF_DISABLE_DEPRECATION_WARNINGS
2510 205 avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
2511 FF_ENABLE_DEPRECATION_WARNINGS
2512 #endif
2513 205 s->lossless = 1;
2514 205 s->ls = 0;
2515 205 s->progressive = 0;
2516
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 205 times.
205 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2517 goto fail;
2518 205 break;
2519 225 case SOF55:
2520 225 avctx->profile = AV_PROFILE_MJPEG_JPEG_LS;
2521 #if FF_API_CODEC_PROPS
2522 FF_DISABLE_DEPRECATION_WARNINGS
2523 225 avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
2524 FF_ENABLE_DEPRECATION_WARNINGS
2525 #endif
2526 225 s->lossless = 1;
2527 225 s->ls = 1;
2528 225 s->progressive = 0;
2529
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 225 times.
225 if ((ret = ff_mjpeg_decode_sof(s)) < 0)
2530 goto fail;
2531 225 break;
2532 16 case LSE:
2533
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
16 if (!CONFIG_JPEGLS_DECODER ||
2534 16 (ret = ff_jpegls_decode_lse(s)) < 0)
2535 goto fail;
2536
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
16 if (ret == 1)
2537 8 goto redo_for_pal8;
2538 8 break;
2539 case EOI:
2540 2503 eoi_parser:
2541
1/2
✓ Branch 0 taken 2503 times.
✗ Branch 1 not taken.
2503 if (!avctx->hwaccel &&
2542
4/6
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 2496 times.
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
2503 s->progressive && s->cur_scan && s->got_picture)
2543 7 mjpeg_idct_scan_progressive_ac(s);
2544 2503 s->cur_scan = 0;
2545
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2503 times.
2503 if (!s->got_picture) {
2546 av_log(avctx, AV_LOG_WARNING,
2547 "Found EOI before any SOF, ignoring\n");
2548 break;
2549 }
2550
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2497 times.
2503 if (s->interlaced) {
2551 6 s->bottom_field ^= 1;
2552 /* if not bottom field, do not output image yet */
2553
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 if (s->bottom_field == !s->interlace_polarity)
2554 3 break;
2555 }
2556
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2500 times.
2500 if (avctx->hwaccel) {
2557 ret = FF_HW_SIMPLE_CALL(avctx, end_frame);
2558 if (ret < 0)
2559 return ret;
2560
2561 av_freep(&s->hwaccel_picture_private);
2562 }
2563
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2500 times.
2500 if ((ret = av_frame_ref(frame, s->picture_ptr)) < 0)
2564 return ret;
2565
2/2
✓ Branch 0 taken 417 times.
✓ Branch 1 taken 2083 times.
2500 if (s->lossless)
2566 417 frame->flags |= AV_FRAME_FLAG_LOSSLESS;
2567 2500 *got_frame = 1;
2568 2500 s->got_picture = 0;
2569
2570
3/4
✓ Branch 0 taken 2083 times.
✓ Branch 1 taken 417 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2083 times.
2500 if (!s->lossless && avctx->debug & FF_DEBUG_QP) {
2571 int qp = FFMAX3(s->qscale[0],
2572 s->qscale[1],
2573 s->qscale[2]);
2574
2575 av_log(avctx, AV_LOG_DEBUG, "QP: %d\n", qp);
2576 }
2577
2578 2500 goto the_end;
2579 2568 case SOS:
2580 2568 s->cur_scan++;
2581
2582
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2568 times.
2568 if ((ret = ff_mjpeg_decode_sos(s)) < 0 &&
2583 (avctx->err_recognition & AV_EF_EXPLODE))
2584 goto fail;
2585 2568 break;
2586 220 case DRI:
2587
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 220 times.
220 if ((ret = mjpeg_decode_dri(s)) < 0)
2588 return ret;
2589 220 break;
2590 case SOF5:
2591 case SOF6:
2592 case SOF7:
2593 case SOF9:
2594 case SOF10:
2595 case SOF11:
2596 case SOF13:
2597 case SOF14:
2598 case SOF15:
2599 case JPG:
2600 av_log(avctx, AV_LOG_ERROR,
2601 "mjpeg: unsupported coding type (%x)\n", start_code);
2602 break;
2603 }
2604
2605
2/2
✓ Branch 0 taken 94 times.
✓ Branch 1 taken 13229 times.
13323 if (avctx->skip_frame == AVDISCARD_ALL) {
2606
1/2
✓ Branch 0 taken 94 times.
✗ Branch 1 not taken.
94 switch (start_code) {
2607 94 case SOF0:
2608 case SOF1:
2609 case SOF2:
2610 case SOF3:
2611 case SOF55:
2612 94 s->got_picture = 0;
2613 94 goto the_end_no_picture;
2614 }
2615 }
2616
2617 13229 skip:
2618 /* eof process start code */
2619 13608 buf_ptr += bytestream2_tell(&s->gB);
2620 13608 av_log(avctx, AV_LOG_DEBUG,
2621 "marker parser used %d bytes\n",
2622 13608 bytestream2_tell(&s->gB));
2623 }
2624
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) {
2625 av_log(avctx, AV_LOG_WARNING, "EOI missing, emulating\n");
2626 goto eoi_parser;
2627 }
2628 1 av_log(avctx, AV_LOG_FATAL, "No JPEG data found in image\n");
2629 1 return AVERROR_INVALIDDATA;
2630 fail:
2631 s->got_picture = 0;
2632 return ret;
2633 2500 the_end:
2634
2635 2500 is16bit = av_pix_fmt_desc_get(avctx->pix_fmt)->comp[0].step > 1;
2636
2637
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2494 times.
2500 if (AV_RB32(s->upscale_h)) {
2638 int p;
2639
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 ||
2640 avctx->pix_fmt == AV_PIX_FMT_YUV444P ||
2641 avctx->pix_fmt == AV_PIX_FMT_YUVJ440P ||
2642 avctx->pix_fmt == AV_PIX_FMT_YUV440P ||
2643 avctx->pix_fmt == AV_PIX_FMT_YUVA444P ||
2644 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
2645 avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
2646 avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
2647 avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
2648 avctx->pix_fmt == AV_PIX_FMT_YUV420P16||
2649 avctx->pix_fmt == AV_PIX_FMT_YUVA420P ||
2650 avctx->pix_fmt == AV_PIX_FMT_YUVA420P16||
2651 avctx->pix_fmt == AV_PIX_FMT_GBRP ||
2652 avctx->pix_fmt == AV_PIX_FMT_GBRAP
2653 );
2654 6 ret = av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &hshift, &vshift);
2655
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (ret)
2656 return ret;
2657
2658
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));
2659
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
24 for (p = 0; p < s->nb_components; p++) {
2660 18 uint8_t *line = s->picture_ptr->data[p];
2661 18 int w = s->width;
2662 18 int h = s->height;
2663
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 9 times.
18 if (!s->upscale_h[p])
2664 9 continue;
2665
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) {
2666 7 w = AV_CEIL_RSHIFT(w, hshift);
2667 7 h = AV_CEIL_RSHIFT(h, vshift);
2668 }
2669
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 8 times.
9 if (s->upscale_v[p] == 1)
2670 1 h = (h + 1) >> 1;
2671
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
9 av_assert0(w > 0);
2672
2/2
✓ Branch 0 taken 534 times.
✓ Branch 1 taken 9 times.
543 for (int i = 0; i < h; i++) {
2673
2/2
✓ Branch 0 taken 214 times.
✓ Branch 1 taken 320 times.
534 if (s->upscale_h[p] == 1) {
2674
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];
2675 214 else line[w - 1] = line[(w - 1) / 2];
2676
2/2
✓ Branch 0 taken 11220 times.
✓ Branch 1 taken 214 times.
11434 for (index = w - 2; index > 0; index--) {
2677
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 11220 times.
11220 if (is16bit)
2678 ((uint16_t*)line)[index] = (((uint16_t*)line)[index / 2] + ((uint16_t*)line)[(index + 1) / 2]) >> 1;
2679 else
2680 11220 line[index] = (line[index / 2] + line[(index + 1) / 2]) >> 1;
2681 }
2682
2/2
✓ Branch 0 taken 256 times.
✓ Branch 1 taken 64 times.
320 } else if (s->upscale_h[p] == 2) {
2683
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 256 times.
256 if (is16bit) {
2684 ((uint16_t*)line)[w - 1] = ((uint16_t*)line)[(w - 1) / 3];
2685 if (w > 1)
2686 ((uint16_t*)line)[w - 2] = ((uint16_t*)line)[w - 1];
2687 } else {
2688 256 line[w - 1] = line[(w - 1) / 3];
2689
1/2
✓ Branch 0 taken 256 times.
✗ Branch 1 not taken.
256 if (w > 1)
2690 256 line[w - 2] = line[w - 1];
2691 }
2692
2/2
✓ Branch 0 taken 15616 times.
✓ Branch 1 taken 256 times.
15872 for (index = w - 3; index > 0; index--) {
2693 15616 line[index] = (line[index / 3] + line[(index + 1) / 3] + line[(index + 2) / 3] + 1) / 3;
2694 }
2695
1/2
✓ Branch 0 taken 64 times.
✗ Branch 1 not taken.
64 } else if (s->upscale_h[p] == 4) {
2696
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 64 times.
64 if (is16bit) {
2697 uint16_t *line16 = (uint16_t *) line;
2698 line16[w - 1] = line16[(w - 1) >> 2];
2699 if (w > 1)
2700 line16[w - 2] = (line16[(w - 1) >> 2] * 3 + line16[(w - 2) >> 2]) >> 2;
2701 if (w > 2)
2702 line16[w - 3] = (line16[(w - 1) >> 2] + line16[(w - 2) >> 2]) >> 1;
2703 } else {
2704 64 line[w - 1] = line[(w - 1) >> 2];
2705
1/2
✓ Branch 0 taken 64 times.
✗ Branch 1 not taken.
64 if (w > 1)
2706 64 line[w - 2] = (line[(w - 1) >> 2] * 3 + line[(w - 2) >> 2]) >> 2;
2707
1/2
✓ Branch 0 taken 64 times.
✗ Branch 1 not taken.
64 if (w > 2)
2708 64 line[w - 3] = (line[(w - 1) >> 2] + line[(w - 2) >> 2]) >> 1;
2709 }
2710
2/2
✓ Branch 0 taken 3840 times.
✓ Branch 1 taken 64 times.
3904 for (index = w - 4; index > 0; index--)
2711 3840 line[index] = (line[(index + 3) >> 2] + line[(index + 2) >> 2]
2712 3840 + line[(index + 1) >> 2] + line[index >> 2]) >> 2;
2713 }
2714 534 line += s->linesize[p];
2715 }
2716 }
2717 }
2718
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2499 times.
2500 if (AV_RB32(s->upscale_v)) {
2719 int p;
2720
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 ||
2721 avctx->pix_fmt == AV_PIX_FMT_YUV444P ||
2722 avctx->pix_fmt == AV_PIX_FMT_YUVJ422P ||
2723 avctx->pix_fmt == AV_PIX_FMT_YUV422P ||
2724 avctx->pix_fmt == AV_PIX_FMT_YUVJ420P ||
2725 avctx->pix_fmt == AV_PIX_FMT_YUV420P ||
2726 avctx->pix_fmt == AV_PIX_FMT_YUV440P ||
2727 avctx->pix_fmt == AV_PIX_FMT_YUVJ440P ||
2728 avctx->pix_fmt == AV_PIX_FMT_YUVA444P ||
2729 avctx->pix_fmt == AV_PIX_FMT_YUVA420P ||
2730 avctx->pix_fmt == AV_PIX_FMT_YUVA420P16||
2731 avctx->pix_fmt == AV_PIX_FMT_GBRP ||
2732 avctx->pix_fmt == AV_PIX_FMT_GBRAP
2733 );
2734 1 ret = av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &hshift, &vshift);
2735
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (ret)
2736 return ret;
2737
2738
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));
2739
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
4 for (p = 0; p < s->nb_components; p++) {
2740 uint8_t *dst;
2741 3 int w = s->width;
2742 3 int h = s->height;
2743
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
3 if (!s->upscale_v[p])
2744 2 continue;
2745
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) {
2746 1 w = AV_CEIL_RSHIFT(w, hshift);
2747 1 h = AV_CEIL_RSHIFT(h, vshift);
2748 }
2749 1 dst = &((uint8_t *)s->picture_ptr->data[p])[(h - 1) * s->linesize[p]];
2750
2/2
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 1 times.
43 for (int i = h - 1; i; i--) {
2751 42 uint8_t *src1 = &((uint8_t *)s->picture_ptr->data[p])[i * s->upscale_v[p] / (s->upscale_v[p] + 1) * s->linesize[p]];
2752 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]];
2753
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)) {
2754 21 memcpy(dst, src1, w);
2755 } else {
2756
2/2
✓ Branch 0 taken 1344 times.
✓ Branch 1 taken 21 times.
1365 for (index = 0; index < w; index++)
2757 1344 dst[index] = (src1[index] + src2[index]) >> 1;
2758 }
2759 42 dst -= s->linesize[p];
2760 }
2761 }
2762 }
2763
3/4
✓ Branch 0 taken 368 times.
✓ Branch 1 taken 2132 times.
✓ Branch 2 taken 368 times.
✗ Branch 3 not taken.
2500 if (s->flipped && !s->rgb) {
2764 368 ret = av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, &hshift, &vshift);
2765
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 368 times.
368 if (ret)
2766 return ret;
2767
2768
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 368 times.
368 av_assert0(s->nb_components == av_pix_fmt_count_planes(frame->format));
2769
2/2
✓ Branch 0 taken 1104 times.
✓ Branch 1 taken 368 times.
1472 for (index = 0; index < s->nb_components; index++) {
2770 1104 int h = frame->height;
2771
3/4
✓ Branch 0 taken 736 times.
✓ Branch 1 taken 368 times.
✓ Branch 2 taken 736 times.
✗ Branch 3 not taken.
1104 if (index && index < 3)
2772 736 h = AV_CEIL_RSHIFT(h, vshift);
2773
1/2
✓ Branch 0 taken 1104 times.
✗ Branch 1 not taken.
1104 if (frame->data[index]) {
2774 1104 frame->data[index] += (h - 1) * frame->linesize[index];
2775 1104 frame->linesize[index] *= -1;
2776 }
2777 }
2778 }
2779
2780
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2495 times.
2500 if (avctx->pix_fmt == AV_PIX_FMT_GBRP) {
2781
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
5 av_assert0(s->nb_components == 3);
2782 5 FFSWAP(uint8_t *, frame->data[0], frame->data[2]);
2783 5 FFSWAP(uint8_t *, frame->data[0], frame->data[1]);
2784 5 FFSWAP(int, frame->linesize[0], frame->linesize[2]);
2785 5 FFSWAP(int, frame->linesize[0], frame->linesize[1]);
2786 }
2787
2788
3/4
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2492 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 8 times.
2500 if (s->adobe_transform == 0 && avctx->pix_fmt == AV_PIX_FMT_GBRAP) {
2789 int w = s->picture_ptr->width;
2790 int h = s->picture_ptr->height;
2791 av_assert0(s->nb_components == 4);
2792 for (int i = 0; i < h; i++) {
2793 int j;
2794 uint8_t *dst[4];
2795 for (index = 0; index < 4; index++) {
2796 dst[index] = s->picture_ptr->data[index]
2797 + s->picture_ptr->linesize[index]*i;
2798 }
2799 for (j = 0; j < w; j++) {
2800 int k = dst[3][j];
2801 int r = dst[0][j] * k;
2802 int g = dst[1][j] * k;
2803 int b = dst[2][j] * k;
2804 dst[0][j] = g * 257 >> 16;
2805 dst[1][j] = b * 257 >> 16;
2806 dst[2][j] = r * 257 >> 16;
2807 }
2808 memset(dst[3], 255, w);
2809 }
2810 }
2811
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2500 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2500 if (s->adobe_transform == 2 && avctx->pix_fmt == AV_PIX_FMT_YUVA444P) {
2812 int w = s->picture_ptr->width;
2813 int h = s->picture_ptr->height;
2814 av_assert0(s->nb_components == 4);
2815 for (int i = 0; i < h; i++) {
2816 int j;
2817 uint8_t *dst[4];
2818 for (index = 0; index < 4; index++) {
2819 dst[index] = s->picture_ptr->data[index]
2820 + s->picture_ptr->linesize[index]*i;
2821 }
2822 for (j = 0; j < w; j++) {
2823 int k = dst[3][j];
2824 int r = (255 - dst[0][j]) * k;
2825 int g = (128 - dst[1][j]) * k;
2826 int b = (128 - dst[2][j]) * k;
2827 dst[0][j] = r * 257 >> 16;
2828 dst[1][j] = (g * 257 >> 16) + 128;
2829 dst[2][j] = (b * 257 >> 16) + 128;
2830 }
2831 memset(dst[3], 255, w);
2832 }
2833 }
2834
2835
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2500 times.
2500 if (s->stereo3d) {
2836 AVStereo3D *stereo = av_stereo3d_create_side_data(frame);
2837 if (stereo) {
2838 stereo->type = s->stereo3d->type;
2839 stereo->flags = s->stereo3d->flags;
2840 }
2841 av_freep(&s->stereo3d);
2842 }
2843
2844
3/4
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2495 times.
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
2500 if (s->iccnum != 0 && s->iccnum == s->iccread) {
2845 AVFrameSideData *sd;
2846 5 size_t offset = 0;
2847 5 int total_size = 0;
2848
2849 /* Sum size of all parts. */
2850
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10 for (int i = 0; i < s->iccnum; i++)
2851 5 total_size += s->iccentries[i].length;
2852
2853 5 ret = ff_frame_new_side_data(avctx, frame, AV_FRAME_DATA_ICC_PROFILE, total_size, &sd);
2854
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
5 if (ret < 0) {
2855 av_log(avctx, AV_LOG_ERROR, "Could not allocate frame side data\n");
2856 return ret;
2857 }
2858
2859
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
5 if (sd) {
2860 /* Reassemble the parts, which are now in-order. */
2861
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
10 for (int i = 0; i < s->iccnum; i++) {
2862 5 memcpy(sd->data + offset, s->iccentries[i].data, s->iccentries[i].length);
2863 5 offset += s->iccentries[i].length;
2864 }
2865 }
2866 }
2867
2868
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 2493 times.
2500 if (s->exif_metadata.entries) {
2869 7 ret = ff_decode_exif_attach_ifd(avctx, frame, &s->exif_metadata);
2870 7 av_exif_free(&s->exif_metadata);
2871
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 if (ret < 0)
2872 av_log(avctx, AV_LOG_WARNING, "couldn't attach EXIF metadata\n");
2873 }
2874
2875
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2497 times.
2500 if (avctx->codec_id != AV_CODEC_ID_SMVJPEG &&
2876
1/2
✓ Branch 0 taken 2497 times.
✗ Branch 1 not taken.
2497 (avctx->codec_tag == MKTAG('A', 'V', 'R', 'n') ||
2877
2/2
✓ Branch 0 taken 2487 times.
✓ Branch 1 taken 10 times.
2497 avctx->codec_tag == MKTAG('A', 'V', 'D', 'J')) &&
2878
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 avctx->coded_height > s->orig_height) {
2879 10 frame->height = AV_CEIL_RSHIFT(avctx->coded_height, avctx->lowres);
2880 10 frame->crop_top = frame->height - avctx->height;
2881 }
2882
2883 2490 the_end_no_picture:
2884 2594 av_log(avctx, AV_LOG_DEBUG, "decode frame unused %td bytes\n",
2885 buf_end - buf_ptr);
2886 2594 return buf_ptr - buf;
2887 }
2888
2889 2216 int ff_mjpeg_decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame,
2890 AVPacket *avpkt)
2891 {
2892 4432 return ff_mjpeg_decode_frame_from_buf(avctx, frame, got_frame,
2893 2216 avpkt, avpkt->data, avpkt->size);
2894 }
2895
2896
2897 /* mxpeg may call the following function (with a blank MJpegDecodeContext)
2898 * even without having called ff_mjpeg_decode_init(). */
2899 244 av_cold int ff_mjpeg_decode_end(AVCodecContext *avctx)
2900 {
2901 244 MJpegDecodeContext *s = avctx->priv_data;
2902 int i, j;
2903
2904
3/8
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 235 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.
244 if (s->interlaced && s->bottom_field == !s->interlace_polarity && s->got_picture && !avctx->frame_num) {
2905 av_log(avctx, AV_LOG_INFO, "Single field\n");
2906 }
2907
2908 244 av_frame_free(&s->picture);
2909 244 s->picture_ptr = NULL;
2910
2911 244 av_frame_free(&s->smv_frame);
2912
2913 244 av_freep(&s->buffer);
2914 244 av_freep(&s->stereo3d);
2915 244 av_freep(&s->ljpeg_buffer);
2916 244 s->ljpeg_buffer_size = 0;
2917
2918
2/2
✓ Branch 0 taken 732 times.
✓ Branch 1 taken 244 times.
976 for (i = 0; i < 3; i++) {
2919
2/2
✓ Branch 0 taken 2928 times.
✓ Branch 1 taken 732 times.
3660 for (j = 0; j < 4; j++)
2920 2928 ff_vlc_free(&s->vlcs[i][j]);
2921 }
2922
2/2
✓ Branch 0 taken 976 times.
✓ Branch 1 taken 244 times.
1220 for (i = 0; i < MAX_COMPONENTS; i++) {
2923 976 av_freep(&s->blocks[i]);
2924 976 av_freep(&s->last_nnz[i]);
2925 }
2926 244 av_exif_free(&s->exif_metadata);
2927
2928 244 reset_icc_profile(s);
2929
2930 244 av_freep(&s->hwaccel_picture_private);
2931 244 av_freep(&s->jls_state);
2932
2933 244 return 0;
2934 }
2935
2936 static av_cold void decode_flush(AVCodecContext *avctx)
2937 {
2938 MJpegDecodeContext *s = avctx->priv_data;
2939 s->got_picture = 0;
2940
2941 s->smv_next_frame = 0;
2942 av_frame_unref(s->smv_frame);
2943 }
2944
2945 #if CONFIG_MJPEG_DECODER
2946 #if FF_API_MJPEG_EXTERN_HUFF
2947 #define OFFSET(x) offsetof(MJpegDecodeContext, x)
2948 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2949 static const AVOption options[] = {
2950 { "extern_huff", "Use external huffman table.",
2951 OFFSET(extern_huff), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VD | AV_OPT_FLAG_DEPRECATED },
2952 { NULL },
2953 };
2954 #endif
2955
2956 static const AVClass mjpegdec_class = {
2957 .class_name = "MJPEG decoder",
2958 .item_name = av_default_item_name,
2959 #if FF_API_MJPEG_EXTERN_HUFF
2960 .option = options,
2961 #endif
2962 .version = LIBAVUTIL_VERSION_INT,
2963 };
2964
2965 const FFCodec ff_mjpeg_decoder = {
2966 .p.name = "mjpeg",
2967 CODEC_LONG_NAME("MJPEG (Motion JPEG)"),
2968 .p.type = AVMEDIA_TYPE_VIDEO,
2969 .p.id = AV_CODEC_ID_MJPEG,
2970 .priv_data_size = sizeof(MJpegDecodeContext),
2971 .init = ff_mjpeg_decode_init,
2972 .close = ff_mjpeg_decode_end,
2973 FF_CODEC_DECODE_CB(ff_mjpeg_decode_frame),
2974 .flush = decode_flush,
2975 .p.capabilities = AV_CODEC_CAP_DR1,
2976 .p.max_lowres = 3,
2977 .p.priv_class = &mjpegdec_class,
2978 .p.profiles = NULL_IF_CONFIG_SMALL(ff_mjpeg_profiles),
2979 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP |
2980 FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM |
2981 FF_CODEC_CAP_ICC_PROFILES,
2982 .hw_configs = (const AVCodecHWConfigInternal *const []) {
2983 #if CONFIG_MJPEG_NVDEC_HWACCEL
2984 HWACCEL_NVDEC(mjpeg),
2985 #endif
2986 #if CONFIG_MJPEG_VAAPI_HWACCEL
2987 HWACCEL_VAAPI(mjpeg),
2988 #endif
2989 NULL
2990 },
2991 };
2992 #endif
2993 #if CONFIG_THP_DECODER
2994 const FFCodec ff_thp_decoder = {
2995 .p.name = "thp",
2996 CODEC_LONG_NAME("Nintendo Gamecube THP video"),
2997 .p.type = AVMEDIA_TYPE_VIDEO,
2998 .p.id = AV_CODEC_ID_THP,
2999 .priv_data_size = sizeof(MJpegDecodeContext),
3000 .init = ff_mjpeg_decode_init,
3001 .close = ff_mjpeg_decode_end,
3002 FF_CODEC_DECODE_CB(ff_mjpeg_decode_frame),
3003 .flush = decode_flush,
3004 .p.capabilities = AV_CODEC_CAP_DR1,
3005 .p.max_lowres = 3,
3006 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
3007 };
3008 #endif
3009
3010 #if CONFIG_SMVJPEG_DECODER
3011 // SMV JPEG just stacks several output frames into one JPEG picture
3012 // we handle that by setting up the cropping parameters appropriately
3013 13 static void smv_process_frame(AVCodecContext *avctx, AVFrame *frame)
3014 {
3015 13 MJpegDecodeContext *s = avctx->priv_data;
3016
3017
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 av_assert0((s->smv_next_frame + 1) * avctx->height <= avctx->coded_height);
3018
3019 13 frame->width = avctx->coded_width;
3020 13 frame->height = avctx->coded_height;
3021 13 frame->crop_top = FFMIN(s->smv_next_frame * avctx->height, frame->height);
3022 13 frame->crop_bottom = frame->height - (s->smv_next_frame + 1) * avctx->height;
3023
3024
1/2
✓ Branch 0 taken 13 times.
✗ Branch 1 not taken.
13 if (s->smv_frame->pts != AV_NOPTS_VALUE)
3025 13 s->smv_frame->pts += s->smv_frame->duration;
3026 13 s->smv_next_frame = (s->smv_next_frame + 1) % s->smv_frames_per_jpeg;
3027
3028
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 11 times.
13 if (s->smv_next_frame == 0)
3029 2 av_frame_unref(s->smv_frame);
3030 13 }
3031
3032 16 static int smvjpeg_receive_frame(AVCodecContext *avctx, AVFrame *frame)
3033 {
3034 16 MJpegDecodeContext *s = avctx->priv_data;
3035 16 AVPacket *const pkt = avctx->internal->in_pkt;
3036 16 int got_frame = 0;
3037 int ret;
3038
3039
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
16 if (s->smv_next_frame > 0)
3040 10 goto return_frame;
3041
3042 6 ret = ff_decode_get_packet(avctx, pkt);
3043
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 if (ret < 0)
3044 3 return ret;
3045
3046 3 av_frame_unref(s->smv_frame);
3047
3048 3 ret = ff_mjpeg_decode_frame(avctx, s->smv_frame, &got_frame, pkt);
3049 3 s->smv_frame->pkt_dts = pkt->dts;
3050 3 av_packet_unref(pkt);
3051
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (ret < 0)
3052 return ret;
3053
3054
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if (!got_frame)
3055 return AVERROR(EAGAIN);
3056
3057 // packet duration covers all the frames in the packet
3058 3 s->smv_frame->duration /= s->smv_frames_per_jpeg;
3059
3060 13 return_frame:
3061
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 av_assert0(s->smv_frame->buf[0]);
3062 13 ret = av_frame_ref(frame, s->smv_frame);
3063
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
13 if (ret < 0)
3064 return ret;
3065
3066 13 smv_process_frame(avctx, frame);
3067 13 return 0;
3068 }
3069
3070 const FFCodec ff_smvjpeg_decoder = {
3071 .p.name = "smvjpeg",
3072 CODEC_LONG_NAME("SMV JPEG"),
3073 .p.type = AVMEDIA_TYPE_VIDEO,
3074 .p.id = AV_CODEC_ID_SMVJPEG,
3075 .priv_data_size = sizeof(MJpegDecodeContext),
3076 .init = ff_mjpeg_decode_init,
3077 .close = ff_mjpeg_decode_end,
3078 FF_CODEC_RECEIVE_FRAME_CB(smvjpeg_receive_frame),
3079 .flush = decode_flush,
3080 .p.capabilities = AV_CODEC_CAP_DR1,
3081 .caps_internal = FF_CODEC_CAP_EXPORTS_CROPPING |
3082 FF_CODEC_CAP_INIT_CLEANUP,
3083 };
3084 #endif
3085