FFmpeg
dnxhddec.c
Go to the documentation of this file.
1 /*
2  * VC3/DNxHD decoder.
3  * Copyright (c) 2007 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>
4  * Copyright (c) 2011 MirriAd Ltd
5  * Copyright (c) 2015 Christophe Gisquet
6  *
7  * 10 bit support added by MirriAd Ltd, Joseph Artsimovich <joseph@mirriad.com>
8  * Slice multithreading and MB interlaced support added by Christophe Gisquet
9  *
10  * This file is part of FFmpeg.
11  *
12  * FFmpeg is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU Lesser General Public
14  * License as published by the Free Software Foundation; either
15  * version 2.1 of the License, or (at your option) any later version.
16  *
17  * FFmpeg is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20  * Lesser General Public License for more details.
21  *
22  * You should have received a copy of the GNU Lesser General Public
23  * License along with FFmpeg; if not, write to the Free Software
24  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25  */
26 
27 #include "libavutil/imgutils.h"
28 #include "avcodec.h"
29 #include "blockdsp.h"
30 #define UNCHECKED_BITSTREAM_READER 1
31 #include "get_bits.h"
32 #include "dnxhddata.h"
33 #include "idctdsp.h"
34 #include "internal.h"
35 #include "profiles.h"
36 #include "thread.h"
37 
38 typedef struct RowContext {
39  DECLARE_ALIGNED(32, int16_t, blocks)[12][64];
40  int luma_scale[64];
41  int chroma_scale[64];
43  int last_dc[3];
45  int errors;
46  /** -1:not set yet 0:off=RGB 1:on=YUV 2:variable */
47  int format;
48 } RowContext;
49 
50 typedef struct DNXHDContext {
54  const uint8_t* buf;
55  int buf_size;
56  int64_t cid; ///< compression id
57  unsigned int width, height;
59  unsigned int mb_width, mb_height;
60  uint32_t mb_scan_index[512];
61  int data_offset; // End of mb_scan_index, where macroblocks start
62  int cur_field; ///< current interlaced field
67  int bit_depth; // 8, 10, 12 or 0 if not initialized at all.
68  int is_444;
69  int alpha;
70  int lla;
71  int mbaff;
72  int act;
74  RowContext *row, int n);
75 } DNXHDContext;
76 
77 #define DNXHD_VLC_BITS 9
78 #define DNXHD_DC_VLC_BITS 7
79 
80 static int dnxhd_decode_dct_block_8(const DNXHDContext *ctx,
81  RowContext *row, int n);
83  RowContext *row, int n);
85  RowContext *row, int n);
87  RowContext *row, int n);
89  RowContext *row, int n);
90 
92 {
94 
95  ctx->avctx = avctx;
96  ctx->cid = -1;
99  }
100 
103 
104  ctx->rows = av_mallocz_array(avctx->thread_count, sizeof(RowContext));
105  if (!ctx->rows)
106  return AVERROR(ENOMEM);
107 
108  return 0;
109 }
110 
111 static int dnxhd_init_vlc(DNXHDContext *ctx, uint32_t cid, int bitdepth)
112 {
113  int ret;
114  if (cid != ctx->cid) {
115  int index;
116 
117  if ((index = ff_dnxhd_get_cid_table(cid)) < 0) {
118  av_log(ctx->avctx, AV_LOG_ERROR, "unsupported cid %"PRIu32"\n", cid);
119  return AVERROR(ENOSYS);
120  }
121  if (ff_dnxhd_cid_table[index].bit_depth != bitdepth &&
123  av_log(ctx->avctx, AV_LOG_ERROR, "bit depth mismatches %d %d\n", ff_dnxhd_cid_table[index].bit_depth, bitdepth);
124  return AVERROR_INVALIDDATA;
125  }
126  ctx->cid_table = &ff_dnxhd_cid_table[index];
127  av_log(ctx->avctx, AV_LOG_VERBOSE, "Profile cid %"PRIu32".\n", cid);
128 
129  ff_free_vlc(&ctx->ac_vlc);
130  ff_free_vlc(&ctx->dc_vlc);
131  ff_free_vlc(&ctx->run_vlc);
132 
133  if ((ret = init_vlc(&ctx->ac_vlc, DNXHD_VLC_BITS, 257,
134  ctx->cid_table->ac_bits, 1, 1,
135  ctx->cid_table->ac_codes, 2, 2, 0)) < 0)
136  goto out;
137  if ((ret = init_vlc(&ctx->dc_vlc, DNXHD_DC_VLC_BITS, bitdepth > 8 ? 14 : 12,
138  ctx->cid_table->dc_bits, 1, 1,
139  ctx->cid_table->dc_codes, 1, 1, 0)) < 0)
140  goto out;
141  if ((ret = init_vlc(&ctx->run_vlc, DNXHD_VLC_BITS, 62,
142  ctx->cid_table->run_bits, 1, 1,
143  ctx->cid_table->run_codes, 2, 2, 0)) < 0)
144  goto out;
145 
146  ctx->cid = cid;
147  }
148  ret = 0;
149 out:
150  if (ret < 0)
151  av_log(ctx->avctx, AV_LOG_ERROR, "init_vlc failed\n");
152  return ret;
153 }
154 
155 static int dnxhd_get_profile(int cid)
156 {
157  switch(cid) {
158  case 1270:
159  return FF_PROFILE_DNXHR_444;
160  case 1271:
161  return FF_PROFILE_DNXHR_HQX;
162  case 1272:
163  return FF_PROFILE_DNXHR_HQ;
164  case 1273:
165  return FF_PROFILE_DNXHR_SQ;
166  case 1274:
167  return FF_PROFILE_DNXHR_LB;
168  }
169  return FF_PROFILE_DNXHD;
170 }
171 
173  const uint8_t *buf, int buf_size,
174  int first_field)
175 {
176  int i, cid, ret;
177  int old_bit_depth = ctx->bit_depth, bitdepth;
178  uint64_t header_prefix;
179  if (buf_size < 0x280) {
180  av_log(ctx->avctx, AV_LOG_ERROR,
181  "buffer too small (%d < 640).\n", buf_size);
182  return AVERROR_INVALIDDATA;
183  }
184 
185  header_prefix = ff_dnxhd_parse_header_prefix(buf);
186  if (header_prefix == 0) {
187  av_log(ctx->avctx, AV_LOG_ERROR,
188  "unknown header 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n",
189  buf[0], buf[1], buf[2], buf[3], buf[4]);
190  return AVERROR_INVALIDDATA;
191  }
192  if (buf[5] & 2) { /* interlaced */
193  ctx->cur_field = buf[5] & 1;
194  frame->interlaced_frame = 1;
195  frame->top_field_first = first_field ^ ctx->cur_field;
196  av_log(ctx->avctx, AV_LOG_DEBUG,
197  "interlaced %d, cur field %d\n", buf[5] & 3, ctx->cur_field);
198  } else {
199  ctx->cur_field = 0;
200  }
201  ctx->mbaff = (buf[0x6] >> 5) & 1;
202  ctx->alpha = buf[0x7] & 1;
203  ctx->lla = (buf[0x7] >> 1) & 1;
204  if (ctx->alpha)
205  avpriv_request_sample(ctx->avctx, "alpha");
206 
207  ctx->height = AV_RB16(buf + 0x18);
208  ctx->width = AV_RB16(buf + 0x1a);
209 
210  switch(buf[0x21] >> 5) {
211  case 1: bitdepth = 8; break;
212  case 2: bitdepth = 10; break;
213  case 3: bitdepth = 12; break;
214  default:
215  av_log(ctx->avctx, AV_LOG_ERROR,
216  "Unknown bitdepth indicator (%d)\n", buf[0x21] >> 5);
217  return AVERROR_INVALIDDATA;
218  }
219 
220  cid = AV_RB32(buf + 0x28);
221 
222  ctx->avctx->profile = dnxhd_get_profile(cid);
223 
224  if ((ret = dnxhd_init_vlc(ctx, cid, bitdepth)) < 0)
225  return ret;
226  if (ctx->mbaff && ctx->cid_table->cid != 1260)
227  av_log(ctx->avctx, AV_LOG_WARNING,
228  "Adaptive MB interlace flag in an unsupported profile.\n");
229 
230  switch ((buf[0x2C] >> 1) & 3) {
231  case 0: frame->colorspace = AVCOL_SPC_BT709; break;
232  case 1: frame->colorspace = AVCOL_SPC_BT2020_NCL; break;
233  case 2: frame->colorspace = AVCOL_SPC_BT2020_CL; break;
234  case 3: frame->colorspace = AVCOL_SPC_UNSPECIFIED; break;
235  }
236 
237  ctx->act = buf[0x2C] & 1;
238  if (ctx->act && ctx->cid_table->cid != 1256 && ctx->cid_table->cid != 1270)
239  av_log(ctx->avctx, AV_LOG_WARNING,
240  "Adaptive color transform in an unsupported profile.\n");
241 
242  ctx->is_444 = (buf[0x2C] >> 6) & 1;
243  if (ctx->is_444) {
244  if (bitdepth == 8) {
245  avpriv_request_sample(ctx->avctx, "4:4:4 8 bits");
246  return AVERROR_INVALIDDATA;
247  } else if (bitdepth == 10) {
248  ctx->decode_dct_block = dnxhd_decode_dct_block_10_444;
249  ctx->pix_fmt = ctx->act ? AV_PIX_FMT_YUV444P10
251  } else {
252  ctx->decode_dct_block = dnxhd_decode_dct_block_12_444;
253  ctx->pix_fmt = ctx->act ? AV_PIX_FMT_YUV444P12
255  }
256  } else if (bitdepth == 12) {
257  ctx->decode_dct_block = dnxhd_decode_dct_block_12;
258  ctx->pix_fmt = AV_PIX_FMT_YUV422P12;
259  } else if (bitdepth == 10) {
260  if (ctx->avctx->profile == FF_PROFILE_DNXHR_HQX)
261  ctx->decode_dct_block = dnxhd_decode_dct_block_10_444;
262  else
263  ctx->decode_dct_block = dnxhd_decode_dct_block_10;
264  ctx->pix_fmt = AV_PIX_FMT_YUV422P10;
265  } else {
266  ctx->decode_dct_block = dnxhd_decode_dct_block_8;
267  ctx->pix_fmt = AV_PIX_FMT_YUV422P;
268  }
269 
270  ctx->avctx->bits_per_raw_sample = ctx->bit_depth = bitdepth;
271  if (ctx->bit_depth != old_bit_depth) {
272  ff_blockdsp_init(&ctx->bdsp, ctx->avctx);
273  ff_idctdsp_init(&ctx->idsp, ctx->avctx);
274  ff_init_scantable(ctx->idsp.idct_permutation, &ctx->scantable,
276  }
277 
278  // make sure profile size constraints are respected
279  // DNx100 allows 1920->1440 and 1280->960 subsampling
280  if (ctx->width != ctx->cid_table->width &&
281  ctx->cid_table->width != DNXHD_VARIABLE) {
282  av_reduce(&ctx->avctx->sample_aspect_ratio.num,
283  &ctx->avctx->sample_aspect_ratio.den,
284  ctx->width, ctx->cid_table->width, 255);
285  ctx->width = ctx->cid_table->width;
286  }
287 
288  if (buf_size < ctx->cid_table->coding_unit_size) {
289  av_log(ctx->avctx, AV_LOG_ERROR, "incorrect frame size (%d < %u).\n",
290  buf_size, ctx->cid_table->coding_unit_size);
291  return AVERROR_INVALIDDATA;
292  }
293 
294  ctx->mb_width = (ctx->width + 15)>> 4;
295  ctx->mb_height = AV_RB16(buf + 0x16c);
296 
297  if ((ctx->height + 15) >> 4 == ctx->mb_height && frame->interlaced_frame)
298  ctx->height <<= 1;
299 
300  av_log(ctx->avctx, AV_LOG_VERBOSE, "%dx%d, 4:%s %d bits, MBAFF=%d ACT=%d\n",
301  ctx->width, ctx->height, ctx->is_444 ? "4:4" : "2:2",
302  ctx->bit_depth, ctx->mbaff, ctx->act);
303 
304  // Newer format supports variable mb_scan_index sizes
305  if (ctx->mb_height > 68 && ff_dnxhd_check_header_prefix_hr(header_prefix)) {
306  ctx->data_offset = 0x170 + (ctx->mb_height << 2);
307  } else {
308  if (ctx->mb_height > 68) {
309  av_log(ctx->avctx, AV_LOG_ERROR,
310  "mb height too big: %d\n", ctx->mb_height);
311  return AVERROR_INVALIDDATA;
312  }
313  ctx->data_offset = 0x280;
314  }
315  if ((ctx->mb_height << frame->interlaced_frame) > (ctx->height + 15) >> 4) {
316  av_log(ctx->avctx, AV_LOG_ERROR,
317  "mb height too big: %d\n", ctx->mb_height);
318  return AVERROR_INVALIDDATA;
319  }
320 
321  if (buf_size < ctx->data_offset) {
322  av_log(ctx->avctx, AV_LOG_ERROR,
323  "buffer too small (%d < %d).\n", buf_size, ctx->data_offset);
324  return AVERROR_INVALIDDATA;
325  }
326 
327  if (ctx->mb_height > FF_ARRAY_ELEMS(ctx->mb_scan_index)) {
328  av_log(ctx->avctx, AV_LOG_ERROR,
329  "mb_height too big (%d > %"SIZE_SPECIFIER").\n", ctx->mb_height, FF_ARRAY_ELEMS(ctx->mb_scan_index));
330  return AVERROR_INVALIDDATA;
331  }
332 
333  for (i = 0; i < ctx->mb_height; i++) {
334  ctx->mb_scan_index[i] = AV_RB32(buf + 0x170 + (i << 2));
335  ff_dlog(ctx->avctx, "mb scan index %d, pos %d: %"PRIu32"\n",
336  i, 0x170 + (i << 2), ctx->mb_scan_index[i]);
337  if (buf_size - ctx->data_offset < ctx->mb_scan_index[i]) {
338  av_log(ctx->avctx, AV_LOG_ERROR,
339  "invalid mb scan index (%"PRIu32" vs %u).\n",
340  ctx->mb_scan_index[i], buf_size - ctx->data_offset);
341  return AVERROR_INVALIDDATA;
342  }
343  }
344 
345  return 0;
346 }
347 
349  RowContext *row,
350  int n,
351  int index_bits,
352  int level_bias,
353  int level_shift,
354  int dc_shift)
355 {
356  int i, j, index1, index2, len, flags;
357  int level, component, sign;
358  const int *scale;
359  const uint8_t *weight_matrix;
360  const uint8_t *ac_info = ctx->cid_table->ac_info;
361  int16_t *block = row->blocks[n];
362  const int eob_index = ctx->cid_table->eob_index;
363  int ret = 0;
364  OPEN_READER(bs, &row->gb);
365 
366  ctx->bdsp.clear_block(block);
367 
368  if (!ctx->is_444) {
369  if (n & 2) {
370  component = 1 + (n & 1);
371  scale = row->chroma_scale;
372  weight_matrix = ctx->cid_table->chroma_weight;
373  } else {
374  component = 0;
375  scale = row->luma_scale;
376  weight_matrix = ctx->cid_table->luma_weight;
377  }
378  } else {
379  component = (n >> 1) % 3;
380  if (component) {
381  scale = row->chroma_scale;
382  weight_matrix = ctx->cid_table->chroma_weight;
383  } else {
384  scale = row->luma_scale;
385  weight_matrix = ctx->cid_table->luma_weight;
386  }
387  }
388 
389  UPDATE_CACHE(bs, &row->gb);
390  GET_VLC(len, bs, &row->gb, ctx->dc_vlc.table, DNXHD_DC_VLC_BITS, 1);
391  if (len < 0) {
392  ret = len;
393  goto error;
394  }
395  if (len) {
396  level = GET_CACHE(bs, &row->gb);
397  LAST_SKIP_BITS(bs, &row->gb, len);
398  sign = ~level >> 31;
399  level = (NEG_USR32(sign ^ level, len) ^ sign) - sign;
400  row->last_dc[component] += level * (1 << dc_shift);
401  }
402  block[0] = row->last_dc[component];
403 
404  i = 0;
405 
406  UPDATE_CACHE(bs, &row->gb);
407  GET_VLC(index1, bs, &row->gb, ctx->ac_vlc.table,
408  DNXHD_VLC_BITS, 2);
409 
410  while (index1 != eob_index) {
411  level = ac_info[2*index1+0];
412  flags = ac_info[2*index1+1];
413 
414  sign = SHOW_SBITS(bs, &row->gb, 1);
415  SKIP_BITS(bs, &row->gb, 1);
416 
417  if (flags & 1) {
418  level += SHOW_UBITS(bs, &row->gb, index_bits) << 7;
419  SKIP_BITS(bs, &row->gb, index_bits);
420  }
421 
422  if (flags & 2) {
423  UPDATE_CACHE(bs, &row->gb);
424  GET_VLC(index2, bs, &row->gb, ctx->run_vlc.table,
425  DNXHD_VLC_BITS, 2);
426  i += ctx->cid_table->run[index2];
427  }
428 
429  if (++i > 63) {
430  av_log(ctx->avctx, AV_LOG_ERROR, "ac tex damaged %d, %d\n", n, i);
431  ret = -1;
432  break;
433  }
434 
435  j = ctx->scantable.permutated[i];
436  level *= scale[i];
437  level += scale[i] >> 1;
438  if (level_bias < 32 || weight_matrix[i] != level_bias)
439  level += level_bias; // 1<<(level_shift-1)
440  level >>= level_shift;
441 
442  block[j] = (level ^ sign) - sign;
443 
444  UPDATE_CACHE(bs, &row->gb);
445  GET_VLC(index1, bs, &row->gb, ctx->ac_vlc.table,
446  DNXHD_VLC_BITS, 2);
447  }
448 error:
449  CLOSE_READER(bs, &row->gb);
450  return ret;
451 }
452 
454  RowContext *row, int n)
455 {
456  return dnxhd_decode_dct_block(ctx, row, n, 4, 32, 6, 0);
457 }
458 
460  RowContext *row, int n)
461 {
462  return dnxhd_decode_dct_block(ctx, row, n, 6, 8, 4, 0);
463 }
464 
466  RowContext *row, int n)
467 {
468  return dnxhd_decode_dct_block(ctx, row, n, 6, 32, 6, 0);
469 }
470 
472  RowContext *row, int n)
473 {
474  return dnxhd_decode_dct_block(ctx, row, n, 6, 8, 4, 2);
475 }
476 
478  RowContext *row, int n)
479 {
480  return dnxhd_decode_dct_block(ctx, row, n, 6, 32, 4, 2);
481 }
482 
484  AVFrame *frame, int x, int y)
485 {
486  int shift1 = ctx->bit_depth >= 10;
487  int dct_linesize_luma = frame->linesize[0];
488  int dct_linesize_chroma = frame->linesize[1];
489  uint8_t *dest_y, *dest_u, *dest_v;
490  int dct_y_offset, dct_x_offset;
491  int qscale, i, act;
492  int interlaced_mb = 0;
493 
494  if (ctx->mbaff) {
495  interlaced_mb = get_bits1(&row->gb);
496  qscale = get_bits(&row->gb, 10);
497  } else {
498  qscale = get_bits(&row->gb, 11);
499  }
500  act = get_bits1(&row->gb);
501  if (act) {
502  if (!ctx->act) {
503  static int act_warned;
504  if (!act_warned) {
505  act_warned = 1;
506  av_log(ctx->avctx, AV_LOG_ERROR,
507  "ACT flag set, in violation of frame header.\n");
508  }
509  } else if (row->format == -1) {
510  row->format = act;
511  } else if (row->format != act) {
512  row->format = 2; // Variable
513  }
514  }
515 
516  if (qscale != row->last_qscale) {
517  for (i = 0; i < 64; i++) {
518  row->luma_scale[i] = qscale * ctx->cid_table->luma_weight[i];
519  row->chroma_scale[i] = qscale * ctx->cid_table->chroma_weight[i];
520  }
521  row->last_qscale = qscale;
522  }
523 
524  for (i = 0; i < 8 + 4 * ctx->is_444; i++) {
525  if (ctx->decode_dct_block(ctx, row, i) < 0)
526  return AVERROR_INVALIDDATA;
527  }
528 
529  if (frame->interlaced_frame) {
530  dct_linesize_luma <<= 1;
531  dct_linesize_chroma <<= 1;
532  }
533 
534  dest_y = frame->data[0] + ((y * dct_linesize_luma) << 4) + (x << (4 + shift1));
535  dest_u = frame->data[1] + ((y * dct_linesize_chroma) << 4) + (x << (3 + shift1 + ctx->is_444));
536  dest_v = frame->data[2] + ((y * dct_linesize_chroma) << 4) + (x << (3 + shift1 + ctx->is_444));
537 
538  if (frame->interlaced_frame && ctx->cur_field) {
539  dest_y += frame->linesize[0];
540  dest_u += frame->linesize[1];
541  dest_v += frame->linesize[2];
542  }
543  if (interlaced_mb) {
544  dct_linesize_luma <<= 1;
545  dct_linesize_chroma <<= 1;
546  }
547 
548  dct_y_offset = interlaced_mb ? frame->linesize[0] : (dct_linesize_luma << 3);
549  dct_x_offset = 8 << shift1;
550  if (!ctx->is_444) {
551  ctx->idsp.idct_put(dest_y, dct_linesize_luma, row->blocks[0]);
552  ctx->idsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, row->blocks[1]);
553  ctx->idsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, row->blocks[4]);
554  ctx->idsp.idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, row->blocks[5]);
555 
556  if (!(ctx->avctx->flags & AV_CODEC_FLAG_GRAY)) {
557  dct_y_offset = interlaced_mb ? frame->linesize[1] : (dct_linesize_chroma << 3);
558  ctx->idsp.idct_put(dest_u, dct_linesize_chroma, row->blocks[2]);
559  ctx->idsp.idct_put(dest_v, dct_linesize_chroma, row->blocks[3]);
560  ctx->idsp.idct_put(dest_u + dct_y_offset, dct_linesize_chroma, row->blocks[6]);
561  ctx->idsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, row->blocks[7]);
562  }
563  } else {
564  ctx->idsp.idct_put(dest_y, dct_linesize_luma, row->blocks[0]);
565  ctx->idsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, row->blocks[1]);
566  ctx->idsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, row->blocks[6]);
567  ctx->idsp.idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, row->blocks[7]);
568 
569  if (!(ctx->avctx->flags & AV_CODEC_FLAG_GRAY)) {
570  dct_y_offset = interlaced_mb ? frame->linesize[1] : (dct_linesize_chroma << 3);
571  ctx->idsp.idct_put(dest_u, dct_linesize_chroma, row->blocks[2]);
572  ctx->idsp.idct_put(dest_u + dct_x_offset, dct_linesize_chroma, row->blocks[3]);
573  ctx->idsp.idct_put(dest_u + dct_y_offset, dct_linesize_chroma, row->blocks[8]);
574  ctx->idsp.idct_put(dest_u + dct_y_offset + dct_x_offset, dct_linesize_chroma, row->blocks[9]);
575  ctx->idsp.idct_put(dest_v, dct_linesize_chroma, row->blocks[4]);
576  ctx->idsp.idct_put(dest_v + dct_x_offset, dct_linesize_chroma, row->blocks[5]);
577  ctx->idsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, row->blocks[10]);
578  ctx->idsp.idct_put(dest_v + dct_y_offset + dct_x_offset, dct_linesize_chroma, row->blocks[11]);
579  }
580  }
581 
582  return 0;
583 }
584 
586  int rownb, int threadnb)
587 {
588  const DNXHDContext *ctx = avctx->priv_data;
589  uint32_t offset = ctx->mb_scan_index[rownb];
590  RowContext *row = ctx->rows + threadnb;
591  int x, ret;
592 
593  row->last_dc[0] =
594  row->last_dc[1] =
595  row->last_dc[2] = 1 << (ctx->bit_depth + 2); // for levels +2^(bitdepth-1)
596  ret = init_get_bits8(&row->gb, ctx->buf + offset, ctx->buf_size - offset);
597  if (ret < 0) {
598  row->errors++;
599  return ret;
600  }
601  for (x = 0; x < ctx->mb_width; x++) {
602  int ret = dnxhd_decode_macroblock(ctx, row, data, x, rownb);
603  if (ret < 0) {
604  row->errors++;
605  return ret;
606  }
607  }
608 
609  return 0;
610 }
611 
613  int *got_frame, AVPacket *avpkt)
614 {
615  const uint8_t *buf = avpkt->data;
616  int buf_size = avpkt->size;
618  ThreadFrame frame = { .f = data };
619  AVFrame *picture = data;
620  int first_field = 1;
621  int ret, i;
622 
623  ff_dlog(avctx, "frame size %d\n", buf_size);
624 
625  for (i = 0; i < avctx->thread_count; i++)
626  ctx->rows[i].format = -1;
627 
628 decode_coding_unit:
629  if ((ret = dnxhd_decode_header(ctx, picture, buf, buf_size, first_field)) < 0)
630  return ret;
631 
632  if ((avctx->width || avctx->height) &&
633  (ctx->width != avctx->width || ctx->height != avctx->height)) {
634  av_log(avctx, AV_LOG_WARNING, "frame size changed: %dx%d -> %ux%u\n",
635  avctx->width, avctx->height, ctx->width, ctx->height);
636  first_field = 1;
637  }
638  if (avctx->pix_fmt != AV_PIX_FMT_NONE && avctx->pix_fmt != ctx->pix_fmt) {
639  av_log(avctx, AV_LOG_WARNING, "pix_fmt changed: %s -> %s\n",
641  first_field = 1;
642  }
643 
644  avctx->pix_fmt = ctx->pix_fmt;
645  ret = ff_set_dimensions(avctx, ctx->width, ctx->height);
646  if (ret < 0)
647  return ret;
648 
649  if (first_field) {
650  if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
651  return ret;
652  picture->pict_type = AV_PICTURE_TYPE_I;
653  picture->key_frame = 1;
654  }
655 
656  ctx->buf_size = buf_size - ctx->data_offset;
657  ctx->buf = buf + ctx->data_offset;
658  avctx->execute2(avctx, dnxhd_decode_row, picture, NULL, ctx->mb_height);
659 
660  if (first_field && picture->interlaced_frame) {
661  buf += ctx->cid_table->coding_unit_size;
662  buf_size -= ctx->cid_table->coding_unit_size;
663  first_field = 0;
664  goto decode_coding_unit;
665  }
666 
667  ret = 0;
668  for (i = 0; i < avctx->thread_count; i++) {
669  ret += ctx->rows[i].errors;
670  ctx->rows[i].errors = 0;
671  }
672 
673  if (ctx->act) {
674  static int act_warned;
675  int format = ctx->rows[0].format;
676  for (i = 1; i < avctx->thread_count; i++) {
677  if (ctx->rows[i].format != format &&
678  ctx->rows[i].format != -1 /* not run */) {
679  format = 2;
680  break;
681  }
682  }
683  switch (format) {
684  case -1:
685  case 2:
686  if (!act_warned) {
687  act_warned = 1;
688  av_log(ctx->avctx, AV_LOG_ERROR,
689  "Unsupported: variable ACT flag.\n");
690  }
691  break;
692  case 0:
693  ctx->pix_fmt = ctx->bit_depth==10
695  break;
696  case 1:
697  ctx->pix_fmt = ctx->bit_depth==10
699  break;
700  }
701  }
702  avctx->pix_fmt = ctx->pix_fmt;
703  if (ret) {
704  av_log(ctx->avctx, AV_LOG_ERROR, "%d lines with errors\n", ret);
705  return AVERROR_INVALIDDATA;
706  }
707 
708  *got_frame = 1;
709  return avpkt->size;
710 }
711 
713 {
715 
716  ff_free_vlc(&ctx->ac_vlc);
717  ff_free_vlc(&ctx->dc_vlc);
718  ff_free_vlc(&ctx->run_vlc);
719 
720  av_freep(&ctx->rows);
721 
722  return 0;
723 }
724 
726  .name = "dnxhd",
727  .long_name = NULL_IF_CONFIG_SMALL("VC3/DNxHD"),
728  .type = AVMEDIA_TYPE_VIDEO,
729  .id = AV_CODEC_ID_DNXHD,
730  .priv_data_size = sizeof(DNXHDContext),
732  .close = dnxhd_decode_close,
734  .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
737 };
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:29
AVCodec
AVCodec.
Definition: codec.h:190
bit_depth
static void bit_depth(AudioStatsContext *s, uint64_t mask, uint64_t imask, AVRational *depth)
Definition: af_astats.c:254
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:182
ff_init_scantable
av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
Definition: idctdsp.c:29
AVPixelFormat
AVPixelFormat
Pixel format.
Definition: pixfmt.h:64
level
uint8_t level
Definition: svq3.c:210
ff_dnxhd_decoder
AVCodec ff_dnxhd_decoder
Definition: dnxhddec.c:725
ff_dnxhd_check_header_prefix_hr
static av_always_inline uint64_t ff_dnxhd_check_header_prefix_hr(uint64_t prefix)
Definition: dnxhddata.h:67
init
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
blockdsp.h
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
RowContext::errors
int errors
Definition: dnxhddec.c:45
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:1154
out
FILE * out
Definition: movenc.c:54
DNXHDContext::buf_size
int buf_size
Definition: dnxhddec.c:55
DNXHDContext::is_444
int is_444
Definition: dnxhddec.c:68
GET_VLC
#define GET_VLC(code, name, gb, table, bits, max_depth)
If the vlc code is invalid and max_depth=1, then no bits will be removed.
Definition: get_bits.h:706
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:300
internal.h
AVPacket::data
uint8_t * data
Definition: packet.h:355
init_vlc
#define init_vlc(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
Definition: vlc.h:38
data
const char data[16]
Definition: mxf.c:91
DNXHDContext::rows
RowContext * rows
Definition: dnxhddec.c:52
av_mallocz_array
void * av_mallocz_array(size_t nmemb, size_t size)
Definition: mem.c:190
FF_PROFILE_DNXHD
#define FF_PROFILE_DNXHD
Definition: avcodec.h:1874
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:192
DNXHDContext::alpha
int alpha
Definition: dnxhddec.c:69
UPDATE_CACHE
#define UPDATE_CACHE(name, gb)
Definition: get_bits.h:178
BlockDSPContext
Definition: blockdsp.h:35
AVCOL_SPC_BT2020_CL
@ AVCOL_SPC_BT2020_CL
ITU-R BT2020 constant luminance system.
Definition: pixfmt.h:521
thread.h
dnxhd_decode_header
static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, const uint8_t *buf, int buf_size, int first_field)
Definition: dnxhddec.c:172
CIDEntry::coding_unit_size
unsigned int coding_unit_size
Definition: dnxhddata.h:46
DNXHDContext::ac_vlc
VLC ac_vlc
Definition: dnxhddec.c:63
DNXHDContext::height
unsigned int height
Definition: dnxhddec.c:57
DNXHDContext::mb_scan_index
uint32_t mb_scan_index[512]
Definition: dnxhddec.c:60
GET_CACHE
#define GET_CACHE(name, gb)
Definition: get_bits.h:215
DNXHD_VLC_BITS
#define DNXHD_VLC_BITS
Definition: dnxhddec.c:77
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:379
DNXHDContext::mb_height
unsigned int mb_height
Definition: dnxhddec.c:59
RowContext::chroma_scale
int chroma_scale[64]
Definition: dnxhddec.c:41
DNXHDContext::cur_field
int cur_field
current interlaced field
Definition: dnxhddec.c:62
AVCodecContext::thread_count
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition: avcodec.h:1785
DNXHDContext
Definition: dnxhddec.c:50
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:413
DNXHDContext::idsp
IDCTDSPContext idsp
Definition: dnxhddec.c:64
GetBitContext
Definition: get_bits.h:61
ff_thread_get_buffer
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 so the codec calls ff_thread_report set FF_CODEC_CAP_ALLOCATE_PROGRESS in AVCodec caps_internal and use ff_thread_get_buffer() to allocate frames. The frames must then be freed with ff_thread_release_buffer(). Otherwise decode directly into the user-supplied frames. Call ff_thread_report_progress() 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
DNXHDContext::bit_depth
int bit_depth
Definition: dnxhddec.c:67
AVFrame::key_frame
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:378
AVCodecContext::coded_height
int coded_height
Definition: avcodec.h:714
av_reduce
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition: rational.c:35
FF_PROFILE_DNXHR_LB
#define FF_PROFILE_DNXHR_LB
Definition: avcodec.h:1875
CIDEntry
Definition: dnxhddata.h:42
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:400
CIDEntry::bit_depth
int bit_depth
Definition: dnxhddata.h:49
dnxhddata.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
av_cold
#define av_cold
Definition: attributes.h:90
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:677
CLOSE_READER
#define CLOSE_READER(name, gb)
Definition: get_bits.h:149
decode
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
Definition: decode_audio.c:71
dnxhd_decode_close
static av_cold int dnxhd_decode_close(AVCodecContext *avctx)
Definition: dnxhddec.c:712
dnxhd_get_profile
static int dnxhd_get_profile(int cid)
Definition: dnxhddec.c:155
dnxhd_decode_frame
static int dnxhd_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: dnxhddec.c:612
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1466
format
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 format(the sample packing is implied by the sample format) and sample rate. The lists are not just lists
SHOW_SBITS
#define SHOW_SBITS(name, gb, num)
Definition: get_bits.h:212
DNXHD_DC_VLC_BITS
#define DNXHD_DC_VLC_BITS
Definition: dnxhddec.c:78
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:197
ctx
AVFormatContext * ctx
Definition: movenc.c:48
RowContext::luma_scale
int luma_scale[64]
Definition: dnxhddec.c:40
get_bits.h
DNXHDContext::act
int act
Definition: dnxhddec.c:72
SKIP_BITS
#define SKIP_BITS(name, gb, num)
Definition: get_bits.h:193
ff_free_vlc
void ff_free_vlc(VLC *vlc)
Definition: bitstream.c:359
DNXHDContext::mb_width
unsigned int mb_width
Definition: dnxhddec.c:59
ff_dnxhd_profiles
const AVProfile ff_dnxhd_profiles[]
Definition: profiles.c:48
if
if(ret)
Definition: filter_design.txt:179
FF_PROFILE_DNXHR_HQ
#define FF_PROFILE_DNXHR_HQ
Definition: avcodec.h:1877
ff_dnxhd_cid_table
const CIDEntry ff_dnxhd_cid_table[]
Definition: dnxhddata.c:935
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:106
DNXHDContext::data_offset
int data_offset
Definition: dnxhddec.c:61
dnxhd_decode_dct_block_12_444
static int dnxhd_decode_dct_block_12_444(const DNXHDContext *ctx, RowContext *row, int n)
Definition: dnxhddec.c:477
NULL
#define NULL
Definition: coverity.c:32
DNXHDContext::avctx
AVCodecContext * avctx
Definition: dnxhddec.c:51
DNXHD_VARIABLE
#define DNXHD_VARIABLE
Indicate that a CIDEntry value must be read in the bitstream.
Definition: dnxhddata.h:40
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:274
get_bits1
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:498
DNXHDContext::lla
int lla
Definition: dnxhddec.c:70
profiles.h
DNXHDContext::bdsp
BlockDSPContext bdsp
Definition: dnxhddec.c:53
LAST_SKIP_BITS
#define LAST_SKIP_BITS(name, gb, num)
Definition: get_bits.h:199
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:398
ff_dnxhd_get_cid_table
int ff_dnxhd_get_cid_table(int cid)
Definition: dnxhddata.c:1078
dnxhd_decode_init
static av_cold int dnxhd_decode_init(AVCodecContext *avctx)
Definition: dnxhddec.c:91
index
int index
Definition: gxfenc.c:89
RowContext::format
int format
-1:not set yet 0:off=RGB 1:on=YUV 2:variable
Definition: dnxhddec.c:47
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:29
cid
int cid
Definition: mxfenc.c:1970
shift1
static const int shift1[6]
Definition: dxa.c:50
AVFrame::pict_type
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:383
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:50
dnxhd_decode_dct_block
static av_always_inline int dnxhd_decode_dct_block(const DNXHDContext *ctx, RowContext *row, int n, int index_bits, int level_bias, int level_shift, int dc_shift)
Definition: dnxhddec.c:348
AV_CODEC_FLAG_GRAY
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
Definition: avcodec.h:308
AVPacket::size
int size
Definition: packet.h:356
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:188
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:402
RowContext
Definition: dnxhddec.c:38
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:92
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:404
RowContext::gb
GetBitContext gb
Definition: dnxhddec.c:42
OPEN_READER
#define OPEN_READER(name, gb)
Definition: get_bits.h:138
AV_CODEC_CAP_SLICE_THREADS
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: codec.h:110
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
RowContext::blocks
int16_t blocks[12][64]
Definition: dnxhddec.c:39
RowContext::last_qscale
int last_qscale
Definition: dnxhddec.c:44
DNXHDContext::cid
int64_t cid
compression id
Definition: dnxhddec.c:56
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition: mem.h:112
AVFrame::interlaced_frame
int interlaced_frame
The content of the picture is interlaced.
Definition: frame.h:447
NEG_USR32
#define NEG_USR32(a, s)
Definition: mathops.h:166
DNXHDContext::decode_dct_block
int(* decode_dct_block)(const struct DNXHDContext *ctx, RowContext *row, int n)
Definition: dnxhddec.c:73
FF_PROFILE_DNXHR_SQ
#define FF_PROFILE_DNXHR_SQ
Definition: avcodec.h:1876
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:269
AVCOL_SPC_BT2020_NCL
@ AVCOL_SPC_BT2020_NCL
ITU-R BT2020 non-constant luminance system.
Definition: pixfmt.h:520
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:414
av_always_inline
#define av_always_inline
Definition: attributes.h:49
uint8_t
uint8_t
Definition: audio_convert.c:194
ff_idctdsp_init
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
Definition: idctdsp.c:238
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:197
len
int len
Definition: vorbis_enc_data.h:452
DNXHDContext::run_vlc
VLC run_vlc
Definition: dnxhddec.c:63
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:512
AVCodecContext::height
int height
Definition: avcodec.h:699
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:736
DNXHDContext::pix_fmt
enum AVPixelFormat pix_fmt
Definition: dnxhddec.c:58
idctdsp.h
avcodec.h
ff_zigzag_direct
const uint8_t ff_zigzag_direct[64]
Definition: mathtables.c:98
ret
ret
Definition: filter_design.txt:187
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
ff_dnxhd_parse_header_prefix
static av_always_inline uint64_t ff_dnxhd_parse_header_prefix(const uint8_t *buf)
Definition: dnxhddata.h:86
RowContext::last_dc
int last_dc[3]
Definition: dnxhddec.c:43
IDCTDSPContext
Definition: idctdsp.h:53
FF_ARRAY_ELEMS
#define FF_ARRAY_ELEMS(a)
Definition: sinewin_tablegen_template.c:38
SIZE_SPECIFIER
#define SIZE_SPECIFIER
Definition: internal.h:264
DNXHDContext::buf
const uint8_t * buf
Definition: dnxhddec.c:54
AVCodecContext
main external API structure.
Definition: avcodec.h:526
ThreadFrame
Definition: thread.h:34
SHOW_UBITS
#define SHOW_UBITS(name, gb, num)
Definition: get_bits.h:211
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition: pixfmt.h:65
VLC
Definition: vlc.h:26
dnxhd_init_vlc
static int dnxhd_init_vlc(DNXHDContext *ctx, uint32_t cid, int bitdepth)
Definition: dnxhddec.c:111
profiles
static const AVProfile profiles[]
Definition: libfdk-aacenc.c:428
FF_PROFILE_DNXHR_HQX
#define FF_PROFILE_DNXHR_HQX
Definition: avcodec.h:1878
AVCodecContext::coded_width
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:714
DNXHDContext::width
unsigned int width
Definition: dnxhddec.c:57
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:70
ff_set_dimensions
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
Definition: utils.c:104
DNXHDContext::mbaff
int mbaff
Definition: dnxhddec.c:71
avpriv_request_sample
#define avpriv_request_sample(...)
Definition: tableprint_vlc.h:39
ScanTable
Scantable.
Definition: idctdsp.h:31
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:48
AVPacket
This structure stores compressed data.
Definition: packet.h:332
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:553
dnxhd_decode_macroblock
static int dnxhd_decode_macroblock(const DNXHDContext *ctx, RowContext *row, AVFrame *frame, int x, int y)
Definition: dnxhddec.c:483
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
FF_PROFILE_DNXHR_444
#define FF_PROFILE_DNXHR_444
Definition: avcodec.h:1879
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:699
dnxhd_decode_dct_block_10_444
static int dnxhd_decode_dct_block_10_444(const DNXHDContext *ctx, RowContext *row, int n)
Definition: dnxhddec.c:465
imgutils.h
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:565
dnxhd_decode_row
static int dnxhd_decode_row(AVCodecContext *avctx, void *data, int rownb, int threadnb)
Definition: dnxhddec.c:585
block
The exact code depends on how similar the blocks are and how related they are to the block
Definition: filter_design.txt:207
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
DNXHDContext::dc_vlc
VLC dc_vlc
Definition: dnxhddec.c:63
ff_blockdsp_init
av_cold void ff_blockdsp_init(BlockDSPContext *c, AVCodecContext *avctx)
Definition: blockdsp.c:60
AVCOL_SPC_BT709
@ AVCOL_SPC_BT709
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B
Definition: pixfmt.h:511
int
int
Definition: ffmpeg_filter.c:192
first_field
static int first_field(const struct video_data *s)
Definition: v4l2.c:234
dnxhd_decode_dct_block_8
static int dnxhd_decode_dct_block_8(const DNXHDContext *ctx, RowContext *row, int n)
Definition: dnxhddec.c:453
DNXHDContext::cid_table
const CIDEntry * cid_table
Definition: dnxhddec.c:66
dnxhd_decode_dct_block_10
static int dnxhd_decode_dct_block_10(const DNXHDContext *ctx, RowContext *row, int n)
Definition: dnxhddec.c:459
AVCodecContext::execute2
int(* execute2)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count)
The codec may call this to execute several independent things.
Definition: avcodec.h:1845
AV_CODEC_ID_DNXHD
@ AV_CODEC_ID_DNXHD
Definition: codec_id.h:148
dnxhd_decode_dct_block_12
static int dnxhd_decode_dct_block_12(const DNXHDContext *ctx, RowContext *row, int n)
Definition: dnxhddec.c:471
av_get_pix_fmt_name
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:2465
AV_RB16
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_WB24 unsigned int_TMPL AV_RB16
Definition: bytestream.h:94
DNXHDContext::scantable
ScanTable scantable
Definition: dnxhddec.c:65