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