FFmpeg
Loading...
Searching...
No Matches
ffv1dec.c
Go to the documentation of this file.
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
48static inline int get_vlc_symbol(GetBitContext *gb, VlcState *const state,
49 int bits)
50{
51 int k, i, v, ret;
52
53 i = state->count;
54 k = 0;
55 while (i < state->error_sum) { // FIXME: optimize
56 k++;
57 i += i;
58 }
59 /* get_ur_golomb() reads at most 32 bits, 12 of which the escape limit
60 * reserves for the prefix */
61 if (k > 20) {
62 ff_dlog(NULL, "k-overflow bias:%d error:%d drift:%d count:%d k:%d",
63 state->bias, state->error_sum, state->drift, state->count, k);
64 k = 20;
65 }
66
67 v = get_sr_golomb(gb, k, 12, bits);
68 ff_dlog(NULL, "v:%d bias:%d error:%d drift:%d count:%d k:%d",
69 v, state->bias, state->error_sum, state->drift, state->count, k);
70
71 v ^= ((2 * state->drift + state->count) >> 31);
72
73 ret = fold(v + state->bias, bits);
74
76
77 return ret;
78}
79
80static int is_input_end(RangeCoder *c, GetBitContext *gb, int ac)
81{
82 if (ac != AC_GOLOMB_RICE) {
83 if (c->overread > MAX_OVERREAD)
85 } else {
86 if (get_bits_left(gb) < 1)
88 }
89 return 0;
90}
91
92#define TYPE int16_t
93#define RENAME(name) name
94#include "ffv1dec_template.c"
95#undef TYPE
96#undef RENAME
97
98#define TYPE int32_t
99#define RENAME(name) name ## 32
100#include "ffv1dec_template.c"
101
103 GetBitContext *gb,
104 uint8_t *src, int w, int h, int stride, int plane_index,
105 int remap_index, int pixel_stride, int ac)
106{
107 int x, y;
108 int16_t *sample[2];
109 int bits;
110 unsigned mask;
111
112 if (sc->remap) {
113 bits = av_ceil_log2(sc->remap_count[remap_index]);
114 mask = (1<<bits)-1;
115
116 av_assert0(sc->fltmap_size[remap_index] >= (mask + 1) * sizeof(*sc->fltmap[remap_index]));
117 } else {
118 bits = f->avctx->bits_per_raw_sample;
119 }
120
121 sample[0] = sc->sample_buffer + 3;
122 sample[1] = sc->sample_buffer + w + 6 + 3;
123
124 sc->run_index = 0;
125
126 memset(sc->sample_buffer, 0, 2 * (w + 6) * sizeof(*sc->sample_buffer));
127
128 for (y = 0; y < h; y++) {
129 int16_t *temp = sample[0]; // FIXME: try a normal buffer
130
131 sample[0] = sample[1];
132 sample[1] = temp;
133
134 sample[1][-1] = sample[0][0];
135 sample[0][w] = sample[0][w - 1];
136
137 if (f->avctx->bits_per_raw_sample <= 8) {
138 int ret = decode_line(f, sc, gb, w, sample, plane_index, 8, ac);
139 if (ret < 0)
140 return ret;
141 if (sc->remap)
142 for (x = 0; x < w; x++)
143 sample[1][x] = sc->fltmap[remap_index][sample[1][x] & mask];
144 for (x = 0; x < w; x++)
145 src[x*pixel_stride + stride * y] = sample[1][x];
146 } else {
147 int ret = decode_line(f, sc, gb, w, sample, plane_index, bits, ac);
148 if (ret < 0)
149 return ret;
150
151 if (sc->remap) {
152 if (f->packed_at_lsb || f->avctx->bits_per_raw_sample == 16) {
153 for (x = 0; x < w; x++) {
154 ((uint16_t*)(src + stride*y))[x*pixel_stride] = sc->fltmap[remap_index][sample[1][x] & mask];
155 }
156 } else {
157 for (x = 0; x < w; x++) {
158 int v = sc->fltmap[remap_index][sample[1][x] & mask];
159 ((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);
160 }
161 }
162 } else {
163 if (f->packed_at_lsb || f->avctx->bits_per_raw_sample == 16) {
164 for (x = 0; x < w; x++) {
165 ((uint16_t*)(src + stride*y))[x*pixel_stride] = sample[1][x];
166 }
167 } else {
168 for (x = 0; x < w; x++) {
169 ((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);
170 }
171 }
172 }
173 }
174 }
175 return 0;
176}
177
180{
181 RangeCoder *c = &sc->c;
182 uint8_t state[CONTEXT_SIZE];
183 unsigned ps, context_count;
184 int sx, sy, sw, sh;
185
186 memset(state, 128, sizeof(state));
187 sx = ff_ffv1_get_symbol(c, state, 0);
188 sy = ff_ffv1_get_symbol(c, state, 0);
189 sw = ff_ffv1_get_symbol(c, state, 0) + 1U;
190 sh = ff_ffv1_get_symbol(c, state, 0) + 1U;
191
192 av_assert0(f->version > 2);
193
194
195 if (sx < 0 || sy < 0 || sw <= 0 || sh <= 0)
196 return AVERROR_INVALIDDATA;
197 if (sx > f->num_h_slices - sw || sy > f->num_v_slices - sh)
198 return AVERROR_INVALIDDATA;
199
200 sc->slice_x = ff_slice_coord(f, f->width , sx , f->num_h_slices, f->chroma_h_shift);
201 sc->slice_y = ff_slice_coord(f, f->height, sy , f->num_v_slices, f->chroma_v_shift);
202 sc->slice_width = ff_slice_coord(f, f->width , sx + sw, f->num_h_slices, f->chroma_h_shift) - sc->slice_x;
203 sc->slice_height = ff_slice_coord(f, f->height, sy + sh, f->num_v_slices, f->chroma_v_shift) - sc->slice_y;
204
205 av_assert0((unsigned)sc->slice_width <= f->width &&
206 (unsigned)sc->slice_height <= f->height);
207 av_assert0 ( (unsigned)sc->slice_x + (uint64_t)sc->slice_width <= f->width
208 && (unsigned)sc->slice_y + (uint64_t)sc->slice_height <= f->height);
209
210 if (f->ac == AC_GOLOMB_RICE && sc->slice_width >= (1<<23))
211 return AVERROR_INVALIDDATA;
212
213 for (unsigned i = 0; i < f->plane_count; i++) {
214 PlaneContext * const p = &sc->plane[i];
215 int idx = ff_ffv1_get_symbol(c, state, 0);
216 if (idx >= (unsigned)f->quant_table_count) {
217 av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n");
218 return -1;
219 }
220 p->quant_table_index = idx;
221 context_count = f->context_count[idx];
222
223 if (p->context_count < context_count) {
224 av_freep(&p->state);
225 av_freep(&p->vlc_state);
226 }
227 p->context_count = context_count;
228 }
229
230 ps = ff_ffv1_get_symbol(c, state, 0);
231 if (ps == 1) {
234 } else if (ps == 2) {
237 } else if (ps == 3) {
239 }
240 frame->sample_aspect_ratio.num = ff_ffv1_get_symbol(c, state, 0);
241 frame->sample_aspect_ratio.den = ff_ffv1_get_symbol(c, state, 0);
242
243 if (av_image_check_sar(f->width, f->height,
244 frame->sample_aspect_ratio) < 0) {
245 av_log(f->avctx, AV_LOG_WARNING, "ignoring invalid SAR: %u/%u\n",
246 frame->sample_aspect_ratio.num,
247 frame->sample_aspect_ratio.den);
248 frame->sample_aspect_ratio = (AVRational){ 0, 1 };
249 }
250
251 if (f->version > 3) {
254 if (sc->slice_coding_mode != 1 && f->colorspace != 0) {
257 if ((uint64_t)sc->slice_rct_by_coef + (uint64_t)sc->slice_rct_ry_coef > 4) {
258 av_log(f->avctx, AV_LOG_ERROR, "slice_rct_y_coef out of range\n");
259 return AVERROR_INVALIDDATA;
260 }
261 }
262 if (f->combined_version >= 0x40004) {
263 sc->remap = ff_ffv1_get_symbol(c, state, 0);
264 if (sc->remap > 2U ||
265 sc->remap && !f->flt) {
266 av_log(f->avctx, AV_LOG_ERROR, "unsupported remap %d\n", sc->remap);
267 return AVERROR_INVALIDDATA;
268 }
269 }
270 }
271 if (f->avctx->bits_per_raw_sample == 32) {
272 if (!sc->remap) {
273 av_log(f->avctx, AV_LOG_ERROR, "unsupported remap\n");
274 return AVERROR_INVALIDDATA;
275 }
276 }
277
278 return 0;
279}
280
282{
283 sc->slice_damaged = 1;
284
285 // only set this for frame threading, as for slice threading its value is
286 // not used and setting it would be a race
287 if (f->avctx->active_thread_type & FF_THREAD_FRAME)
288 f->frame_damaged = 1;
289}
290
291static int decode_current_mul(RangeCoder *rc, uint8_t state[32], int *mul, int mul_count, int64_t i)
292{
293 int ndx = (i * mul_count) >> 32;
294 av_assert2(ndx <= 4096U);
295
296 if (mul[ndx] < 0)
297 mul[ndx] = ff_ffv1_get_symbol(rc, state, 0) & 0x3FFFFFFF;
298
299 return mul[ndx];
300}
301
303{
304 unsigned int end = (1LL<<f->avctx->bits_per_raw_sample) - 1;
305 int flip = sc->remap == 2 ? (end>>1) : 0;
306
307 for (int p = 0; p < 1 + 2*f->chroma_planes + f->transparency; p++) {
308 int j = 0;
309 int lu = 0;
310 uint8_t state[2][3][32];
311 int64_t i;
312 int mul[4096+1];
313 int mul_count;
314
315 const int is_chroma = (p == 1 || p == 2) && f->chroma_planes;
316 const int plane_width = AV_CEIL_RSHIFT(sc->slice_width , is_chroma ? f->chroma_h_shift : 0);
317 const int plane_height = AV_CEIL_RSHIFT(sc->slice_height, is_chroma ? f->chroma_v_shift : 0);
318 const int pixel_num = FFMIN(plane_width * plane_height, end + 1LL);
319 const size_t fltmap_ceil = 1ULL << av_ceil_log2(pixel_num);
320
321 if (f->avctx->bits_per_raw_sample == 32) {
322 av_fast_malloc(&sc->fltmap32[p], &sc->fltmap32_size[p], fltmap_ceil * sizeof(*sc->fltmap32[p]));
323 if (!sc->fltmap32[p])
324 return AVERROR(ENOMEM);
325 } else {
326 av_fast_malloc(&sc->fltmap[p] , &sc->fltmap_size[p] , fltmap_ceil * sizeof(*sc->fltmap[p]));
327 if (!sc->fltmap[p])
328 return AVERROR(ENOMEM);
329 }
330
331 memset(state, 128, sizeof(state));
332 mul_count = ff_ffv1_get_symbol(&sc->c, state[0][0], 0);
333
334 if (mul_count > 4096U)
335 return AVERROR_INVALIDDATA;
336 for (int i = 0; i<mul_count; i++) {
337 mul[i] = -1;
338
339 }
340 mul[mul_count] = 1;
341
342 memset(state, 128, sizeof(state));
343 int current_mul = 1;
344 for (i=0; i <= end ;) {
345 unsigned run = get_symbol_inline(&sc->c, state[lu][0], 0);
346 unsigned run0 = lu ? 0 : run;
347 unsigned run1 = lu ? run : 1;
348
349 i += run0 * current_mul;
350
351 while (run1--) {
352 if (current_mul > 1) {
353 int delta = get_symbol_inline(&sc->c, state[lu][1], 1);
354 if (delta <= -current_mul || delta > current_mul/2)
355 return AVERROR_INVALIDDATA; //not sure we should check this
356 i += current_mul - 1 + delta;
357 }
358 if (i - 1 >= end)
359 break;
360 if (j >= pixel_num)
361 return AVERROR_INVALIDDATA;
362 if (end <= 0xFFFF) {
363 sc->fltmap [p][j++] = i ^ ((i& 0x8000) ? 0 : flip);
364 } else
365 sc->fltmap32[p][j++] = i ^ ((i&0x80000000) ? 0 : flip);
366 i++;
367 current_mul = decode_current_mul(&sc->c, state[0][2], mul, mul_count, i);
368 }
369 if (lu) {
370 i += current_mul;
371 }
372 lu ^= !run;
373 }
374 if (!j)
375 return AVERROR_INVALIDDATA;
376 sc->remap_count[p] = j;
377 }
378 return 0;
379}
380
382 GetBitContext *gb,
383 uint8_t *src, int w, int h, int stride)
384{
385 int x, y, p;
386 TYPE *sample[4][2];
387 int ac = f->ac;
388 unsigned mask[4];
389
390 int bits[4], offset;
391 ff_ffv1_compute_bits_per_plane(f, sc, bits, &offset, mask, f->avctx->bits_per_raw_sample);
392
393 w >>= 1;
394
395 if (sc->slice_coding_mode == 1)
396 ac = 1;
397
398 for (x = 0; x < 4; x++) {
399 sample[x][0] = RENAME(sc->sample_buffer) + x * 2 * (w + 6) + 3;
400 sample[x][1] = RENAME(sc->sample_buffer) + (x * 2 + 1) * (w + 6) + 3;
401 }
402
403 sc->run_index = 0;
404
405 memset(RENAME(sc->sample_buffer), 0, 8 * (w + 6) * sizeof(*RENAME(sc->sample_buffer)));
406
407 for (y = 0; y < h; y += 2) {
408 for (p = 0; p < 4; p++) {
409 int ret;
410 TYPE *temp = sample[p][0]; // FIXME: try a normal buffer
411
412 sample[p][0] = sample[p][1];
413 sample[p][1] = temp;
414
415 sample[p][1][-1]= sample[p][0][0 ];
416 sample[p][0][ w]= sample[p][0][w-1];
417 ret = RENAME(decode_line)(f, sc, gb, w, sample[p],
418 p == 1 ? 2 : (p > 1), bits[p], ac);
419 if (ret < 0)
420 return ret;
421 }
422
423 for (x = 0; x < w; x++) {
424 int g_r = sample[0][1][x];
425 int g_b = sample[1][1][x];
426 int b = sample[2][1][x];
427 int r = sample[3][1][x];
428
429 if (sc->slice_coding_mode != 1) {
430 b -= offset;
431 r -= offset;
432 g_r -= (b * sc->slice_rct_by_coef + r * sc->slice_rct_ry_coef) >> 2;
433 b += g_r;
434 r += g_r;
435
436 /* Recover green pair: encoder stored gm = gb + (gd >> 1), gd = gr - gb */
437 int gd = g_b - offset;
438 g_b = g_r - (gd >> 1);
439 g_r = g_b + gd;
440 }
441
442 *((uint16_t*)(src + (x*2 + 0)*2 + stride*(y + 0))) = r;
443 *((uint16_t*)(src + (x*2 + 1)*2 + stride*(y + 0))) = g_r;
444 *((uint16_t*)(src + (x*2 + 0)*2 + stride*(y + 1))) = g_b;
445 *((uint16_t*)(src + (x*2 + 1)*2 + stride*(y + 1))) = b;
446 }
447 }
448 return 0;
449}
450
451static int decode_slice(AVCodecContext *c, void *arg)
452{
453 FFV1Context *f = c->priv_data;
454 FFV1SliceContext *sc = arg;
455 int width, height, x, y, ret;
456 const int ps = av_pix_fmt_desc_get(f->pix_fmt)->comp[0].step;
457 AVFrame * const p = f->picture.f;
458 const int si = sc - f->slices;
459 GetBitContext gb;
460 int ac = f->ac || sc->slice_coding_mode == 1;
461
462 if (!(p->flags & AV_FRAME_FLAG_KEY) && f->last_picture.f)
463 ff_progress_frame_await(&f->last_picture, si);
464
465 if (f->slice_damaged[si])
466 slice_set_damaged(f, sc);
467
468 sc->slice_rct_by_coef = 1;
469 sc->slice_rct_ry_coef = 1;
470
471 if (f->version > 2) {
472 if (ff_ffv1_init_slice_state(f, sc) < 0)
473 return AVERROR(ENOMEM);
474 if (decode_slice_header(f, sc, p) < 0) {
475 sc->slice_x = sc->slice_y = sc->slice_height = sc->slice_width = 0;
476 slice_set_damaged(f, sc);
477 return AVERROR_INVALIDDATA;
478 }
479 }
480 if ((ret = ff_ffv1_init_slice_state(f, sc)) < 0)
481 return ret;
482 if ((p->flags & AV_FRAME_FLAG_KEY) || sc->slice_reset_contexts) {
484 } else if (sc->slice_damaged) {
485 return AVERROR_INVALIDDATA;
486 }
487
488 width = sc->slice_width;
489 height = sc->slice_height;
490 x = sc->slice_x;
491 y = sc->slice_y;
492
493 if (sc->remap) {
494 ret = decode_remap(f, sc);
495 if (ret < 0) {
496 slice_set_damaged(f, sc);
497 return ret;
498 }
499 }
500
501 if (ac == AC_GOLOMB_RICE) {
502 if (f->combined_version >= 0x30002)
503 get_rac(&sc->c, (uint8_t[]) { 129 });
504 sc->ac_byte_count = f->version > 2 || (!x && !y) ? sc->c.bytestream - sc->c.bytestream_start - 1 : 0;
505 init_get_bits(&gb,
507 (sc->c.bytestream_end - sc->c.bytestream_start - sc->ac_byte_count) * 8);
508 }
509
511 if (f->colorspace == 0 && (f->chroma_planes || !f->transparency)) {
512 const int chroma_width = AV_CEIL_RSHIFT(width, f->chroma_h_shift);
513 const int chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift);
514 const int cx = x >> f->chroma_h_shift;
515 const int cy = y >> f->chroma_v_shift;
516 decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 0, 1, ac);
517
518 if (f->chroma_planes) {
519 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);
520 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);
521 }
522 if (f->transparency)
523 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,
524 (f->version >= 4 && !f->chroma_planes) ? 1 : 3, 1, ac);
525 } else if (f->colorspace == 0) {
526 decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0] , width, height, p->linesize[0], 0, 0, 2, ac);
527 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);
528 } else if (f->bayer) {
529 decode_bayer_frame(f, sc, &gb, p->data[0] + ps * x + y * p->linesize[0],
530 width, height, p->linesize[0]);
531 } else if (f->use32bit) {
532 uint8_t *planes[4] = { p->data[0] + ps * x + y * p->linesize[0],
533 p->data[1] + ps * x + y * p->linesize[1],
534 p->data[2] + ps * x + y * p->linesize[2] };
535 if (f->transparency)
536 planes[3] = p->data[3] + ps * x + y * p->linesize[3];
537 decode_rgb_frame32(f, sc, &gb, planes, width, height, p->linesize);
538 } else {
539 uint8_t *planes[4] = { p->data[0] + ps * x + y * p->linesize[0] };
540 if (f->avctx->bits_per_raw_sample > 8) {
541 planes[1] = p->data[1] + ps * x + y * p->linesize[1];
542 planes[2] = p->data[2] + ps * x + y * p->linesize[2];
543 if (f->transparency)
544 planes[3] = p->data[3] + ps * x + y * p->linesize[3];
545 }
546 decode_rgb_frame(f, sc, &gb, planes, width, height, p->linesize);
547 }
548 if (ac != AC_GOLOMB_RICE && f->version > 2) {
549 int v;
550 get_rac(&sc->c, (uint8_t[]) { 129 });
551 v = sc->c.bytestream_end - sc->c.bytestream - 2 - 5*!!f->ec;
552 if (v) {
553 av_log(f->avctx, AV_LOG_ERROR, "bytestream end mismatching by %d\n", v);
554 slice_set_damaged(f, sc);
555 }
556 }
557
558 if (sc->slice_damaged && (f->avctx->err_recognition & AV_EF_EXPLODE))
559 return AVERROR_INVALIDDATA;
560
561 if ((c->active_thread_type & FF_THREAD_FRAME) && !f->frame_damaged)
562 ff_progress_frame_report(&f->picture, si);
563
564 return 0;
565}
566
568{
569 enum AVPixelFormat pix_fmts[] = {
570#if CONFIG_FFV1_VULKAN_HWACCEL
572#endif
573 f->pix_fmt,
575 };
576
577 return ff_get_format(f->avctx, pix_fmts);
578}
579
581{
582 uint8_t state[CONTEXT_SIZE];
583 int context_count = -1; //-1 to avoid warning
584 int ret;
585
586 memset(state, 128, sizeof(state));
587
589 if (ret < 0)
590 return ret;
591
592 if (f->bayer && f->combined_version <= 0x40002) {
593 av_log(f->avctx, AV_LOG_ERROR,
594 "Bayer requires aligned slice coordinates (combined_version > 0x40002)\n");
595 return AVERROR_INVALIDDATA;
596 }
597
598 if (f->configured_pix_fmt != f->pix_fmt ||
599 f->configured_width != f->width ||
600 f->configured_height != f->height ||
601 f->configured_ac != f->ac) {
602 f->avctx->pix_fmt = get_pixel_format(f);
603 if (f->avctx->pix_fmt < 0)
604 return AVERROR(EINVAL);
605 f->configured_pix_fmt = f->pix_fmt;
606 f->configured_width = f->width;
607 f->configured_height = f->height;
608 f->configured_ac = f->ac;
609 }
610
611 ff_dlog(f->avctx, "%d %d %d\n",
612 f->chroma_h_shift, f->chroma_v_shift, f->pix_fmt);
613 if (f->version < 2) {
614 context_count = ff_ffv1_read_quant_tables(c, f->quant_tables[0]);
615 if (context_count < 0) {
616 av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
617 return AVERROR_INVALIDDATA;
618 }
619 f->slice_count = f->max_slice_count;
620 } else if (f->version < 3) {
621 f->slice_count = ff_ffv1_get_symbol(c, state, 0);
622 } else {
623 const uint8_t *p = c->bytestream_end;
624 for (f->slice_count = 0;
625 f->slice_count < MAX_SLICES && 3 + 5*!!f->ec < p - c->bytestream_start;
626 f->slice_count++) {
627 int trailer = 3 + 5*!!f->ec;
628 int size = AV_RB24(p-trailer);
629 if (size + trailer > p - c->bytestream_start)
630 break;
631 p -= size + trailer;
632 }
633 }
634 if (f->slice_count > (unsigned)MAX_SLICES || f->slice_count <= 0 || f->slice_count > f->max_slice_count) {
635 av_log(f->avctx, AV_LOG_ERROR, "slice count %d is invalid (max=%d)\n", f->slice_count, f->max_slice_count);
636 return AVERROR_INVALIDDATA;
637 }
638
639 av_refstruct_unref(&f->slice_damaged);
640 f->slice_damaged = av_refstruct_allocz(f->slice_count * sizeof(*f->slice_damaged));
641 if (!f->slice_damaged)
642 return AVERROR(ENOMEM);
643
644 for (int j = 0; j < f->slice_count; j++) {
645 FFV1SliceContext *sc = &f->slices[j];
646
647 if (f->version == 2) {
648 int sx = ff_ffv1_get_symbol(c, state, 0);
649 int sy = ff_ffv1_get_symbol(c, state, 0);
650 int sw = ff_ffv1_get_symbol(c, state, 0) + 1U;
651 int sh = ff_ffv1_get_symbol(c, state, 0) + 1U;
652
653 if (sx < 0 || sy < 0 || sw <= 0 || sh <= 0)
654 return AVERROR_INVALIDDATA;
655 if (sx > f->num_h_slices - sw || sy > f->num_v_slices - sh)
656 return AVERROR_INVALIDDATA;
657
658 sc->slice_x = sx * (int64_t)f->width / f->num_h_slices;
659 sc->slice_y = sy * (int64_t)f->height / f->num_v_slices;
660 sc->slice_width = (sx + sw) * (int64_t)f->width / f->num_h_slices - sc->slice_x;
661 sc->slice_height = (sy + sh) * (int64_t)f->height / f->num_v_slices - sc->slice_y;
662
663 av_assert0((unsigned)sc->slice_width <= f->width &&
664 (unsigned)sc->slice_height <= f->height);
665 av_assert0 ( (unsigned)sc->slice_x + (uint64_t)sc->slice_width <= f->width
666 && (unsigned)sc->slice_y + (uint64_t)sc->slice_height <= f->height);
667 }
668
671 if (!sc->plane)
672 return AVERROR(ENOMEM);
673
674 for (int i = 0; i < f->plane_count; i++) {
675 PlaneContext *const p = &sc->plane[i];
676
677 if (f->version == 2) {
678 int idx = ff_ffv1_get_symbol(c, state, 0);
679 if (idx >= (unsigned)f->quant_table_count) {
680 av_log(f->avctx, AV_LOG_ERROR,
681 "quant_table_index out of range\n");
682 return AVERROR_INVALIDDATA;
683 }
684 p->quant_table_index = idx;
685 context_count = f->context_count[idx];
686 }
687
688 if (f->version <= 2) {
689 av_assert0(context_count >= 0);
690 p->context_count = context_count;
691 }
692 }
693 }
694 return 0;
695}
696
698{
699 FFV1Context *f = avctx->priv_data;
700 int ret;
701
702 f->pix_fmt = AV_PIX_FMT_NONE;
703 f->configured_pix_fmt = AV_PIX_FMT_NONE;
704
705 if ((ret = ff_ffv1_common_init(avctx, f)) < 0)
706 return ret;
707
708 if (avctx->extradata_size > 0 && (ret = ff_ffv1_read_extra_header(f)) < 0)
709 return ret;
710
711 if ((ret = ff_ffv1_init_slice_contexts(f)) < 0)
712 return ret;
713
714 return 0;
715}
716
718 uint8_t *buf, uint8_t *buf_end, int idx,
719 uint8_t **pos, uint32_t *len)
720{
721 FFV1Context *f = avctx->priv_data;
722
723 /* Length field */
724 uint32_t v = buf_end - buf;
725 if (idx || f->version > 2) {
726 /* Three bytes of length, plus flush bit + CRC */
727 uint32_t trailer = 3 + 5*!!f->ec;
728 if (trailer > buf_end - buf)
729 v = INT_MAX;
730 else
731 v = AV_RB24(buf_end - trailer) + trailer;
732 }
733
734 if (buf_end - buf < v) {
735 av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n");
736 ff_progress_frame_report(&f->picture, INT_MAX);
737 return AVERROR_INVALIDDATA;
738 }
739
740 *len = v;
741 if (idx)
742 *pos = buf_end - v;
743 else
744 *pos = buf;
745
746 return 0;
747}
748
750 uint8_t *buf, size_t buf_size)
751{
752 int ret;
753 FFV1Context *f = avctx->priv_data;
754
755 uint8_t keystate = 128;
756 ff_init_range_decoder(c, buf, buf_size);
757 ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
758
759 if (get_rac(c, &keystate)) {
760 f->key_frame = AV_FRAME_FLAG_KEY;
761 f->key_frame_ok = 0;
762 if ((ret = read_header(f, c)) < 0)
763 return ret;
764 f->key_frame_ok = 1;
765 } else {
766 if (!f->key_frame_ok) {
767 av_log(avctx, AV_LOG_ERROR,
768 "Cannot decode non-keyframe without valid keyframe\n");
769 return AVERROR_INVALIDDATA;
770 }
771 f->key_frame = 0;
772 }
773
774 if (f->ac != AC_GOLOMB_RICE) {
775 if (buf_size < avctx->width * avctx->height / (128*8))
776 return AVERROR_INVALIDDATA;
777 } else {
778 int w = avctx->width;
779 int s = 1 + w / (1<<23);
780 int i;
781
782 w /= s;
783
784 for (i = 0; w > (1<<ff_log2_run[i]); i++)
785 w -= ff_log2_run[i];
786 if (buf_size < (avctx->height + i + 6) / 8 * s)
787 return AVERROR_INVALIDDATA;
788 }
789
790 return 0;
791}
792
794 AVPacket *avpkt)
795{
796 FFV1Context *f = avctx->priv_data;
797 AVFrame *p = f->picture.f;
798
799 uint8_t *buf = avpkt->data;
800 size_t buf_size = avpkt->size;
801 uint8_t *buf_end = buf + buf_size;
802
803 for (int i = f->slice_count - 1; i >= 0; i--) {
804 FFV1SliceContext *sc = &f->slices[i];
805
806 uint8_t *pos;
807 uint32_t len;
808 int err = find_next_slice(avctx, buf, buf_end, i,
809 &pos, &len);
810 if (err < 0)
811 return err;
812
813 buf_end -= len;
814
815 sc->slice_damaged = 0;
816
817 if (f->ec) {
818 unsigned crc = av_crc(av_crc_get_table(AV_CRC_32_IEEE), f->crcref, pos, len);
819 if (crc != f->crcref) {
820 int64_t ts = avpkt->pts != AV_NOPTS_VALUE ? avpkt->pts : avpkt->dts;
821 av_log(f->avctx, AV_LOG_ERROR, "slice CRC mismatch %X!", crc);
822 if (ts != AV_NOPTS_VALUE && avctx->pkt_timebase.num) {
823 av_log(f->avctx, AV_LOG_ERROR, "at %f seconds\n", ts*av_q2d(avctx->pkt_timebase));
824 } else if (ts != AV_NOPTS_VALUE) {
825 av_log(f->avctx, AV_LOG_ERROR, "at %"PRId64"\n", ts);
826 } else {
827 av_log(f->avctx, AV_LOG_ERROR, "\n");
828 }
829 slice_set_damaged(f, sc);
830 }
831 if (avctx->debug & FF_DEBUG_PICT_INFO) {
832 av_log(avctx, AV_LOG_DEBUG, "slice %d, CRC: 0x%08"PRIX32"\n", i, AV_RB32(pos + len - 4));
833 }
834 }
835
836 if (i) {
838 ff_build_rac_states(&sc->c, 0.05 * (1LL << 32), 256 - 8);
839 } else {
840 sc->c = c;
841 sc->c.bytestream_end = pos + len;
842 }
843 }
844
845 avctx->execute(avctx,
847 f->slices,
848 NULL,
849 f->slice_count,
850 sizeof(*f->slices));
851
852 for (int i = f->slice_count - 1; i >= 0; i--) {
853 FFV1SliceContext *sc = &f->slices[i];
854 if (sc->slice_damaged && f->last_picture.f) {
855 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(f->pix_fmt);
856 const uint8_t *src[4];
857 uint8_t *dst[4];
858 ff_progress_frame_await(&f->last_picture, INT_MAX);
859 for (int j = 0; j < desc->nb_components; j++) {
860 int pixshift = desc->comp[j].depth > 8;
861 int sh = (j == 1 || j == 2) ? f->chroma_h_shift : 0;
862 int sv = (j == 1 || j == 2) ? f->chroma_v_shift : 0;
863 dst[j] = p->data[j] + p->linesize[j] *
864 (sc->slice_y >> sv) + ((sc->slice_x >> sh) << pixshift);
865 src[j] = f->last_picture.f->data[j] + f->last_picture.f->linesize[j] *
866 (sc->slice_y >> sv) + ((sc->slice_x >> sh) << pixshift);
867
868 }
869
870 av_image_copy(dst, p->linesize, src,
871 f->last_picture.f->linesize,
872 f->pix_fmt,
873 sc->slice_width,
874 sc->slice_height);
875
876 f->slice_damaged[i] = 1;
877 }
878 }
879
880 return 0;
881}
882
883static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
884 int *got_frame, AVPacket *avpkt)
885{
886 FFV1Context *f = avctx->priv_data;
887 int ret;
888 AVFrame *p;
889 const FFHWAccel *hwaccel = NULL;
890
891 /* This is copied onto the first slice's range coder context */
893
894 ff_progress_frame_unref(&f->last_picture);
895 av_refstruct_unref(&f->hwaccel_last_picture_private);
896
897 FFSWAP(ProgressFrame, f->picture, f->last_picture);
898 FFSWAP(void *, f->hwaccel_picture_private, f->hwaccel_last_picture_private);
899
900 f->avctx = avctx;
901 f->frame_damaged = 0;
902
903 ret = decode_header(avctx, &c, avpkt->data, avpkt->size);
904 if (ret < 0)
905 return ret;
906
907 if (avctx->debug & FF_DEBUG_PICT_INFO)
908 av_log(avctx, AV_LOG_DEBUG, "ver:%d keyframe:%d coder:%d ec:%d slices:%d bps:%d\n",
909 f->version, !!f->key_frame, f->ac, f->ec, f->slice_count, f->avctx->bits_per_raw_sample);
910
911 if (avctx->skip_frame >= AVDISCARD_ALL)
912 return avpkt->size;
913
914 if (avctx->hwaccel)
915 hwaccel = ffhwaccel(avctx->hwaccel);
916
917 ret = ff_progress_frame_get_buffer(avctx, &f->picture,
919 if (ret < 0)
920 return ret;
921
922 ret = ff_hwaccel_frame_priv_alloc(avctx, &f->hwaccel_picture_private);
923 if (ret < 0)
924 return ret;
925
926 p = f->picture.f;
927
928 p->pict_type = AV_PICTURE_TYPE_I; //FIXME I vs. P
929 p->flags = (p->flags & ~AV_FRAME_FLAG_KEY) | f->key_frame;
930
931 if (f->version < 3 && avctx->field_order > AV_FIELD_PROGRESSIVE) {
932 /* we have interlaced material flagged in container */
933 p->flags |= AV_FRAME_FLAG_INTERLACED;
934 if (avctx->field_order == AV_FIELD_TT || avctx->field_order == AV_FIELD_TB)
936 }
937
938 /* Start */
939 if (hwaccel) {
940 ret = hwaccel->start_frame(avctx, avpkt->buf, avpkt->data, avpkt->size);
941 if (ret < 0)
942 return ret;
943 }
944
946
947 /* Decode slices */
948 if (hwaccel) {
949 uint8_t *buf_end = avpkt->data + avpkt->size;
950
951 if (!(p->flags & AV_FRAME_FLAG_KEY) && f->last_picture.f)
952 ff_progress_frame_await(&f->last_picture, f->slice_count - 1);
953
954 for (int i = f->slice_count - 1; i >= 0; i--) {
955 uint8_t *pos;
956 uint32_t len;
957 ret = find_next_slice(avctx, avpkt->data, buf_end, i,
958 &pos, &len);
959 if (ret < 0)
960 return ret;
961
962 buf_end -= len;
963
964 ret = hwaccel->decode_slice(avctx, pos, len);
965 if (ret < 0)
966 return ret;
967 }
968 } else {
969 ret = decode_slices(avctx, c, avpkt);
970 if (ret < 0)
971 return ret;
972 }
973
974 /* Finalize */
975 if (hwaccel) {
976 ret = hwaccel->end_frame(avctx);
977 if (ret < 0)
978 return ret;
979 }
980
981 ff_progress_frame_report(&f->picture, INT_MAX);
982
983 ff_progress_frame_unref(&f->last_picture);
984 av_refstruct_unref(&f->hwaccel_last_picture_private);
985 if ((ret = av_frame_ref(rframe, f->picture.f)) < 0)
986 return ret;
987
988 *got_frame = 1;
989
990 return avpkt->size;
991}
992
993#if HAVE_THREADS
994static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
995{
996 FFV1Context *fsrc = src->priv_data;
997 FFV1Context *fdst = dst->priv_data;
998
999 if (dst == src)
1000 return 0;
1001
1002 fdst->version = fsrc->version;
1003 fdst->micro_version = fsrc->micro_version;
1004 fdst->combined_version = fsrc->combined_version;
1005 fdst->chroma_planes = fsrc->chroma_planes;
1006 fdst->chroma_h_shift = fsrc->chroma_h_shift;
1007 fdst->chroma_v_shift = fsrc->chroma_v_shift;
1008 fdst->transparency = fsrc->transparency;
1009 fdst->plane_count = fsrc->plane_count;
1010 fdst->ac = fsrc->ac;
1011 fdst->colorspace = fsrc->colorspace;
1012 fdst->pix_fmt = fsrc->pix_fmt;
1014 fdst->configured_ac = fsrc->configured_ac;
1015 fdst->configured_width = fsrc->configured_width;
1017
1018 fdst->ec = fsrc->ec;
1019 fdst->intra = fsrc->intra;
1020 fdst->key_frame_ok = fsrc->key_frame_ok;
1021
1022 fdst->packed_at_lsb = fsrc->packed_at_lsb;
1023 fdst->slice_count = fsrc->slice_count;
1024 fdst->use32bit = fsrc->use32bit;
1025 memcpy(fdst->state_transition, fsrc->state_transition,
1026 sizeof(fdst->state_transition));
1027
1028 // in version 1 there is a single per-keyframe quant table, so
1029 // we need to propagate it between threads
1030 if (fsrc->version < 2)
1031 memcpy(fdst->quant_tables[0], fsrc->quant_tables[0], sizeof(fsrc->quant_tables[0]));
1032
1033 for (int i = 0; i < fdst->num_h_slices * fdst->num_v_slices; i++) {
1034 FFV1SliceContext *sc = &fdst->slices[i];
1035 const FFV1SliceContext *sc0 = &fsrc->slices[i];
1036
1037 av_refstruct_replace(&sc->plane, sc0->plane);
1038
1039 if (fsrc->version < 3) {
1040 sc->slice_x = sc0->slice_x;
1041 sc->slice_y = sc0->slice_y;
1042 sc->slice_width = sc0->slice_width;
1043 sc->slice_height = sc0->slice_height;
1044 }
1045 }
1046
1048
1050
1054
1055 return 0;
1056}
1057#endif
1058
1060{
1061 FFV1Context *const s = avctx->priv_data;
1062
1063 ff_progress_frame_unref(&s->picture);
1064 av_refstruct_unref(&s->hwaccel_picture_private);
1065
1066 ff_progress_frame_unref(&s->last_picture);
1067 av_refstruct_unref(&s->hwaccel_last_picture_private);
1068
1070
1071 return 0;
1072}
1073
1075 .p.name = "ffv1",
1076 CODEC_LONG_NAME("FFmpeg video codec #1"),
1077 .p.type = AVMEDIA_TYPE_VIDEO,
1078 .p.id = AV_CODEC_ID_FFV1,
1079 .priv_data_size = sizeof(FFV1Context),
1080 .init = decode_init,
1083 UPDATE_THREAD_CONTEXT(update_thread_context),
1084 .p.capabilities = AV_CODEC_CAP_DR1 |
1086 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP |
1089 .hw_configs = (const AVCodecHWConfigInternal *const []) {
1090#if CONFIG_FFV1_VULKAN_HWACCEL
1091 HWACCEL_VULKAN(ffv1),
1092#endif
1093 NULL
1094 },
1095};
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:97
#define RENAME(element)
const FFCodec ff_ffv1_decoder
Definition ffv1dec.c:1074
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition avassert.h:68
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition avassert.h:58
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
Libavcodec external API header.
#define FF_THREAD_FRAME
Decode more than one frame at once.
Definition avcodec.h:1600
#define FF_DEBUG_PICT_INFO
Definition avcodec.h:1399
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define f(width, name)
Definition cbs_vp8.c:236
#define s(width, name)
Definition cbs_vp9.c:198
#define UPDATE_THREAD_CONTEXT(func)
#define FF_CODEC_CAP_USES_PROGRESSFRAMES
The decoder might make use of the ProgressFrame API.
#define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
The decoder extracts and fills its parameters if all frames are skipped due to the skip_frame setting...
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define AV_CEIL_RSHIFT(a, b)
Definition common.h:60
#define av_ceil_log2
Definition common.h:97
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
Public header for CRC hash function implementation.
#define MAX_SLICES
void ff_progress_frame_replace(ProgressFrame *dst, const ProgressFrame *src)
Do nothing if dst and src already refer to the same AVFrame; otherwise unreference dst and if src is ...
Definition decode.c:2006
void ff_progress_frame_await(const ProgressFrame *f, int n)
Wait for earlier decoding threads to finish reference frames.
Definition decode.c:2021
void ff_progress_frame_report(ProgressFrame *f, int n)
Notify later decoding threads when part of their reference frame is ready.
Definition decode.c:2016
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition decode.c:1248
int ff_hwaccel_frame_priv_alloc(AVCodecContext *avctx, void **hwaccel_picture_private)
Allocate a hwaccel frame private data if the provided avctx uses a hwaccel method that needs it.
Definition decode.c:2383
int ff_progress_frame_get_buffer(AVCodecContext *avctx, ProgressFrame *f, int flags)
Wrapper around ff_progress_frame_alloc() and ff_thread_get_buffer().
Definition decode.c:1976
void ff_progress_frame_unref(ProgressFrame *f)
Give up a reference to the underlying frame contained in a ProgressFrame and reset the ProgressFrame,...
Definition decode.c:1999
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition defs.h:51
@ AV_FIELD_TT
Top coded_first, top displayed first.
Definition defs.h:230
@ AV_FIELD_PROGRESSIVE
Definition defs.h:229
@ AV_FIELD_TB
Top coded first, bottom displayed first.
Definition defs.h:232
static AVFrame * frame
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:613
static const uint8_t bits[8]
Definition fastaudio.c:100
static const char * hwaccel
Definition ffplay.c:406
int ret
Definition ffplay.c:391
av_cold int ff_ffv1_init_slice_state(const FFV1Context *f, FFV1SliceContext *sc)
Definition ffv1.c:72
av_cold int ff_ffv1_common_init(AVCodecContext *avctx, FFV1Context *s)
Definition ffv1.c:36
PlaneContext * ff_ffv1_planes_alloc(void)
Definition ffv1.c:66
int ff_slice_coord(const FFV1Context *f, int width, int sx, int num_h_slices, int chroma_shift)
This is intended for both width and height.
Definition ffv1.c:127
av_cold void ff_ffv1_close(FFV1Context *s)
Definition ffv1.c:268
void ff_ffv1_clear_slice_state(const FFV1Context *f, FFV1SliceContext *sc)
Definition ffv1.c:200
void ff_ffv1_compute_bits_per_plane(const FFV1Context *f, FFV1SliceContext *sc, int bits[4], int *offset, int mask[4], int bits_per_raw_sample)
Definition ffv1.c:224
av_cold int ff_ffv1_init_slice_contexts(FFV1Context *f)
Definition ffv1.c:142
int ff_ffv1_get_symbol(RangeCoder *c, uint8_t *state, int is_signed)
Definition ffv1.c:263
FF Video Codec 1 (a lossless codec)
int ff_ffv1_read_extra_header(FFV1Context *f)
Definition ffv1_parse.c:70
#define CONTEXT_SIZE
Definition ffv1.h:45
static void update_vlc_state(VlcState *const state, const int v)
Definition ffv1.h:227
int ff_ffv1_parse_header(FFV1Context *f, RangeCoder *c, uint8_t *state)
Definition ffv1_parse.c:216
#define AC_GOLOMB_RICE
Definition ffv1.h:52
int ff_ffv1_read_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256])
Definition ffv1_parse.c:52
static av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed)
Definition ffv1.h:256
static av_always_inline int fold(int diff, int bits)
Definition ffv1.h:216
static int decode_slice_header(const FFV1Context *f, FFV1SliceContext *sc, AVFrame *frame)
Definition ffv1dec.c:178
static int decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame, AVPacket *avpkt)
Definition ffv1dec.c:883
static int get_vlc_symbol(GetBitContext *gb, VlcState *const state, int bits)
Definition ffv1dec.c:48
static av_cold int ffv1_decode_close(AVCodecContext *avctx)
Definition ffv1dec.c:1059
static int is_input_end(RangeCoder *c, GetBitContext *gb, int ac)
Definition ffv1dec.c:80
static int decode_slices(AVCodecContext *avctx, RangeCoder c, AVPacket *avpkt)
Definition ffv1dec.c:793
#define TYPE
Definition ffv1dec.c:92
static int decode_plane(FFV1Context *f, FFV1SliceContext *sc, GetBitContext *gb, uint8_t *src, int w, int h, int stride, int plane_index, int remap_index, int pixel_stride, int ac)
Definition ffv1dec.c:102
static av_cold int decode_init(AVCodecContext *avctx)
Definition ffv1dec.c:697
static int decode_slice(AVCodecContext *c, void *arg)
Definition ffv1dec.c:451
static void slice_set_damaged(FFV1Context *f, FFV1SliceContext *sc)
Definition ffv1dec.c:281
static int decode_remap(FFV1Context *f, FFV1SliceContext *sc)
Definition ffv1dec.c:302
#define RENAME(name)
Definition ffv1dec.c:93
static int decode_header(AVCodecContext *avctx, RangeCoder *c, uint8_t *buf, size_t buf_size)
Definition ffv1dec.c:749
static int find_next_slice(AVCodecContext *avctx, uint8_t *buf, uint8_t *buf_end, int idx, uint8_t **pos, uint32_t *len)
Definition ffv1dec.c:717
static int decode_bayer_frame(FFV1Context *f, FFV1SliceContext *sc, GetBitContext *gb, uint8_t *src, int w, int h, int stride)
Definition ffv1dec.c:381
static enum AVPixelFormat get_pixel_format(FFV1Context *f)
Definition ffv1dec.c:567
static int decode_current_mul(RangeCoder *rc, uint8_t state[32], int *mul, int mul_count, int64_t i)
Definition ffv1dec.c:291
static int read_header(FFV1Context *f, RangeCoder *c)
Definition ffv1dec.c:580
#define sample
bitstream reader API header.
static int get_bits_left(GetBitContext *gb)
Definition get_bits.h:688
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition get_bits.h:517
exp golomb vlc stuff
static int get_sr_golomb(GetBitContext *gb, int k, int limit, int esc_len)
read signed golomb rice code (ffv1).
Definition golomb.h:532
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
Definition avcodec.h:415
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition codec.h:102
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition codec.h:98
@ AV_CODEC_ID_FFV1
Definition codec_id.h:83
@ AVDISCARD_ALL
discard all
Definition defs.h:248
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition crc.c:389
uint32_t av_crc(const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length)
Calculate the CRC of a block.
Definition crc.c:421
@ AV_CRC_32_IEEE
Definition crc.h:52
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition frame.h:702
#define AV_FRAME_FLAG_TOP_FIELD_FIRST
A flag to mark frames where the top field is displayed first if the content is interlaced.
Definition frame.h:707
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition frame.h:694
int av_frame_ref(AVFrame *dst, const AVFrame *src)
Set up a new reference to the data described by the source frame.
Definition frame.c:281
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition rational.h:104
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
Definition mem.c:661
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
void av_image_copy(uint8_t *const dst_data[4], const int dst_linesizes[4], const uint8_t *const src_data[4], const int src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height)
Copy image in src_data to dst_data.
Definition imgutils.c:422
int av_image_check_sar(unsigned int w, unsigned int h, AVRational sar)
Check if the given sample aspect ratio of an image is valid.
Definition imgutils.c:323
@ AV_PICTURE_TYPE_I
Intra.
Definition avutil.h:278
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition avutil.h:247
static const FFHWAccel * ffhwaccel(const AVHWAccel *codec)
#define HWACCEL_VULKAN(codec)
Definition hwconfig.h:78
misc image utilities
#define r
Definition input.c:42
#define b
Definition input.c:43
#define AV_RB32(p)
#define AV_RB24(x)
#define MAX_OVERREAD
Definition lagarithrac.h:49
unsigned offset
Definition libaomenc.c:763
static av_cold int decode_init(AVCodecContext *avctx)
Definition 4xm.c:998
static int decode_frame(AVCodecContext *avctx, AVFrame *picture, int *got_frame, AVPacket *avpkt)
Definition 4xm.c:837
av_cold void CBS_FUNC close(CodedBitstreamContext **ctx_ptr)
Close a context and free all internal state.
Definition cbs.c:118
const char * arg
Definition jacosubdec.c:66
static void flip(AVCodecContext *avctx, AVFrame *frame)
Definition rawdec.c:131
Multithreading API for decoders.
#define av_cold
Definition attributes.h:117
static enum AVPixelFormat pix_fmts[]
Definition libkvazaar.c:296
const char * desc
Definition libsvtav1.c:83
static const struct @257111027162314367033347246032313251342043035002 planes[]
uint8_t w
Definition llvidencdsp.c:39
static const uint16_t mask[17]
Definition lzw.c:38
#define FFSWAP(type, a, b)
Definition macros.h:52
#define FFMIN(a, b)
Definition macros.h:49
const uint8_t ff_log2_run[41]
Definition mathtables.c:155
Memory handling functions.
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition pixdesc.c:3484
AVPixelFormat
Pixel format.
Definition pixfmt.h:71
@ AV_PIX_FMT_NONE
Definition pixfmt.h:72
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition pixfmt.h:379
void ff_thread_finish_setup(AVCodecContext *avctx)
If the codec defines update_thread_context(), call this when they are ready for the next thread to st...
av_cold void ff_init_range_decoder(RangeCoder *c, const uint8_t *buf, int buf_size)
Definition rangecoder.c:53
void ff_build_rac_states(RangeCoder *c, int factor, int max_p)
Definition rangecoder.c:68
Range coder.
static int get_rac(RangeCoder *c, uint8_t *const state)
Definition rangecoder.h:118
void av_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition refstruct.c:121
void av_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
Definition refstruct.c:161
static void * av_refstruct_allocz(size_t size)
Equivalent to av_refstruct_alloc_ext(size, 0, NULL, NULL)
Definition refstruct.h:105
unsigned int pos
Definition spdifenc.c:431
main external API structure.
Definition avcodec.h:443
int width
picture width / height.
Definition avcodec.h:605
int debug
debug
Definition avcodec.h:1398
AVRational pkt_timebase
Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed.
Definition avcodec.h:554
enum AVFieldOrder field_order
Field order.
Definition avcodec.h:698
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
Definition avcodec.h:1429
int(* execute)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size)
The codec may call this to execute several independent things.
Definition avcodec.h:1619
int extradata_size
Definition avcodec.h:527
void * priv_data
Definition avcodec.h:470
enum AVDiscard skip_frame
Skip decoding for selected frames.
Definition avcodec.h:1677
int step
Number of elements between 2 horizontally consecutive pixels.
Definition pixdesc.h:40
This structure describes decoded (raw) audio or video data.
Definition frame.h:479
This structure stores compressed data.
Definition packet.h:587
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition packet.h:593
int size
Definition packet.h:611
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition packet.h:603
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition packet.h:609
uint8_t * data
Definition packet.h:610
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition pixdesc.h:69
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition pixdesc.h:105
Rational number (pair of numerator and denominator).
Definition rational.h:58
int num
Numerator.
Definition rational.h:59
int configured_height
Definition ffv1.h:142
int ac
1=range coder <-> 0=golomb rice
Definition ffv1.h:147
int colorspace
Definition ffv1.h:152
int version
Definition ffv1.h:127
int transparency
Definition ffv1.h:133
int num_v_slices
Definition ffv1.h:176
ProgressFrame picture
Definition ffv1.h:137
int configured_width
Definition ffv1.h:142
uint8_t * slice_damaged
Definition ffv1.h:187
int max_slice_count
Definition ffv1.h:175
int chroma_planes
Definition ffv1.h:131
int num_h_slices
Definition ffv1.h:177
int plane_count
Definition ffv1.h:146
int slice_count
Definition ffv1.h:174
enum AVPixelFormat configured_pix_fmt
Definition ffv1.h:141
int micro_version
Definition ffv1.h:128
int use32bit
Definition ffv1.h:160
void * hwaccel_picture_private
Definition ffv1.h:138
int chroma_h_shift
Definition ffv1.h:132
int key_frame_ok
Definition ffv1.h:164
int configured_ac
Definition ffv1.h:143
int packed_at_lsb
Definition ffv1.h:169
FFV1SliceContext * slices
Definition ffv1.h:179
int chroma_v_shift
Definition ffv1.h:132
int combined_version
Definition ffv1.h:129
int ec
Definition ffv1.h:162
uint8_t state_transition[256]
Definition ffv1.h:150
int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE]
Definition ffv1.h:148
enum AVPixelFormat pix_fmt
Definition ffv1.h:140
int intra
Definition ffv1.h:163
int slice_rct_ry_coef
Definition ffv1.h:86
int slice_damaged
Definition ffv1.h:100
int16_t * sample_buffer
Definition ffv1.h:74
unsigned int fltmap32_size[4]
Definition ffv1.h:115
int ac_byte_count
number of bytes used for AC coding
Definition ffv1.h:94
RangeCoder c
Definition ffv1.h:92
int slice_reset_contexts
Definition ffv1.h:99
uint32_t * fltmap32[4]
Definition ffv1.h:113
PlaneContext * plane
Definition ffv1.h:90
uint16_t * fltmap[4]
Definition ffv1.h:112
unsigned int fltmap_size[4]
Definition ffv1.h:114
int run_index
Definition ffv1.h:83
int remap_count[4]
Definition ffv1.h:109
int slice_height
Definition ffv1.h:78
int slice_width
Definition ffv1.h:77
int slice_coding_mode
Definition ffv1.h:84
int slice_rct_by_coef
Definition ffv1.h:85
The ProgressFrame structure.
uint8_t * bytestream_start
Definition rangecoder.h:42
uint8_t * bytestream
Definition rangecoder.h:43
uint8_t * bytestream_end
Definition rangecoder.h:44
uint8_t run
Definition svq3.c:207
#define stride
#define ff_dlog(a,...)
#define av_freep(p)
#define av_log(a,...)
#define src
Definition vp8dsp.c:248
#define height
Definition dsp.h:99
#define width
Definition dsp.h:99
static struct @232240247175332074307271266321204261331170211232 state
int size
else temp
Definition vf_mcdeint.c:275
float delta
int len
static double c[64]