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 "libavutil/timer.h"
29 #include "avcodec.h"
30 #include "blockdsp.h"
31 #define UNCHECKED_BITSTREAM_READER 1
32 #include "get_bits.h"
33 #include "dnxhddata.h"
34 #include "idctdsp.h"
35 #include "internal.h"
36 #include "profiles.h"
37 #include "thread.h"
38 
39 typedef struct RowContext {
40  DECLARE_ALIGNED(32, int16_t, blocks)[12][64];
41  int luma_scale[64];
42  int chroma_scale[64];
44  int last_dc[3];
46  int errors;
47  /** -1:not set yet 0:off=RGB 1:on=YUV 2:variable */
48  int format;
49 } RowContext;
50 
51 typedef struct DNXHDContext {
55  const uint8_t* buf;
56  int buf_size;
57  int64_t cid; ///< compression id
58  unsigned int width, height;
60  unsigned int mb_width, mb_height;
61  uint32_t mb_scan_index[512];
62  int data_offset; // End of mb_scan_index, where macroblocks start
63  int cur_field; ///< current interlaced field
68  int bit_depth; // 8, 10, 12 or 0 if not initialized at all.
69  int is_444;
70  int alpha;
71  int lla;
72  int mbaff;
73  int act;
75  RowContext *row, int n);
76 } DNXHDContext;
77 
78 #define DNXHD_VLC_BITS 9
79 #define DNXHD_DC_VLC_BITS 7
80 
81 static int dnxhd_decode_dct_block_8(const DNXHDContext *ctx,
82  RowContext *row, int n);
84  RowContext *row, int n);
86  RowContext *row, int n);
88  RowContext *row, int n);
90  RowContext *row, int n);
91 
93 {
95 
96  ctx->avctx = avctx;
97  ctx->cid = -1;
100  }
101 
104 
105  ctx->rows = av_mallocz_array(avctx->thread_count, sizeof(RowContext));
106  if (!ctx->rows)
107  return AVERROR(ENOMEM);
108 
109  return 0;
110 }
111 
112 static int dnxhd_init_vlc(DNXHDContext *ctx, uint32_t cid, int bitdepth)
113 {
114  int ret;
115  if (cid != ctx->cid) {
116  int index;
117 
118  if ((index = ff_dnxhd_get_cid_table(cid)) < 0) {
119  av_log(ctx->avctx, AV_LOG_ERROR, "unsupported cid %"PRIu32"\n", cid);
120  return AVERROR(ENOSYS);
121  }
122  if (ff_dnxhd_cid_table[index].bit_depth != bitdepth &&
124  av_log(ctx->avctx, AV_LOG_ERROR, "bit depth mismatches %d %d\n", ff_dnxhd_cid_table[index].bit_depth, bitdepth);
125  return AVERROR_INVALIDDATA;
126  }
127  ctx->cid_table = &ff_dnxhd_cid_table[index];
128  av_log(ctx->avctx, AV_LOG_VERBOSE, "Profile cid %"PRIu32".\n", cid);
129 
130  ff_free_vlc(&ctx->ac_vlc);
131  ff_free_vlc(&ctx->dc_vlc);
132  ff_free_vlc(&ctx->run_vlc);
133 
134  if ((ret = init_vlc(&ctx->ac_vlc, DNXHD_VLC_BITS, 257,
135  ctx->cid_table->ac_bits, 1, 1,
136  ctx->cid_table->ac_codes, 2, 2, 0)) < 0)
137  goto out;
138  if ((ret = init_vlc(&ctx->dc_vlc, DNXHD_DC_VLC_BITS, bitdepth > 8 ? 14 : 12,
139  ctx->cid_table->dc_bits, 1, 1,
140  ctx->cid_table->dc_codes, 1, 1, 0)) < 0)
141  goto out;
142  if ((ret = init_vlc(&ctx->run_vlc, DNXHD_VLC_BITS, 62,
143  ctx->cid_table->run_bits, 1, 1,
144  ctx->cid_table->run_codes, 2, 2, 0)) < 0)
145  goto out;
146 
147  ctx->cid = cid;
148  }
149  ret = 0;
150 out:
151  if (ret < 0)
152  av_log(ctx->avctx, AV_LOG_ERROR, "init_vlc failed\n");
153  return ret;
154 }
155 
157 {
159 
160  ctx->avctx = avctx;
161  // make sure VLC tables will be loaded when cid is parsed
162  ctx->cid = -1;
163 
164  ctx->rows = av_mallocz_array(avctx->thread_count, sizeof(RowContext));
165  if (!ctx->rows)
166  return AVERROR(ENOMEM);
167 
168  return 0;
169 }
170 
171 static int dnxhd_get_profile(int cid)
172 {
173  switch(cid) {
174  case 1270:
175  return FF_PROFILE_DNXHR_444;
176  case 1271:
177  return FF_PROFILE_DNXHR_HQX;
178  case 1272:
179  return FF_PROFILE_DNXHR_HQ;
180  case 1273:
181  return FF_PROFILE_DNXHR_SQ;
182  case 1274:
183  return FF_PROFILE_DNXHR_LB;
184  }
185  return FF_PROFILE_DNXHD;
186 }
187 
189  const uint8_t *buf, int buf_size,
190  int first_field)
191 {
192  int i, cid, ret;
193  int old_bit_depth = ctx->bit_depth, bitdepth;
194  uint64_t header_prefix;
195  if (buf_size < 0x280) {
196  av_log(ctx->avctx, AV_LOG_ERROR,
197  "buffer too small (%d < 640).\n", buf_size);
198  return AVERROR_INVALIDDATA;
199  }
200 
201  header_prefix = ff_dnxhd_parse_header_prefix(buf);
202  if (header_prefix == 0) {
203  av_log(ctx->avctx, AV_LOG_ERROR,
204  "unknown header 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n",
205  buf[0], buf[1], buf[2], buf[3], buf[4]);
206  return AVERROR_INVALIDDATA;
207  }
208  if (buf[5] & 2) { /* interlaced */
209  ctx->cur_field = buf[5] & 1;
210  frame->interlaced_frame = 1;
211  frame->top_field_first = first_field ^ ctx->cur_field;
212  av_log(ctx->avctx, AV_LOG_DEBUG,
213  "interlaced %d, cur field %d\n", buf[5] & 3, ctx->cur_field);
214  } else {
215  ctx->cur_field = 0;
216  }
217  ctx->mbaff = (buf[0x6] >> 5) & 1;
218  ctx->alpha = buf[0x7] & 1;
219  ctx->lla = (buf[0x7] >> 1) & 1;
220  if (ctx->alpha)
221  avpriv_request_sample(ctx->avctx, "alpha");
222 
223  ctx->height = AV_RB16(buf + 0x18);
224  ctx->width = AV_RB16(buf + 0x1a);
225 
226  switch(buf[0x21] >> 5) {
227  case 1: bitdepth = 8; break;
228  case 2: bitdepth = 10; break;
229  case 3: bitdepth = 12; break;
230  default:
231  av_log(ctx->avctx, AV_LOG_ERROR,
232  "Unknown bitdepth indicator (%d)\n", buf[0x21] >> 5);
233  return AVERROR_INVALIDDATA;
234  }
235 
236  cid = AV_RB32(buf + 0x28);
237 
238  ctx->avctx->profile = dnxhd_get_profile(cid);
239 
240  if ((ret = dnxhd_init_vlc(ctx, cid, bitdepth)) < 0)
241  return ret;
242  if (ctx->mbaff && ctx->cid_table->cid != 1260)
243  av_log(ctx->avctx, AV_LOG_WARNING,
244  "Adaptive MB interlace flag in an unsupported profile.\n");
245 
246  ctx->act = buf[0x2C] & 7;
247  if (ctx->act && ctx->cid_table->cid != 1256 && ctx->cid_table->cid != 1270)
248  av_log(ctx->avctx, AV_LOG_WARNING,
249  "Adaptive color transform in an unsupported profile.\n");
250 
251  ctx->is_444 = (buf[0x2C] >> 6) & 1;
252  if (ctx->is_444) {
253  if (bitdepth == 8) {
254  avpriv_request_sample(ctx->avctx, "4:4:4 8 bits");
255  return AVERROR_INVALIDDATA;
256  } else if (bitdepth == 10) {
257  ctx->decode_dct_block = dnxhd_decode_dct_block_10_444;
258  ctx->pix_fmt = ctx->act ? AV_PIX_FMT_YUV444P10
260  } else {
261  ctx->decode_dct_block = dnxhd_decode_dct_block_12_444;
262  ctx->pix_fmt = ctx->act ? AV_PIX_FMT_YUV444P12
264  }
265  } else if (bitdepth == 12) {
266  ctx->decode_dct_block = dnxhd_decode_dct_block_12;
267  ctx->pix_fmt = AV_PIX_FMT_YUV422P12;
268  } else if (bitdepth == 10) {
269  if (ctx->avctx->profile == FF_PROFILE_DNXHR_HQX)
270  ctx->decode_dct_block = dnxhd_decode_dct_block_10_444;
271  else
272  ctx->decode_dct_block = dnxhd_decode_dct_block_10;
273  ctx->pix_fmt = AV_PIX_FMT_YUV422P10;
274  } else {
275  ctx->decode_dct_block = dnxhd_decode_dct_block_8;
276  ctx->pix_fmt = AV_PIX_FMT_YUV422P;
277  }
278 
279  ctx->avctx->bits_per_raw_sample = ctx->bit_depth = bitdepth;
280  if (ctx->bit_depth != old_bit_depth) {
281  ff_blockdsp_init(&ctx->bdsp, ctx->avctx);
282  ff_idctdsp_init(&ctx->idsp, ctx->avctx);
283  ff_init_scantable(ctx->idsp.idct_permutation, &ctx->scantable,
285  }
286 
287  // make sure profile size constraints are respected
288  // DNx100 allows 1920->1440 and 1280->960 subsampling
289  if (ctx->width != ctx->cid_table->width &&
290  ctx->cid_table->width != DNXHD_VARIABLE) {
291  av_reduce(&ctx->avctx->sample_aspect_ratio.num,
292  &ctx->avctx->sample_aspect_ratio.den,
293  ctx->width, ctx->cid_table->width, 255);
294  ctx->width = ctx->cid_table->width;
295  }
296 
297  if (buf_size < ctx->cid_table->coding_unit_size) {
298  av_log(ctx->avctx, AV_LOG_ERROR, "incorrect frame size (%d < %u).\n",
299  buf_size, ctx->cid_table->coding_unit_size);
300  return AVERROR_INVALIDDATA;
301  }
302 
303  ctx->mb_width = (ctx->width + 15)>> 4;
304  ctx->mb_height = AV_RB16(buf + 0x16c);
305 
306  if ((ctx->height + 15) >> 4 == ctx->mb_height && frame->interlaced_frame)
307  ctx->height <<= 1;
308 
309  av_log(ctx->avctx, AV_LOG_VERBOSE, "%dx%d, 4:%s %d bits, MBAFF=%d ACT=%d\n",
310  ctx->width, ctx->height, ctx->is_444 ? "4:4" : "2:2",
311  ctx->bit_depth, ctx->mbaff, ctx->act);
312 
313  // Newer format supports variable mb_scan_index sizes
314  if (ctx->mb_height > 68 && ff_dnxhd_check_header_prefix_hr(header_prefix)) {
315  ctx->data_offset = 0x170 + (ctx->mb_height << 2);
316  } else {
317  if (ctx->mb_height > 68) {
318  av_log(ctx->avctx, AV_LOG_ERROR,
319  "mb height too big: %d\n", ctx->mb_height);
320  return AVERROR_INVALIDDATA;
321  }
322  ctx->data_offset = 0x280;
323  }
324  if ((ctx->mb_height << frame->interlaced_frame) > (ctx->height + 15) >> 4) {
325  av_log(ctx->avctx, AV_LOG_ERROR,
326  "mb height too big: %d\n", ctx->mb_height);
327  return AVERROR_INVALIDDATA;
328  }
329 
330  if (buf_size < ctx->data_offset) {
331  av_log(ctx->avctx, AV_LOG_ERROR,
332  "buffer too small (%d < %d).\n", buf_size, ctx->data_offset);
333  return AVERROR_INVALIDDATA;
334  }
335 
336  if (ctx->mb_height > FF_ARRAY_ELEMS(ctx->mb_scan_index)) {
337  av_log(ctx->avctx, AV_LOG_ERROR,
338  "mb_height too big (%d > %"SIZE_SPECIFIER").\n", ctx->mb_height, FF_ARRAY_ELEMS(ctx->mb_scan_index));
339  return AVERROR_INVALIDDATA;
340  }
341 
342  for (i = 0; i < ctx->mb_height; i++) {
343  ctx->mb_scan_index[i] = AV_RB32(buf + 0x170 + (i << 2));
344  ff_dlog(ctx->avctx, "mb scan index %d, pos %d: %"PRIu32"\n",
345  i, 0x170 + (i << 2), ctx->mb_scan_index[i]);
346  if (buf_size - ctx->data_offset < ctx->mb_scan_index[i]) {
347  av_log(ctx->avctx, AV_LOG_ERROR,
348  "invalid mb scan index (%"PRIu32" vs %u).\n",
349  ctx->mb_scan_index[i], buf_size - ctx->data_offset);
350  return AVERROR_INVALIDDATA;
351  }
352  }
353 
354  return 0;
355 }
356 
358  RowContext *row,
359  int n,
360  int index_bits,
361  int level_bias,
362  int level_shift,
363  int dc_shift)
364 {
365  int i, j, index1, index2, len, flags;
366  int level, component, sign;
367  const int *scale;
368  const uint8_t *weight_matrix;
369  const uint8_t *ac_info = ctx->cid_table->ac_info;
370  int16_t *block = row->blocks[n];
371  const int eob_index = ctx->cid_table->eob_index;
372  int ret = 0;
373  OPEN_READER(bs, &row->gb);
374 
375  ctx->bdsp.clear_block(block);
376 
377  if (!ctx->is_444) {
378  if (n & 2) {
379  component = 1 + (n & 1);
380  scale = row->chroma_scale;
381  weight_matrix = ctx->cid_table->chroma_weight;
382  } else {
383  component = 0;
384  scale = row->luma_scale;
385  weight_matrix = ctx->cid_table->luma_weight;
386  }
387  } else {
388  component = (n >> 1) % 3;
389  if (component) {
390  scale = row->chroma_scale;
391  weight_matrix = ctx->cid_table->chroma_weight;
392  } else {
393  scale = row->luma_scale;
394  weight_matrix = ctx->cid_table->luma_weight;
395  }
396  }
397 
398  UPDATE_CACHE(bs, &row->gb);
399  GET_VLC(len, bs, &row->gb, ctx->dc_vlc.table, DNXHD_DC_VLC_BITS, 1);
400  if (len < 0) {
401  ret = len;
402  goto error;
403  }
404  if (len) {
405  level = GET_CACHE(bs, &row->gb);
406  LAST_SKIP_BITS(bs, &row->gb, len);
407  sign = ~level >> 31;
408  level = (NEG_USR32(sign ^ level, len) ^ sign) - sign;
409  row->last_dc[component] += level * (1 << dc_shift);
410  }
411  block[0] = row->last_dc[component];
412 
413  i = 0;
414 
415  UPDATE_CACHE(bs, &row->gb);
416  GET_VLC(index1, bs, &row->gb, ctx->ac_vlc.table,
417  DNXHD_VLC_BITS, 2);
418 
419  while (index1 != eob_index) {
420  level = ac_info[2*index1+0];
421  flags = ac_info[2*index1+1];
422 
423  sign = SHOW_SBITS(bs, &row->gb, 1);
424  SKIP_BITS(bs, &row->gb, 1);
425 
426  if (flags & 1) {
427  level += SHOW_UBITS(bs, &row->gb, index_bits) << 7;
428  SKIP_BITS(bs, &row->gb, index_bits);
429  }
430 
431  if (flags & 2) {
432  UPDATE_CACHE(bs, &row->gb);
433  GET_VLC(index2, bs, &row->gb, ctx->run_vlc.table,
434  DNXHD_VLC_BITS, 2);
435  i += ctx->cid_table->run[index2];
436  }
437 
438  if (++i > 63) {
439  av_log(ctx->avctx, AV_LOG_ERROR, "ac tex damaged %d, %d\n", n, i);
440  ret = -1;
441  break;
442  }
443 
444  j = ctx->scantable.permutated[i];
445  level *= scale[i];
446  level += scale[i] >> 1;
447  if (level_bias < 32 || weight_matrix[i] != level_bias)
448  level += level_bias; // 1<<(level_shift-1)
449  level >>= level_shift;
450 
451  block[j] = (level ^ sign) - sign;
452 
453  UPDATE_CACHE(bs, &row->gb);
454  GET_VLC(index1, bs, &row->gb, ctx->ac_vlc.table,
455  DNXHD_VLC_BITS, 2);
456  }
457 error:
458  CLOSE_READER(bs, &row->gb);
459  return ret;
460 }
461 
463  RowContext *row, int n)
464 {
465  return dnxhd_decode_dct_block(ctx, row, n, 4, 32, 6, 0);
466 }
467 
469  RowContext *row, int n)
470 {
471  return dnxhd_decode_dct_block(ctx, row, n, 6, 8, 4, 0);
472 }
473 
475  RowContext *row, int n)
476 {
477  return dnxhd_decode_dct_block(ctx, row, n, 6, 32, 6, 0);
478 }
479 
481  RowContext *row, int n)
482 {
483  return dnxhd_decode_dct_block(ctx, row, n, 6, 8, 4, 2);
484 }
485 
487  RowContext *row, int n)
488 {
489  return dnxhd_decode_dct_block(ctx, row, n, 6, 32, 4, 2);
490 }
491 
493  AVFrame *frame, int x, int y)
494 {
495  int shift1 = ctx->bit_depth >= 10;
496  int dct_linesize_luma = frame->linesize[0];
497  int dct_linesize_chroma = frame->linesize[1];
498  uint8_t *dest_y, *dest_u, *dest_v;
499  int dct_y_offset, dct_x_offset;
500  int qscale, i, act;
501  int interlaced_mb = 0;
502 
503  if (ctx->mbaff) {
504  interlaced_mb = get_bits1(&row->gb);
505  qscale = get_bits(&row->gb, 10);
506  } else {
507  qscale = get_bits(&row->gb, 11);
508  }
509  act = get_bits1(&row->gb);
510  if (act) {
511  if (!ctx->act) {
512  static int act_warned;
513  if (!act_warned) {
514  act_warned = 1;
515  av_log(ctx->avctx, AV_LOG_ERROR,
516  "ACT flag set, in violation of frame header.\n");
517  }
518  } else if (row->format == -1) {
519  row->format = act;
520  } else if (row->format != act) {
521  row->format = 2; // Variable
522  }
523  }
524 
525  if (qscale != row->last_qscale) {
526  for (i = 0; i < 64; i++) {
527  row->luma_scale[i] = qscale * ctx->cid_table->luma_weight[i];
528  row->chroma_scale[i] = qscale * ctx->cid_table->chroma_weight[i];
529  }
530  row->last_qscale = qscale;
531  }
532 
533  for (i = 0; i < 8 + 4 * ctx->is_444; i++) {
534  if (ctx->decode_dct_block(ctx, row, i) < 0)
535  return AVERROR_INVALIDDATA;
536  }
537 
538  if (frame->interlaced_frame) {
539  dct_linesize_luma <<= 1;
540  dct_linesize_chroma <<= 1;
541  }
542 
543  dest_y = frame->data[0] + ((y * dct_linesize_luma) << 4) + (x << (4 + shift1));
544  dest_u = frame->data[1] + ((y * dct_linesize_chroma) << 4) + (x << (3 + shift1 + ctx->is_444));
545  dest_v = frame->data[2] + ((y * dct_linesize_chroma) << 4) + (x << (3 + shift1 + ctx->is_444));
546 
547  if (frame->interlaced_frame && ctx->cur_field) {
548  dest_y += frame->linesize[0];
549  dest_u += frame->linesize[1];
550  dest_v += frame->linesize[2];
551  }
552  if (interlaced_mb) {
553  dct_linesize_luma <<= 1;
554  dct_linesize_chroma <<= 1;
555  }
556 
557  dct_y_offset = interlaced_mb ? frame->linesize[0] : (dct_linesize_luma << 3);
558  dct_x_offset = 8 << shift1;
559  if (!ctx->is_444) {
560  ctx->idsp.idct_put(dest_y, dct_linesize_luma, row->blocks[0]);
561  ctx->idsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, row->blocks[1]);
562  ctx->idsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, row->blocks[4]);
563  ctx->idsp.idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, row->blocks[5]);
564 
565  if (!(ctx->avctx->flags & AV_CODEC_FLAG_GRAY)) {
566  dct_y_offset = interlaced_mb ? frame->linesize[1] : (dct_linesize_chroma << 3);
567  ctx->idsp.idct_put(dest_u, dct_linesize_chroma, row->blocks[2]);
568  ctx->idsp.idct_put(dest_v, dct_linesize_chroma, row->blocks[3]);
569  ctx->idsp.idct_put(dest_u + dct_y_offset, dct_linesize_chroma, row->blocks[6]);
570  ctx->idsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, row->blocks[7]);
571  }
572  } else {
573  ctx->idsp.idct_put(dest_y, dct_linesize_luma, row->blocks[0]);
574  ctx->idsp.idct_put(dest_y + dct_x_offset, dct_linesize_luma, row->blocks[1]);
575  ctx->idsp.idct_put(dest_y + dct_y_offset, dct_linesize_luma, row->blocks[6]);
576  ctx->idsp.idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, row->blocks[7]);
577 
578  if (!(ctx->avctx->flags & AV_CODEC_FLAG_GRAY)) {
579  dct_y_offset = interlaced_mb ? frame->linesize[1] : (dct_linesize_chroma << 3);
580  ctx->idsp.idct_put(dest_u, dct_linesize_chroma, row->blocks[2]);
581  ctx->idsp.idct_put(dest_u + dct_x_offset, dct_linesize_chroma, row->blocks[3]);
582  ctx->idsp.idct_put(dest_u + dct_y_offset, dct_linesize_chroma, row->blocks[8]);
583  ctx->idsp.idct_put(dest_u + dct_y_offset + dct_x_offset, dct_linesize_chroma, row->blocks[9]);
584  ctx->idsp.idct_put(dest_v, dct_linesize_chroma, row->blocks[4]);
585  ctx->idsp.idct_put(dest_v + dct_x_offset, dct_linesize_chroma, row->blocks[5]);
586  ctx->idsp.idct_put(dest_v + dct_y_offset, dct_linesize_chroma, row->blocks[10]);
587  ctx->idsp.idct_put(dest_v + dct_y_offset + dct_x_offset, dct_linesize_chroma, row->blocks[11]);
588  }
589  }
590 
591  return 0;
592 }
593 
595  int rownb, int threadnb)
596 {
597  const DNXHDContext *ctx = avctx->priv_data;
598  uint32_t offset = ctx->mb_scan_index[rownb];
599  RowContext *row = ctx->rows + threadnb;
600  int x, ret;
601 
602  row->last_dc[0] =
603  row->last_dc[1] =
604  row->last_dc[2] = 1 << (ctx->bit_depth + 2); // for levels +2^(bitdepth-1)
605  ret = init_get_bits8(&row->gb, ctx->buf + offset, ctx->buf_size - offset);
606  if (ret < 0) {
607  row->errors++;
608  return ret;
609  }
610  for (x = 0; x < ctx->mb_width; x++) {
611  //START_TIMER;
612  int ret = dnxhd_decode_macroblock(ctx, row, data, x, rownb);
613  if (ret < 0) {
614  row->errors++;
615  return ret;
616  }
617  //STOP_TIMER("decode macroblock");
618  }
619 
620  return 0;
621 }
622 
624  int *got_frame, AVPacket *avpkt)
625 {
626  const uint8_t *buf = avpkt->data;
627  int buf_size = avpkt->size;
629  ThreadFrame frame = { .f = data };
630  AVFrame *picture = data;
631  int first_field = 1;
632  int ret, i;
633 
634  ff_dlog(avctx, "frame size %d\n", buf_size);
635 
636  for (i = 0; i < avctx->thread_count; i++)
637  ctx->rows[i].format = -1;
638 
639 decode_coding_unit:
640  if ((ret = dnxhd_decode_header(ctx, picture, buf, buf_size, first_field)) < 0)
641  return ret;
642 
643  if ((avctx->width || avctx->height) &&
644  (ctx->width != avctx->width || ctx->height != avctx->height)) {
645  av_log(avctx, AV_LOG_WARNING, "frame size changed: %dx%d -> %ux%u\n",
646  avctx->width, avctx->height, ctx->width, ctx->height);
647  first_field = 1;
648  }
649  if (avctx->pix_fmt != AV_PIX_FMT_NONE && avctx->pix_fmt != ctx->pix_fmt) {
650  av_log(avctx, AV_LOG_WARNING, "pix_fmt changed: %s -> %s\n",
652  first_field = 1;
653  }
654 
655  avctx->pix_fmt = ctx->pix_fmt;
656  ret = ff_set_dimensions(avctx, ctx->width, ctx->height);
657  if (ret < 0)
658  return ret;
659 
660  if (first_field) {
661  if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
662  return ret;
663  picture->pict_type = AV_PICTURE_TYPE_I;
664  picture->key_frame = 1;
665  }
666 
667  ctx->buf_size = buf_size - ctx->data_offset;
668  ctx->buf = buf + ctx->data_offset;
669  avctx->execute2(avctx, dnxhd_decode_row, picture, NULL, ctx->mb_height);
670 
671  if (first_field && picture->interlaced_frame) {
672  buf += ctx->cid_table->coding_unit_size;
673  buf_size -= ctx->cid_table->coding_unit_size;
674  first_field = 0;
675  goto decode_coding_unit;
676  }
677 
678  ret = 0;
679  for (i = 0; i < avctx->thread_count; i++) {
680  ret += ctx->rows[i].errors;
681  ctx->rows[i].errors = 0;
682  }
683 
684  if (ctx->act) {
685  static int act_warned;
686  int format = ctx->rows[0].format;
687  for (i = 1; i < avctx->thread_count; i++) {
688  if (ctx->rows[i].format != format &&
689  ctx->rows[i].format != -1 /* not run */) {
690  format = 2;
691  break;
692  }
693  }
694  switch (format) {
695  case -1:
696  case 2:
697  if (!act_warned) {
698  act_warned = 1;
699  av_log(ctx->avctx, AV_LOG_ERROR,
700  "Unsupported: variable ACT flag.\n");
701  }
702  break;
703  case 0:
704  ctx->pix_fmt = ctx->bit_depth==10
706  break;
707  case 1:
708  ctx->pix_fmt = ctx->bit_depth==10
710  break;
711  }
712  }
713  avctx->pix_fmt = ctx->pix_fmt;
714  if (ret) {
715  av_log(ctx->avctx, AV_LOG_ERROR, "%d lines with errors\n", ret);
716  return AVERROR_INVALIDDATA;
717  }
718 
719  *got_frame = 1;
720  return avpkt->size;
721 }
722 
724 {
726 
727  ff_free_vlc(&ctx->ac_vlc);
728  ff_free_vlc(&ctx->dc_vlc);
729  ff_free_vlc(&ctx->run_vlc);
730 
731  av_freep(&ctx->rows);
732 
733  return 0;
734 }
735 
737  .name = "dnxhd",
738  .long_name = NULL_IF_CONFIG_SMALL("VC3/DNxHD"),
739  .type = AVMEDIA_TYPE_VIDEO,
740  .id = AV_CODEC_ID_DNXHD,
741  .priv_data_size = sizeof(DNXHDContext),
743  .close = dnxhd_decode_close,
745  .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
749 };
AVCodec
AVCodec.
Definition: avcodec.h:3481
bit_depth
static void bit_depth(AudioStatsContext *s, uint64_t mask, uint64_t imask, AVRational *depth)
Definition: af_astats.c:226
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:207
ff_dnxhd_decoder
AVCodec ff_dnxhd_decoder
Definition: dnxhddec.c:736
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:46
AVCodecContext::colorspace
enum AVColorSpace colorspace
YUV colorspace type.
Definition: avcodec.h:2193
out
FILE * out
Definition: movenc.c:54
DNXHDContext::buf_size
int buf_size
Definition: dnxhddec.c:56
n
int n
Definition: avisynth_c.h:760
DNXHDContext::is_444
int is_444
Definition: dnxhddec.c:69
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:295
internal.h
AVPacket::data
uint8_t * data
Definition: avcodec.h:1477
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:53
av_mallocz_array
void * av_mallocz_array(size_t nmemb, size_t size)
Definition: mem.c:191
FF_PROFILE_DNXHD
#define FF_PROFILE_DNXHD
Definition: avcodec.h:2913
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:192
DNXHDContext::alpha
int alpha
Definition: dnxhddec.c:70
UPDATE_CACHE
#define UPDATE_CACHE(name, gb)
Definition: get_bits.h:178
BlockDSPContext
Definition: blockdsp.h:35
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:188
CIDEntry::coding_unit_size
unsigned int coding_unit_size
Definition: dnxhddata.h:46
DNXHDContext::ac_vlc
VLC ac_vlc
Definition: dnxhddec.c:64
DNXHDContext::height
unsigned int height
Definition: dnxhddec.c:58
DNXHDContext::mb_scan_index
uint32_t mb_scan_index[512]
Definition: dnxhddec.c:61
GET_CACHE
#define GET_CACHE(name, gb)
Definition: get_bits.h:215
DNXHD_VLC_BITS
#define DNXHD_VLC_BITS
Definition: dnxhddec.c:78
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:60
RowContext::chroma_scale
int chroma_scale[64]
Definition: dnxhddec.c:42
DNXHDContext::cur_field
int cur_field
current interlaced field
Definition: dnxhddec.c:63
AVCodecContext::thread_count
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition: avcodec.h:2824
DNXHDContext
Definition: dnxhddec.c:51
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:403
DNXHDContext::idsp
IDCTDSPContext idsp
Definition: dnxhddec.c:65
GetBitContext
Definition: get_bits.h:61
DNXHDContext::bit_depth
int bit_depth
Definition: dnxhddec.c:68
AVFrame::key_frame
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:373
AVCodecContext::coded_height
int coded_height
Definition: avcodec.h:1753
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:2914
CIDEntry
Definition: dnxhddata.h:42
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:390
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
buf
void * buf
Definition: avisynth_c.h:766
av_cold
#define av_cold
Definition: attributes.h:84
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:42
dnxhd_decode_close
static av_cold int dnxhd_decode_close(AVCodecContext *avctx)
Definition: dnxhddec.c:723
dnxhd_get_profile
static int dnxhd_get_profile(int cid)
Definition: dnxhddec.c:171
dnxhd_decode_frame
static int dnxhd_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: dnxhddec.c:623
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1473
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:79
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:41
get_bits.h
DNXHDContext::act
int act
Definition: dnxhddec.c:73
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:60
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:2916
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: avcodec.h:1037
DNXHDContext::data_offset
int data_offset
Definition: dnxhddec.c:62
dnxhd_decode_dct_block_12_444
static int dnxhd_decode_dct_block_12_444(const DNXHDContext *ctx, RowContext *row, int n)
Definition: dnxhddec.c:486
NULL
#define NULL
Definition: coverity.c:32
DNXHDContext::avctx
AVCodecContext * avctx
Definition: dnxhddec.c:52
dnxhd_decode_init_thread_copy
static av_cold int dnxhd_decode_init_thread_copy(AVCodecContext *avctx)
Definition: dnxhddec.c:156
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:71
profiles.h
DNXHDContext::bdsp
BlockDSPContext bdsp
Definition: dnxhddec.c:54
timer.h
LAST_SKIP_BITS
#define LAST_SKIP_BITS(name, gb, num)
Definition: get_bits.h:199
ONLY_IF_THREADS_ENABLED
#define ONLY_IF_THREADS_ENABLED(x)
Define a function with only the non-default version specified.
Definition: internal.h:227
ff_thread_get_buffer
int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
Definition: pthread_frame.c:964
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:388
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:92
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:48
error
static void error(const char *err)
Definition: target_dec_fuzzer.c:61
ff_dlog
#define ff_dlog(a,...)
Definition: tableprint_vlc.h:29
cid
int cid
Definition: mxfenc.c:2072
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:378
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: avcodec.h:981
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:357
AV_CODEC_FLAG_GRAY
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
Definition: avcodec.h:883
AVPacket::size
int size
Definition: avcodec.h:1478
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:392
init_thread_copy
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 add an init_thread_copy() which re-allocates them for other threads. Add AV_CODEC_CAP_FRAME_THREADS to the codec capabilities. There will be very little speed gain at this point but it should work. If there are inter-frame dependencies
RowContext
Definition: dnxhddec.c:39
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:394
RowContext::gb
GetBitContext gb
Definition: dnxhddec.c:43
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: avcodec.h:1041
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:40
RowContext::last_qscale
int last_qscale
Definition: dnxhddec.c:45
DNXHDContext::cid
int64_t cid
compression id
Definition: dnxhddec.c:57
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:442
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:74
FF_PROFILE_DNXHR_SQ
#define FF_PROFILE_DNXHR_SQ
Definition: avcodec.h:2915
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:259
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:404
av_always_inline
#define av_always_inline
Definition: attributes.h:43
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: avcodec.h:3488
len
int len
Definition: vorbis_enc_data.h:452
DNXHDContext::run_vlc
VLC run_vlc
Definition: dnxhddec.c:64
AVCOL_SPC_UNSPECIFIED
@ AVCOL_SPC_UNSPECIFIED
Definition: pixfmt.h:499
AVCodecContext::height
int height
Definition: avcodec.h:1738
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:1775
DNXHDContext::pix_fmt
enum AVPixelFormat pix_fmt
Definition: dnxhddec.c:59
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:44
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:55
AVCodecContext
main external API structure.
Definition: avcodec.h:1565
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:112
FF_PROFILE_DNXHR_HQX
#define FF_PROFILE_DNXHR_HQX
Definition: avcodec.h:2917
AVCodecContext::coded_width
int coded_width
Bitstream width / height, may be different from width/height e.g.
Definition: avcodec.h:1753
DNXHDContext::width
unsigned int width
Definition: dnxhddec.c:58
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:72
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: avcodec.h:1454
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:1592
dnxhd_decode_macroblock
static int dnxhd_decode_macroblock(const DNXHDContext *ctx, RowContext *row, AVFrame *frame, int x, int y)
Definition: dnxhddec.c:492
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
FF_PROFILE_DNXHR_444
#define FF_PROFILE_DNXHR_444
Definition: avcodec.h:2918
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:1738
dnxhd_decode_dct_block_10_444
static int dnxhd_decode_dct_block_10_444(const DNXHDContext *ctx, RowContext *row, int n)
Definition: dnxhddec.c:474
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:594
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:64
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:498
int
int
Definition: ffmpeg_filter.c:191
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:462
DNXHDContext::cid_table
const CIDEntry * cid_table
Definition: dnxhddec.c:67
dnxhd_decode_dct_block_10
static int dnxhd_decode_dct_block_10(const DNXHDContext *ctx, RowContext *row, int n)
Definition: dnxhddec.c:468
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:2884
AV_CODEC_ID_DNXHD
@ AV_CODEC_ID_DNXHD
Definition: avcodec.h:317
dnxhd_decode_dct_block_12
static int dnxhd_decode_dct_block_12(const DNXHDContext *ctx, RowContext *row, int n)
Definition: dnxhddec.c:480
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:2438
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:66