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 "refstruct.h"
42 #include "thread.h"
43 
44 static inline av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state,
45  int is_signed)
46 {
47  if (get_rac(c, state + 0))
48  return 0;
49  else {
50  int e;
51  unsigned a;
52  e = 0;
53  while (get_rac(c, state + 1 + FFMIN(e, 9))) { // 1..10
54  e++;
55  if (e > 31)
56  return AVERROR_INVALIDDATA;
57  }
58 
59  a = 1;
60  for (int i = e - 1; i >= 0; i--)
61  a += a + get_rac(c, state + 22 + FFMIN(i, 9)); // 22..31
62 
63  e = -(is_signed && get_rac(c, state + 11 + FFMIN(e, 10))); // 11..21
64  return (a ^ e) - e;
65  }
66 }
67 
68 static av_noinline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed)
69 {
70  return get_symbol_inline(c, state, is_signed);
71 }
72 
73 static inline int get_vlc_symbol(GetBitContext *gb, VlcState *const state,
74  int bits)
75 {
76  int k, i, v, ret;
77 
78  i = state->count;
79  k = 0;
80  while (i < state->error_sum) { // FIXME: optimize
81  k++;
82  i += i;
83  }
84 
85  v = get_sr_golomb(gb, k, 12, bits);
86  ff_dlog(NULL, "v:%d bias:%d error:%d drift:%d count:%d k:%d",
87  v, state->bias, state->error_sum, state->drift, state->count, k);
88 
89  v ^= ((2 * state->drift + state->count) >> 31);
90 
91  ret = fold(v + state->bias, bits);
92 
94 
95  return ret;
96 }
97 
98 static int is_input_end(RangeCoder *c, GetBitContext *gb, int ac)
99 {
100  if (ac != AC_GOLOMB_RICE) {
101  if (c->overread > MAX_OVERREAD)
102  return AVERROR_INVALIDDATA;
103  } else {
104  if (get_bits_left(gb) < 1)
105  return AVERROR_INVALIDDATA;
106  }
107  return 0;
108 }
109 
110 #define TYPE int16_t
111 #define RENAME(name) name
112 #include "ffv1dec_template.c"
113 #undef TYPE
114 #undef RENAME
115 
116 #define TYPE int32_t
117 #define RENAME(name) name ## 32
118 #include "ffv1dec_template.c"
119 
121  GetBitContext *gb,
122  uint8_t *src, int w, int h, int stride, int plane_index,
123  int pixel_stride)
124 {
125  const int ac = f->ac;
126  int x, y;
127  int16_t *sample[2];
128  sample[0] = sc->sample_buffer + 3;
129  sample[1] = sc->sample_buffer + w + 6 + 3;
130 
131  sc->run_index = 0;
132 
133  memset(sc->sample_buffer, 0, 2 * (w + 6) * sizeof(*sc->sample_buffer));
134 
135  for (y = 0; y < h; y++) {
136  int16_t *temp = sample[0]; // FIXME: try a normal buffer
137 
138  sample[0] = sample[1];
139  sample[1] = temp;
140 
141  sample[1][-1] = sample[0][0];
142  sample[0][w] = sample[0][w - 1];
143 
144  if (f->avctx->bits_per_raw_sample <= 8) {
145  int ret = decode_line(f, sc, gb, w, sample, plane_index, 8, ac);
146  if (ret < 0)
147  return ret;
148  for (x = 0; x < w; x++)
149  src[x*pixel_stride + stride * y] = sample[1][x];
150  } else {
151  int ret = decode_line(f, sc, gb, w, sample, plane_index, f->avctx->bits_per_raw_sample, ac);
152  if (ret < 0)
153  return ret;
154  if (f->packed_at_lsb) {
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  return 0;
166 }
167 
170 {
171  RangeCoder *c = &sc->c;
172  uint8_t state[CONTEXT_SIZE];
173  unsigned ps, context_count;
174  int sx, sy, sw, sh;
175 
176  memset(state, 128, sizeof(state));
177  sx = get_symbol(c, state, 0);
178  sy = get_symbol(c, state, 0);
179  sw = get_symbol(c, state, 0) + 1U;
180  sh = get_symbol(c, state, 0) + 1U;
181 
182  av_assert0(f->version > 2);
183 
184 
185  if (sx < 0 || sy < 0 || sw <= 0 || sh <= 0)
186  return AVERROR_INVALIDDATA;
187  if (sx > f->num_h_slices - sw || sy > f->num_v_slices - sh)
188  return AVERROR_INVALIDDATA;
189 
190  sc->slice_x = sx * (int64_t)f->width / f->num_h_slices;
191  sc->slice_y = sy * (int64_t)f->height / f->num_v_slices;
192  sc->slice_width = (sx + sw) * (int64_t)f->width / f->num_h_slices - sc->slice_x;
193  sc->slice_height = (sy + sh) * (int64_t)f->height / f->num_v_slices - sc->slice_y;
194 
195  av_assert0((unsigned)sc->slice_width <= f->width &&
196  (unsigned)sc->slice_height <= f->height);
197  av_assert0 ( (unsigned)sc->slice_x + (uint64_t)sc->slice_width <= f->width
198  && (unsigned)sc->slice_y + (uint64_t)sc->slice_height <= f->height);
199 
200  if (f->ac == AC_GOLOMB_RICE && sc->slice_width >= (1<<23))
201  return AVERROR_INVALIDDATA;
202 
203  for (unsigned i = 0; i < f->plane_count; i++) {
204  PlaneContext * const p = &sc->plane[i];
205  int idx = get_symbol(c, state, 0);
206  if (idx >= (unsigned)f->quant_table_count) {
207  av_log(f->avctx, AV_LOG_ERROR, "quant_table_index out of range\n");
208  return -1;
209  }
210  p->quant_table_index = idx;
211  context_count = f->context_count[idx];
212 
213  if (p->context_count < context_count) {
214  av_freep(&p->state);
215  av_freep(&p->vlc_state);
216  }
217  p->context_count = context_count;
218  }
219 
220  ps = get_symbol(c, state, 0);
221  if (ps == 1) {
224  } else if (ps == 2) {
227  } else if (ps == 3) {
228  frame->flags &= ~AV_FRAME_FLAG_INTERLACED;
229  }
230  frame->sample_aspect_ratio.num = get_symbol(c, state, 0);
231  frame->sample_aspect_ratio.den = get_symbol(c, state, 0);
232 
233  if (av_image_check_sar(f->width, f->height,
234  frame->sample_aspect_ratio) < 0) {
235  av_log(f->avctx, AV_LOG_WARNING, "ignoring invalid SAR: %u/%u\n",
236  frame->sample_aspect_ratio.num,
237  frame->sample_aspect_ratio.den);
238  frame->sample_aspect_ratio = (AVRational){ 0, 1 };
239  }
240 
241  if (f->version > 3) {
243  sc->slice_coding_mode = get_symbol(c, state, 0);
244  if (sc->slice_coding_mode != 1) {
245  sc->slice_rct_by_coef = get_symbol(c, state, 0);
246  sc->slice_rct_ry_coef = get_symbol(c, state, 0);
247  if ((uint64_t)sc->slice_rct_by_coef + (uint64_t)sc->slice_rct_ry_coef > 4) {
248  av_log(f->avctx, AV_LOG_ERROR, "slice_rct_y_coef out of range\n");
249  return AVERROR_INVALIDDATA;
250  }
251  }
252  }
253 
254  return 0;
255 }
256 
258 {
259  sc->slice_damaged = 1;
260 
261  // only set this for frame threading, as for slice threading its value is
262  // not used and setting it would be a race
263  if (f->avctx->active_thread_type & FF_THREAD_FRAME)
264  f->frame_damaged = 1;
265 }
266 
267 static int decode_slice(AVCodecContext *c, void *arg)
268 {
269  FFV1Context *f = c->priv_data;
270  FFV1SliceContext *sc = arg;
271  int width, height, x, y, ret;
272  const int ps = av_pix_fmt_desc_get(c->pix_fmt)->comp[0].step;
273  AVFrame * const p = f->picture.f;
274  const int si = sc - f->slices;
275  GetBitContext gb;
276 
277  if (!(p->flags & AV_FRAME_FLAG_KEY) && f->last_picture.f)
278  ff_progress_frame_await(&f->last_picture, si);
279 
280  if (f->slice_damaged[si])
281  slice_set_damaged(f, sc);
282 
283  sc->slice_rct_by_coef = 1;
284  sc->slice_rct_ry_coef = 1;
285 
286  if (f->version > 2) {
287  if (ff_ffv1_init_slice_state(f, sc) < 0)
288  return AVERROR(ENOMEM);
289  if (decode_slice_header(f, sc, p) < 0) {
290  sc->slice_x = sc->slice_y = sc->slice_height = sc->slice_width = 0;
291  slice_set_damaged(f, sc);
292  return AVERROR_INVALIDDATA;
293  }
294  }
295  if ((ret = ff_ffv1_init_slice_state(f, sc)) < 0)
296  return ret;
297  if ((p->flags & AV_FRAME_FLAG_KEY) || sc->slice_reset_contexts) {
299  } else if (sc->slice_damaged) {
300  return AVERROR_INVALIDDATA;
301  }
302 
303  width = sc->slice_width;
304  height = sc->slice_height;
305  x = sc->slice_x;
306  y = sc->slice_y;
307 
308  if (f->ac == AC_GOLOMB_RICE) {
309  if (f->version == 3 && f->micro_version > 1 || f->version > 3)
310  get_rac(&sc->c, (uint8_t[]) { 129 });
311  sc->ac_byte_count = f->version > 2 || (!x && !y) ? sc->c.bytestream - sc->c.bytestream_start - 1 : 0;
312  init_get_bits(&gb,
313  sc->c.bytestream_start + sc->ac_byte_count,
314  (sc->c.bytestream_end - sc->c.bytestream_start - sc->ac_byte_count) * 8);
315  }
316 
317  av_assert1(width && height);
318  if (f->colorspace == 0 && (f->chroma_planes || !f->transparency)) {
319  const int chroma_width = AV_CEIL_RSHIFT(width, f->chroma_h_shift);
320  const int chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift);
321  const int cx = x >> f->chroma_h_shift;
322  const int cy = y >> f->chroma_v_shift;
323  decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0, 1);
324 
325  if (f->chroma_planes) {
326  decode_plane(f, sc, &gb, p->data[1] + ps*cx+cy*p->linesize[1], chroma_width, chroma_height, p->linesize[1], 1, 1);
327  decode_plane(f, sc, &gb, p->data[2] + ps*cx+cy*p->linesize[2], chroma_width, chroma_height, p->linesize[2], 1, 1);
328  }
329  if (f->transparency)
330  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, 1);
331  } else if (f->colorspace == 0) {
332  decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0] , width, height, p->linesize[0], 0, 2);
333  decode_plane(f, sc, &gb, p->data[0] + ps*x + y*p->linesize[0] + 1, width, height, p->linesize[0], 1, 2);
334  } else if (f->use32bit) {
335  uint8_t *planes[4] = { p->data[0] + ps * x + y * p->linesize[0],
336  p->data[1] + ps * x + y * p->linesize[1],
337  p->data[2] + ps * x + y * p->linesize[2],
338  p->data[3] + ps * x + y * p->linesize[3] };
339  decode_rgb_frame32(f, sc, &gb, planes, width, height, p->linesize);
340  } else {
341  uint8_t *planes[4] = { p->data[0] + ps * x + y * p->linesize[0],
342  p->data[1] + ps * x + y * p->linesize[1],
343  p->data[2] + ps * x + y * p->linesize[2],
344  p->data[3] + ps * x + y * p->linesize[3] };
345  decode_rgb_frame(f, sc, &gb, planes, width, height, p->linesize);
346  }
347  if (f->ac != AC_GOLOMB_RICE && f->version > 2) {
348  int v;
349  get_rac(&sc->c, (uint8_t[]) { 129 });
350  v = sc->c.bytestream_end - sc->c.bytestream - 2 - 5*f->ec;
351  if (v) {
352  av_log(f->avctx, AV_LOG_ERROR, "bytestream end mismatching by %d\n", v);
353  slice_set_damaged(f, sc);
354  }
355  }
356 
357  if ((c->active_thread_type & FF_THREAD_FRAME) && !f->frame_damaged)
358  ff_progress_frame_report(&f->picture, si);
359 
360  return 0;
361 }
362 
363 static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale)
364 {
365  int v;
366  int i = 0;
367  uint8_t state[CONTEXT_SIZE];
368 
369  memset(state, 128, sizeof(state));
370 
371  for (v = 0; i < 128; v++) {
372  unsigned len = get_symbol(c, state, 0) + 1U;
373 
374  if (len > 128 - i || !len)
375  return AVERROR_INVALIDDATA;
376 
377  while (len--) {
378  quant_table[i] = scale * v;
379  i++;
380  }
381  }
382 
383  for (i = 1; i < 128; i++)
384  quant_table[256 - i] = -quant_table[i];
385  quant_table[128] = -quant_table[127];
386 
387  return 2 * v - 1;
388 }
389 
391  int16_t quant_table[MAX_CONTEXT_INPUTS][256])
392 {
393  int i;
394  int context_count = 1;
395 
396  for (i = 0; i < 5; i++) {
397  int ret = read_quant_table(c, quant_table[i], context_count);
398  if (ret < 0)
399  return ret;
400  context_count *= ret;
401  if (context_count > 32768U) {
402  return AVERROR_INVALIDDATA;
403  }
404  }
405  return (context_count + 1) / 2;
406 }
407 
409 {
410  RangeCoder c;
411  uint8_t state[CONTEXT_SIZE];
412  int ret;
413  uint8_t state2[32][CONTEXT_SIZE];
414  unsigned crc = 0;
415 
416  memset(state2, 128, sizeof(state2));
417  memset(state, 128, sizeof(state));
418 
419  ff_init_range_decoder(&c, f->avctx->extradata, f->avctx->extradata_size);
420  ff_build_rac_states(&c, 0.05 * (1LL << 32), 256 - 8);
421 
422  f->version = get_symbol(&c, state, 0);
423  if (f->version < 2) {
424  av_log(f->avctx, AV_LOG_ERROR, "Invalid version in global header\n");
425  return AVERROR_INVALIDDATA;
426  }
427  if (f->version > 4) {
428  av_log(f->avctx, AV_LOG_ERROR, "unsupported version %d\n",
429  f->version);
430  return AVERROR_PATCHWELCOME;
431  }
432  if (f->version > 2) {
433  c.bytestream_end -= 4;
434  f->micro_version = get_symbol(&c, state, 0);
435  if (f->micro_version < 0)
436  return AVERROR_INVALIDDATA;
437  }
438  f->ac = get_symbol(&c, state, 0);
439 
440  if (f->ac == AC_RANGE_CUSTOM_TAB) {
441  for (int i = 1; i < 256; i++)
442  f->state_transition[i] = get_symbol(&c, state, 1) + c.one_state[i];
443  }
444 
445  f->colorspace = get_symbol(&c, state, 0); //YUV cs type
446  f->avctx->bits_per_raw_sample = get_symbol(&c, state, 0);
447  f->chroma_planes = get_rac(&c, state);
448  f->chroma_h_shift = get_symbol(&c, state, 0);
449  f->chroma_v_shift = get_symbol(&c, state, 0);
450  f->transparency = get_rac(&c, state);
451  f->plane_count = 1 + (f->chroma_planes || f->version<4) + f->transparency;
452  f->num_h_slices = 1 + get_symbol(&c, state, 0);
453  f->num_v_slices = 1 + get_symbol(&c, state, 0);
454 
455  if (f->chroma_h_shift > 4U || f->chroma_v_shift > 4U) {
456  av_log(f->avctx, AV_LOG_ERROR, "chroma shift parameters %d %d are invalid\n",
457  f->chroma_h_shift, f->chroma_v_shift);
458  return AVERROR_INVALIDDATA;
459  }
460 
461  if (f->num_h_slices > (unsigned)f->width || !f->num_h_slices ||
462  f->num_v_slices > (unsigned)f->height || !f->num_v_slices
463  ) {
464  av_log(f->avctx, AV_LOG_ERROR, "slice count invalid\n");
465  return AVERROR_INVALIDDATA;
466  }
467 
468  if (f->num_h_slices > MAX_SLICES / f->num_v_slices) {
469  av_log(f->avctx, AV_LOG_ERROR, "slice count unsupported\n");
470  return AVERROR_PATCHWELCOME;
471  }
472 
473  f->quant_table_count = get_symbol(&c, state, 0);
474  if (f->quant_table_count > (unsigned)MAX_QUANT_TABLES || !f->quant_table_count) {
475  av_log(f->avctx, AV_LOG_ERROR, "quant table count %d is invalid\n", f->quant_table_count);
476  f->quant_table_count = 0;
477  return AVERROR_INVALIDDATA;
478  }
479 
480  for (int i = 0; i < f->quant_table_count; i++) {
481  f->context_count[i] = read_quant_tables(&c, f->quant_tables[i]);
482  if (f->context_count[i] < 0) {
483  av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
484  return AVERROR_INVALIDDATA;
485  }
486  }
488  return ret;
489 
490  for (int i = 0; i < f->quant_table_count; i++)
491  if (get_rac(&c, state)) {
492  for (int j = 0; j < f->context_count[i]; j++)
493  for (int k = 0; k < CONTEXT_SIZE; k++) {
494  int pred = j ? f->initial_states[i][j - 1][k] : 128;
495  f->initial_states[i][j][k] =
496  (pred + get_symbol(&c, state2[k], 1)) & 0xFF;
497  }
498  }
499 
500  if (f->version > 2) {
501  f->ec = get_symbol(&c, state, 0);
502  if (f->micro_version > 2)
503  f->intra = get_symbol(&c, state, 0);
504  }
505 
506  if (f->version > 2) {
507  unsigned v;
509  f->avctx->extradata, f->avctx->extradata_size);
510  if (v || f->avctx->extradata_size < 4) {
511  av_log(f->avctx, AV_LOG_ERROR, "CRC mismatch %X!\n", v);
512  return AVERROR_INVALIDDATA;
513  }
514  crc = AV_RB32(f->avctx->extradata + f->avctx->extradata_size - 4);
515  }
516 
517  if (f->avctx->debug & FF_DEBUG_PICT_INFO)
518  av_log(f->avctx, AV_LOG_DEBUG,
519  "global: ver:%d.%d, coder:%d, colorspace: %d bpr:%d chroma:%d(%d:%d), alpha:%d slices:%dx%d qtabs:%d ec:%d intra:%d CRC:0x%08X\n",
520  f->version, f->micro_version,
521  f->ac,
522  f->colorspace,
523  f->avctx->bits_per_raw_sample,
524  f->chroma_planes, f->chroma_h_shift, f->chroma_v_shift,
525  f->transparency,
526  f->num_h_slices, f->num_v_slices,
527  f->quant_table_count,
528  f->ec,
529  f->intra,
530  crc
531  );
532  return 0;
533 }
534 
536 {
537  uint8_t state[CONTEXT_SIZE];
538  int context_count = -1; //-1 to avoid warning
539  RangeCoder *const c = &f->slices[0].c;
540 
541  memset(state, 128, sizeof(state));
542 
543  if (f->version < 2) {
544  int chroma_planes, chroma_h_shift, chroma_v_shift, transparency, colorspace, bits_per_raw_sample;
545  unsigned v= get_symbol(c, state, 0);
546  if (v >= 2) {
547  av_log(f->avctx, AV_LOG_ERROR, "invalid version %d in ver01 header\n", v);
548  return AVERROR_INVALIDDATA;
549  }
550  f->version = v;
551  f->ac = get_symbol(c, state, 0);
552 
553  if (f->ac == AC_RANGE_CUSTOM_TAB) {
554  for (int i = 1; i < 256; i++) {
555  int st = get_symbol(c, state, 1) + c->one_state[i];
556  if (st < 1 || st > 255) {
557  av_log(f->avctx, AV_LOG_ERROR, "invalid state transition %d\n", st);
558  return AVERROR_INVALIDDATA;
559  }
560  f->state_transition[i] = st;
561  }
562  }
563 
564  colorspace = get_symbol(c, state, 0); //YUV cs type
565  bits_per_raw_sample = f->version > 0 ? get_symbol(c, state, 0) : f->avctx->bits_per_raw_sample;
566  chroma_planes = get_rac(c, state);
567  chroma_h_shift = get_symbol(c, state, 0);
568  chroma_v_shift = get_symbol(c, state, 0);
569  transparency = get_rac(c, state);
570  if (colorspace == 0 && f->avctx->skip_alpha)
571  transparency = 0;
572 
573  if (f->plane_count) {
574  if (colorspace != f->colorspace ||
575  bits_per_raw_sample != f->avctx->bits_per_raw_sample ||
576  chroma_planes != f->chroma_planes ||
577  chroma_h_shift != f->chroma_h_shift ||
578  chroma_v_shift != f->chroma_v_shift ||
579  transparency != f->transparency) {
580  av_log(f->avctx, AV_LOG_ERROR, "Invalid change of global parameters\n");
581  return AVERROR_INVALIDDATA;
582  }
583  }
584 
585  if (chroma_h_shift > 4U || chroma_v_shift > 4U) {
586  av_log(f->avctx, AV_LOG_ERROR, "chroma shift parameters %d %d are invalid\n",
587  chroma_h_shift, chroma_v_shift);
588  return AVERROR_INVALIDDATA;
589  }
590 
591  f->colorspace = colorspace;
592  f->avctx->bits_per_raw_sample = bits_per_raw_sample;
593  f->chroma_planes = chroma_planes;
594  f->chroma_h_shift = chroma_h_shift;
595  f->chroma_v_shift = chroma_v_shift;
596  f->transparency = transparency;
597 
598  f->plane_count = 2 + f->transparency;
599  }
600 
601  if (f->colorspace == 0) {
602  if (!f->transparency && !f->chroma_planes) {
603  if (f->avctx->bits_per_raw_sample <= 8)
604  f->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
605  else if (f->avctx->bits_per_raw_sample == 9) {
606  f->packed_at_lsb = 1;
607  f->avctx->pix_fmt = AV_PIX_FMT_GRAY9;
608  } else if (f->avctx->bits_per_raw_sample == 10) {
609  f->packed_at_lsb = 1;
610  f->avctx->pix_fmt = AV_PIX_FMT_GRAY10;
611  } else if (f->avctx->bits_per_raw_sample == 12) {
612  f->packed_at_lsb = 1;
613  f->avctx->pix_fmt = AV_PIX_FMT_GRAY12;
614  } else if (f->avctx->bits_per_raw_sample == 14) {
615  f->packed_at_lsb = 1;
616  f->avctx->pix_fmt = AV_PIX_FMT_GRAY14;
617  } else if (f->avctx->bits_per_raw_sample == 16) {
618  f->packed_at_lsb = 1;
619  f->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
620  } else if (f->avctx->bits_per_raw_sample < 16) {
621  f->avctx->pix_fmt = AV_PIX_FMT_GRAY16;
622  } else
623  return AVERROR(ENOSYS);
624  } else if (f->transparency && !f->chroma_planes) {
625  if (f->avctx->bits_per_raw_sample <= 8)
626  f->avctx->pix_fmt = AV_PIX_FMT_YA8;
627  else
628  return AVERROR(ENOSYS);
629  } else if (f->avctx->bits_per_raw_sample<=8 && !f->transparency) {
630  switch(16 * f->chroma_h_shift + f->chroma_v_shift) {
631  case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUV444P; break;
632  case 0x01: f->avctx->pix_fmt = AV_PIX_FMT_YUV440P; break;
633  case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUV422P; break;
634  case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUV420P; break;
635  case 0x20: f->avctx->pix_fmt = AV_PIX_FMT_YUV411P; break;
636  case 0x22: f->avctx->pix_fmt = AV_PIX_FMT_YUV410P; break;
637  }
638  } else if (f->avctx->bits_per_raw_sample <= 8 && f->transparency) {
639  switch(16*f->chroma_h_shift + f->chroma_v_shift) {
640  case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUVA444P; break;
641  case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUVA422P; break;
642  case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUVA420P; break;
643  }
644  } else if (f->avctx->bits_per_raw_sample == 9 && !f->transparency) {
645  f->packed_at_lsb = 1;
646  switch(16 * f->chroma_h_shift + f->chroma_v_shift) {
647  case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUV444P9; break;
648  case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUV422P9; break;
649  case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUV420P9; break;
650  }
651  } else if (f->avctx->bits_per_raw_sample == 9 && f->transparency) {
652  f->packed_at_lsb = 1;
653  switch(16 * f->chroma_h_shift + f->chroma_v_shift) {
654  case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUVA444P9; break;
655  case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUVA422P9; break;
656  case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUVA420P9; break;
657  }
658  } else if (f->avctx->bits_per_raw_sample == 10 && !f->transparency) {
659  f->packed_at_lsb = 1;
660  switch(16 * f->chroma_h_shift + f->chroma_v_shift) {
661  case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUV444P10; break;
662  case 0x01: f->avctx->pix_fmt = AV_PIX_FMT_YUV440P10; break;
663  case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUV422P10; break;
664  case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUV420P10; break;
665  }
666  } else if (f->avctx->bits_per_raw_sample == 10 && f->transparency) {
667  f->packed_at_lsb = 1;
668  switch(16 * f->chroma_h_shift + f->chroma_v_shift) {
669  case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUVA444P10; break;
670  case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUVA422P10; break;
671  case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUVA420P10; break;
672  }
673  } else if (f->avctx->bits_per_raw_sample == 12 && !f->transparency) {
674  f->packed_at_lsb = 1;
675  switch(16 * f->chroma_h_shift + f->chroma_v_shift) {
676  case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUV444P12; break;
677  case 0x01: f->avctx->pix_fmt = AV_PIX_FMT_YUV440P12; break;
678  case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUV422P12; break;
679  case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUV420P12; break;
680  }
681  } else if (f->avctx->bits_per_raw_sample == 12 && f->transparency) {
682  f->packed_at_lsb = 1;
683  switch(16 * f->chroma_h_shift + f->chroma_v_shift) {
684  case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUVA444P12; break;
685  case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUVA422P12; break;
686  }
687  } else if (f->avctx->bits_per_raw_sample == 14 && !f->transparency) {
688  f->packed_at_lsb = 1;
689  switch(16 * f->chroma_h_shift + f->chroma_v_shift) {
690  case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUV444P14; break;
691  case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUV422P14; break;
692  case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUV420P14; break;
693  }
694  } else if (f->avctx->bits_per_raw_sample == 16 && !f->transparency){
695  f->packed_at_lsb = 1;
696  switch(16 * f->chroma_h_shift + f->chroma_v_shift) {
697  case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUV444P16; break;
698  case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUV422P16; break;
699  case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUV420P16; break;
700  }
701  } else if (f->avctx->bits_per_raw_sample == 16 && f->transparency){
702  f->packed_at_lsb = 1;
703  switch(16 * f->chroma_h_shift + f->chroma_v_shift) {
704  case 0x00: f->avctx->pix_fmt = AV_PIX_FMT_YUVA444P16; break;
705  case 0x10: f->avctx->pix_fmt = AV_PIX_FMT_YUVA422P16; break;
706  case 0x11: f->avctx->pix_fmt = AV_PIX_FMT_YUVA420P16; break;
707  }
708  }
709  } else if (f->colorspace == 1) {
710  if (f->chroma_h_shift || f->chroma_v_shift) {
711  av_log(f->avctx, AV_LOG_ERROR,
712  "chroma subsampling not supported in this colorspace\n");
713  return AVERROR(ENOSYS);
714  }
715  if ( f->avctx->bits_per_raw_sample <= 8 && !f->transparency)
716  f->avctx->pix_fmt = AV_PIX_FMT_0RGB32;
717  else if (f->avctx->bits_per_raw_sample <= 8 && f->transparency)
718  f->avctx->pix_fmt = AV_PIX_FMT_RGB32;
719  else if (f->avctx->bits_per_raw_sample == 9 && !f->transparency)
720  f->avctx->pix_fmt = AV_PIX_FMT_GBRP9;
721  else if (f->avctx->bits_per_raw_sample == 10 && !f->transparency)
722  f->avctx->pix_fmt = AV_PIX_FMT_GBRP10;
723  else if (f->avctx->bits_per_raw_sample == 10 && f->transparency)
724  f->avctx->pix_fmt = AV_PIX_FMT_GBRAP10;
725  else if (f->avctx->bits_per_raw_sample == 12 && !f->transparency)
726  f->avctx->pix_fmt = AV_PIX_FMT_GBRP12;
727  else if (f->avctx->bits_per_raw_sample == 12 && f->transparency)
728  f->avctx->pix_fmt = AV_PIX_FMT_GBRAP12;
729  else if (f->avctx->bits_per_raw_sample == 14 && !f->transparency)
730  f->avctx->pix_fmt = AV_PIX_FMT_GBRP14;
731  else if (f->avctx->bits_per_raw_sample == 14 && f->transparency)
732  f->avctx->pix_fmt = AV_PIX_FMT_GBRAP14;
733  else if (f->avctx->bits_per_raw_sample == 16 && !f->transparency) {
734  f->avctx->pix_fmt = AV_PIX_FMT_GBRP16;
735  f->use32bit = 1;
736  }
737  else if (f->avctx->bits_per_raw_sample == 16 && f->transparency) {
738  f->avctx->pix_fmt = AV_PIX_FMT_GBRAP16;
739  f->use32bit = 1;
740  }
741  } else {
742  av_log(f->avctx, AV_LOG_ERROR, "colorspace not supported\n");
743  return AVERROR(ENOSYS);
744  }
745  if (f->avctx->pix_fmt == AV_PIX_FMT_NONE) {
746  av_log(f->avctx, AV_LOG_ERROR, "format not supported\n");
747  return AVERROR(ENOSYS);
748  }
749 
750  ff_dlog(f->avctx, "%d %d %d\n",
751  f->chroma_h_shift, f->chroma_v_shift, f->avctx->pix_fmt);
752  if (f->version < 2) {
753  context_count = read_quant_tables(c, f->quant_tables[0]);
754  if (context_count < 0) {
755  av_log(f->avctx, AV_LOG_ERROR, "read_quant_table error\n");
756  return AVERROR_INVALIDDATA;
757  }
758  f->slice_count = f->max_slice_count;
759  } else if (f->version < 3) {
760  f->slice_count = get_symbol(c, state, 0);
761  } else {
762  const uint8_t *p = c->bytestream_end;
763  for (f->slice_count = 0;
764  f->slice_count < MAX_SLICES && 3 + 5*!!f->ec < p - c->bytestream_start;
765  f->slice_count++) {
766  int trailer = 3 + 5*!!f->ec;
767  int size = AV_RB24(p-trailer);
768  if (size + trailer > p - c->bytestream_start)
769  break;
770  p -= size + trailer;
771  }
772  }
773  if (f->slice_count > (unsigned)MAX_SLICES || f->slice_count <= 0 || f->slice_count > f->max_slice_count) {
774  av_log(f->avctx, AV_LOG_ERROR, "slice count %d is invalid (max=%d)\n", f->slice_count, f->max_slice_count);
775  return AVERROR_INVALIDDATA;
776  }
777 
778  ff_refstruct_unref(&f->slice_damaged);
779  f->slice_damaged = ff_refstruct_allocz(f->slice_count * sizeof(*f->slice_damaged));
780  if (!f->slice_damaged)
781  return AVERROR(ENOMEM);
782 
783  for (int j = 0; j < f->slice_count; j++) {
784  FFV1SliceContext *sc = &f->slices[j];
785 
786  if (f->version == 2) {
787  int sx = get_symbol(c, state, 0);
788  int sy = get_symbol(c, state, 0);
789  int sw = get_symbol(c, state, 0) + 1U;
790  int sh = get_symbol(c, state, 0) + 1U;
791 
792  if (sx < 0 || sy < 0 || sw <= 0 || sh <= 0)
793  return AVERROR_INVALIDDATA;
794  if (sx > f->num_h_slices - sw || sy > f->num_v_slices - sh)
795  return AVERROR_INVALIDDATA;
796 
797  sc->slice_x = sx * (int64_t)f->width / f->num_h_slices;
798  sc->slice_y = sy * (int64_t)f->height / f->num_v_slices;
799  sc->slice_width = (sx + sw) * (int64_t)f->width / f->num_h_slices - sc->slice_x;
800  sc->slice_height = (sy + sh) * (int64_t)f->height / f->num_v_slices - sc->slice_y;
801 
802  av_assert0((unsigned)sc->slice_width <= f->width &&
803  (unsigned)sc->slice_height <= f->height);
804  av_assert0 ( (unsigned)sc->slice_x + (uint64_t)sc->slice_width <= f->width
805  && (unsigned)sc->slice_y + (uint64_t)sc->slice_height <= f->height);
806  }
807 
809  sc->plane = ff_ffv1_planes_alloc();
810  if (!sc->plane)
811  return AVERROR(ENOMEM);
812 
813  for (int i = 0; i < f->plane_count; i++) {
814  PlaneContext *const p = &sc->plane[i];
815 
816  if (f->version == 2) {
817  int idx = get_symbol(c, state, 0);
818  if (idx >= (unsigned)f->quant_table_count) {
819  av_log(f->avctx, AV_LOG_ERROR,
820  "quant_table_index out of range\n");
821  return AVERROR_INVALIDDATA;
822  }
823  p->quant_table_index = idx;
824  context_count = f->context_count[idx];
825  }
826 
827  if (f->version <= 2) {
828  av_assert0(context_count >= 0);
829  p->context_count = context_count;
830  }
831  }
832  }
833  return 0;
834 }
835 
837 {
838  FFV1Context *f = avctx->priv_data;
839  int ret;
840 
841  if ((ret = ff_ffv1_common_init(avctx)) < 0)
842  return ret;
843 
844  if (avctx->extradata_size > 0 && (ret = read_extra_header(f)) < 0)
845  return ret;
846 
847  if ((ret = ff_ffv1_init_slice_contexts(f)) < 0)
848  return ret;
849 
850  return 0;
851 }
852 
853 static int decode_frame(AVCodecContext *avctx, AVFrame *rframe,
854  int *got_frame, AVPacket *avpkt)
855 {
856  uint8_t *buf = avpkt->data;
857  int buf_size = avpkt->size;
858  FFV1Context *f = avctx->priv_data;
859  RangeCoder *const c = &f->slices[0].c;
860  int ret, key_frame;
861  uint8_t keystate = 128;
862  uint8_t *buf_p;
863  AVFrame *p;
864 
865  ff_progress_frame_unref(&f->last_picture);
866  FFSWAP(ProgressFrame, f->picture, f->last_picture);
867 
868 
869  f->avctx = avctx;
870  f->frame_damaged = 0;
871  ff_init_range_decoder(c, buf, buf_size);
872  ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
873 
874  if (get_rac(c, &keystate)) {
875  key_frame = AV_FRAME_FLAG_KEY;
876  f->key_frame_ok = 0;
877  if ((ret = read_header(f)) < 0)
878  return ret;
879  f->key_frame_ok = 1;
880  } else {
881  if (!f->key_frame_ok) {
882  av_log(avctx, AV_LOG_ERROR,
883  "Cannot decode non-keyframe without valid keyframe\n");
884  return AVERROR_INVALIDDATA;
885  }
886  key_frame = 0;
887  }
888 
889  if (f->ac != AC_GOLOMB_RICE) {
890  if (buf_size < avctx->width * avctx->height / (128*8))
891  return AVERROR_INVALIDDATA;
892  } else {
893  int w = avctx->width;
894  int s = 1 + w / (1<<23);
895  int i;
896 
897  w /= s;
898 
899  for (i = 0; w > (1<<ff_log2_run[i]); i++)
900  w -= ff_log2_run[i];
901  if (buf_size < (avctx->height + i + 6) / 8 * s)
902  return AVERROR_INVALIDDATA;
903  }
904 
905  ret = ff_progress_frame_get_buffer(avctx, &f->picture,
907  if (ret < 0)
908  return ret;
909 
910  p = f->picture.f;
911 
912  p->pict_type = AV_PICTURE_TYPE_I; //FIXME I vs. P
913  p->flags = (p->flags & ~AV_FRAME_FLAG_KEY) | key_frame;
914 
915  if (f->version < 3 && avctx->field_order > AV_FIELD_PROGRESSIVE) {
916  /* we have interlaced material flagged in container */
918  if (avctx->field_order == AV_FIELD_TT || avctx->field_order == AV_FIELD_TB)
920  }
921 
922  if (avctx->debug & FF_DEBUG_PICT_INFO)
923  av_log(avctx, AV_LOG_DEBUG, "ver:%d keyframe:%d coder:%d ec:%d slices:%d bps:%d\n",
924  f->version, !!(p->flags & AV_FRAME_FLAG_KEY), f->ac, f->ec, f->slice_count, f->avctx->bits_per_raw_sample);
925 
926  ff_thread_finish_setup(avctx);
927 
928  buf_p = buf + buf_size;
929  for (int i = f->slice_count - 1; i >= 0; i--) {
930  FFV1SliceContext *sc = &f->slices[i];
931  int trailer = 3 + 5*!!f->ec;
932  int v;
933 
934  sc->slice_damaged = 0;
935 
936  if (i || f->version > 2) {
937  if (trailer > buf_p - buf) v = INT_MAX;
938  else v = AV_RB24(buf_p-trailer) + trailer;
939  } else v = buf_p - c->bytestream_start;
940  if (buf_p - c->bytestream_start < v) {
941  av_log(avctx, AV_LOG_ERROR, "Slice pointer chain broken\n");
942  ff_progress_frame_report(&f->picture, INT_MAX);
943  return AVERROR_INVALIDDATA;
944  }
945  buf_p -= v;
946 
947  if (f->ec) {
948  unsigned crc = av_crc(av_crc_get_table(AV_CRC_32_IEEE), 0, buf_p, v);
949  if (crc) {
950  int64_t ts = avpkt->pts != AV_NOPTS_VALUE ? avpkt->pts : avpkt->dts;
951  av_log(f->avctx, AV_LOG_ERROR, "slice CRC mismatch %X!", crc);
952  if (ts != AV_NOPTS_VALUE && avctx->pkt_timebase.num) {
953  av_log(f->avctx, AV_LOG_ERROR, "at %f seconds\n", ts*av_q2d(avctx->pkt_timebase));
954  } else if (ts != AV_NOPTS_VALUE) {
955  av_log(f->avctx, AV_LOG_ERROR, "at %"PRId64"\n", ts);
956  } else {
957  av_log(f->avctx, AV_LOG_ERROR, "\n");
958  }
959  slice_set_damaged(f, sc);
960  }
961  if (avctx->debug & FF_DEBUG_PICT_INFO) {
962  av_log(avctx, AV_LOG_DEBUG, "slice %d, CRC: 0x%08"PRIX32"\n", i, AV_RB32(buf_p + v - 4));
963  }
964  }
965 
966  if (i) {
967  ff_init_range_decoder(&sc->c, buf_p, v);
968  ff_build_rac_states(&sc->c, 0.05 * (1LL << 32), 256 - 8);
969  } else
970  sc->c.bytestream_end = buf_p + v;
971 
972  }
973 
974  avctx->execute(avctx,
975  decode_slice,
976  f->slices,
977  NULL,
978  f->slice_count,
979  sizeof(*f->slices));
980 
981  for (int i = f->slice_count - 1; i >= 0; i--) {
982  FFV1SliceContext *sc = &f->slices[i];
983  if (sc->slice_damaged && f->last_picture.f) {
985  const uint8_t *src[4];
986  uint8_t *dst[4];
987  ff_progress_frame_await(&f->last_picture, INT_MAX);
988  for (int j = 0; j < desc->nb_components; j++) {
989  int pixshift = desc->comp[j].depth > 8;
990  int sh = (j == 1 || j == 2) ? f->chroma_h_shift : 0;
991  int sv = (j == 1 || j == 2) ? f->chroma_v_shift : 0;
992  dst[j] = p->data[j] + p->linesize[j] *
993  (sc->slice_y >> sv) + ((sc->slice_x >> sh) << pixshift);
994  src[j] = f->last_picture.f->data[j] + f->last_picture.f->linesize[j] *
995  (sc->slice_y >> sv) + ((sc->slice_x >> sh) << pixshift);
996 
997  }
998 
999  av_image_copy(dst, p->linesize, src,
1000  f->last_picture.f->linesize,
1001  avctx->pix_fmt,
1002  sc->slice_width,
1003  sc->slice_height);
1004 
1005  f->slice_damaged[i] = 1;
1006  }
1007  }
1008  ff_progress_frame_report(&f->picture, INT_MAX);
1009 
1010  ff_progress_frame_unref(&f->last_picture);
1011  if ((ret = av_frame_ref(rframe, f->picture.f)) < 0)
1012  return ret;
1013 
1014  *got_frame = 1;
1015 
1016  return buf_size;
1017 }
1018 
1019 #if HAVE_THREADS
1020 static int update_thread_context(AVCodecContext *dst, const AVCodecContext *src)
1021 {
1022  FFV1Context *fsrc = src->priv_data;
1023  FFV1Context *fdst = dst->priv_data;
1024 
1025  if (dst == src)
1026  return 0;
1027 
1028  fdst->version = fsrc->version;
1029  fdst->micro_version = fsrc->micro_version;
1030  fdst->chroma_planes = fsrc->chroma_planes;
1031  fdst->chroma_h_shift = fsrc->chroma_h_shift;
1032  fdst->chroma_v_shift = fsrc->chroma_v_shift;
1033  fdst->transparency = fsrc->transparency;
1034  fdst->plane_count = fsrc->plane_count;
1035  fdst->ac = fsrc->ac;
1036  fdst->colorspace = fsrc->colorspace;
1037 
1038  fdst->ec = fsrc->ec;
1039  fdst->intra = fsrc->intra;
1040  fdst->key_frame_ok = fsrc->key_frame_ok;
1041 
1042  fdst->packed_at_lsb = fsrc->packed_at_lsb;
1043  fdst->slice_count = fsrc->slice_count;
1044  fdst->use32bit = fsrc->use32bit;
1045  memcpy(fdst->state_transition, fsrc->state_transition,
1046  sizeof(fdst->state_transition));
1047 
1048  // in version 1 there is a single per-keyframe quant table, so
1049  // we need to propagate it between threads
1050  if (fsrc->version < 2)
1051  memcpy(fdst->quant_tables[0], fsrc->quant_tables[0], sizeof(fsrc->quant_tables[0]));
1052 
1053  for (int i = 0; i < fdst->num_h_slices * fdst->num_v_slices; i++) {
1054  FFV1SliceContext *sc = &fdst->slices[i];
1055  const FFV1SliceContext *sc0 = &fsrc->slices[i];
1056 
1057  ff_refstruct_replace(&sc->plane, sc0->plane);
1058 
1059  if (fsrc->version < 3) {
1060  sc->slice_x = sc0->slice_x;
1061  sc->slice_y = sc0->slice_y;
1062  sc->slice_width = sc0->slice_width;
1063  sc->slice_height = sc0->slice_height;
1064  }
1065  }
1066 
1068 
1069  av_assert1(fdst->max_slice_count == fsrc->max_slice_count);
1070 
1071  ff_progress_frame_replace(&fdst->picture, &fsrc->picture);
1072 
1073  return 0;
1074 }
1075 #endif
1076 
1078 {
1079  FFV1Context *const s = avctx->priv_data;
1080 
1081  ff_progress_frame_unref(&s->picture);
1082  ff_progress_frame_unref(&s->last_picture);
1083 
1084  return ff_ffv1_close(avctx);
1085 }
1086 
1088  .p.name = "ffv1",
1089  CODEC_LONG_NAME("FFmpeg video codec #1"),
1090  .p.type = AVMEDIA_TYPE_VIDEO,
1091  .p.id = AV_CODEC_ID_FFV1,
1092  .priv_data_size = sizeof(FFV1Context),
1093  .init = decode_init,
1094  .close = ffv1_decode_close,
1097  .p.capabilities = AV_CODEC_CAP_DR1 |
1099  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP |
1101 };
AV_PIX_FMT_YUVA422P16
#define AV_PIX_FMT_YUVA422P16
Definition: pixfmt.h:522
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:1783
read_extra_header
static int read_extra_header(FFV1Context *f)
Definition: ffv1dec.c:408
AV_PIX_FMT_GBRAP16
#define AV_PIX_FMT_GBRAP16
Definition: pixfmt.h:501
state
static struct @449 state
FFV1Context::chroma_v_shift
int chroma_v_shift
Definition: ffv1.h:115
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:186
FFV1SliceContext::slice_height
int slice_height
Definition: ffv1.h:75
FFV1Context::key_frame_ok
int key_frame_ok
Definition: ffv1.h:135
update_vlc_state
static void update_vlc_state(VlcState *const state, const int v)
Definition: ffv1.h:185
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:43
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:695
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:267
AV_PIX_FMT_YA8
@ AV_PIX_FMT_YA8
8 bits gray, 8 bits alpha
Definition: pixfmt.h:140
av_pix_fmt_desc_get
const AVPixFmtDescriptor * av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt)
Definition: pixdesc.c:2965
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:85
FFV1Context::ec
int ec
Definition: ffv1.h:133
int64_t
long long int64_t
Definition: coverity.c:34
AV_PIX_FMT_YUVA422P9
#define AV_PIX_FMT_YUVA422P9
Definition: pixfmt.h:514
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:374
pixdesc.h
ff_ffv1_common_init
av_cold int ff_ffv1_common_init(AVCodecContext *avctx)
Definition: ffv1.c:36
AV_PIX_FMT_YUVA420P16
#define AV_PIX_FMT_YUVA420P16
Definition: pixfmt.h:521
w
uint8_t w
Definition: llviddspenc.c:38
AVPacket::data
uint8_t * data
Definition: packet.h:533
AV_PIX_FMT_YUVA420P10
#define AV_PIX_FMT_YUVA420P10
Definition: pixfmt.h:516
AVCodecContext::field_order
enum AVFieldOrder field_order
Field order.
Definition: avcodec.h:708
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:1741
rangecoder.h
AVComponentDescriptor::step
int step
Number of elements between 2 horizontally consecutive pixels.
Definition: pixdesc.h:40
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:478
PlaneContext::state
uint8_t(* state)[CONTEXT_SIZE]
Definition: ffv1.h:64
FFCodec
Definition: codec_internal.h:127
FFV1Context::num_h_slices
int num_h_slices
Definition: ffv1.h:147
RangeCoder::bytestream_end
uint8_t * bytestream_end
Definition: rangecoder.h:44
AV_PIX_FMT_YUV440P
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:106
AVFrame::flags
int flags
Frame flags, a combination of AV_FRAME_FLAGS.
Definition: frame.h:646
read_quant_table
static int read_quant_table(RangeCoder *c, int16_t *quant_table, int scale)
Definition: ffv1dec.c:363
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
AC_RANGE_CUSTOM_TAB
#define AC_RANGE_CUSTOM_TAB
Definition: ffv1.h:51
AV_PIX_FMT_YUVA422P10
#define AV_PIX_FMT_YUVA422P10
Definition: pixfmt.h:517
init_get_bits
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:514
thread.h
FFV1Context::chroma_h_shift
int chroma_h_shift
Definition: ffv1.h:115
FFV1SliceContext::slice_x
int slice_x
Definition: ffv1.h:76
ff_ffv1_clear_slice_state
void ff_ffv1_clear_slice_state(const FFV1Context *f, FFV1SliceContext *sc)
Definition: ffv1.c:178
FF_DEBUG_PICT_INFO
#define FF_DEBUG_PICT_INFO
Definition: avcodec.h:1401
AV_PIX_FMT_GRAY9
#define AV_PIX_FMT_GRAY9
Definition: pixfmt.h:458
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:395
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
golomb.h
exp golomb vlc stuff
AV_PIX_FMT_YUVA420P9
#define AV_PIX_FMT_YUVA420P9
Definition: pixfmt.h:513
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
AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_GBRP14
Definition: pixfmt.h:496
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:494
AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA444P16
Definition: pixfmt.h:523
ffv1_decode_close
static av_cold int ffv1_decode_close(AVCodecContext *avctx)
Definition: ffv1dec.c:1077
GetBitContext
Definition: get_bits.h:108
AV_PIX_FMT_YUV422P9
#define AV_PIX_FMT_YUV422P9
Definition: pixfmt.h:476
av_noinline
#define av_noinline
Definition: attributes.h:72
MAX_SLICES
#define MAX_SLICES
Definition: d3d12va_hevc.c:33
CONTEXT_SIZE
#define CONTEXT_SIZE
Definition: ffv1.h:44
AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GRAY16
Definition: pixfmt.h:462
get_symbol_inline
static av_flatten int get_symbol_inline(RangeCoder *c, uint8_t *state, int is_signed)
Definition: ffv1dec.c:44
FFV1Context::chroma_planes
int chroma_planes
Definition: ffv1.h:114
PlaneContext::context_count
int context_count
Definition: ffv1.h:63
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:134
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:481
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:69
FFV1Context::quant_tables
int16_t quant_tables[MAX_QUANT_TABLES][MAX_CONTEXT_INPUTS][256]
Definition: ffv1.h:125
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
av_cold
#define av_cold
Definition: attributes.h:90
AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_YUV422P16
Definition: pixfmt.h:490
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:71
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 pixel_stride)
Definition: ffv1dec.c:120
FFV1Context::use32bit
int use32bit
Definition: ffv1.h:131
AV_PIX_FMT_GBRAP10
#define AV_PIX_FMT_GBRAP10
Definition: pixfmt.h:498
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:524
width
#define width
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:311
s
#define s(width, name)
Definition: cbs_vp9.c:198
AV_PIX_FMT_GBRAP14
#define AV_PIX_FMT_GBRAP14
Definition: pixfmt.h:500
AV_PIX_FMT_GBRAP12
#define AV_PIX_FMT_GBRAP12
Definition: pixfmt.h:499
FFV1Context::slice_count
int slice_count
Definition: ffv1.h:144
AV_PIX_FMT_YUVA420P
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition: pixfmt.h:108
AV_PIX_FMT_YUV444P16
#define AV_PIX_FMT_YUV444P16
Definition: pixfmt.h:491
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:425
decode_frame
static int decode_frame(AVCodecContext *avctx, AVFrame *rframe, int *got_frame, AVPacket *avpkt)
Definition: ffv1dec.c:853
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:145
bits
uint8_t bits
Definition: vp3data.h:128
FFV1Context::intra
int intra
Definition: ffv1.h:134
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
is_input_end
static int is_input_end(RangeCoder *c, GetBitContext *gb, int ac)
Definition: ffv1dec.c:98
AV_PIX_FMT_YUVA444P12
#define AV_PIX_FMT_YUVA444P12
Definition: pixfmt.h:520
AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUV420P9
Definition: pixfmt.h:475
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:201
read_quant_tables
static int read_quant_tables(RangeCoder *c, int16_t quant_table[MAX_CONTEXT_INPUTS][256])
Definition: ffv1dec.c:390
AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV420P16
Definition: pixfmt.h:489
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:1766
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
get_bits.h
AV_PIX_FMT_GRAY14
#define AV_PIX_FMT_GRAY14
Definition: pixfmt.h:461
fold
static av_always_inline int fold(int diff, int bits)
Definition: ffv1.h:174
FFV1Context::ac
int ac
1=range coder <-> 0=golomb rice
Definition: ffv1.h:124
get_vlc_symbol
static int get_vlc_symbol(GetBitContext *gb, VlcState *const state, int bits)
Definition: ffv1dec.c:73
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
FFV1Context::plane_count
int plane_count
Definition: ffv1.h:123
FFV1Context::slice_damaged
uint8_t * slice_damaged
Definition: ffv1.h:157
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:296
arg
const char * arg
Definition: jacosubdec.c:67
AV_PIX_FMT_GRAY10
#define AV_PIX_FMT_GRAY10
Definition: pixfmt.h:459
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:110
quant_table
static const int16_t quant_table[64]
Definition: intrax8.c:517
AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_GBRP16
Definition: pixfmt.h:497
read_header
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:535
get_symbol
static av_noinline int get_symbol(RangeCoder *c, uint8_t *state, int is_signed)
Definition: ffv1dec.c:68
NULL
#define NULL
Definition: coverity.c:32
PlaneContext::vlc_state
VlcState * vlc_state
Definition: ffv1.h:65
AC_GOLOMB_RICE
#define AC_GOLOMB_RICE
Definition: ffv1.h:49
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
FFV1Context::num_v_slices
int num_v_slices
Definition: ffv1.h:146
FFV1Context::colorspace
int colorspace
Definition: ffv1.h:129
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:1087
FFV1Context::slices
FFV1SliceContext * slices
Definition: ffv1.h:149
FFV1Context::state_transition
uint8_t state_transition[256]
Definition: ffv1.h:127
AV_PIX_FMT_YUV440P10
#define AV_PIX_FMT_YUV440P10
Definition: pixfmt.h:480
mathops.h
ff_refstruct_allocz
static void * ff_refstruct_allocz(size_t size)
Equivalent to ff_refstruct_alloc_ext(size, 0, NULL, NULL)
Definition: refstruct.h:105
PlaneContext
Definition: ffv1.h:61
UPDATE_THREAD_CONTEXT
#define UPDATE_THREAD_CONTEXT(func)
Definition: codec_internal.h:305
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:479
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:81
AV_PIX_FMT_GBRP9
#define AV_PIX_FMT_GBRP9
Definition: pixfmt.h:493
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
VlcState
Definition: ffv1.h:54
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:28
FFV1SliceContext::slice_width
int slice_width
Definition: ffv1.h:74
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:476
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:366
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
AVPacket::size
int size
Definition: packet.h:534
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:386
codec_internal.h
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:483
ff_ffv1_close
av_cold int ff_ffv1_close(AVCodecContext *avctx)
Definition: ffv1.c:203
AVCodecContext::pkt_timebase
AVRational pkt_timebase
Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed.
Definition: avcodec.h:551
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
slice_set_damaged
static void slice_set_damaged(FFV1Context *f, FFV1SliceContext *sc)
Definition: ffv1dec.c:257
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
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:485
RangeCoder::bytestream
uint8_t * bytestream
Definition: rangecoder.h:43
FFV1Context::picture
ProgressFrame picture
Definition: ffv1.h:120
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:532
height
#define height
AV_PIX_FMT_RGB32
#define AV_PIX_FMT_RGB32
Definition: pixfmt.h:451
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
AV_PIX_FMT_YUVA444P
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition: pixfmt.h:174
FFV1SliceContext::slice_rct_by_coef
int slice_rct_by_coef
Definition: ffv1.h:81
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:114
AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUVA444P10
Definition: pixfmt.h:518
ff_ffv1_init_slice_state
av_cold int ff_ffv1_init_slice_state(const FFV1Context *f, FFV1SliceContext *sc)
Definition: ffv1.c:74
PlaneContext::quant_table_index
int quant_table_index
Definition: ffv1.h:62
FF_THREAD_FRAME
#define FF_THREAD_FRAME
Decode more than one frame at once.
Definition: avcodec.h:1598
FFV1SliceContext::c
RangeCoder c
Definition: ffv1.h:87
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:526
FFV1SliceContext::slice_rct_ry_coef
int slice_rct_ry_coef
Definition: ffv1.h:82
av_flatten
#define av_flatten
Definition: attributes.h:96
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:495
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:56
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
ffv1.h
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:194
FFV1SliceContext
Definition: ffv1.h:70
len
int len
Definition: vorbis_enc_data.h:426
get_rac
static int get_rac(RangeCoder *c, uint8_t *const state)
Definition: rangecoder.h:127
AV_CRC_32_IEEE
@ AV_CRC_32_IEEE
Definition: crc.h:52
AVCodecContext::height
int height
Definition: avcodec.h:618
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:657
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:633
AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_YUV444P9
Definition: pixfmt.h:477
MAX_CONTEXT_INPUTS
#define MAX_CONTEXT_INPUTS
Definition: ffv1.h:47
FFV1Context::packed_at_lsb
int packed_at_lsb
Definition: ffv1.h:139
avcodec.h
stride
#define stride
Definition: h264pred_template.c:537
ret
ret
Definition: filter_design.txt:187
pred
static const float pred[4]
Definition: siprdata.h:259
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
AV_PIX_FMT_0RGB32
#define AV_PIX_FMT_0RGB32
Definition: pixfmt.h:455
decode_slice_header
static int decode_slice_header(const FFV1Context *f, FFV1SliceContext *sc, AVFrame *frame)
Definition: ffv1dec.c:168
FFV1SliceContext::slice_y
int slice_y
Definition: ffv1.h:77
AV_PIX_FMT_YUVA444P9
#define AV_PIX_FMT_YUVA444P9
Definition: pixfmt.h:515
ff_refstruct_replace
void ff_refstruct_replace(void *dstp, const void *src)
Ensure *dstp refers to the same object as src.
Definition: refstruct.c:160
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
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:482
U
#define U(x)
Definition: vpx_arith.h:37
ff_ffv1_planes_alloc
PlaneContext * ff_ffv1_planes_alloc(void)
Definition: ffv1.c:68
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:1773
AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_YUV422P14
Definition: pixfmt.h:487
ff_ffv1_allocate_initial_states
int ff_ffv1_allocate_initial_states(FFV1Context *f)
Definition: ffv1.c:163
AVCodecContext
main external API structure.
Definition: avcodec.h:445
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:1617
decode_init
static av_cold int decode_init(AVCodecContext *avctx)
Definition: ffv1dec.c:836
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_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:72
AV_PIX_FMT_YUVA422P12
#define AV_PIX_FMT_YUVA422P12
Definition: pixfmt.h:519
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
AVPixFmtDescriptor::comp
AVComponentDescriptor comp[4]
Parameters that describe how pixels are packed.
Definition: pixdesc.h:105
temp
else temp
Definition: vf_mcdeint.c:263
AV_PIX_FMT_YUV444P
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition: pixfmt.h:78
AVCodecContext::debug
int debug
debug
Definition: avcodec.h:1400
desc
const char * desc
Definition: libsvtav1.c:79
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:77
mem.h
MAX_QUANT_TABLES
#define MAX_QUANT_TABLES
Definition: ffv1.h:46
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:106
FFV1Context::transparency
int transparency
Definition: ffv1.h:116
scale
static void scale(int *out, const int *in, const int w, const int h, const int shift)
Definition: intra.c:291
ProgressFrame
The ProgressFrame structure.
Definition: progressframe.h:73
AVPacket
This structure stores compressed data.
Definition: packet.h:510
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:472
FFV1SliceContext::run_index
int run_index
Definition: ffv1.h:79
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:34
src
INIT_CLIP pixel * src
Definition: h264pred_template.c:418
AV_PIX_FMT_YUV411P
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:80
ffv1dec_template.c
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:618
ff_ffv1_init_slice_contexts
av_cold int ff_ffv1_init_slice_contexts(FFV1Context *f)
Definition: ffv1.c:122
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:94
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:419
AV_PIX_FMT_YUV410P
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:79
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:112
AV_PIX_FMT_YUV440P12
#define AV_PIX_FMT_YUV440P12
Definition: pixfmt.h:484
h
h
Definition: vp9dsp_template.c:2070
RangeCoder
Definition: mss3.c:63
AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUV444P14
Definition: pixfmt.h:488
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
AV_PIX_FMT_GRAY12
#define AV_PIX_FMT_GRAY12
Definition: pixfmt.h:460
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:89
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:95
FFV1SliceContext::slice_coding_mode
int slice_coding_mode
Definition: ffv1.h:80
ff_refstruct_unref
void ff_refstruct_unref(void *objp)
Decrement the reference count of the underlying object and automatically free the object if there are...
Definition: refstruct.c:120
planes
static const struct @450 planes[]
FFV1Context::version
int version
Definition: ffv1.h:111
AV_PIX_FMT_YUVA422P
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
Definition: pixfmt.h:173
AV_PIX_FMT_YUV420P14
#define AV_PIX_FMT_YUV420P14
Definition: pixfmt.h:486