FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/ffv1dec.c
Date: 2026-04-24 19:58:39
Exec Total Coverage
Lines: 317 567 55.9%
Functions: 13 17 76.5%
Branches: 187 436 42.9%

Line Branch Exec Source
1 /*
2 * FFV1 decoder
3 *
4 * Copyright (c) 2003-2013 Michael Niedermayer <michaelni@gmx.at>
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 /**
24 * @file
25 * FF Video Codec 1 (a lossless codec) decoder
26 */
27
28 #include "libavutil/avassert.h"
29 #include "libavutil/crc.h"
30 #include "libavutil/mem.h"
31 #include "libavutil/imgutils.h"
32 #include "libavutil/pixdesc.h"
33 #include "avcodec.h"
34 #include "codec_internal.h"
35 #include "get_bits.h"
36 #include "rangecoder.h"
37 #include "golomb.h"
38 #include "mathops.h"
39 #include "ffv1.h"
40 #include "progressframe.h"
41 #include "libavutil/refstruct.h"
42 #include "thread.h"
43 #include "decode.h"
44 #include "hwconfig.h"
45 #include "hwaccel_internal.h"
46 #include "config_components.h"
47
48 163659991 static inline int get_vlc_symbol(GetBitContext *gb, VlcState *const state,
49 int bits)
50 {
51 int k, i, v, ret;
52
53 163659991 i = state->count;
54 163659991 k = 0;
55
2/2
✓ Branch 0 taken 272532174 times.
✓ Branch 1 taken 163659991 times.
436192165 while (i < state->error_sum) { // FIXME: optimize
56 272532174 k++;
57 272532174 i += i;
58 }
59
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 163659991 times.
163659991 if (k > bits) {
60 ff_dlog(NULL, "k-overflow bias:%d error:%d drift:%d count:%d k:%d",
61 state->bias, state->error_sum, state->drift, state->count, k);
62 k = bits;
63 }
64
65 163659991 v = get_sr_golomb(gb, k, 12, bits);
66 ff_dlog(NULL, "v:%d bias:%d error:%d drift:%d count:%d k:%d",
67 v, state->bias, state->error_sum, state->drift, state->count, k);
68
69 163659991 v ^= ((2 * state->drift + state->count) >> 31);
70
71 163659991 ret = fold(v + state->bias, bits);
72
73 163659991 update_vlc_state(state, v);
74
75 163659991 return ret;
76 }
77
78 4542400 static int is_input_end(RangeCoder *c, GetBitContext *gb, int ac)
79 {
80
2/2
✓ Branch 0 taken 2514800 times.
✓ Branch 1 taken 2027600 times.
4542400 if (ac != AC_GOLOMB_RICE) {
81
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2514800 times.
2514800 if (c->overread > MAX_OVERREAD)
82 return AVERROR_INVALIDDATA;
83 } else {
84
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2027600 times.
2027600 if (get_bits_left(gb) < 1)
85 return AVERROR_INVALIDDATA;
86 }
87 4542400 return 0;
88 }
89
90 #define TYPE int16_t
91 #define RENAME(name) name
92 #include "ffv1dec_template.c"
93 #undef TYPE
94 #undef RENAME
95
96 #define TYPE int32_t
97 #define RENAME(name) name ## 32
98 #include "ffv1dec_template.c"
99
100 18300 static int decode_plane(FFV1Context *f, FFV1SliceContext *sc,
101 GetBitContext *gb,
102 uint8_t *src, int w, int h, int stride, int plane_index,
103 int remap_index, int pixel_stride, int ac)
104 {
105 int x, y;
106 int16_t *sample[2];
107 int bits;
108 unsigned mask;
109
110
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18300 times.
18300 if (sc->remap) {
111 bits = av_ceil_log2(sc->remap_count[remap_index]);
112 mask = (1<<bits)-1;
113
114 av_assert0(sc->fltmap_size[remap_index] >= (mask + 1) * sizeof(*sc->fltmap[remap_index]));
115 } else {
116 18300 bits = f->avctx->bits_per_raw_sample;
117 }
118
119 18300 sample[0] = sc->sample_buffer + 3;
120 18300 sample[1] = sc->sample_buffer + w + 6 + 3;
121
122 18300 sc->run_index = 0;
123
124 18300 memset(sc->sample_buffer, 0, 2 * (w + 6) * sizeof(*sc->sample_buffer));
125
126
2/2
✓ Branch 0 taken 1732400 times.
✓ Branch 1 taken 18300 times.
1750700 for (y = 0; y < h; y++) {
127 1732400 int16_t *temp = sample[0]; // FIXME: try a normal buffer
128
129 1732400 sample[0] = sample[1];
130 1732400 sample[1] = temp;
131
132 1732400 sample[1][-1] = sample[0][0];
133 1732400 sample[0][w] = sample[0][w - 1];
134
135
2/2
✓ Branch 0 taken 924200 times.
✓ Branch 1 taken 808200 times.
1732400 if (f->avctx->bits_per_raw_sample <= 8) {
136 924200 int ret = decode_line(f, sc, gb, w, sample, plane_index, 8, ac);
137
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 924200 times.
924200 if (ret < 0)
138 return ret;
139
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 924200 times.
924200 if (sc->remap)
140 for (x = 0; x < w; x++)
141 sample[1][x] = sc->fltmap[remap_index][sample[1][x]];
142
2/2
✓ Branch 0 taken 145253900 times.
✓ Branch 1 taken 924200 times.
146178100 for (x = 0; x < w; x++)
143 145253900 src[x*pixel_stride + stride * y] = sample[1][x];
144 } else {
145 808200 int ret = decode_line(f, sc, gb, w, sample, plane_index, bits, ac);
146
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 808200 times.
808200 if (ret < 0)
147 return ret;
148
149
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 808200 times.
808200 if (sc->remap) {
150 if (f->packed_at_lsb || f->avctx->bits_per_raw_sample == 16) {
151 for (x = 0; x < w; x++) {
152 ((uint16_t*)(src + stride*y))[x*pixel_stride] = sc->fltmap[remap_index][sample[1][x] & mask];
153 }
154 } else {
155 for (x = 0; x < w; x++) {
156 int v = sc->fltmap[remap_index][sample[1][x] & mask];
157 ((uint16_t*)(src + stride*y))[x*pixel_stride] = v << (16 - f->avctx->bits_per_raw_sample) | v >> (2 * f->avctx->bits_per_raw_sample - 16);
158 }
159 }
160 } else {
161
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 808200 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
808200 if (f->packed_at_lsb || f->avctx->bits_per_raw_sample == 16) {
162
2/2
✓ Branch 0 taken 106856200 times.
✓ Branch 1 taken 808200 times.
107664400 for (x = 0; x < w; x++) {
163 106856200 ((uint16_t*)(src + stride*y))[x*pixel_stride] = sample[1][x];
164 }
165 } else {
166 for (x = 0; x < w; x++) {
167 ((uint16_t*)(src + stride*y))[x*pixel_stride] = sample[1][x] << (16 - f->avctx->bits_per_raw_sample) | ((uint16_t **)sample)[1][x] >> (2 * f->avctx->bits_per_raw_sample - 16);
168 }
169 }
170 }
171 }
172 }
173 18300 return 0;
174 }
175
176 6700 static int decode_slice_header(const FFV1Context *f,
177 FFV1SliceContext *sc, AVFrame *frame)
178 {
179 6700 RangeCoder *c = &sc->c;
180 uint8_t state[CONTEXT_SIZE];
181 unsigned ps, context_count;
182 int sx, sy, sw, sh;
183
184 6700 memset(state, 128, sizeof(state));
185 6700 sx = ff_ffv1_get_symbol(c, state, 0);
186 6700 sy = ff_ffv1_get_symbol(c, state, 0);
187 6700 sw = ff_ffv1_get_symbol(c, state, 0) + 1U;
188 6700 sh = ff_ffv1_get_symbol(c, state, 0) + 1U;
189
190
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6700 times.
6700 av_assert0(f->version > 2);
191
192
193
4/8
✓ Branch 0 taken 6700 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6700 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6700 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 6700 times.
6700 if (sx < 0 || sy < 0 || sw <= 0 || sh <= 0)
194 return AVERROR_INVALIDDATA;
195
2/4
✓ Branch 0 taken 6700 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6700 times.
6700 if (sx > f->num_h_slices - sw || sy > f->num_v_slices - sh)
196 return AVERROR_INVALIDDATA;
197
198 6700 sc->slice_x = ff_slice_coord(f, f->width , sx , f->num_h_slices, f->chroma_h_shift);
199 6700 sc->slice_y = ff_slice_coord(f, f->height, sy , f->num_v_slices, f->chroma_v_shift);
200 6700 sc->slice_width = ff_slice_coord(f, f->width , sx + sw, f->num_h_slices, f->chroma_h_shift) - sc->slice_x;
201 6700 sc->slice_height = ff_slice_coord(f, f->height, sy + sh, f->num_v_slices, f->chroma_v_shift) - sc->slice_y;
202
203
2/4
✓ Branch 0 taken 6700 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6700 times.
6700 av_assert0((unsigned)sc->slice_width <= f->width &&
204 (unsigned)sc->slice_height <= f->height);
205
2/4
✓ Branch 0 taken 6700 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6700 times.
6700 av_assert0 ( (unsigned)sc->slice_x + (uint64_t)sc->slice_width <= f->width
206 && (unsigned)sc->slice_y + (uint64_t)sc->slice_height <= f->height);
207
208
3/4
✓ Branch 0 taken 2700 times.
✓ Branch 1 taken 4000 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2700 times.
6700 if (f->ac == AC_GOLOMB_RICE && sc->slice_width >= (1<<23))
209 return AVERROR_INVALIDDATA;
210
211
2/2
✓ Branch 0 taken 13400 times.
✓ Branch 1 taken 6700 times.
20100 for (unsigned i = 0; i < f->plane_count; i++) {
212 13400 PlaneContext * const p = &sc->plane[i];
213 13400 int idx = ff_ffv1_get_symbol(c, state, 0);
214
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13400 times.
13400 if (idx >= (unsigned)f->quant_table_count) {
215 av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n");
216 return -1;
217 }
218 13400 p->quant_table_index = idx;
219 13400 context_count = f->context_count[idx];
220
221
2/2
✓ Branch 0 taken 1344 times.
✓ Branch 1 taken 12056 times.
13400 if (p->context_count < context_count) {
222 1344 av_freep(&p->state);
223 1344 av_freep(&p->vlc_state);
224 }
225 13400 p->context_count = context_count;
226 }
227
228 6700 ps = ff_ffv1_get_symbol(c, state, 0);
229
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6700 times.
6700 if (ps == 1) {
230 frame->flags |= AV_FRAME_FLAG_INTERLACED;
231 frame->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST;
232
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6700 times.
6700 } else if (ps == 2) {
233 frame->flags |= AV_FRAME_FLAG_INTERLACED;
234 frame->flags &= ~AV_FRAME_FLAG_TOP_FIELD_FIRST;
235
1/2
✓ Branch 0 taken 6700 times.
✗ Branch 1 not taken.
6700 } else if (ps == 3) {
236 6700 frame->flags &= ~AV_FRAME_FLAG_INTERLACED;
237 }
238 6700 frame->sample_aspect_ratio.num = ff_ffv1_get_symbol(c, state, 0);
239 6700 frame->sample_aspect_ratio.den = ff_ffv1_get_symbol(c, state, 0);
240
241
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6700 times.
6700 if (av_image_check_sar(f->width, f->height,
242 frame->sample_aspect_ratio) < 0) {
243 av_log(f->avctx, AV_LOG_WARNING, "ignoring invalid SAR: %u/%u\n",
244 frame->sample_aspect_ratio.num,
245 frame->sample_aspect_ratio.den);
246 frame->sample_aspect_ratio = (AVRational){ 0, 1 };
247 }
248
249
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6700 times.
6700 if (f->version > 3) {
250 sc->slice_reset_contexts = get_rac(c, state);
251 sc->slice_coding_mode = ff_ffv1_get_symbol(c, state, 0);
252 if (sc->slice_coding_mode != 1 && f->colorspace == 1) {
253 sc->slice_rct_by_coef = ff_ffv1_get_symbol(c, state, 0);
254 sc->slice_rct_ry_coef = ff_ffv1_get_symbol(c, state, 0);
255 if ((uint64_t)sc->slice_rct_by_coef + (uint64_t)sc->slice_rct_ry_coef > 4) {
256 av_log(f->avctx, AV_LOG_ERROR, "slice_rct_y_coef out of range\n");
257 return AVERROR_INVALIDDATA;
258 }
259 }
260 if (f->combined_version >= 0x40004) {
261 sc->remap = ff_ffv1_get_symbol(c, state, 0);
262 if (sc->remap > 2U ||
263 sc->remap && !f->flt) {
264 av_log(f->avctx, AV_LOG_ERROR, "unsupported remap %d\n", sc->remap);
265 return AVERROR_INVALIDDATA;
266 }
267 }
268 }
269
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6700 times.
6700 if (f->avctx->bits_per_raw_sample == 32) {
270 if (!sc->remap) {
271 av_log(f->avctx, AV_LOG_ERROR, "unsupported remap\n");
272 return AVERROR_INVALIDDATA;
273 }
274 }
275
276 6700 return 0;
277 }
278
279 static void slice_set_damaged(FFV1Context *f, FFV1SliceContext *sc)
280 {
281 sc->slice_damaged = 1;
282
283 // only set this for frame threading, as for slice threading its value is
284 // not used and setting it would be a race
285 if (f->avctx->active_thread_type & FF_THREAD_FRAME)
286 f->frame_damaged = 1;
287 }
288
289 static int decode_current_mul(RangeCoder *rc, uint8_t state[32], int *mul, int mul_count, int64_t i)
290 {
291 int ndx = (i * mul_count) >> 32;
292 av_assert2(ndx <= 4096U);
293
294 if (mul[ndx] < 0)
295 mul[ndx] = ff_ffv1_get_symbol(rc, state, 0) & 0x3FFFFFFF;
296
297 return mul[ndx];
298 }
299
300 static int decode_remap(FFV1Context *f, FFV1SliceContext *sc)
301 {
302 unsigned int end = (1LL<<f->avctx->bits_per_raw_sample) - 1;
303 int flip = sc->remap == 2 ? (end>>1) : 0;
304
305 for (int p = 0; p < 1 + 2*f->chroma_planes + f->transparency; p++) {
306 int j = 0;
307 int lu = 0;
308 uint8_t state[2][3][32];
309 int64_t i;
310 int mul[4096+1];
311 int mul_count;
312
313 const int is_chroma = (p == 1 || p == 2) && f->chroma_planes;
314 const int plane_width = AV_CEIL_RSHIFT(sc->slice_width , is_chroma ? f->chroma_h_shift : 0);
315 const int plane_height = AV_CEIL_RSHIFT(sc->slice_height, is_chroma ? f->chroma_v_shift : 0);
316 const int pixel_num = FFMIN(plane_width * plane_height, end + 1LL);
317 const size_t fltmap_ceil = 1ULL << av_ceil_log2(pixel_num);
318
319 if (f->avctx->bits_per_raw_sample == 32) {
320 av_fast_malloc(&sc->fltmap32[p], &sc->fltmap32_size[p], fltmap_ceil * sizeof(*sc->fltmap32[p]));
321 if (!sc->fltmap32[p])
322 return AVERROR(ENOMEM);
323 } else {
324 av_fast_malloc(&sc->fltmap[p] , &sc->fltmap_size[p] , fltmap_ceil * sizeof(*sc->fltmap[p]));
325 if (!sc->fltmap[p])
326 return AVERROR(ENOMEM);
327 }
328
329 memset(state, 128, sizeof(state));
330 mul_count = ff_ffv1_get_symbol(&sc->c, state[0][0], 0);
331
332 if (mul_count > 4096U)
333 return AVERROR_INVALIDDATA;
334 for (int i = 0; i<mul_count; i++) {
335 mul[i] = -1;
336
337 }
338 mul[mul_count] = 1;
339
340 memset(state, 128, sizeof(state));
341 int current_mul = 1;
342 for (i=0; i <= end ;) {
343 unsigned run = get_symbol_inline(&sc->c, state[lu][0], 0);
344 unsigned run0 = lu ? 0 : run;
345 unsigned run1 = lu ? run : 1;
346
347 i += run0 * current_mul;
348
349 while (run1--) {
350 if (current_mul > 1) {
351 int delta = get_symbol_inline(&sc->c, state[lu][1], 1);
352 if (delta <= -current_mul || delta > current_mul/2)
353 return AVERROR_INVALIDDATA; //not sure we should check this
354 i += current_mul - 1 + delta;
355 }
356 if (i - 1 >= end)
357 break;
358 if (j >= pixel_num)
359 return AVERROR_INVALIDDATA;
360 if (end <= 0xFFFF) {
361 sc->fltmap [p][j++] = i ^ ((i& 0x8000) ? 0 : flip);
362 } else
363 sc->fltmap32[p][j++] = i ^ ((i&0x80000000) ? 0 : flip);
364 i++;
365 current_mul = decode_current_mul(&sc->c, state[0][2], mul, mul_count, i);
366 }
367 if (lu) {
368 i += current_mul;
369 }
370 lu ^= !run;
371 }
372 sc->remap_count[p] = j;
373 }
374 return 0;
375 }
376
377 7700 static int decode_slice(AVCodecContext *c, void *arg)
378 {
379 7700 FFV1Context *f = c->priv_data;
380 7700 FFV1SliceContext *sc = arg;
381 int width, height, x, y, ret;
382 7700 const int ps = av_pix_fmt_desc_get(f->pix_fmt)->comp[0].step;
383 7700 AVFrame * const p = f->picture.f;
384 7700 const int si = sc - f->slices;
385 GetBitContext gb;
386
3/4
✓ Branch 0 taken 3700 times.
✓ Branch 1 taken 4000 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3700 times.
7700 int ac = f->ac || sc->slice_coding_mode == 1;
387
388
3/4
✓ Branch 0 taken 6928 times.
✓ Branch 1 taken 772 times.
✓ Branch 2 taken 6928 times.
✗ Branch 3 not taken.
7700 if (!(p->flags & AV_FRAME_FLAG_KEY) && f->last_picture.f)
389 6928 ff_progress_frame_await(&f->last_picture, si);
390
391
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7700 times.
7700 if (f->slice_damaged[si])
392 slice_set_damaged(f, sc);
393
394 7700 sc->slice_rct_by_coef = 1;
395 7700 sc->slice_rct_ry_coef = 1;
396
397
2/2
✓ Branch 0 taken 6700 times.
✓ Branch 1 taken 1000 times.
7700 if (f->version > 2) {
398
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6700 times.
6700 if (ff_ffv1_init_slice_state(f, sc) < 0)
399 return AVERROR(ENOMEM);
400
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6700 times.
6700 if (decode_slice_header(f, sc, p) < 0) {
401 sc->slice_x = sc->slice_y = sc->slice_height = sc->slice_width = 0;
402 slice_set_damaged(f, sc);
403 return AVERROR_INVALIDDATA;
404 }
405 }
406
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 7700 times.
7700 if ((ret = ff_ffv1_init_slice_state(f, sc)) < 0)
407 return ret;
408
3/4
✓ Branch 0 taken 6928 times.
✓ Branch 1 taken 772 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6928 times.
7700 if ((p->flags & AV_FRAME_FLAG_KEY) || sc->slice_reset_contexts) {
409 772 ff_ffv1_clear_slice_state(f, sc);
410
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6928 times.
6928 } else if (sc->slice_damaged) {
411 return AVERROR_INVALIDDATA;
412 }
413
414 7700 width = sc->slice_width;
415 7700 height = sc->slice_height;
416 7700 x = sc->slice_x;
417 7700 y = sc->slice_y;
418
419
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7700 times.
7700 if (sc->remap) {
420 ret = decode_remap(f, sc);
421 if (ret < 0)
422 return ret;
423 }
424
425
2/2
✓ Branch 0 taken 3700 times.
✓ Branch 1 taken 4000 times.
7700 if (ac == AC_GOLOMB_RICE) {
426
2/2
✓ Branch 0 taken 2700 times.
✓ Branch 1 taken 1000 times.
3700 if (f->combined_version >= 0x30002)
427 2700 get_rac(&sc->c, (uint8_t[]) { 129 });
428
6/6
✓ Branch 0 taken 1000 times.
✓ Branch 1 taken 2700 times.
✓ Branch 2 taken 600 times.
✓ Branch 3 taken 400 times.
✓ Branch 4 taken 400 times.
✓ Branch 5 taken 200 times.
3700 sc->ac_byte_count = f->version > 2 || (!x && !y) ? sc->c.bytestream - sc->c.bytestream_start - 1 : 0;
429 3700 init_get_bits(&gb,
430 3700 sc->c.bytestream_start + sc->ac_byte_count,
431 3700 (sc->c.bytestream_end - sc->c.bytestream_start - sc->ac_byte_count) * 8);
432 }
433
434 av_assert1(width && height);
435
3/6
✓ Branch 0 taken 6100 times.
✓ Branch 1 taken 1600 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6100 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
13800 if (f->colorspace == 0 && (f->chroma_planes || !f->transparency)) {
436 6100 const int chroma_width = AV_CEIL_RSHIFT(width, f->chroma_h_shift);
437 6100 const int chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift);
438 6100 const int cx = x >> f->chroma_h_shift;
439 6100 const int cy = y >> f->chroma_v_shift;
440 6100 decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 0, 1, ac);
441
442
1/2
✓ Branch 0 taken 6100 times.
✗ Branch 1 not taken.
6100 if (f->chroma_planes) {
443 6100 decode_plane(f, sc, &gb, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1, 1, ac);
444 6100 decode_plane(f, sc, &gb, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 2, 1, ac);
445 }
446
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6100 times.
6100 if (f->transparency)
447 decode_plane(f, sc, &gb, p->data[3] + ps*x + y*p->linesize[3], width, height, p->linesize[3], (f->version >= 4 && !f->chroma_planes) ? 1 : 2,
448 (f->version >= 4 && !f->chroma_planes) ? 1 : 3, 1, ac);
449
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1600 times.
1600 } else if (f->colorspace == 0) {
450 decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0] , width, height, p->linesize[0], 0, 0, 2, ac);
451 decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0] + (ps>>1), width, height, p->linesize[0], 1, 1, 2, ac);
452
2/2
✓ Branch 0 taken 800 times.
✓ Branch 1 taken 800 times.
1600 } else if (f->use32bit) {
453 800 uint8_t *planes[4] = { p->data[0] + ps * x + y * p->linesize[0],
454 800 p->data[1] + ps * x + y * p->linesize[1],
455 800 p->data[2] + ps * x + y * p->linesize[2] };
456
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 800 times.
800 if (f->transparency)
457 planes[3] = p->data[3] + ps * x + y * p->linesize[3];
458 800 decode_rgb_frame32(f, sc, &gb, planes, width, height, p->linesize);
459 } else {
460 800 uint8_t *planes[4] = { p->data[0] + ps * x + y * p->linesize[0] };
461
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 800 times.
800 if (f->avctx->bits_per_raw_sample > 8) {
462 planes[1] = p->data[1] + ps * x + y * p->linesize[1];
463 planes[2] = p->data[2] + ps * x + y * p->linesize[2];
464 if (f->transparency)
465 planes[3] = p->data[3] + ps * x + y * p->linesize[3];
466 }
467 800 decode_rgb_frame(f, sc, &gb, planes, width, height, p->linesize);
468 }
469
3/4
✓ Branch 0 taken 4000 times.
✓ Branch 1 taken 3700 times.
✓ Branch 2 taken 4000 times.
✗ Branch 3 not taken.
7700 if (ac != AC_GOLOMB_RICE && f->version > 2) {
470 int v;
471 4000 get_rac(&sc->c, (uint8_t[]) { 129 });
472
1/2
✓ Branch 0 taken 4000 times.
✗ Branch 1 not taken.
4000 v = sc->c.bytestream_end - sc->c.bytestream - 2 - 5*!!f->ec;
473
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4000 times.
4000 if (v) {
474 av_log(f->avctx, AV_LOG_ERROR, "bytestream end mismatching by %d\n", v);
475 slice_set_damaged(f, sc);
476 }
477 }
478
479
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 7700 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7700 if (sc->slice_damaged && (f->avctx->err_recognition & AV_EF_EXPLODE))
480 return AVERROR_INVALIDDATA;
481
482
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 7700 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7700 if ((c->active_thread_type & FF_THREAD_FRAME) && !f->frame_damaged)
483 ff_progress_frame_report(&f->picture, si);
484
485 7700 return 0;
486 }
487
488 87 static enum AVPixelFormat get_pixel_format(FFV1Context *f)
489 {
490 87 enum AVPixelFormat pix_fmts[] = {
491 #if CONFIG_FFV1_VULKAN_HWACCEL
492 AV_PIX_FMT_VULKAN,
493 #endif
494 87 f->pix_fmt,
495 AV_PIX_FMT_NONE,
496 };
497
498 87 return ff_get_format(f->avctx, pix_fmts);
499 }
500
501 253 static int read_header(FFV1Context *f, RangeCoder *c)
502 {
503 uint8_t state[CONTEXT_SIZE];
504 253 int context_count = -1; //-1 to avoid warning
505 int ret;
506
507 253 memset(state, 128, sizeof(state));
508
509 253 ret = ff_ffv1_parse_header(f, c, state);
510
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 253 times.
253 if (ret < 0)
511 return ret;
512
513
2/2
✓ Branch 0 taken 166 times.
✓ Branch 1 taken 87 times.
253 if (f->configured_pix_fmt != f->pix_fmt ||
514
1/2
✓ Branch 0 taken 166 times.
✗ Branch 1 not taken.
166 f->configured_width != f->width ||
515
1/2
✓ Branch 0 taken 166 times.
✗ Branch 1 not taken.
166 f->configured_height != f->height ||
516
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 166 times.
166 f->configured_ac != f->ac) {
517 87 f->avctx->pix_fmt = get_pixel_format(f);
518
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 87 times.
87 if (f->avctx->pix_fmt < 0)
519 return AVERROR(EINVAL);
520 87 f->configured_pix_fmt = f->pix_fmt;
521 87 f->configured_width = f->width;
522 87 f->configured_height = f->height;
523 87 f->configured_ac = f->ac;
524 }
525
526 ff_dlog(f->avctx, "%d %d %d\n",
527 f->chroma_h_shift, f->chroma_v_shift, f->pix_fmt);
528
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 229 times.
253 if (f->version < 2) {
529 24 context_count = ff_ffv1_read_quant_tables(c, f->quant_tables[0]);
530
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 if (context_count < 0) {
531 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
532 return AVERROR_INVALIDDATA;
533 }
534 24 f->slice_count = f->max_slice_count;
535
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 205 times.
229 } else if (f->version < 3) {
536 24 f->slice_count = ff_ffv1_get_symbol(c, state, 0);
537 } else {
538 205 const uint8_t *p = c->bytestream_end;
539 205 for (f->slice_count = 0;
540
4/6
✓ Branch 0 taken 1035 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1035 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 830 times.
✓ Branch 5 taken 205 times.
1035 f->slice_count < MAX_SLICES && 3 + 5*!!f->ec < p - c->bytestream_start;
541 830 f->slice_count++) {
542
1/2
✓ Branch 0 taken 830 times.
✗ Branch 1 not taken.
830 int trailer = 3 + 5*!!f->ec;
543 830 int size = AV_RB24(p-trailer);
544
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 830 times.
830 if (size + trailer > p - c->bytestream_start)
545 break;
546 830 p -= size + trailer;
547 }
548 }
549
3/6
✓ Branch 0 taken 253 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 253 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 253 times.
253 if (f->slice_count > (unsigned)MAX_SLICES || f->slice_count <= 0 || f->slice_count > f->max_slice_count) {
550 av_log(f->avctx, AV_LOG_ERROR, "slice count %d is invalid (max=%d)\n", f->slice_count, f->max_slice_count);
551 return AVERROR_INVALIDDATA;
552 }
553
554 253 av_refstruct_unref(&f->slice_damaged);
555 253 f->slice_damaged = av_refstruct_allocz(f->slice_count * sizeof(*f->slice_damaged));
556
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 253 times.
253 if (!f->slice_damaged)
557 return AVERROR(ENOMEM);
558
559
2/2
✓ Branch 0 taken 950 times.
✓ Branch 1 taken 253 times.
1203 for (int j = 0; j < f->slice_count; j++) {
560 950 FFV1SliceContext *sc = &f->slices[j];
561
562
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 854 times.
950 if (f->version == 2) {
563 96 int sx = ff_ffv1_get_symbol(c, state, 0);
564 96 int sy = ff_ffv1_get_symbol(c, state, 0);
565 96 int sw = ff_ffv1_get_symbol(c, state, 0) + 1U;
566 96 int sh = ff_ffv1_get_symbol(c, state, 0) + 1U;
567
568
4/8
✓ Branch 0 taken 96 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 96 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 96 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 96 times.
96 if (sx < 0 || sy < 0 || sw <= 0 || sh <= 0)
569 return AVERROR_INVALIDDATA;
570
2/4
✓ Branch 0 taken 96 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 96 times.
96 if (sx > f->num_h_slices - sw || sy > f->num_v_slices - sh)
571 return AVERROR_INVALIDDATA;
572
573 96 sc->slice_x = sx * (int64_t)f->width / f->num_h_slices;
574 96 sc->slice_y = sy * (int64_t)f->height / f->num_v_slices;
575 96 sc->slice_width = (sx + sw) * (int64_t)f->width / f->num_h_slices - sc->slice_x;
576 96 sc->slice_height = (sy + sh) * (int64_t)f->height / f->num_v_slices - sc->slice_y;
577
578
2/4
✓ Branch 0 taken 96 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 96 times.
96 av_assert0((unsigned)sc->slice_width <= f->width &&
579 (unsigned)sc->slice_height <= f->height);
580
2/4
✓ Branch 0 taken 96 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 96 times.
96 av_assert0 ( (unsigned)sc->slice_x + (uint64_t)sc->slice_width <= f->width
581 && (unsigned)sc->slice_y + (uint64_t)sc->slice_height <= f->height);
582 }
583
584 950 av_refstruct_unref(&sc->plane);
585 950 sc->plane = ff_ffv1_planes_alloc();
586
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 950 times.
950 if (!sc->plane)
587 return AVERROR(ENOMEM);
588
589
2/2
✓ Branch 0 taken 1900 times.
✓ Branch 1 taken 950 times.
2850 for (int i = 0; i < f->plane_count; i++) {
590 1900 PlaneContext *const p = &sc->plane[i];
591
592
2/2
✓ Branch 0 taken 192 times.
✓ Branch 1 taken 1708 times.
1900 if (f->version == 2) {
593 192 int idx = ff_ffv1_get_symbol(c, state, 0);
594
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 192 times.
192 if (idx >= (unsigned)f->quant_table_count) {
595 av_log(f->avctx, AV_LOG_ERROR,
596 "quant_table_index out of range\n");
597 return AVERROR_INVALIDDATA;
598 }
599 192 p->quant_table_index = idx;
600 192 context_count = f->context_count[idx];
601 }
602
603
2/2
✓ Branch 0 taken 240 times.
✓ Branch 1 taken 1660 times.
1900 if (f->version <= 2) {
604
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 240 times.
240 av_assert0(context_count >= 0);
605 240 p->context_count = context_count;
606 }
607 }
608 }
609 253 return 0;
610 }
611
612 88 static av_cold int decode_init(AVCodecContext *avctx)
613 {
614 88 FFV1Context *f = avctx->priv_data;
615 int ret;
616
617 88 f->pix_fmt = AV_PIX_FMT_NONE;
618 88 f->configured_pix_fmt = AV_PIX_FMT_NONE;
619
620
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 88 times.
88 if ((ret = ff_ffv1_common_init(avctx, f)) < 0)
621 return ret;
622
623
3/4
✓ Branch 0 taken 80 times.
✓ Branch 1 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 80 times.
88 if (avctx->extradata_size > 0 && (ret = ff_ffv1_read_extra_header(f)) < 0)
624 return ret;
625
626
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 88 times.
88 if ((ret = ff_ffv1_init_slice_contexts(f)) < 0)
627 return ret;
628
629 88 return 0;
630 }
631
632 7700 static int find_next_slice(AVCodecContext *avctx,
633 uint8_t *buf, uint8_t *buf_end, int idx,
634 uint8_t **pos, uint32_t *len)
635 {
636 7700 FFV1Context *f = avctx->priv_data;
637
638 /* Length field */
639 7700 uint32_t v = buf_end - buf;
640
4/4
✓ Branch 0 taken 2075 times.
✓ Branch 1 taken 5625 times.
✓ Branch 2 taken 1675 times.
✓ Branch 3 taken 400 times.
7700 if (idx || f->version > 2) {
641 /* Three bytes of length, plus flush bit + CRC */
642
2/2
✓ Branch 0 taken 6700 times.
✓ Branch 1 taken 600 times.
7300 uint32_t trailer = 3 + 5*!!f->ec;
643
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7300 times.
7300 if (trailer > buf_end - buf)
644 v = INT_MAX;
645 else
646 7300 v = AV_RB24(buf_end - trailer) + trailer;
647 }
648
649
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7700 times.
7700 if (buf_end - buf < v) {
650 av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n");
651 ff_progress_frame_report(&f->picture, INT_MAX);
652 return AVERROR_INVALIDDATA;
653 }
654
655 7700 *len = v;
656
2/2
✓ Branch 0 taken 5625 times.
✓ Branch 1 taken 2075 times.
7700 if (idx)
657 5625 *pos = buf_end - v;
658 else
659 2075 *pos = buf;
660
661 7700 return 0;
662 }
663
664 2120 static int decode_header(AVCodecContext *avctx, RangeCoder *c,
665 uint8_t *buf, size_t buf_size)
666 {
667 int ret;
668 2120 FFV1Context *f = avctx->priv_data;
669
670 2120 uint8_t keystate = 128;
671 2120 ff_init_range_decoder(c, buf, buf_size);
672 2120 ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
673
674
2/2
✓ Branch 1 taken 253 times.
✓ Branch 2 taken 1867 times.
2120 if (get_rac(c, &keystate)) {
675 253 f->key_frame = AV_FRAME_FLAG_KEY;
676 253 f->key_frame_ok = 0;
677
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 253 times.
253 if ((ret = read_header(f, c)) < 0)
678 return ret;
679 253 f->key_frame_ok = 1;
680 } else {
681
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1867 times.
1867 if (!f->key_frame_ok) {
682 av_log(avctx, AV_LOG_ERROR,
683 "Cannot decode non-keyframe without valid keyframe\n");
684 return AVERROR_INVALIDDATA;
685 }
686 1867 f->key_frame = 0;
687 }
688
689
2/2
✓ Branch 0 taken 1022 times.
✓ Branch 1 taken 1098 times.
2120 if (f->ac != AC_GOLOMB_RICE) {
690
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1022 times.
1022 if (buf_size < avctx->width * avctx->height / (128*8))
691 return AVERROR_INVALIDDATA;
692 } else {
693 1098 int w = avctx->width;
694 1098 int s = 1 + w / (1<<23);
695 int i;
696
697 1098 w /= s;
698
699
2/2
✓ Branch 0 taken 25232 times.
✓ Branch 1 taken 1098 times.
26330 for (i = 0; w > (1<<ff_log2_run[i]); i++)
700 25232 w -= ff_log2_run[i];
701
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1098 times.
1098 if (buf_size < (avctx->height + i + 6) / 8 * s)
702 return AVERROR_INVALIDDATA;
703 }
704
705 2120 return 0;
706 }
707
708 2075 static int decode_slices(AVCodecContext *avctx, RangeCoder c,
709 AVPacket *avpkt)
710 {
711 2075 FFV1Context *f = avctx->priv_data;
712 2075 AVFrame *p = f->picture.f;
713
714 2075 uint8_t *buf = avpkt->data;
715 2075 size_t buf_size = avpkt->size;
716 2075 uint8_t *buf_end = buf + buf_size;
717
718
2/2
✓ Branch 0 taken 7700 times.
✓ Branch 1 taken 2075 times.
9775 for (int i = f->slice_count - 1; i >= 0; i--) {
719 7700 FFV1SliceContext *sc = &f->slices[i];
720
721 uint8_t *pos;
722 uint32_t len;
723 7700 int err = find_next_slice(avctx, buf, buf_end, i,
724 &pos, &len);
725
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7700 times.
7700 if (err < 0)
726 return err;
727
728 7700 buf_end -= len;
729
730 7700 sc->slice_damaged = 0;
731
732
2/2
✓ Branch 0 taken 6700 times.
✓ Branch 1 taken 1000 times.
7700 if (f->ec) {
733 6700 unsigned crc = av_crc(av_crc_get_table(AV_CRC_32_IEEE), f->crcref, pos, len);
734
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6700 times.
6700 if (crc != f->crcref) {
735 int64_t ts = avpkt->pts != AV_NOPTS_VALUE ? avpkt->pts : avpkt->dts;
736 av_log(f->avctx, AV_LOG_ERROR, "slice CRC mismatch %X!", crc);
737 if (ts != AV_NOPTS_VALUE && avctx->pkt_timebase.num) {
738 av_log(f->avctx, AV_LOG_ERROR, "at %f seconds\n", ts*av_q2d(avctx->pkt_timebase));
739 } else if (ts != AV_NOPTS_VALUE) {
740 av_log(f->avctx, AV_LOG_ERROR, "at %"PRId64"\n", ts);
741 } else {
742 av_log(f->avctx, AV_LOG_ERROR, "\n");
743 }
744 slice_set_damaged(f, sc);
745 }
746
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6700 times.
6700 if (avctx->debug & FF_DEBUG_PICT_INFO) {
747 av_log(avctx, AV_LOG_DEBUG, "slice %d, CRC: 0x%08"PRIX32"\n", i, AV_RB32(pos + len - 4));
748 }
749 }
750
751
2/2
✓ Branch 0 taken 5625 times.
✓ Branch 1 taken 2075 times.
7700 if (i) {
752 5625 ff_init_range_decoder(&sc->c, pos, len);
753 5625 ff_build_rac_states(&sc->c, 0.05 * (1LL << 32), 256 - 8);
754 } else {
755 2075 sc->c = c;
756 2075 sc->c.bytestream_end = pos + len;
757 }
758 }
759
760 2075 avctx->execute(avctx,
761 decode_slice,
762 2075 f->slices,
763 NULL,
764 f->slice_count,
765 sizeof(*f->slices));
766
767
2/2
✓ Branch 0 taken 7700 times.
✓ Branch 1 taken 2075 times.
9775 for (int i = f->slice_count - 1; i >= 0; i--) {
768 7700 FFV1SliceContext *sc = &f->slices[i];
769
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 7700 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
7700 if (sc->slice_damaged && f->last_picture.f) {
770 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(f->pix_fmt);
771 const uint8_t *src[4];
772 uint8_t *dst[4];
773 ff_progress_frame_await(&f->last_picture, INT_MAX);
774 for (int j = 0; j < desc->nb_components; j++) {
775 int pixshift = desc->comp[j].depth > 8;
776 int sh = (j == 1 || j == 2) ? f->chroma_h_shift : 0;
777 int sv = (j == 1 || j == 2) ? f->chroma_v_shift : 0;
778 dst[j] = p->data[j] + p->linesize[j] *
779 (sc->slice_y >> sv) + ((sc->slice_x >> sh) << pixshift);
780 src[j] = f->last_picture.f->data[j] + f->last_picture.f->linesize[j] *
781 (sc->slice_y >> sv) + ((sc->slice_x >> sh) << pixshift);
782
783 }
784
785 av_image_copy(dst, p->linesize, src,
786 f->last_picture.f->linesize,
787 f->pix_fmt,
788 sc->slice_width,
789 sc->slice_height);
790
791 f->slice_damaged[i] = 1;
792 }
793 }
794
795 2075 return 0;
796 }
797
798 2120 static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
799 int *got_frame, AVPacket *avpkt)
800 {
801 2120 FFV1Context *f = avctx->priv_data;
802 int ret;
803 AVFrame *p;
804 2120 const FFHWAccel *hwaccel = NULL;
805
806 /* This is copied onto the first slice's range coder context */
807 RangeCoder c;
808
809 2120 ff_progress_frame_unref(&f->last_picture);
810 2120 av_refstruct_unref(&f->hwaccel_last_picture_private);
811
812 2120 FFSWAP(ProgressFrame, f->picture, f->last_picture);
813 2120 FFSWAP(void *, f->hwaccel_picture_private, f->hwaccel_last_picture_private);
814
815 2120 f->avctx = avctx;
816 2120 f->frame_damaged = 0;
817
818 2120 ret = decode_header(avctx, &c, avpkt->data, avpkt->size);
819
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2120 times.
2120 if (ret < 0)
820 return ret;
821
822
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2120 times.
2120 if (avctx->debug & FF_DEBUG_PICT_INFO)
823 av_log(avctx, AV_LOG_DEBUG, "ver:%d keyframe:%d coder:%d ec:%d slices:%d bps:%d\n",
824 f->version, !!f->key_frame, f->ac, f->ec, f->slice_count, f->avctx->bits_per_raw_sample);
825
826
2/2
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 2075 times.
2120 if (avctx->skip_frame >= AVDISCARD_ALL)
827 45 return avpkt->size;
828
829
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2075 times.
2075 if (avctx->hwaccel)
830 hwaccel = ffhwaccel(avctx->hwaccel);
831
832 2075 ret = ff_progress_frame_get_buffer(avctx, &f->picture,
833 AV_GET_BUFFER_FLAG_REF);
834
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2075 times.
2075 if (ret < 0)
835 return ret;
836
837 2075 ret = ff_hwaccel_frame_priv_alloc(avctx, &f->hwaccel_picture_private);
838
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2075 times.
2075 if (ret < 0)
839 return ret;
840
841 2075 p = f->picture.f;
842
843 2075 p->pict_type = AV_PICTURE_TYPE_I; //FIXME I vs. P
844 2075 p->flags = (p->flags & ~AV_FRAME_FLAG_KEY) | f->key_frame;
845
846
3/4
✓ Branch 0 taken 400 times.
✓ Branch 1 taken 1675 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 400 times.
2075 if (f->version < 3 && avctx->field_order > AV_FIELD_PROGRESSIVE) {
847 /* we have interlaced material flagged in container */
848 p->flags |= AV_FRAME_FLAG_INTERLACED;
849 if (avctx->field_order == AV_FIELD_TT || avctx->field_order == AV_FIELD_TB)
850 p->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST;
851 }
852
853 /* Start */
854
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2075 times.
2075 if (hwaccel) {
855 ret = hwaccel->start_frame(avctx, avpkt->buf, avpkt->data, avpkt->size);
856 if (ret < 0)
857 return ret;
858 }
859
860 2075 ff_thread_finish_setup(avctx);
861
862 /* Decode slices */
863
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2075 times.
2075 if (hwaccel) {
864 uint8_t *buf_end = avpkt->data + avpkt->size;
865
866 if (!(p->flags & AV_FRAME_FLAG_KEY) && f->last_picture.f)
867 ff_progress_frame_await(&f->last_picture, f->slice_count - 1);
868
869 for (int i = f->slice_count - 1; i >= 0; i--) {
870 uint8_t *pos;
871 uint32_t len;
872 ret = find_next_slice(avctx, avpkt->data, buf_end, i,
873 &pos, &len);
874 if (ret < 0)
875 return ret;
876
877 buf_end -= len;
878
879 ret = hwaccel->decode_slice(avctx, pos, len);
880 if (ret < 0)
881 return ret;
882 }
883 } else {
884 2075 ret = decode_slices(avctx, c, avpkt);
885
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2075 times.
2075 if (ret < 0)
886 return ret;
887 }
888
889 /* Finalize */
890
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2075 times.
2075 if (hwaccel) {
891 ret = hwaccel->end_frame(avctx);
892 if (ret < 0)
893 return ret;
894 }
895
896 2075 ff_progress_frame_report(&f->picture, INT_MAX);
897
898 2075 ff_progress_frame_unref(&f->last_picture);
899 2075 av_refstruct_unref(&f->hwaccel_last_picture_private);
900
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2075 times.
2075 if ((ret = av_frame_ref(rframe, f->picture.f)) < 0)
901 return ret;
902
903 2075 *got_frame = 1;
904
905 2075 return avpkt->size;
906 }
907
908 #if HAVE_THREADS
909 static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
910 {
911 FFV1Context *fsrc = src->priv_data;
912 FFV1Context *fdst = dst->priv_data;
913
914 if (dst == src)
915 return 0;
916
917 fdst->version = fsrc->version;
918 fdst->micro_version = fsrc->micro_version;
919 fdst->combined_version = fsrc->combined_version;
920 fdst->chroma_planes = fsrc->chroma_planes;
921 fdst->chroma_h_shift = fsrc->chroma_h_shift;
922 fdst->chroma_v_shift = fsrc->chroma_v_shift;
923 fdst->transparency = fsrc->transparency;
924 fdst->plane_count = fsrc->plane_count;
925 fdst->ac = fsrc->ac;
926 fdst->colorspace = fsrc->colorspace;
927 fdst->pix_fmt = fsrc->pix_fmt;
928 fdst->configured_pix_fmt = fsrc->configured_pix_fmt;
929 fdst->configured_ac = fsrc->configured_ac;
930 fdst->configured_width = fsrc->configured_width;
931 fdst->configured_height = fsrc->configured_height;
932
933 fdst->ec = fsrc->ec;
934 fdst->intra = fsrc->intra;
935 fdst->key_frame_ok = fsrc->key_frame_ok;
936
937 fdst->packed_at_lsb = fsrc->packed_at_lsb;
938 fdst->slice_count = fsrc->slice_count;
939 fdst->use32bit = fsrc->use32bit;
940 memcpy(fdst->state_transition, fsrc->state_transition,
941 sizeof(fdst->state_transition));
942
943 // in version 1 there is a single per-keyframe quant table, so
944 // we need to propagate it between threads
945 if (fsrc->version < 2)
946 memcpy(fdst->quant_tables[0], fsrc->quant_tables[0], sizeof(fsrc->quant_tables[0]));
947
948 for (int i = 0; i < fdst->num_h_slices * fdst->num_v_slices; i++) {
949 FFV1SliceContext *sc = &fdst->slices[i];
950 const FFV1SliceContext *sc0 = &fsrc->slices[i];
951
952 av_refstruct_replace(&sc->plane, sc0->plane);
953
954 if (fsrc->version < 3) {
955 sc->slice_x = sc0->slice_x;
956 sc->slice_y = sc0->slice_y;
957 sc->slice_width = sc0->slice_width;
958 sc->slice_height = sc0->slice_height;
959 }
960 }
961
962 av_refstruct_replace(&fdst->slice_damaged, fsrc->slice_damaged);
963
964 av_assert1(fdst->max_slice_count == fsrc->max_slice_count);
965
966 ff_progress_frame_replace(&fdst->picture, &fsrc->picture);
967 av_refstruct_replace(&fdst->hwaccel_picture_private,
968 fsrc->hwaccel_picture_private);
969
970 return 0;
971 }
972 #endif
973
974 88 static av_cold int ffv1_decode_close(AVCodecContext *avctx)
975 {
976 88 FFV1Context *const s = avctx->priv_data;
977
978 88 ff_progress_frame_unref(&s->picture);
979 88 av_refstruct_unref(&s->hwaccel_picture_private);
980
981 88 ff_progress_frame_unref(&s->last_picture);
982 88 av_refstruct_unref(&s->hwaccel_last_picture_private);
983
984 88 ff_ffv1_close(s);
985
986 88 return 0;
987 }
988
989 const FFCodec ff_ffv1_decoder = {
990 .p.name = "ffv1",
991 CODEC_LONG_NAME("FFmpeg video codec #1"),
992 .p.type = AVMEDIA_TYPE_VIDEO,
993 .p.id = AV_CODEC_ID_FFV1,
994 .priv_data_size = sizeof(FFV1Context),
995 .init = decode_init,
996 .close = ffv1_decode_close,
997 FF_CODEC_DECODE_CB(decode_frame),
998 UPDATE_THREAD_CONTEXT(update_thread_context),
999 .p.capabilities = AV_CODEC_CAP_DR1 |
1000 AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS,
1001 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP |
1002 FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM |
1003 FF_CODEC_CAP_USES_PROGRESSFRAMES,
1004 .hw_configs = (const AVCodecHWConfigInternal *const []) {
1005 #if CONFIG_FFV1_VULKAN_HWACCEL
1006 HWACCEL_VULKAN(ffv1),
1007 #endif
1008 NULL
1009 },
1010 };
1011