FFmpeg
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 
48 static 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 
60  v = get_sr_golomb(gb, k, 12, bits);
61  ff_dlog(NULL, "v:%d bias:%d error:%d drift:%d count:%d k:%d",
62  v, state->bias, state->error_sum, state->drift, state->count, k);
63 
64  v ^= ((2 * state->drift + state->count) >> 31);
65 
66  ret = fold(v + state->bias, bits);
67 
69 
70  return ret;
71 }
72 
73 static int is_input_end(RangeCoder *c, GetBitContext *gb, int ac)
74 {
75  if (ac != AC_GOLOMB_RICE) {
76  if (c->overread > MAX_OVERREAD)
77  return AVERROR_INVALIDDATA;
78  } else {
79  if (get_bits_left(gb) < 1)
80  return AVERROR_INVALIDDATA;
81  }
82  return 0;
83 }
84 
85 #define TYPE int16_t
86 #define RENAME(name) name
87 #include "ffv1dec_template.c"
88 #undef TYPE
89 #undef RENAME
90 
91 #define TYPE int32_t
92 #define RENAME(name) name ## 32
93 #include "ffv1dec_template.c"
94 
96  GetBitContext *gb,
97  uint8_t *src, int w, int h, int stride, int plane_index,
98  int remap_index, int pixel_stride, int ac)
99 {
100  int x, y;
101  int16_t *sample[2];
102  int bits;
103  unsigned mask;
104 
105  if (sc->remap) {
106  bits = av_ceil_log2(sc->remap_count[remap_index]);
107  mask = (1<<bits)-1;
108  } else {
109  bits = f->avctx->bits_per_raw_sample;
110  }
111 
112  sample[0] = sc->sample_buffer + 3;
113  sample[1] = sc->sample_buffer + w + 6 + 3;
114 
115  sc->run_index = 0;
116 
117  memset(sc->sample_buffer, 0, 2 * (w + 6) * sizeof(*sc->sample_buffer));
118 
119  for (y = 0; y < h; y++) {
120  int16_t *temp = sample[0]; // FIXME: try a normal buffer
121 
122  sample[0] = sample[1];
123  sample[1] = temp;
124 
125  sample[1][-1] = sample[0][0];
126  sample[0][w] = sample[0][w - 1];
127 
128  if (f->avctx->bits_per_raw_sample <= 8) {
129  int ret = decode_line(f, sc, gb, w, sample, plane_index, 8, ac);
130  if (ret < 0)
131  return ret;
132  if (sc->remap)
133  for (x = 0; x < w; x++)
134  sample[1][x] = sc->fltmap[remap_index][sample[1][x]];
135  for (x = 0; x < w; x++)
136  src[x*pixel_stride + stride * y] = sample[1][x];
137  } else {
138  int ret = decode_line(f, sc, gb, w, sample, plane_index, bits, ac);
139  if (ret < 0)
140  return ret;
141 
142  if (sc->remap) {
143  if (f->packed_at_lsb || f->avctx->bits_per_raw_sample == 16) {
144  for (x = 0; x < w; x++) {
145  ((uint16_t*)(src + stride*y))[x*pixel_stride] = sc->fltmap[remap_index][sample[1][x] & mask];
146  }
147  } else {
148  for (x = 0; x < w; x++) {
149  int v = sc->fltmap[remap_index][sample[1][x] & mask];
150  ((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);
151  }
152  }
153  } else {
154  if (f->packed_at_lsb || f->avctx->bits_per_raw_sample == 16) {
155  for (x = 0; x < w; x++) {
156  ((uint16_t*)(src + stride*y))[x*pixel_stride] = sample[1][x];
157  }
158  } else {
159  for (x = 0; x < w; x++) {
160  ((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);
161  }
162  }
163  }
164  }
165  }
166  return 0;
167 }
168 
171 {
172  RangeCoder *c = &sc->c;
173  uint8_t state[CONTEXT_SIZE];
174  unsigned ps, context_count;
175  int sx, sy, sw, sh;
176 
177  memset(state, 128, sizeof(state));
178  sx = ff_ffv1_get_symbol(c, state, 0);
179  sy = ff_ffv1_get_symbol(c, state, 0);
180  sw = ff_ffv1_get_symbol(c, state, 0) + 1U;
181  sh = ff_ffv1_get_symbol(c, state, 0) + 1U;
182 
183  av_assert0(f->version > 2);
184 
185 
186  if (sx < 0 || sy < 0 || sw <= 0 || sh <= 0)
187  return AVERROR_INVALIDDATA;
188  if (sx > f->num_h_slices - sw || sy > f->num_v_slices - sh)
189  return AVERROR_INVALIDDATA;
190 
191  sc->slice_x = ff_slice_coord(f, f->width , sx , f->num_h_slices, f->chroma_h_shift);
192  sc->slice_y = ff_slice_coord(f, f->height, sy , f->num_v_slices, f->chroma_v_shift);
193  sc->slice_width = ff_slice_coord(f, f->width , sx + sw, f->num_h_slices, f->chroma_h_shift) - sc->slice_x;
194  sc->slice_height = ff_slice_coord(f, f->height, sy + sh, f->num_v_slices, f->chroma_v_shift) - sc->slice_y;
195 
196  av_assert0((unsigned)sc->slice_width <= f->width &&
197  (unsigned)sc->slice_height <= f->height);
198  av_assert0 ( (unsigned)sc->slice_x + (uint64_t)sc->slice_width <= f->width
199  && (unsigned)sc->slice_y + (uint64_t)sc->slice_height <= f->height);
200 
201  if (f->ac == AC_GOLOMB_RICE && sc->slice_width >= (1<<23))
202  return AVERROR_INVALIDDATA;
203 
204  for (unsigned i = 0; i < f->plane_count; i++) {
205  PlaneContext * const p = &sc->plane[i];
206  int idx = ff_ffv1_get_symbol(c, state, 0);
207  if (idx >= (unsigned)f->quant_table_count) {
208  av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n");
209  return -1;
210  }
211  p->quant_table_index = idx;
212  context_count = f->context_count[idx];
213 
214  if (p->context_count < context_count) {
215  av_freep(&p->state);
216  av_freep(&p->vlc_state);
217  }
218  p->context_count = context_count;
219  }
220 
221  ps = ff_ffv1_get_symbol(c, state, 0);
222  if (ps == 1) {
225  } else if (ps == 2) {
228  } else if (ps == 3) {
229  frame->flags &= ~AV_FRAME_FLAG_INTERLACED;
230  }
231  frame->sample_aspect_ratio.num = ff_ffv1_get_symbol(c, state, 0);
232  frame->sample_aspect_ratio.den = ff_ffv1_get_symbol(c, state, 0);
233 
234  if (av_image_check_sar(f->width, f->height,
235  frame->sample_aspect_ratio) < 0) {
236  av_log(f->avctx, AV_LOG_WARNING, "ignoring invalid SAR: %u/%u\n",
237  frame->sample_aspect_ratio.num,
238  frame->sample_aspect_ratio.den);
239  frame->sample_aspect_ratio = (AVRational){ 0, 1 };
240  }
241 
242  if (f->version > 3) {
245  if (sc->slice_coding_mode != 1 && f->colorspace == 1) {
248  if ((uint64_t)sc->slice_rct_by_coef + (uint64_t)sc->slice_rct_ry_coef > 4) {
249  av_log(f->avctx, AV_LOG_ERROR, "slice_rct_y_coef out of range\n");
250  return AVERROR_INVALIDDATA;
251  }
252  }
253  if (f->combined_version >= 0x40004) {
254  sc->remap = ff_ffv1_get_symbol(c, state, 0);
255  if (sc->remap > 2U ||
256  sc->remap && !f->flt) {
257  av_log(f->avctx, AV_LOG_ERROR, "unsupported remap %d\n", sc->remap);
258  return AVERROR_INVALIDDATA;
259  }
260  }
261  }
262  if (f->avctx->bits_per_raw_sample == 32) {
263  if (!sc->remap) {
264  av_log(f->avctx, AV_LOG_ERROR, "unsupported remap\n");
265  return AVERROR_INVALIDDATA;
266  }
267  }
268 
269  return 0;
270 }
271 
273 {
274  sc->slice_damaged = 1;
275 
276  // only set this for frame threading, as for slice threading its value is
277  // not used and setting it would be a race
278  if (f->avctx->active_thread_type & FF_THREAD_FRAME)
279  f->frame_damaged = 1;
280 }
281 
282 static int decode_current_mul(RangeCoder *rc, uint8_t state[32], int *mul, int mul_count, int64_t i)
283 {
284  int ndx = (i * mul_count) >> 32;
285  av_assert2(ndx <= 4096U);
286 
287  if (mul[ndx] < 0)
288  mul[ndx] = ff_ffv1_get_symbol(rc, state, 0) & 0x3FFFFFFF;
289 
290  return mul[ndx];
291 }
292 
294 {
295  unsigned int end = (1LL<<f->avctx->bits_per_raw_sample) - 1;
296  int flip = sc->remap == 2 ? (end>>1) : 0;
297  const int pixel_num = sc->slice_width * sc->slice_height;
298 
299  for (int p= 0; p < 1 + 2*f->chroma_planes + f->transparency; p++) {
300  int j = 0;
301  int lu = 0;
302  uint8_t state[2][3][32];
303  int64_t i;
304  int mul[4096+1];
305  int mul_count;
306 
307  memset(state, 128, sizeof(state));
308  mul_count = ff_ffv1_get_symbol(&sc->c, state[0][0], 0);
309 
310  if (mul_count > 4096U)
311  return AVERROR_INVALIDDATA;
312  for (int i = 0; i<mul_count; i++) {
313  mul[i] = -1;
314 
315  }
316  mul[mul_count] = 1;
317 
318  memset(state, 128, sizeof(state));
319  int current_mul = 1;
320  for (i=0; i <= end ;) {
321  unsigned run = get_symbol_inline(&sc->c, state[lu][0], 0);
322  unsigned run0 = lu ? 0 : run;
323  unsigned run1 = lu ? run : 1;
324 
325  i += run0 * current_mul;
326 
327  while (run1--) {
328  if (current_mul > 1) {
329  int delta = get_symbol_inline(&sc->c, state[lu][1], 1);
330  if (delta <= -current_mul || delta > current_mul/2)
331  return AVERROR_INVALIDDATA; //not sure we should check this
332  i += current_mul - 1 + delta;
333  }
334  if (i - 1 >= end)
335  break;
336  if (j >= pixel_num)
337  return AVERROR_INVALIDDATA;
338  if (end <= 0xFFFF) {
339  sc->fltmap [p][j++] = i ^ ((i& 0x8000) ? 0 : flip);
340  } else
341  sc->fltmap32[p][j++] = i ^ ((i&0x80000000) ? 0 : flip);
342  i++;
343  current_mul = decode_current_mul(&sc->c, state[0][2], mul, mul_count, i);
344  }
345  if (lu) {
346  i += current_mul;
347  }
348  lu ^= !run;
349  }
350  sc->remap_count[p] = j;
351  }
352  return 0;
353 }
354 
355 static int decode_slice(AVCodecContext *c, void *arg)
356 {
357  FFV1Context *f = c->priv_data;
358  FFV1SliceContext *sc = arg;
359  int width, height, x, y, ret;
360  const int ps = av_pix_fmt_desc_get(f->pix_fmt)->comp[0].step;
361  AVFrame * const p = f->picture.f;
362  const int si = sc - f->slices;
363  GetBitContext gb;
364  int ac = f->ac || sc->slice_coding_mode == 1;
365 
366  if (!(p->flags & AV_FRAME_FLAG_KEY) && f->last_picture.f)
367  ff_progress_frame_await(&f->last_picture, si);
368 
369  if (f->slice_damaged[si])
370  slice_set_damaged(f, sc);
371 
372  sc->slice_rct_by_coef = 1;
373  sc->slice_rct_ry_coef = 1;
374 
375  if (f->version > 2) {
376  if (ff_ffv1_init_slice_state(f, sc) < 0)
377  return AVERROR(ENOMEM);
378  if (decode_slice_header(f, sc, p) < 0) {
379  sc->slice_x = sc->slice_y = sc->slice_height = sc->slice_width = 0;
380  slice_set_damaged(f, sc);
381  return AVERROR_INVALIDDATA;
382  }
383  }
384  if ((ret = ff_ffv1_init_slice_state(f, sc)) < 0)
385  return ret;
386  if ((p->flags & AV_FRAME_FLAG_KEY) || sc->slice_reset_contexts) {
388  } else if (sc->slice_damaged) {
389  return AVERROR_INVALIDDATA;
390  }
391 
392  width = sc->slice_width;
393  height = sc->slice_height;
394  x = sc->slice_x;
395  y = sc->slice_y;
396 
397  if (sc->remap) {
398  const int pixel_num = sc->slice_width * sc->slice_height;
399 
400  for(int p = 0; p < 1 + 2*f->chroma_planes + f->transparency ; p++) {
401  if (f->avctx->bits_per_raw_sample == 32) {
402  av_fast_malloc(&sc->fltmap32[p], &sc->fltmap32_size[p], pixel_num * sizeof(*sc->fltmap32[p]));
403  if (!sc->fltmap32[p])
404  return AVERROR(ENOMEM);
405  } else {
406  av_fast_malloc(&sc->fltmap[p], &sc->fltmap_size[p], pixel_num * sizeof(*sc->fltmap[p]));
407  if (!sc->fltmap[p])
408  return AVERROR(ENOMEM);
409  }
410  }
411 
412  ret = decode_remap(f, sc);
413  if (ret < 0)
414  return ret;
415  }
416 
417  if (ac == AC_GOLOMB_RICE) {
418  if (f->combined_version >= 0x30002)
419  get_rac(&sc->c, (uint8_t[]) { 129 });
420  sc->ac_byte_count = f->version > 2 || (!x && !y) ? sc->c.bytestream - sc->c.bytestream_start - 1 : 0;
421  init_get_bits(&gb,
422  sc->c.bytestream_start + sc->ac_byte_count,
423  (sc->c.bytestream_end - sc->c.bytestream_start - sc->ac_byte_count) * 8);
424  }
425 
426  av_assert1(width && height);
427  if (f->colorspace == 0 && (f->chroma_planes || !f->transparency)) {
428  const int chroma_width = AV_CEIL_RSHIFT(width, f->chroma_h_shift);
429  const int chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift);
430  const int cx = x >> f->chroma_h_shift;
431  const int cy = y >> f->chroma_v_shift;
432  decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 0, 1, ac);
433 
434  if (f->chroma_planes) {
435  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);
436  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);
437  }
438  if (f->transparency)
439  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,
440  (f->version >= 4 && !f->chroma_planes) ? 1 : 3, 1, ac);
441  } else if (f->colorspace == 0) {
442  decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0] , width, height, p->linesize[0], 0, 0, 2, ac);
443  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);
444  } else if (f->use32bit) {
445  uint8_t *planes[4] = { p->data[0] + ps * x + y * p->linesize[0],
446  p->data[1] + ps * x + y * p->linesize[1],
447  p->data[2] + ps * x + y * p->linesize[2],
448  p->data[3] + ps * x + y * p->linesize[3] };
449  decode_rgb_frame32(f, sc, &gb, planes, width, height, p->linesize);
450  } else {
451  uint8_t *planes[4] = { p->data[0] + ps * x + y * p->linesize[0],
452  p->data[1] + ps * x + y * p->linesize[1],
453  p->data[2] + ps * x + y * p->linesize[2],
454  p->data[3] + ps * x + y * p->linesize[3] };
455  decode_rgb_frame(f, sc, &gb, planes, width, height, p->linesize);
456  }
457  if (ac != AC_GOLOMB_RICE && f->version > 2) {
458  int v;
459  get_rac(&sc->c, (uint8_t[]) { 129 });
460  v = sc->c.bytestream_end - sc->c.bytestream - 2 - 5*!!f->ec;
461  if (v) {
462  av_log(f->avctx, AV_LOG_ERROR, "bytestream end mismatching by %d\n", v);
463  slice_set_damaged(f, sc);
464  }
465  }
466 
467  if (sc->slice_damaged && (f->avctx->err_recognition & AV_EF_EXPLODE))
468  return AVERROR_INVALIDDATA;
469 
470  if ((c->active_thread_type & FF_THREAD_FRAME) && !f->frame_damaged)
471  ff_progress_frame_report(&f->picture, si);
472 
473  return 0;
474 }
475 
477 {
478  enum AVPixelFormat pix_fmts[] = {
479 #if CONFIG_FFV1_VULKAN_HWACCEL
481 #endif
482  f->pix_fmt,
484  };
485 
486  return ff_get_format(f->avctx, pix_fmts);
487 }
488 
490 {
491  uint8_t state[CONTEXT_SIZE];
492  int context_count = -1; //-1 to avoid warning
493  int ret;
494 
495  memset(state, 128, sizeof(state));
496 
498  if (ret < 0)
499  return ret;
500 
501  if (f->configured_pix_fmt != f->pix_fmt) {
502  f->avctx->pix_fmt = get_pixel_format(f);
503  if (f->avctx->pix_fmt < 0)
504  return AVERROR(EINVAL);
505  f->configured_pix_fmt = f->pix_fmt;
506  }
507 
508  ff_dlog(f->avctx, "%d %d %d\n",
509  f->chroma_h_shift, f->chroma_v_shift, f->pix_fmt);
510  if (f->version < 2) {
511  context_count = ff_ffv1_read_quant_tables(c, f->quant_tables[0]);
512  if (context_count < 0) {
513  av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
514  return AVERROR_INVALIDDATA;
515  }
516  f->slice_count = f->max_slice_count;
517  } else if (f->version < 3) {
518  f->slice_count = ff_ffv1_get_symbol(c, state, 0);
519  } else {
520  const uint8_t *p = c->bytestream_end;
521  for (f->slice_count = 0;
522  f->slice_count < MAX_SLICES && 3 + 5*!!f->ec < p - c->bytestream_start;
523  f->slice_count++) {
524  int trailer = 3 + 5*!!f->ec;
525  int size = AV_RB24(p-trailer);
526  if (size + trailer > p - c->bytestream_start)
527  break;
528  p -= size + trailer;
529  }
530  }
531  if (f->slice_count > (unsigned)MAX_SLICES || f->slice_count <= 0 || f->slice_count > f->max_slice_count) {
532  av_log(f->avctx, AV_LOG_ERROR, "slice count %d is invalid (max=%d)\n", f->slice_count, f->max_slice_count);
533  return AVERROR_INVALIDDATA;
534  }
535 
536  av_refstruct_unref(&f->slice_damaged);
537  f->slice_damaged = av_refstruct_allocz(f->slice_count * sizeof(*f->slice_damaged));
538  if (!f->slice_damaged)
539  return AVERROR(ENOMEM);
540 
541  for (int j = 0; j < f->slice_count; j++) {
542  FFV1SliceContext *sc = &f->slices[j];
543 
544  if (f->version == 2) {
545  int sx = ff_ffv1_get_symbol(c, state, 0);
546  int sy = ff_ffv1_get_symbol(c, state, 0);
547  int sw = ff_ffv1_get_symbol(c, state, 0) + 1U;
548  int sh = ff_ffv1_get_symbol(c, state, 0) + 1U;
549 
550  if (sx < 0 || sy < 0 || sw <= 0 || sh <= 0)
551  return AVERROR_INVALIDDATA;
552  if (sx > f->num_h_slices - sw || sy > f->num_v_slices - sh)
553  return AVERROR_INVALIDDATA;
554 
555  sc->slice_x = sx * (int64_t)f->width / f->num_h_slices;
556  sc->slice_y = sy * (int64_t)f->height / f->num_v_slices;
557  sc->slice_width = (sx + sw) * (int64_t)f->width / f->num_h_slices - sc->slice_x;
558  sc->slice_height = (sy + sh) * (int64_t)f->height / f->num_v_slices - sc->slice_y;
559 
560  av_assert0((unsigned)sc->slice_width <= f->width &&
561  (unsigned)sc->slice_height <= f->height);
562  av_assert0 ( (unsigned)sc->slice_x + (uint64_t)sc->slice_width <= f->width
563  && (unsigned)sc->slice_y + (uint64_t)sc->slice_height <= f->height);
564  }
565 
567  sc->plane = ff_ffv1_planes_alloc();
568  if (!sc->plane)
569  return AVERROR(ENOMEM);
570 
571  for (int i = 0; i < f->plane_count; i++) {
572  PlaneContext *const p = &sc->plane[i];
573 
574  if (f->version == 2) {
575  int idx = ff_ffv1_get_symbol(c, state, 0);
576  if (idx >= (unsigned)f->quant_table_count) {
577  av_log(f->avctx, AV_LOG_ERROR,
578  "quant_table_index out of range\n");
579  return AVERROR_INVALIDDATA;
580  }
581  p->quant_table_index = idx;
582  context_count = f->context_count[idx];
583  }
584 
585  if (f->version <= 2) {
586  av_assert0(context_count >= 0);
587  p->context_count = context_count;
588  }
589  }
590  }
591  return 0;
592 }
593 
595 {
596  FFV1Context *f = avctx->priv_data;
597  int ret;
598 
599  f->pix_fmt = AV_PIX_FMT_NONE;
600  f->configured_pix_fmt = AV_PIX_FMT_NONE;
601 
602  if ((ret = ff_ffv1_common_init(avctx, f)) < 0)
603  return ret;
604 
605  if (avctx->extradata_size > 0 && (ret = ff_ffv1_read_extra_header(f)) < 0)
606  return ret;
607 
608  if ((ret = ff_ffv1_init_slice_contexts(f)) < 0)
609  return ret;
610 
611  return 0;
612 }
613 
614 static int find_next_slice(AVCodecContext *avctx,
615  uint8_t *buf, uint8_t *buf_end, int idx,
616  uint8_t **pos, uint32_t *len)
617 {
618  FFV1Context *f = avctx->priv_data;
619 
620  /* Length field */
621  uint32_t v = buf_end - buf;
622  if (idx || f->version > 2) {
623  /* Three bytes of length, plus flush bit + CRC */
624  uint32_t trailer = 3 + 5*!!f->ec;
625  if (trailer > buf_end - buf)
626  v = INT_MAX;
627  else
628  v = AV_RB24(buf_end - trailer) + trailer;
629  }
630 
631  if (buf_end - buf < v) {
632  av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n");
633  ff_progress_frame_report(&f->picture, INT_MAX);
634  return AVERROR_INVALIDDATA;
635  }
636 
637  *len = v;
638  if (idx)
639  *pos = buf_end - v;
640  else
641  *pos = buf;
642 
643  return 0;
644 }
645 
647  uint8_t *buf, size_t buf_size)
648 {
649  int ret;
650  FFV1Context *f = avctx->priv_data;
651 
652  uint8_t keystate = 128;
653  ff_init_range_decoder(c, buf, buf_size);
654  ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
655 
656  if (get_rac(c, &keystate)) {
657  f->key_frame = AV_FRAME_FLAG_KEY;
658  f->key_frame_ok = 0;
659  if ((ret = read_header(f, c)) < 0)
660  return ret;
661  f->key_frame_ok = 1;
662  } else {
663  if (!f->key_frame_ok) {
664  av_log(avctx, AV_LOG_ERROR,
665  "Cannot decode non-keyframe without valid keyframe\n");
666  return AVERROR_INVALIDDATA;
667  }
668  f->key_frame = 0;
669  }
670 
671  if (f->ac != AC_GOLOMB_RICE) {
672  if (buf_size < avctx->width * avctx->height / (128*8))
673  return AVERROR_INVALIDDATA;
674  } else {
675  int w = avctx->width;
676  int s = 1 + w / (1<<23);
677  int i;
678 
679  w /= s;
680 
681  for (i = 0; w > (1<<ff_log2_run[i]); i++)
682  w -= ff_log2_run[i];
683  if (buf_size < (avctx->height + i + 6) / 8 * s)
684  return AVERROR_INVALIDDATA;
685  }
686 
687  return 0;
688 }
689 
691  AVPacket *avpkt)
692 {
693  FFV1Context *f = avctx->priv_data;
694  AVFrame *p = f->picture.f;
695 
696  uint8_t *buf = avpkt->data;
697  size_t buf_size = avpkt->size;
698  uint8_t *buf_end = buf + buf_size;
699 
700  for (int i = f->slice_count - 1; i >= 0; i--) {
701  FFV1SliceContext *sc = &f->slices[i];
702 
703  uint8_t *pos;
704  uint32_t len;
705  int err = find_next_slice(avctx, buf, buf_end, i,
706  &pos, &len);
707  if (err < 0)
708  return err;
709 
710  buf_end -= len;
711 
712  sc->slice_damaged = 0;
713 
714  if (f->ec) {
715  unsigned crc = av_crc(av_crc_get_table(AV_CRC_32_IEEE), f->crcref, pos, len);
716  if (crc != f->crcref) {
717  int64_t ts = avpkt->pts != AV_NOPTS_VALUE ? avpkt->pts : avpkt->dts;
718  av_log(f->avctx, AV_LOG_ERROR, "slice CRC mismatch %X!", crc);
719  if (ts != AV_NOPTS_VALUE && avctx->pkt_timebase.num) {
720  av_log(f->avctx, AV_LOG_ERROR, "at %f seconds\n", ts*av_q2d(avctx->pkt_timebase));
721  } else if (ts != AV_NOPTS_VALUE) {
722  av_log(f->avctx, AV_LOG_ERROR, "at %"PRId64"\n", ts);
723  } else {
724  av_log(f->avctx, AV_LOG_ERROR, "\n");
725  }
726  slice_set_damaged(f, sc);
727  }
728  if (avctx->debug & FF_DEBUG_PICT_INFO) {
729  av_log(avctx, AV_LOG_DEBUG, "slice %d, CRC: 0x%08"PRIX32"\n", i, AV_RB32(pos + len - 4));
730  }
731  }
732 
733  if (i) {
734  ff_init_range_decoder(&sc->c, pos, len);
735  ff_build_rac_states(&sc->c, 0.05 * (1LL << 32), 256 - 8);
736  } else {
737  sc->c = c;
738  sc->c.bytestream_end = pos + len;
739  }
740  }
741 
742  avctx->execute(avctx,
743  decode_slice,
744  f->slices,
745  NULL,
746  f->slice_count,
747  sizeof(*f->slices));
748 
749  for (int i = f->slice_count - 1; i >= 0; i--) {
750  FFV1SliceContext *sc = &f->slices[i];
751  if (sc->slice_damaged && f->last_picture.f) {
752  const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(f->pix_fmt);
753  const uint8_t *src[4];
754  uint8_t *dst[4];
755  ff_progress_frame_await(&f->last_picture, INT_MAX);
756  for (int j = 0; j < desc->nb_components; j++) {
757  int pixshift = desc->comp[j].depth > 8;
758  int sh = (j == 1 || j == 2) ? f->chroma_h_shift : 0;
759  int sv = (j == 1 || j == 2) ? f->chroma_v_shift : 0;
760  dst[j] = p->data[j] + p->linesize[j] *
761  (sc->slice_y >> sv) + ((sc->slice_x >> sh) << pixshift);
762  src[j] = f->last_picture.f->data[j] + f->last_picture.f->linesize[j] *
763  (sc->slice_y >> sv) + ((sc->slice_x >> sh) << pixshift);
764 
765  }
766 
768  f->last_picture.f->linesize,
769  f->pix_fmt,
770  sc->slice_width,
771  sc->slice_height);
772 
773  f->slice_damaged[i] = 1;
774  }
775  }
776 
777  return 0;
778 }
779 
780 static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
781  int *got_frame, AVPacket *avpkt)
782 {
783  FFV1Context *f = avctx->priv_data;
784  int ret;
785  AVFrame *p;
786  const FFHWAccel *hwaccel = NULL;
787 
788  /* This is copied onto the first slice's range coder context */
789  RangeCoder c;
790 
791  ff_progress_frame_unref(&f->last_picture);
792  av_refstruct_unref(&f->hwaccel_last_picture_private);
793 
794  FFSWAP(ProgressFrame, f->picture, f->last_picture);
795  FFSWAP(void *, f->hwaccel_picture_private, f->hwaccel_last_picture_private);
796 
797  f->avctx = avctx;
798  f->frame_damaged = 0;
799 
800  ret = decode_header(avctx, &c, avpkt->data, avpkt->size);
801  if (ret < 0)
802  return ret;
803 
804  if (avctx->debug & FF_DEBUG_PICT_INFO)
805  av_log(avctx, AV_LOG_DEBUG, "ver:%d keyframe:%d coder:%d ec:%d slices:%d bps:%d\n",
806  f->version, !!f->key_frame, f->ac, f->ec, f->slice_count, f->avctx->bits_per_raw_sample);
807 
808  if (avctx->skip_frame >= AVDISCARD_ALL)
809  return avpkt->size;
810 
811  if (avctx->hwaccel)
812  hwaccel = ffhwaccel(avctx->hwaccel);
813 
814  ret = ff_progress_frame_get_buffer(avctx, &f->picture,
816  if (ret < 0)
817  return ret;
818 
819  ret = ff_hwaccel_frame_priv_alloc(avctx, &f->hwaccel_picture_private);
820  if (ret < 0)
821  return ret;
822 
823  p = f->picture.f;
824 
825  p->pict_type = AV_PICTURE_TYPE_I; //FIXME I vs. P
826  p->flags = (p->flags & ~AV_FRAME_FLAG_KEY) | f->key_frame;
827 
828  if (f->version < 3 && avctx->field_order > AV_FIELD_PROGRESSIVE) {
829  /* we have interlaced material flagged in container */
831  if (avctx->field_order == AV_FIELD_TT || avctx->field_order == AV_FIELD_TB)
833  }
834 
835  /* Start */
836  if (hwaccel) {
837  ret = hwaccel->start_frame(avctx, avpkt->buf, avpkt->data, avpkt->size);
838  if (ret < 0)
839  return ret;
840  }
841 
842  ff_thread_finish_setup(avctx);
843 
844  /* Decode slices */
845  if (hwaccel) {
846  uint8_t *buf_end = avpkt->data + avpkt->size;
847 
848  if (!(p->flags & AV_FRAME_FLAG_KEY) && f->last_picture.f)
849  ff_progress_frame_await(&f->last_picture, f->slice_count - 1);
850 
851  for (int i = f->slice_count - 1; i >= 0; i--) {
852  uint8_t *pos;
853  uint32_t len;
854  ret = find_next_slice(avctx, avpkt->data, buf_end, i,
855  &pos, &len);
856  if (ret < 0)
857  return ret;
858 
859  buf_end -= len;
860 
861  ret = hwaccel->decode_slice(avctx, pos, len);
862  if (ret < 0)
863  return ret;
864  }
865  } else {
866  ret = decode_slices(avctx, c, avpkt);
867  if (ret < 0)
868  return ret;
869  }
870 
871  /* Finalize */
872  if (hwaccel) {
873  ret = hwaccel->end_frame(avctx);
874  if (ret < 0)
875  return ret;
876  }
877 
878  ff_progress_frame_report(&f->picture, INT_MAX);
879 
880  ff_progress_frame_unref(&f->last_picture);
881  av_refstruct_unref(&f->hwaccel_last_picture_private);
882  if ((ret = av_frame_ref(rframe, f->picture.f)) < 0)
883  return ret;
884 
885  *got_frame = 1;
886 
887  return avpkt->size;
888 }
889 
890 #if HAVE_THREADS
892 {
893  FFV1Context *fsrc = src->priv_data;
894  FFV1Context *fdst = dst->priv_data;
895 
896  if (dst == src)
897  return 0;
898 
899  fdst->version = fsrc->version;
900  fdst->micro_version = fsrc->micro_version;
901  fdst->combined_version = fsrc->combined_version;
902  fdst->chroma_planes = fsrc->chroma_planes;
903  fdst->chroma_h_shift = fsrc->chroma_h_shift;
904  fdst->chroma_v_shift = fsrc->chroma_v_shift;
905  fdst->transparency = fsrc->transparency;
906  fdst->plane_count = fsrc->plane_count;
907  fdst->ac = fsrc->ac;
908  fdst->colorspace = fsrc->colorspace;
909  fdst->pix_fmt = fsrc->pix_fmt;
911 
912  fdst->ec = fsrc->ec;
913  fdst->intra = fsrc->intra;
914  fdst->key_frame_ok = fsrc->key_frame_ok;
915 
916  fdst->packed_at_lsb = fsrc->packed_at_lsb;
917  fdst->slice_count = fsrc->slice_count;
918  fdst->use32bit = fsrc->use32bit;
919  memcpy(fdst->state_transition, fsrc->state_transition,
920  sizeof(fdst->state_transition));
921 
922  // in version 1 there is a single per-keyframe quant table, so
923  // we need to propagate it between threads
924  if (fsrc->version < 2)
925  memcpy(fdst->quant_tables[0], fsrc->quant_tables[0], sizeof(fsrc->quant_tables[0]));
926 
927  for (int i = 0; i < fdst->num_h_slices * fdst->num_v_slices; i++) {
928  FFV1SliceContext *sc = &fdst->slices[i];
929  const FFV1SliceContext *sc0 = &fsrc->slices[i];
930 
931  av_refstruct_replace(&sc->plane, sc0->plane);
932 
933  if (fsrc->version < 3) {
934  sc->slice_x = sc0->slice_x;
935  sc->slice_y = sc0->slice_y;
936  sc->slice_width = sc0->slice_width;
937  sc->slice_height = sc0->slice_height;
938  }
939  }
940 
942 
944 
945  ff_progress_frame_replace(&fdst->picture, &fsrc->picture);
948 
949  return 0;
950 }
951 #endif
952 
954 {
955  FFV1Context *const s = avctx->priv_data;
956 
957  ff_progress_frame_unref(&s->picture);
958  av_refstruct_unref(&s->hwaccel_picture_private);
959 
960  ff_progress_frame_unref(&s->last_picture);
961  av_refstruct_unref(&s->hwaccel_last_picture_private);
962 
963  ff_ffv1_close(s);
964 
965  return 0;
966 }
967 
969  .p.name = "ffv1",
970  CODEC_LONG_NAME("FFmpeg video codec #1"),
971  .p.type = AVMEDIA_TYPE_VIDEO,
972  .p.id = AV_CODEC_ID_FFV1,
973  .priv_data_size = sizeof(FFV1Context),
974  .init = decode_init,
978  .p.capabilities = AV_CODEC_CAP_DR1 |
980  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP |
983  .hw_configs = (const AVCodecHWConfigInternal *const []) {
984 #if CONFIG_FFV1_VULKAN_HWACCEL
985  HWACCEL_VULKAN(ffv1),
986 #endif
987  NULL
988  },
989 };
hwconfig.h
ff_progress_frame_report
void ff_progress_frame_report(ProgressFrame *f, int n)
Notify later decoding threads when part of their reference frame is ready.
Definition: decode.c:1807
AVCodecContext::hwaccel
const struct AVHWAccel * hwaccel
Hardware accelerator in use.
Definition: avcodec.h:1405
FFV1Context::chroma_v_shift
int chroma_v_shift
Definition: ffv1.h:132
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:215
FFV1SliceContext::slice_height
int slice_height
Definition: ffv1.h:78
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:71
FFV1Context::key_frame_ok
int key_frame_ok
Definition: ffv1.h:159
AV_EF_EXPLODE
#define AV_EF_EXPLODE
abort decoding on minor error detection
Definition: defs.h:51
update_vlc_state
static void update_vlc_state(VlcState *const state, const int v)
Definition: ffv1.h:222
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:678
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
decode_slice
static int decode_slice(AVCodecContext *c, void *arg)
Definition: ffv1dec.c:355
ff_get_format
int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
Select the (possibly hardware accelerated) pixel format.
Definition: decode.c:1203
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:3341
MAX_OVERREAD
#define MAX_OVERREAD
Definition: lagarithrac.h:49
AV_FIELD_PROGRESSIVE
@ AV_FIELD_PROGRESSIVE
Definition: defs.h:202
FFV1SliceContext::plane
PlaneContext * plane
Definition: ffv1.h:90
FFV1Context::ec
int ec
Definition: ffv1.h:157
int64_t
long long int64_t
Definition: coverity.c:34
mask
int mask
Definition: mediacodecdec_common.c:154
get_sr_golomb
static int get_sr_golomb(GetBitContext *gb, int k, int limit, int esc_len)
read signed golomb rice code (ffv1).
Definition: golomb.h:532
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
decode_plane
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:95
pixdesc.h
FFV1Context::configured_pix_fmt
enum AVPixelFormat configured_pix_fmt
Definition: ffv1.h:141
w
uint8_t w
Definition: llviddspenc.c:38
decode_header
static int decode_header(AVCodecContext *avctx, RangeCoder *c, uint8_t *buf, size_t buf_size)
Definition: ffv1dec.c:646
AVPacket::data
uint8_t * data
Definition: packet.h:535
AVCodecContext::field_order
enum AVFieldOrder field_order
Field order.
Definition: avcodec.h:682
ff_progress_frame_get_buffer
int ff_progress_frame_get_buffer(AVCodecContext *avctx, ProgressFrame *f, int flags)
This function sets up the ProgressFrame, i.e.
Definition: decode.c:1762
rangecoder.h
AVComponentDescriptor::step
int step
Number of elements between 2 horizontally consecutive pixels.
Definition: pixdesc.h:40
PlaneContext::state
uint8_t(* state)[CONTEXT_SIZE]
Definition: ffv1.h:67
FFCodec
Definition: codec_internal.h:127
decode_remap
static int decode_remap(FFV1Context *f, FFV1SliceContext *sc)
Definition: ffv1dec.c:293
FFV1Context::num_h_slices
int num_h_slices
Definition: ffv1.h:172
FFV1Context::hwaccel_picture_private
void * hwaccel_picture_private
Definition: ffv1.h:138
RangeCoder::bytestream_end
uint8_t * bytestream_end
Definition: rangecoder.h:44
FFV1SliceContext::fltmap_size
unsigned int fltmap_size[4]
Definition: ffv1.h:114
AVFrame::flags
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
Definition: frame.h:654
decode_line
static av_always_inline int RENAME() decode_line(FFV1Context *f, FFV1SliceContext *sc, GetBitContext *gb, int w, TYPE *sample[2], int plane_index, int bits, int ac)
Definition: ffv1dec_template.c:26
FFV1Context::quant_tables
int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][MAX_QUANT_TABLE_SIZE]
Definition: ffv1.h:146
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:497
thread.h
FFV1Context::chroma_h_shift
int chroma_h_shift
Definition: ffv1.h:132
FFV1SliceContext::slice_x
int slice_x
Definition: ffv1.h:79
AV_PIX_FMT_VULKAN
@ AV_PIX_FMT_VULKAN
Vulkan hardware images.
Definition: pixfmt.h:379
ff_ffv1_read_extra_header
int ff_ffv1_read_extra_header(FFV1Context *f)
Definition: ffv1_parse.c:70
ff_ffv1_clear_slice_state
void ff_ffv1_clear_slice_state(const FFV1Context *f, FFV1SliceContext *sc)
Definition: ffv1.c:198
FF_DEBUG_PICT_INFO
#define FF_DEBUG_PICT_INFO
Definition: avcodec.h:1375
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:431
AV_FRAME_FLAG_TOP_FIELD_FIRST
#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:638
crc.h
state
static struct @488 state
golomb.h
exp golomb vlc stuff
decode_current_mul
static int decode_current_mul(RangeCoder *rc, uint8_t state[32], int *mul, int mul_count, int64_t i)
Definition: ffv1dec.c:282
AV_FIELD_TT
@ AV_FIELD_TT
Top coded_first, top displayed first.
Definition: defs.h:203
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
FFHWAccel
Definition: hwaccel_internal.h:34
FFV1Context::combined_version
int combined_version
Definition: ffv1.h:129
av_ceil_log2
#define av_ceil_log2
Definition: common.h:97
AVCodecContext::skip_frame
enum AVDiscard skip_frame
Skip decoding for selected frames.
Definition: avcodec.h:1662
ffv1_decode_close
static av_cold int ffv1_decode_close(AVCodecContext *avctx)
Definition: ffv1dec.c:953
GetBitContext
Definition: get_bits.h:108
MAX_SLICES
#define MAX_SLICES
Definition: d3d12va_hevc.c:33
CONTEXT_SIZE
#define CONTEXT_SIZE
Definition: ffv1.h:45
FFV1Context::chroma_planes
int chroma_planes
Definition: ffv1.h:131
PlaneContext::context_count
int context_count
Definition: ffv1.h:66
AVRational::num
int num
Numerator.
Definition: rational.h:59
progressframe.h
AV_FIELD_TB
@ AV_FIELD_TB
Top coded first, bottom displayed first.
Definition: defs.h:205
refstruct.h
decode_rgb_frame
static int RENAME() decode_rgb_frame(FFV1Context *f, FFV1SliceContext *sc, GetBitContext *gb, uint8_t *src[4], int w, int h, int stride[4])
Definition: ffv1dec_template.c:140
av_refstruct_allocz
static void * av_refstruct_allocz(size_t size)
Equivalent to av_refstruct_alloc_ext(size, 0, NULL, NULL)
Definition: refstruct.h:105
avassert.h
FF_CODEC_CAP_USES_PROGRESSFRAMES
#define FF_CODEC_CAP_USES_PROGRESSFRAMES
The decoder might make use of the ProgressFrame API.
Definition: codec_internal.h:68
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
av_cold
#define av_cold
Definition: attributes.h:90
AV_FRAME_FLAG_KEY
#define AV_FRAME_FLAG_KEY
A flag to mark frames that are keyframes.
Definition: frame.h:625
FFV1SliceContext::sample_buffer
int16_t * sample_buffer
Definition: ffv1.h:74
FFV1Context::use32bit
int use32bit
Definition: ffv1.h:155
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:515
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:341
ff_hwaccel_frame_priv_alloc
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:2160
s
#define s(width, name)
Definition: cbs_vp9.c:198
FFV1Context::slice_count
int slice_count
Definition: ffv1.h:169
AV_CEIL_RSHIFT
#define AV_CEIL_RSHIFT(a, b)
Definition: common.h:60
AV_GET_BUFFER_FLAG_REF
#define AV_GET_BUFFER_FLAG_REF
The decoder will keep a reference to the frame and may reuse it later.
Definition: avcodec.h:411
decode_frame
static int decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame, AVPacket *avpkt)
Definition: ffv1dec.c:780
av_q2d
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition: rational.h:104
FFV1Context::max_slice_count
int max_slice_count
Definition: ffv1.h:170
bits
uint8_t bits
Definition: vp3data.h:128
FFV1Context::intra
int intra
Definition: ffv1.h:158
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
pix_fmts
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:298
is_input_end
static int is_input_end(RangeCoder *c, GetBitContext *gb, int ac)
Definition: ffv1dec.c:73
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
FFV1SliceContext::fltmap32_size
unsigned int fltmap32_size[4]
Definition: ffv1.h:115
ff_progress_frame_unref
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:1790
ff_progress_frame_await
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before ff_progress_frame_await() has been called on them. reget_buffer() and buffer age optimizations no longer work. *The contents of buffers must not be written to after ff_progress_frame_report() has been called on them. This includes draw_edges(). Porting codecs to frame threading
decode.h
get_bits.h
fold
static av_always_inline int fold(int diff, int bits)
Definition: ffv1.h:211
FFV1Context::ac
int ac
1=range coder <-> 0=golomb rice
Definition: ffv1.h:145
get_vlc_symbol
static int get_vlc_symbol(GetBitContext *gb, VlcState *const state, int bits)
Definition: ffv1dec.c:48
FFV1Context::plane_count
int plane_count
Definition: ffv1.h:144
FFV1Context::slice_damaged
uint8_t * slice_damaged
Definition: ffv1.h:182
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:326
arg
const char * arg
Definition: jacosubdec.c:67
if
if(ret)
Definition: filter_design.txt:179
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:95
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: defs.h:221
AVPacket::buf
AVBufferRef * buf
A reference to the reference-counted buffer where the packet data is stored.
Definition: packet.h:518
NULL
#define NULL
Definition: coverity.c:32
PlaneContext::vlc_state
VlcState * vlc_state
Definition: ffv1.h:68
AC_GOLOMB_RICE
#define AC_GOLOMB_RICE
Definition: ffv1.h:52
run
uint8_t run
Definition: svq3.c:204
hwaccel_internal.h
FFV1Context::num_v_slices
int num_v_slices
Definition: ffv1.h:171
FFV1SliceContext::fltmap32
uint32_t * fltmap32[4]
Definition: ffv1.h:113
FFV1Context::colorspace
int colorspace
Definition: ffv1.h:150
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:279
ff_ffv1_decoder
const FFCodec ff_ffv1_decoder
Definition: ffv1dec.c:968
FFV1Context::slices
FFV1SliceContext * slices
Definition: ffv1.h:174
FFV1Context::state_transition
uint8_t state_transition[256]
Definition: ffv1.h:148
mathops.h
ff_ffv1_get_symbol
int ff_ffv1_get_symbol(RangeCoder *c, uint8_t *state, int is_signed)
Definition: ffv1.c:259
PlaneContext
Definition: ffv1.h:64
UPDATE_THREAD_CONTEXT
#define UPDATE_THREAD_CONTEXT(func)
Definition: codec_internal.h:335
close
av_cold void CBS_FUNC() close(CodedBitstreamContext **ctx_ptr)
Close a context and free all internal state.
Definition: cbs.c:140
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
decode_slices
static int decode_slices(AVCodecContext *avctx, RangeCoder c, AVPacket *avpkt)
Definition: ffv1dec.c:690
VlcState
Definition: ffv1.h:57
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
FFV1SliceContext::slice_width
int slice_width
Definition: ffv1.h:77
ff_init_range_decoder
av_cold void ff_init_range_decoder(RangeCoder *c, const uint8_t *buf, int buf_size)
Definition: rangecoder.c:53
AV_CODEC_ID_FFV1
@ AV_CODEC_ID_FFV1
Definition: codec_id.h:85
f
f
Definition: af_crystalizer.c:122
AVFrame::pict_type
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:502
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
get_pixel_format
static enum AVPixelFormat get_pixel_format(FFV1Context *f)
Definition: ffv1dec.c:476
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:52
flip
static void flip(AVCodecContext *avctx, AVFrame *frame)
Definition: rawdec.c:131
AVPacket::size
int size
Definition: packet.h:536
height
#define height
Definition: dsp.h:85
av_frame_ref
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:276
codec_internal.h
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:424
AVCodecContext::pkt_timebase
AVRational pkt_timebase
Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed.
Definition: avcodec.h:542
sample
#define sample
Definition: flacdsp_template.c:44
size
int size
Definition: twinvq_data.h:10344
ff_build_rac_states
void ff_build_rac_states(RangeCoder *c, int factor, int max_p)
Definition: rangecoder.c:68
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
planes
static const struct @489 planes[]
slice_set_damaged
static void slice_set_damaged(FFV1Context *f, FFV1SliceContext *sc)
Definition: ffv1dec.c:272
AV_RB32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition: bytestream.h:96
FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
#define FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM
The decoder extracts and fills its parameters even if the frame is skipped due to the skip_frame sett...
Definition: codec_internal.h:54
get_symbol_inline
static av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed)
Definition: ffv1.h:251
AVCodecHWConfigInternal
Definition: hwconfig.h:25
RangeCoder::bytestream
uint8_t * bytestream
Definition: rangecoder.h:43
FFV1Context::picture
ProgressFrame picture
Definition: ffv1.h:137
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:534
FFV1SliceContext::slice_rct_by_coef
int slice_rct_by_coef
Definition: ffv1.h:85
av_crc_get_table
const AVCRC * av_crc_get_table(AVCRCId crc_id)
Get an initialized standard CRC table.
Definition: crc.c:374
AV_CODEC_CAP_SLICE_THREADS
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: codec.h:99
ff_ffv1_init_slice_state
av_cold int ff_ffv1_init_slice_state(const FFV1Context *f, FFV1SliceContext *sc)
Definition: ffv1.c:72
read_header
static int read_header(FFV1Context *f, RangeCoder *c)
Definition: ffv1dec.c:489
PlaneContext::quant_table_index
int quant_table_index
Definition: ffv1.h:65
FF_THREAD_FRAME
#define FF_THREAD_FRAME
Decode more than one frame at once.
Definition: avcodec.h:1572
FFV1SliceContext::c
RangeCoder c
Definition: ffv1.h:92
av_refstruct_unref
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:120
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:67
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:528
FFV1SliceContext::slice_rct_ry_coef
int slice_rct_ry_coef
Definition: ffv1.h:86
FFV1SliceContext::remap_count
int remap_count[4]
Definition: ffv1.h:109
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:56
delta
float delta
Definition: vorbis_enc_data.h:430
ff_ffv1_common_init
av_cold int ff_ffv1_common_init(AVCodecContext *avctx, FFV1Context *s)
Definition: ffv1.c:36
ffv1.h
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
FFV1SliceContext
Definition: ffv1.h:73
len
int len
Definition: vorbis_enc_data.h:426
get_rac
static int get_rac(RangeCoder *c, uint8_t *const state)
Definition: rangecoder.h:118
AV_CRC_32_IEEE
@ AV_CRC_32_IEEE
Definition: crc.h:52
AVCodecContext::height
int height
Definition: avcodec.h:592
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:633
FFV1Context::packed_at_lsb
int packed_at_lsb
Definition: ffv1.h:164
ff_ffv1_read_quant_tables
int ff_ffv1_read_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256])
Definition: ffv1_parse.c:52
avcodec.h
stride
#define stride
Definition: h264pred_template.c:536
FFV1SliceContext::fltmap
uint16_t * fltmap[4]
Definition: ffv1.h:112
ret
ret
Definition: filter_design.txt:187
find_next_slice
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:614
FFSWAP
#define FFSWAP(type, a, b)
Definition: macros.h:52
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:264
decode_slice_header
static int decode_slice_header(const FFV1Context *f, FFV1SliceContext *sc, AVFrame *frame)
Definition: ffv1dec.c:169
FFV1SliceContext::slice_y
int slice_y
Definition: ffv1.h:80
hwaccel
static const char * hwaccel
Definition: ffplay.c:353
pos
unsigned int pos
Definition: spdifenc.c:414
ff_ffv1_close
av_cold void ff_ffv1_close(FFV1Context *s)
Definition: ffv1.c:264
ff_thread_finish_setup
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call ff_thread_finish_setup() afterwards. If some code can 't be moved
ff_slice_coord
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
U
#define U(x)
Definition: vpx_arith.h:37
ff_ffv1_planes_alloc
PlaneContext * ff_ffv1_planes_alloc(void)
Definition: ffv1.c:66
ff_progress_frame_replace
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:1797
HWACCEL_VULKAN
#define HWACCEL_VULKAN(codec)
Definition: hwconfig.h:76
FFV1Context::pix_fmt
enum AVPixelFormat pix_fmt
Definition: ffv1.h:140
AVCodecContext
main external API structure.
Definition: avcodec.h:431
RangeCoder::bytestream_start
uint8_t * bytestream_start
Definition: rangecoder.h:42
AVCodecContext::execute
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:1591
decode_init
static av_cold int decode_init(AVCodecContext *avctx)
Definition: ffv1dec.c:594
av_crc
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:392
av_refstruct_replace
void av_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
Definition: refstruct.c:160
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
ffhwaccel
static const FFHWAccel * ffhwaccel(const AVHWAccel *codec)
Definition: hwaccel_internal.h:168
update_thread_context
the pkt_dts and pkt_pts fields in AVFrame will work as usual Restrictions on codec whose streams don t reset across will not work because their bitstreams cannot be decoded in parallel *The contents of buffers must not be read before as well as code calling up to before the decode process starts Call have update_thread_context() run it in the next thread. Add AV_CODEC_CAP_FRAME_THREADS to the codec capabilities. There will be very little speed gain at this point but it should work. Use ff_thread_get_buffer()(or ff_progress_frame_get_buffer() in case you have inter-frame dependencies and use the ProgressFrame API) to allocate frame buffers. Call ff_progress_frame_report() after some part of the current picture has decoded. A good place to put this is where draw_horiz_band() is called - add this if it isn 't called anywhere
FFV1SliceContext::remap
int remap
Definition: ffv1.h:87
ff_ffv1_parse_header
int ff_ffv1_parse_header(FFV1Context *f, RangeCoder *c, uint8_t *state)
Definition: ffv1_parse.c:208
AVPixFmtDescriptor::comp
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:105
temp
else temp
Definition: vf_mcdeint.c:263
AVCodecContext::debug
int debug
debug
Definition: avcodec.h:1374
desc
const char * desc
Definition: libsvtav1.c:79
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
mem.h
AVPixFmtDescriptor
Descriptor that unambiguously describes how the bits of a pixel are stored in the up to 4 data planes...
Definition: pixdesc.h:69
FFV1Context
Definition: ffv1.h:122
FFV1Context::transparency
int transparency
Definition: ffv1.h:133
ProgressFrame
The ProgressFrame structure.
Definition: progressframe.h:73
AVPacket
This structure stores compressed data.
Definition: packet.h:512
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
FFV1SliceContext::run_index
int run_index
Definition: ffv1.h:83
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_fast_malloc
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:557
ffv1dec_template.c
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:592
ff_ffv1_init_slice_contexts
av_cold int ff_ffv1_init_slice_contexts(FFV1Context *f)
Definition: ffv1.c:140
ff_log2_run
const uint8_t ff_log2_run[41]
Definition: mathtables.c:116
imgutils.h
FFV1SliceContext::slice_reset_contexts
int slice_reset_contexts
Definition: ffv1.h:99
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, a positive or negative value, which is typically indicating the size in bytes of each pict...
Definition: frame.h:455
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
FFV1Context::micro_version
int micro_version
Definition: ffv1.h:128
h
h
Definition: vp9dsp_template.c:2070
RangeCoder
Definition: mss3.c:63
av_image_check_sar
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
width
#define width
Definition: dsp.h:85
av_image_copy
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
FFV1SliceContext::ac_byte_count
int ac_byte_count
number of bytes used for AC coding
Definition: ffv1.h:94
AV_RB24
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_RB24
Definition: bytestream.h:97
FFV1SliceContext::slice_damaged
int slice_damaged
Definition: ffv1.h:100
FFV1SliceContext::slice_coding_mode
int slice_coding_mode
Definition: ffv1.h:84
src
#define src
Definition: vp8dsp.c:248
FFV1Context::version
int version
Definition: ffv1.h:127