FFmpeg coverage


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