FFmpeg
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
dnxhdenc.c
Go to the documentation of this file.
1 /*
2  * VC3/DNxHD encoder
3  * Copyright (c) 2007 Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>
4  * Copyright (c) 2011 MirriAd Ltd
5  *
6  * VC-3 encoder funded by the British Broadcasting Corporation
7  * 10 bit support added by MirriAd Ltd, Joseph Artsimovich <joseph@mirriad.com>
8  *
9  * This file is part of FFmpeg.
10  *
11  * FFmpeg is free software; you can redistribute it and/or
12  * modify it under the terms of the GNU Lesser General Public
13  * License as published by the Free Software Foundation; either
14  * version 2.1 of the License, or (at your option) any later version.
15  *
16  * FFmpeg is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19  * Lesser General Public License for more details.
20  *
21  * You should have received a copy of the GNU Lesser General Public
22  * License along with FFmpeg; if not, write to the Free Software
23  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24  */
25 
26 #include "libavutil/attributes.h"
27 #include "libavutil/internal.h"
28 #include "libavutil/mem.h"
29 #include "libavutil/mem_internal.h"
30 #include "libavutil/opt.h"
31 
32 #include "avcodec.h"
33 #include "blockdsp.h"
34 #include "codec_internal.h"
35 #include "encode.h"
36 #include "fdctdsp.h"
37 #include "mathops.h"
38 #include "mpegvideo.h"
39 #include "mpegvideoenc.h"
40 #include "pixblockdsp.h"
41 #include "packet_internal.h"
42 #include "profiles.h"
43 #include "dnxhdenc.h"
44 
45 // The largest value that will not lead to overflow for 10-bit samples.
46 #define DNX10BIT_QMAT_SHIFT 18
47 #define RC_VARIANCE 1 // use variance or ssd for fast rc
48 #define LAMBDA_FRAC_BITS 10
49 
50 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
51 static const AVOption options[] = {
52  { "nitris_compat", "encode with Avid Nitris compatibility",
53  offsetof(DNXHDEncContext, nitris_compat), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
54  { "ibias", "intra quant bias",
55  offsetof(DNXHDEncContext, intra_quant_bias), AV_OPT_TYPE_INT,
56  { .i64 = 0 }, INT_MIN, INT_MAX, VE },
57  { "profile", NULL, offsetof(DNXHDEncContext, profile), AV_OPT_TYPE_INT,
58  { .i64 = AV_PROFILE_DNXHD },
59  AV_PROFILE_DNXHD, AV_PROFILE_DNXHR_444, VE, .unit = "profile" },
60  { "dnxhd", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_PROFILE_DNXHD },
61  0, 0, VE, .unit = "profile" },
62  { "dnxhr_444", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_PROFILE_DNXHR_444 },
63  0, 0, VE, .unit = "profile" },
64  { "dnxhr_hqx", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_PROFILE_DNXHR_HQX },
65  0, 0, VE, .unit = "profile" },
66  { "dnxhr_hq", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_PROFILE_DNXHR_HQ },
67  0, 0, VE, .unit = "profile" },
68  { "dnxhr_sq", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_PROFILE_DNXHR_SQ },
69  0, 0, VE, .unit = "profile" },
70  { "dnxhr_lb", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_PROFILE_DNXHR_LB },
71  0, 0, VE, .unit = "profile" },
72  { NULL }
73 };
74 
75 static const AVClass dnxhd_class = {
76  .class_name = "dnxhd",
77  .item_name = av_default_item_name,
78  .option = options,
79  .version = LIBAVUTIL_VERSION_INT,
80 };
81 
82 static void dnxhd_8bit_get_pixels_8x4_sym(int16_t *restrict block,
83  const uint8_t *pixels,
84  ptrdiff_t line_size)
85 {
86  int i;
87  for (i = 0; i < 4; i++) {
88  block[0] = pixels[0];
89  block[1] = pixels[1];
90  block[2] = pixels[2];
91  block[3] = pixels[3];
92  block[4] = pixels[4];
93  block[5] = pixels[5];
94  block[6] = pixels[6];
95  block[7] = pixels[7];
96  pixels += line_size;
97  block += 8;
98  }
99  memcpy(block, block - 8, sizeof(*block) * 8);
100  memcpy(block + 8, block - 16, sizeof(*block) * 8);
101  memcpy(block + 16, block - 24, sizeof(*block) * 8);
102  memcpy(block + 24, block - 32, sizeof(*block) * 8);
103 }
104 
105 static av_always_inline
106 void dnxhd_10bit_get_pixels_8x4_sym(int16_t *restrict block,
107  const uint8_t *pixels,
108  ptrdiff_t line_size)
109 {
110  memcpy(block + 0 * 8, pixels + 0 * line_size, 8 * sizeof(*block));
111  memcpy(block + 7 * 8, pixels + 0 * line_size, 8 * sizeof(*block));
112  memcpy(block + 1 * 8, pixels + 1 * line_size, 8 * sizeof(*block));
113  memcpy(block + 6 * 8, pixels + 1 * line_size, 8 * sizeof(*block));
114  memcpy(block + 2 * 8, pixels + 2 * line_size, 8 * sizeof(*block));
115  memcpy(block + 5 * 8, pixels + 2 * line_size, 8 * sizeof(*block));
116  memcpy(block + 3 * 8, pixels + 3 * line_size, 8 * sizeof(*block));
117  memcpy(block + 4 * 8, pixels + 3 * line_size, 8 * sizeof(*block));
118 }
119 
121  int n, int qscale, int *overflow)
122 {
123  int i, j, level, last_non_zero, start_i;
124  const int *qmat;
125  const uint8_t *scantable = ctx->c.intra_scantable.scantable;
126  int bias;
127  int max = 0;
128  unsigned int threshold1, threshold2;
129 
130  ctx->fdsp.fdct(block);
131 
132  block[0] = (block[0] + 2) >> 2;
133  start_i = 1;
134  last_non_zero = 0;
135  qmat = n < 4 ? ctx->q_intra_matrix[qscale] : ctx->q_chroma_intra_matrix[qscale];
136  bias= ctx->intra_quant_bias * (1 << (16 - 8));
137  threshold1 = (1 << 16) - bias - 1;
138  threshold2 = (threshold1 << 1);
139 
140  for (i = 63; i >= start_i; i--) {
141  j = scantable[i];
142  level = block[j] * qmat[j];
143 
144  if (((unsigned)(level + threshold1)) > threshold2) {
145  last_non_zero = i;
146  break;
147  } else{
148  block[j]=0;
149  }
150  }
151 
152  for (i = start_i; i <= last_non_zero; i++) {
153  j = scantable[i];
154  level = block[j] * qmat[j];
155 
156  if (((unsigned)(level + threshold1)) > threshold2) {
157  if (level > 0) {
158  level = (bias + level) >> 16;
159  block[j] = level;
160  } else{
161  level = (bias - level) >> 16;
162  block[j] = -level;
163  }
164  max |= level;
165  } else {
166  block[j] = 0;
167  }
168  }
169  *overflow = ctx->max_qcoeff < max; //overflow might have happened
170 
171  /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
172  if (ctx->c.idsp.perm_type != FF_IDCT_PERM_NONE)
173  ff_block_permute(block, ctx->c.idsp.idct_permutation,
174  scantable, last_non_zero);
175 
176  return last_non_zero;
177 }
178 
180  int n, int qscale, int *overflow)
181 {
182  const uint8_t *scantable = ctx->c.intra_scantable.scantable;
183  const int *qmat = n<4 ? ctx->q_intra_matrix[qscale] : ctx->q_chroma_intra_matrix[qscale];
184  int last_non_zero = 0;
185  int i;
186 
187  ctx->fdsp.fdct(block);
188 
189  // Divide by 4 with rounding, to compensate scaling of DCT coefficients
190  block[0] = (block[0] + 2) >> 2;
191 
192  for (i = 1; i < 64; ++i) {
193  int j = scantable[i];
194  int sign = FF_SIGNBIT(block[j]);
195  int level = (block[j] ^ sign) - sign;
196  level = level * qmat[j] >> DNX10BIT_QMAT_SHIFT;
197  block[j] = (level ^ sign) - sign;
198  if (level)
199  last_non_zero = i;
200  }
201 
202  /* we need this permutation so that we correct the IDCT, we only permute the !=0 elements */
203  if (ctx->c.idsp.perm_type != FF_IDCT_PERM_NONE)
204  ff_block_permute(block, ctx->c.idsp.idct_permutation,
205  scantable, last_non_zero);
206 
207  return last_non_zero;
208 }
209 
211 {
212  int i, j, level, run;
213  int max_level = 1 << (ctx->bit_depth + 2);
214 
215  if (!FF_ALLOCZ_TYPED_ARRAY(ctx->orig_vlc_codes, max_level * 4) ||
216  !FF_ALLOCZ_TYPED_ARRAY(ctx->orig_vlc_bits, max_level * 4) ||
217  !(ctx->run_codes = av_mallocz(63 * 2)) ||
218  !(ctx->run_bits = av_mallocz(63)))
219  return AVERROR(ENOMEM);
220  ctx->vlc_codes = ctx->orig_vlc_codes + max_level * 2;
221  ctx->vlc_bits = ctx->orig_vlc_bits + max_level * 2;
222  for (level = -max_level; level < max_level; level++) {
223  for (run = 0; run < 2; run++) {
224  int index = level * (1 << 1) | run;
225  int sign, offset = 0, alevel = level;
226 
227  MASK_ABS(sign, alevel);
228  if (alevel > 64) {
229  offset = (alevel - 1) >> 6;
230  alevel -= offset << 6;
231  }
232  for (j = 0; j < 257; j++) {
233  if (ctx->cid_table->ac_info[2*j+0] >> 1 == alevel &&
234  (!offset || (ctx->cid_table->ac_info[2*j+1] & 1) && offset) &&
235  (!run || (ctx->cid_table->ac_info[2*j+1] & 2) && run)) {
236  av_assert1(!ctx->vlc_codes[index]);
237  if (alevel) {
238  ctx->vlc_codes[index] =
239  (ctx->cid_table->ac_codes[j] << 1) | (sign & 1);
240  ctx->vlc_bits[index] = ctx->cid_table->ac_bits[j] + 1;
241  } else {
242  ctx->vlc_codes[index] = ctx->cid_table->ac_codes[j];
243  ctx->vlc_bits[index] = ctx->cid_table->ac_bits[j];
244  }
245  break;
246  }
247  }
248  av_assert0(!alevel || j < 257);
249  if (offset) {
250  ctx->vlc_codes[index] =
251  (ctx->vlc_codes[index] << ctx->cid_table->index_bits) | offset;
252  ctx->vlc_bits[index] += ctx->cid_table->index_bits;
253  }
254  }
255  }
256  for (i = 0; i < 62; i++) {
257  int run = ctx->cid_table->run[i];
258  av_assert0(run < 63);
259  ctx->run_codes[run] = ctx->cid_table->run_codes[i];
260  ctx->run_bits[run] = ctx->cid_table->run_bits[i];
261  }
262  return 0;
263 }
264 
265 static av_cold int dnxhd_init_qmat(DNXHDEncContext *ctx, int lbias, int cbias)
266 {
267  // init first elem to 1 to avoid div by 0 in convert_matrix
268  uint16_t weight_matrix[64] = { 1, }; // convert_matrix needs uint16_t*
269  const uint8_t *luma_weight_table = ctx->cid_table->luma_weight;
270  const uint8_t *chroma_weight_table = ctx->cid_table->chroma_weight;
271 
272  if (!FF_ALLOCZ_TYPED_ARRAY(ctx->qmatrix_l, ctx->m.c.avctx->qmax + 1) ||
273  !FF_ALLOCZ_TYPED_ARRAY(ctx->qmatrix_c, ctx->m.c.avctx->qmax + 1) ||
274  !FF_ALLOCZ_TYPED_ARRAY(ctx->qmatrix_l16, ctx->m.c.avctx->qmax + 1) ||
275  !FF_ALLOCZ_TYPED_ARRAY(ctx->qmatrix_c16, ctx->m.c.avctx->qmax + 1))
276  return AVERROR(ENOMEM);
277 
278  if (ctx->bit_depth == 8) {
279  for (int i = 1; i < 64; i++) {
280  int j = ctx->m.c.idsp.idct_permutation[ff_zigzag_direct[i]];
281  weight_matrix[j] = ctx->cid_table->luma_weight[i];
282  }
283  ff_convert_matrix(&ctx->m, ctx->qmatrix_l, ctx->qmatrix_l16,
284  weight_matrix, ctx->intra_quant_bias, 1,
285  ctx->m.c.avctx->qmax, 1);
286  for (int i = 1; i < 64; i++) {
287  int j = ctx->m.c.idsp.idct_permutation[ff_zigzag_direct[i]];
288  weight_matrix[j] = ctx->cid_table->chroma_weight[i];
289  }
290  ff_convert_matrix(&ctx->m, ctx->qmatrix_c, ctx->qmatrix_c16,
291  weight_matrix, ctx->intra_quant_bias, 1,
292  ctx->m.c.avctx->qmax, 1);
293 
294  for (int qscale = 1; qscale <= ctx->m.c.avctx->qmax; qscale++) {
295  for (int i = 0; i < 64; i++) {
296  ctx->qmatrix_l[qscale][i] <<= 2;
297  ctx->qmatrix_c[qscale][i] <<= 2;
298  ctx->qmatrix_l16[qscale][0][i] <<= 2;
299  ctx->qmatrix_l16[qscale][1][i] <<= 2;
300  ctx->qmatrix_c16[qscale][0][i] <<= 2;
301  ctx->qmatrix_c16[qscale][1][i] <<= 2;
302  }
303  }
304  } else {
305  // 10-bit
306  for (int qscale = 1; qscale <= ctx->m.c.avctx->qmax; qscale++) {
307  for (int i = 1; i < 64; i++) {
308  int j = ff_zigzag_direct[i];
309 
310  /* The quantization formula from the VC-3 standard is:
311  * quantized = sign(block[i]) * floor(abs(block[i]/s) * p /
312  * (qscale * weight_table[i]))
313  * Where p is 32 for 8-bit samples and 8 for 10-bit ones.
314  * The s factor compensates scaling of DCT coefficients done by
315  * the DCT routines, and therefore is not present in standard.
316  * It's 8 for 8-bit samples and 4 for 10-bit ones.
317  * We want values of ctx->qtmatrix_l and ctx->qtmatrix_r to be:
318  * ((1 << DNX10BIT_QMAT_SHIFT) * (p / s)) /
319  * (qscale * weight_table[i])
320  * For 10-bit samples, p / s == 2 */
321  ctx->qmatrix_l[qscale][j] = (1 << (DNX10BIT_QMAT_SHIFT + 1)) /
322  (qscale * luma_weight_table[i]);
323  ctx->qmatrix_c[qscale][j] = (1 << (DNX10BIT_QMAT_SHIFT + 1)) /
324  (qscale * chroma_weight_table[i]);
325  }
326  }
327  }
328 
329  ctx->m.q_chroma_intra_matrix16 = ctx->qmatrix_c16;
330  ctx->m.q_chroma_intra_matrix = ctx->qmatrix_c;
331  ctx->m.q_intra_matrix16 = ctx->qmatrix_l16;
332  ctx->m.q_intra_matrix = ctx->qmatrix_l;
333 
334  return 0;
335 }
336 
338 {
339  if (!FF_ALLOCZ_TYPED_ARRAY(ctx->mb_rc, (ctx->m.c.avctx->qmax + 1) * ctx->m.c.mb_num))
340  return AVERROR(ENOMEM);
341 
342  if (ctx->m.c.avctx->mb_decision != FF_MB_DECISION_RD) {
343  if (!FF_ALLOCZ_TYPED_ARRAY(ctx->mb_cmp, ctx->m.c.mb_num) ||
344  !FF_ALLOCZ_TYPED_ARRAY(ctx->mb_cmp_tmp, ctx->m.c.mb_num))
345  return AVERROR(ENOMEM);
346  }
347  ctx->frame_bits = (ctx->coding_unit_size -
348  ctx->data_offset - 4 - ctx->min_padding) * 8;
349  ctx->qscale = 1;
350  ctx->lambda = 2 << LAMBDA_FRAC_BITS; // qscale 2
351  return 0;
352 }
353 
355 {
357  int i, ret;
358 
359  switch (avctx->pix_fmt) {
360  case AV_PIX_FMT_YUV422P:
361  ctx->bit_depth = 8;
362  break;
365  case AV_PIX_FMT_GBRP10:
366  ctx->bit_depth = 10;
367  break;
368  }
369 
370  if ((ctx->profile == AV_PROFILE_DNXHR_444 && (avctx->pix_fmt != AV_PIX_FMT_YUV444P10 &&
375  "pixel format is incompatible with DNxHD profile\n");
376  return AVERROR(EINVAL);
377  }
378 
379  if (ctx->profile == AV_PROFILE_DNXHR_HQX && avctx->pix_fmt != AV_PIX_FMT_YUV422P10) {
381  "pixel format is incompatible with DNxHR HQX profile\n");
382  return AVERROR(EINVAL);
383  }
384 
385  if ((ctx->profile == AV_PROFILE_DNXHR_LB ||
386  ctx->profile == AV_PROFILE_DNXHR_SQ ||
389  "pixel format is incompatible with DNxHR LB/SQ/HQ profile\n");
390  return AVERROR(EINVAL);
391  }
392 
393  ctx->is_444 = ctx->profile == AV_PROFILE_DNXHR_444;
394  avctx->profile = ctx->profile;
395  ctx->cid = ff_dnxhd_find_cid(avctx, ctx->bit_depth);
396  if (!ctx->cid) {
398  "video parameters incompatible with DNxHD. Valid DNxHD profiles:\n");
400  return AVERROR(EINVAL);
401  }
402  av_log(avctx, AV_LOG_DEBUG, "cid %d\n", ctx->cid);
403 
404  if (ctx->cid >= 1270 && ctx->cid <= 1274)
405  avctx->codec_tag = MKTAG('A','V','d','h');
406 
407  if (avctx->width < 256 || avctx->height < 120) {
409  "Input dimensions too small, input must be at least 256x120\n");
410  return AVERROR(EINVAL);
411  }
412 
413  ctx->cid_table = ff_dnxhd_get_cid_table(ctx->cid);
414  av_assert0(ctx->cid_table);
415 
416  ctx->m.c.avctx = avctx;
417  ctx->m.c.mb_intra = 1;
418  ctx->m.c.h263_aic = 1;
419 
420  avctx->bits_per_raw_sample = ctx->bit_depth;
421 
422  ff_blockdsp_init(&ctx->m.c.bdsp);
423  ff_fdctdsp_init(&ctx->m.fdsp, avctx);
424  ff_mpv_idct_init(&ctx->m.c);
425  ff_mpegvideoencdsp_init(&ctx->m.mpvencdsp, avctx);
426  ff_pixblockdsp_init(&ctx->m.pdsp, avctx);
427  ff_dct_encode_init(&ctx->m);
428 
429  if (ctx->profile != AV_PROFILE_DNXHD)
430  ff_videodsp_init(&ctx->m.c.vdsp, ctx->bit_depth);
431 
432  if (ctx->is_444 || ctx->profile == AV_PROFILE_DNXHR_HQX) {
433  ctx->m.dct_quantize = dnxhd_10bit_dct_quantize_444;
434  ctx->get_pixels_8x4_sym = dnxhd_10bit_get_pixels_8x4_sym;
435  ctx->block_width_l2 = 4;
436  } else if (ctx->bit_depth == 10) {
437  ctx->m.dct_quantize = dnxhd_10bit_dct_quantize;
438  ctx->get_pixels_8x4_sym = dnxhd_10bit_get_pixels_8x4_sym;
439  ctx->block_width_l2 = 4;
440  } else {
441  ctx->get_pixels_8x4_sym = dnxhd_8bit_get_pixels_8x4_sym;
442  ctx->block_width_l2 = 3;
443  }
444 
446 
447  ctx->m.c.mb_height = (avctx->height + 15) / 16;
448  ctx->m.c.mb_width = (avctx->width + 15) / 16;
449 
451  ctx->interlaced = 1;
452  ctx->m.c.mb_height /= 2;
453  }
454 
455  if (ctx->interlaced && ctx->profile != AV_PROFILE_DNXHD) {
457  "Interlaced encoding is not supported for DNxHR profiles.\n");
458  return AVERROR(EINVAL);
459  }
460 
461  ctx->m.c.mb_num = ctx->m.c.mb_height * ctx->m.c.mb_width;
462 
463  if (ctx->cid_table->frame_size == DNXHD_VARIABLE) {
464  ctx->frame_size = ff_dnxhd_get_hr_frame_size(ctx->cid,
465  avctx->width, avctx->height);
466  av_assert0(ctx->frame_size >= 0);
467  ctx->coding_unit_size = ctx->frame_size;
468  } else {
469  ctx->frame_size = ctx->cid_table->frame_size;
470  ctx->coding_unit_size = ctx->cid_table->coding_unit_size;
471  }
472 
473  if (ctx->m.c.mb_height > 68)
474  ctx->data_offset = 0x170 + (ctx->m.c.mb_height << 2);
475  else
476  ctx->data_offset = 0x280;
477 
478  // XXX tune lbias/cbias
479  if ((ret = dnxhd_init_qmat(ctx, ctx->intra_quant_bias, 0)) < 0)
480  return ret;
481 
482  /* Avid Nitris hardware decoder requires a minimum amount of padding
483  * in the coding unit payload */
484  if (ctx->nitris_compat)
485  ctx->min_padding = 1600;
486 
487  if ((ret = dnxhd_init_vlc(ctx)) < 0)
488  return ret;
489  if ((ret = dnxhd_init_rc(ctx)) < 0)
490  return ret;
491 
492  if (!FF_ALLOCZ_TYPED_ARRAY(ctx->slice_size, ctx->m.c.mb_height) ||
493  !FF_ALLOCZ_TYPED_ARRAY(ctx->slice_offs, ctx->m.c.mb_height) ||
494  !FF_ALLOCZ_TYPED_ARRAY(ctx->mb_bits, ctx->m.c.mb_num) ||
495  !FF_ALLOCZ_TYPED_ARRAY(ctx->mb_qscale, ctx->m.c.mb_num))
496  return AVERROR(ENOMEM);
497 
499  if (avctx->thread_count > MAX_THREADS) {
500  av_log(avctx, AV_LOG_ERROR, "too many threads\n");
501  return AVERROR(EINVAL);
502  }
503  }
504 
505  if (avctx->qmax <= 1) {
506  av_log(avctx, AV_LOG_ERROR, "qmax must be at least 2\n");
507  return AVERROR(EINVAL);
508  }
509 
510  ctx->thread[0] = ctx;
512  for (i = 1; i < avctx->thread_count; i++) {
513  ctx->thread[i] = av_memdup(ctx, sizeof(DNXHDEncContext));
514  if (!ctx->thread[i])
515  return AVERROR(ENOMEM);
516  }
517  }
518 
519  return 0;
520 }
521 
523 {
525 
526  memset(buf, 0, ctx->data_offset);
527 
528  // * write prefix */
529  AV_WB16(buf + 0x02, ctx->data_offset);
530  if (ctx->cid >= 1270 && ctx->cid <= 1274)
531  buf[4] = 0x03;
532  else
533  buf[4] = 0x01;
534 
535  buf[5] = ctx->interlaced ? ctx->cur_field + 2 : 0x01;
536  buf[6] = 0x80; // crc flag off
537  buf[7] = 0xa0; // reserved
538  AV_WB16(buf + 0x18, avctx->height >> ctx->interlaced); // ALPF
539  AV_WB16(buf + 0x1a, avctx->width); // SPL
540  AV_WB16(buf + 0x1d, avctx->height >> ctx->interlaced); // NAL
541 
542  buf[0x21] = ctx->bit_depth == 10 ? 0x58 : 0x38;
543  buf[0x22] = 0x88 + (ctx->interlaced << 2);
544  AV_WB32(buf + 0x28, ctx->cid); // CID
545  buf[0x2c] = (!ctx->interlaced << 7) | (ctx->is_444 << 6) | (avctx->pix_fmt == AV_PIX_FMT_YUV444P10);
546 
547  buf[0x5f] = 0x01; // UDL
548 
549  buf[0x167] = 0x02; // reserved
550  AV_WB16(buf + 0x16a, ctx->m.c.mb_height * 4 + 4); // MSIPS
551  AV_WB16(buf + 0x16c, ctx->m.c.mb_height); // Ns
552  buf[0x16f] = 0x10; // reserved
553 
554  ctx->msip = buf + 0x170;
555  return 0;
556 }
557 
559 {
560  int nbits;
561  if (diff < 0) {
562  nbits = av_log2_16bit(-2 * diff);
563  diff--;
564  } else {
565  nbits = av_log2_16bit(2 * diff);
566  }
567  put_bits(pb, ctx->cid_table->dc_bits[nbits] + nbits,
568  (ctx->cid_table->dc_codes[nbits] << nbits) +
569  av_zero_extend(diff, nbits));
570 }
571 
572 static av_always_inline
574  int16_t *block, int last_index, int n)
575 {
576  int last_non_zero = 0;
577  int slevel, i, j;
578 
579  dnxhd_encode_dc(pb, ctx, block[0] - ctx->m.c.last_dc[n]);
580  ctx->m.c.last_dc[n] = block[0];
581 
582  for (i = 1; i <= last_index; i++) {
583  j = ctx->m.c.intra_scantable.permutated[i];
584  slevel = block[j];
585  if (slevel) {
586  int run_level = i - last_non_zero - 1;
587  int rlevel = slevel * (1 << 1) | !!run_level;
588  put_bits(pb, ctx->vlc_bits[rlevel], ctx->vlc_codes[rlevel]);
589  if (run_level)
590  put_bits(pb, ctx->run_bits[run_level],
591  ctx->run_codes[run_level]);
592  last_non_zero = i;
593  }
594  }
595  put_bits(pb, ctx->vlc_bits[0], ctx->vlc_codes[0]); // EOB
596 }
597 
598 static av_always_inline
600  int qscale, int last_index)
601 {
602  const uint8_t *weight_matrix;
603  int level;
604  int i;
605 
606  if (ctx->is_444) {
607  weight_matrix = ((n % 6) < 2) ? ctx->cid_table->luma_weight
608  : ctx->cid_table->chroma_weight;
609  } else {
610  weight_matrix = (n & 2) ? ctx->cid_table->chroma_weight
611  : ctx->cid_table->luma_weight;
612  }
613 
614  for (i = 1; i <= last_index; i++) {
615  int j = ctx->m.c.intra_scantable.permutated[i];
616  level = block[j];
617  if (level) {
618  if (level < 0) {
619  level = (1 - 2 * level) * qscale * weight_matrix[i];
620  if (ctx->bit_depth == 10) {
621  if (weight_matrix[i] != 8)
622  level += 8;
623  level >>= 4;
624  } else {
625  if (weight_matrix[i] != 32)
626  level += 32;
627  level >>= 6;
628  }
629  level = -level;
630  } else {
631  level = (2 * level + 1) * qscale * weight_matrix[i];
632  if (ctx->bit_depth == 10) {
633  if (weight_matrix[i] != 8)
634  level += 8;
635  level >>= 4;
636  } else {
637  if (weight_matrix[i] != 32)
638  level += 32;
639  level >>= 6;
640  }
641  }
642  block[j] = level;
643  }
644  }
645 }
646 
647 static av_always_inline int dnxhd_ssd_block(int16_t *qblock, int16_t *block)
648 {
649  int score = 0;
650  int i;
651  for (i = 0; i < 64; i++)
652  score += (block[i] - qblock[i]) * (block[i] - qblock[i]);
653  return score;
654 }
655 
656 static av_always_inline
657 int dnxhd_calc_ac_bits(DNXHDEncContext *ctx, int16_t *block, int last_index)
658 {
659  int last_non_zero = 0;
660  int bits = 0;
661  int i, j, level;
662  for (i = 1; i <= last_index; i++) {
663  j = ctx->m.c.intra_scantable.permutated[i];
664  level = block[j];
665  if (level) {
666  int run_level = i - last_non_zero - 1;
667  bits += ctx->vlc_bits[level * (1 << 1) |
668  !!run_level] + ctx->run_bits[run_level];
669  last_non_zero = i;
670  }
671  }
672  return bits;
673 }
674 
675 static av_always_inline
676 void dnxhd_get_blocks(DNXHDEncContext *ctx, int mb_x, int mb_y)
677 {
678  const int bs = ctx->block_width_l2;
679  const int bw = 1 << bs;
680  int dct_y_offset = ctx->dct_y_offset;
681  int dct_uv_offset = ctx->dct_uv_offset;
682  int linesize = ctx->m.c.linesize;
683  int uvlinesize = ctx->m.c.uvlinesize;
684  const uint8_t *ptr_y = ctx->thread[0]->src[0] +
685  ((mb_y << 4) * ctx->m.c.linesize) + (mb_x << bs + 1);
686  const uint8_t *ptr_u = ctx->thread[0]->src[1] +
687  ((mb_y << 4) * ctx->m.c.uvlinesize) + (mb_x << bs + ctx->is_444);
688  const uint8_t *ptr_v = ctx->thread[0]->src[2] +
689  ((mb_y << 4) * ctx->m.c.uvlinesize) + (mb_x << bs + ctx->is_444);
690  PixblockDSPContext *pdsp = &ctx->m.pdsp;
691  VideoDSPContext *vdsp = &ctx->m.c.vdsp;
692 
693  if (ctx->bit_depth != 10 && vdsp->emulated_edge_mc && ((mb_x << 4) + 16 > ctx->m.c.avctx->width ||
694  (mb_y << 4) + 16 > ctx->m.c.avctx->height)) {
695  int y_w = ctx->m.c.avctx->width - (mb_x << 4);
696  int y_h = ctx->m.c.avctx->height - (mb_y << 4);
697  int uv_w = (y_w + 1) / 2;
698  int uv_h = y_h;
699  linesize = 16;
700  uvlinesize = 8;
701 
702  vdsp->emulated_edge_mc(&ctx->edge_buf_y[0], ptr_y,
703  linesize, ctx->m.c.linesize,
704  linesize, 16,
705  0, 0, y_w, y_h);
706  vdsp->emulated_edge_mc(&ctx->edge_buf_uv[0][0], ptr_u,
707  uvlinesize, ctx->m.c.uvlinesize,
708  uvlinesize, 16,
709  0, 0, uv_w, uv_h);
710  vdsp->emulated_edge_mc(&ctx->edge_buf_uv[1][0], ptr_v,
711  uvlinesize, ctx->m.c.uvlinesize,
712  uvlinesize, 16,
713  0, 0, uv_w, uv_h);
714 
715  dct_y_offset = bw * linesize;
716  dct_uv_offset = bw * uvlinesize;
717  ptr_y = &ctx->edge_buf_y[0];
718  ptr_u = &ctx->edge_buf_uv[0][0];
719  ptr_v = &ctx->edge_buf_uv[1][0];
720  } else if (ctx->bit_depth == 10 && vdsp->emulated_edge_mc && ((mb_x << 4) + 16 > ctx->m.c.avctx->width ||
721  (mb_y << 4) + 16 > ctx->m.c.avctx->height)) {
722  int y_w = ctx->m.c.avctx->width - (mb_x << 4);
723  int y_h = ctx->m.c.avctx->height - (mb_y << 4);
724  int uv_w = ctx->is_444 ? y_w : (y_w + 1) / 2;
725  int uv_h = y_h;
726  linesize = 32;
727  uvlinesize = 16 + 16 * ctx->is_444;
728 
729  vdsp->emulated_edge_mc(&ctx->edge_buf_y[0], ptr_y,
730  linesize, ctx->m.c.linesize,
731  linesize / 2, 16,
732  0, 0, y_w, y_h);
733  vdsp->emulated_edge_mc(&ctx->edge_buf_uv[0][0], ptr_u,
734  uvlinesize, ctx->m.c.uvlinesize,
735  uvlinesize / 2, 16,
736  0, 0, uv_w, uv_h);
737  vdsp->emulated_edge_mc(&ctx->edge_buf_uv[1][0], ptr_v,
738  uvlinesize, ctx->m.c.uvlinesize,
739  uvlinesize / 2, 16,
740  0, 0, uv_w, uv_h);
741 
742  dct_y_offset = bw * linesize / 2;
743  dct_uv_offset = bw * uvlinesize / 2;
744  ptr_y = &ctx->edge_buf_y[0];
745  ptr_u = &ctx->edge_buf_uv[0][0];
746  ptr_v = &ctx->edge_buf_uv[1][0];
747  }
748 
749  if (!ctx->is_444) {
750  pdsp->get_pixels(ctx->blocks[0], ptr_y, linesize);
751  pdsp->get_pixels(ctx->blocks[1], ptr_y + bw, linesize);
752  pdsp->get_pixels(ctx->blocks[2], ptr_u, uvlinesize);
753  pdsp->get_pixels(ctx->blocks[3], ptr_v, uvlinesize);
754 
755  if (mb_y + 1 == ctx->m.c.mb_height && ctx->m.c.avctx->height == 1080) {
756  if (ctx->interlaced) {
757  ctx->get_pixels_8x4_sym(ctx->blocks[4],
758  ptr_y + dct_y_offset,
759  linesize);
760  ctx->get_pixels_8x4_sym(ctx->blocks[5],
761  ptr_y + dct_y_offset + bw,
762  linesize);
763  ctx->get_pixels_8x4_sym(ctx->blocks[6],
764  ptr_u + dct_uv_offset,
765  uvlinesize);
766  ctx->get_pixels_8x4_sym(ctx->blocks[7],
767  ptr_v + dct_uv_offset,
768  uvlinesize);
769  } else {
770  ctx->m.c.bdsp.clear_block(ctx->blocks[4]);
771  ctx->m.c.bdsp.clear_block(ctx->blocks[5]);
772  ctx->m.c.bdsp.clear_block(ctx->blocks[6]);
773  ctx->m.c.bdsp.clear_block(ctx->blocks[7]);
774  }
775  } else {
776  pdsp->get_pixels(ctx->blocks[4],
777  ptr_y + dct_y_offset, linesize);
778  pdsp->get_pixels(ctx->blocks[5],
779  ptr_y + dct_y_offset + bw, linesize);
780  pdsp->get_pixels(ctx->blocks[6],
781  ptr_u + dct_uv_offset, uvlinesize);
782  pdsp->get_pixels(ctx->blocks[7],
783  ptr_v + dct_uv_offset, uvlinesize);
784  }
785  } else {
786  pdsp->get_pixels(ctx->blocks[0], ptr_y, linesize);
787  pdsp->get_pixels(ctx->blocks[1], ptr_y + bw, linesize);
788  pdsp->get_pixels(ctx->blocks[6], ptr_y + dct_y_offset, linesize);
789  pdsp->get_pixels(ctx->blocks[7], ptr_y + dct_y_offset + bw, linesize);
790 
791  pdsp->get_pixels(ctx->blocks[2], ptr_u, uvlinesize);
792  pdsp->get_pixels(ctx->blocks[3], ptr_u + bw, uvlinesize);
793  pdsp->get_pixels(ctx->blocks[8], ptr_u + dct_uv_offset, uvlinesize);
794  pdsp->get_pixels(ctx->blocks[9], ptr_u + dct_uv_offset + bw, uvlinesize);
795 
796  pdsp->get_pixels(ctx->blocks[4], ptr_v, uvlinesize);
797  pdsp->get_pixels(ctx->blocks[5], ptr_v + bw, uvlinesize);
798  pdsp->get_pixels(ctx->blocks[10], ptr_v + dct_uv_offset, uvlinesize);
799  pdsp->get_pixels(ctx->blocks[11], ptr_v + dct_uv_offset + bw, uvlinesize);
800  }
801 }
802 
803 static av_always_inline
805 {
806  int x;
807 
808  if (ctx->is_444) {
809  x = (i >> 1) % 3;
810  } else {
811  const static uint8_t component[8]={0,0,1,2,0,0,1,2};
812  x = component[i];
813  }
814  return x;
815 }
816 
818  int jobnr, int threadnr)
819 {
821  int mb_y = jobnr;
822  int qscale = ctx->qscale;
823  LOCAL_ALIGNED_16(int16_t, block, [64]);
824  ctx = ctx->thread[threadnr];
825 
826  ctx->m.c.last_dc[0] =
827  ctx->m.c.last_dc[1] =
828  ctx->m.c.last_dc[2] = 1 << (ctx->bit_depth + 2);
829 
830  for (int mb_x = 0; mb_x < ctx->m.c.mb_width; mb_x++) {
831  unsigned mb = mb_y * ctx->m.c.mb_width + mb_x;
832  int ssd = 0;
833  int ac_bits = 0;
834  int dc_bits = 0;
835  int i;
836 
837  dnxhd_get_blocks(ctx, mb_x, mb_y);
838 
839  for (i = 0; i < 8 + 4 * ctx->is_444; i++) {
840  int16_t *src_block = ctx->blocks[i];
841  int overflow, nbits, diff, last_index;
842  int n = dnxhd_switch_matrix(ctx, i);
843 
844  memcpy(block, src_block, 64 * sizeof(*block));
845  last_index = ctx->m.dct_quantize(&ctx->m, block,
846  ctx->is_444 ? 4 * (n > 0): 4 & (2*i),
847  qscale, &overflow);
848  ac_bits += dnxhd_calc_ac_bits(ctx, block, last_index);
849 
850  diff = block[0] - ctx->m.c.last_dc[n];
851  if (diff < 0)
852  nbits = av_log2_16bit(-2 * diff);
853  else
854  nbits = av_log2_16bit(2 * diff);
855 
856  av_assert1(nbits < ctx->bit_depth + 4);
857  dc_bits += ctx->cid_table->dc_bits[nbits] + nbits;
858 
859  ctx->m.c.last_dc[n] = block[0];
860 
862  dnxhd_unquantize_c(ctx, block, i, qscale, last_index);
863  ctx->m.c.idsp.idct(block);
864  ssd += dnxhd_ssd_block(block, src_block);
865  }
866  }
867  ctx->mb_rc[(qscale * ctx->m.c.mb_num) + mb].ssd = ssd;
868  ctx->mb_rc[(qscale * ctx->m.c.mb_num) + mb].bits = ac_bits + dc_bits + 12 +
869  (1 + ctx->is_444) * 8 * ctx->vlc_bits[0];
870  }
871  return 0;
872 }
873 
875  int jobnr, int threadnr)
876 {
878  PutBitContext pb0, *const pb = &pb0;
879  int mb_y = jobnr;
880  ctx = ctx->thread[threadnr];
881  init_put_bits(pb, (uint8_t *)arg + ctx->data_offset + ctx->slice_offs[jobnr],
882  ctx->slice_size[jobnr]);
883 
884  ctx->m.c.last_dc[0] =
885  ctx->m.c.last_dc[1] =
886  ctx->m.c.last_dc[2] = 1 << (ctx->bit_depth + 2);
887  for (int mb_x = 0; mb_x < ctx->m.c.mb_width; mb_x++) {
888  unsigned mb = mb_y * ctx->m.c.mb_width + mb_x;
889  int qscale = ctx->mb_qscale[mb];
890  int i;
891 
892  put_bits(pb, 11, qscale);
894 
895  dnxhd_get_blocks(ctx, mb_x, mb_y);
896 
897  for (i = 0; i < 8 + 4 * ctx->is_444; i++) {
898  int16_t *block = ctx->blocks[i];
899  int overflow, n = dnxhd_switch_matrix(ctx, i);
900  int last_index = ctx->m.dct_quantize(&ctx->m, block,
901  ctx->is_444 ? (((i >> 1) % 3) < 1 ? 0 : 4): 4 & (2*i),
902  qscale, &overflow);
903 
904  dnxhd_encode_block(pb, ctx, block, last_index, n);
905  }
906  }
907  flush_put_bits(pb);
908  memset(put_bits_ptr(pb), 0, put_bytes_left(pb, 0));
909  return 0;
910 }
911 
913 {
914  for (int mb_y = 0, offset = 0; mb_y < ctx->m.c.mb_height; mb_y++) {
915  int thread_size;
916  ctx->slice_offs[mb_y] = offset;
917  ctx->slice_size[mb_y] = 0;
918  for (int mb_x = 0; mb_x < ctx->m.c.mb_width; mb_x++) {
919  unsigned mb = mb_y * ctx->m.c.mb_width + mb_x;
920  ctx->slice_size[mb_y] += ctx->mb_bits[mb];
921  }
922  ctx->slice_size[mb_y] = (ctx->slice_size[mb_y] + 31U) & ~31U;
923  ctx->slice_size[mb_y] >>= 3;
924  thread_size = ctx->slice_size[mb_y];
925  offset += thread_size;
926  }
927 }
928 
930  int jobnr, int threadnr)
931 {
933  int mb_y = jobnr, x, y;
934  int partial_last_row = (mb_y == ctx->m.c.mb_height - 1) &&
935  ((avctx->height >> ctx->interlaced) & 0xF);
936 
937  ctx = ctx->thread[threadnr];
938  if (ctx->bit_depth == 8) {
939  const uint8_t *pix = ctx->thread[0]->src[0] + ((mb_y << 4) * ctx->m.c.linesize);
940  for (int mb_x = 0; mb_x < ctx->m.c.mb_width; ++mb_x, pix += 16) {
941  unsigned mb = mb_y * ctx->m.c.mb_width + mb_x;
942  int sum;
943  int varc;
944 
945  if (!partial_last_row && mb_x * 16 <= avctx->width - 16 && (avctx->width % 16) == 0) {
946  sum = ctx->m.mpvencdsp.pix_sum(pix, ctx->m.c.linesize);
947  varc = ctx->m.mpvencdsp.pix_norm1(pix, ctx->m.c.linesize);
948  } else {
949  int bw = FFMIN(avctx->width - 16 * mb_x, 16);
950  int bh = FFMIN((avctx->height >> ctx->interlaced) - 16 * mb_y, 16);
951  sum = varc = 0;
952  for (y = 0; y < bh; y++) {
953  for (x = 0; x < bw; x++) {
954  uint8_t val = pix[x + y * ctx->m.c.linesize];
955  sum += val;
956  varc += val * val;
957  }
958  }
959  }
960  varc = (varc - (((unsigned) sum * sum) >> 8) + 128) >> 8;
961 
962  ctx->mb_cmp[mb].value = varc;
963  ctx->mb_cmp[mb].mb = mb;
964  }
965  } else { // 10-bit
966  const int linesize = ctx->m.c.linesize >> 1;
967  for (int mb_x = 0; mb_x < ctx->m.c.mb_width; ++mb_x) {
968  const uint16_t *pix = (const uint16_t *)ctx->thread[0]->src[0] +
969  ((mb_y << 4) * linesize) + (mb_x << 4);
970  unsigned mb = mb_y * ctx->m.c.mb_width + mb_x;
971  int sum = 0;
972  int sqsum = 0;
973  int bw = FFMIN(avctx->width - 16 * mb_x, 16);
974  int bh = FFMIN((avctx->height >> ctx->interlaced) - 16 * mb_y, 16);
975  int mean, sqmean;
976  int i, j;
977  // Macroblocks are 16x16 pixels, unlike DCT blocks which are 8x8.
978  for (i = 0; i < bh; ++i) {
979  for (j = 0; j < bw; ++j) {
980  // Turn 16-bit pixels into 10-bit ones.
981  const int sample = (unsigned) pix[j] >> 6;
982  sum += sample;
983  sqsum += sample * sample;
984  // 2^10 * 2^10 * 16 * 16 = 2^28, which is less than INT_MAX
985  }
986  pix += linesize;
987  }
988  mean = sum >> 8; // 16*16 == 2^8
989  sqmean = sqsum >> 8;
990  ctx->mb_cmp[mb].value = sqmean - mean * mean;
991  ctx->mb_cmp[mb].mb = mb;
992  }
993  }
994  return 0;
995 }
996 
998 {
999  int lambda, up_step, down_step;
1000  int last_lower = INT_MAX, last_higher = 0;
1001 
1002  for (int q = 1; q < avctx->qmax; q++) {
1003  ctx->qscale = q;
1005  NULL, NULL, ctx->m.c.mb_height);
1006  }
1007  up_step = down_step = 2 << LAMBDA_FRAC_BITS;
1008  lambda = ctx->lambda;
1009 
1010  for (;;) {
1011  int bits = 0;
1012  int end = 0;
1013  if (lambda == last_higher) {
1014  lambda++;
1015  end = 1; // need to set final qscales/bits
1016  }
1017  for (int y = 0; y < ctx->m.c.mb_height; y++) {
1018  for (int x = 0; x < ctx->m.c.mb_width; x++) {
1019  unsigned min = UINT_MAX;
1020  int qscale = 1;
1021  int mb = y * ctx->m.c.mb_width + x;
1022  int rc = 0;
1023  for (int q = 1; q < avctx->qmax; q++) {
1024  int i = (q*ctx->m.c.mb_num) + mb;
1025  unsigned score = ctx->mb_rc[i].bits * lambda +
1026  ((unsigned) ctx->mb_rc[i].ssd << LAMBDA_FRAC_BITS);
1027  if (score < min) {
1028  min = score;
1029  qscale = q;
1030  rc = i;
1031  }
1032  }
1033  bits += ctx->mb_rc[rc].bits;
1034  ctx->mb_qscale[mb] = qscale;
1035  ctx->mb_bits[mb] = ctx->mb_rc[rc].bits;
1036  }
1037  bits = (bits + 31) & ~31; // padding
1038  if (bits > ctx->frame_bits)
1039  break;
1040  }
1041  if (end) {
1042  if (bits > ctx->frame_bits)
1043  return AVERROR(EINVAL);
1044  break;
1045  }
1046  if (bits < ctx->frame_bits) {
1047  last_lower = FFMIN(lambda, last_lower);
1048  if (last_higher != 0)
1049  lambda = (lambda+last_higher)>>1;
1050  else
1051  lambda -= down_step;
1052  down_step = FFMIN((int64_t)down_step*5, INT_MAX);
1053  up_step = 1<<LAMBDA_FRAC_BITS;
1054  lambda = FFMAX(1, lambda);
1055  if (lambda == last_lower)
1056  break;
1057  } else {
1058  last_higher = FFMAX(lambda, last_higher);
1059  if (last_lower != INT_MAX)
1060  lambda = (lambda+last_lower)>>1;
1061  else if ((int64_t)lambda + up_step > INT_MAX)
1062  return AVERROR(EINVAL);
1063  else
1064  lambda += up_step;
1065  up_step = FFMIN((int64_t)up_step*5, INT_MAX);
1066  down_step = 1<<LAMBDA_FRAC_BITS;
1067  }
1068  }
1069  ctx->lambda = lambda;
1070  return 0;
1071 }
1072 
1074 {
1075  int bits = 0;
1076  int up_step = 1;
1077  int down_step = 1;
1078  int last_higher = 0;
1079  int last_lower = INT_MAX;
1080  int qscale;
1081 
1082  qscale = ctx->qscale;
1083  for (;;) {
1084  bits = 0;
1085  ctx->qscale = qscale;
1086  // XXX avoid recalculating bits
1087  ctx->m.c.avctx->execute2(ctx->m.c.avctx, dnxhd_calc_bits_thread,
1088  NULL, NULL, ctx->m.c.mb_height);
1089  for (int y = 0; y < ctx->m.c.mb_height; y++) {
1090  for (int x = 0; x < ctx->m.c.mb_width; x++)
1091  bits += ctx->mb_rc[(qscale*ctx->m.c.mb_num) + (y*ctx->m.c.mb_width+x)].bits;
1092  bits = (bits+31)&~31; // padding
1093  if (bits > ctx->frame_bits)
1094  break;
1095  }
1096  if (bits < ctx->frame_bits) {
1097  if (qscale == 1)
1098  return 1;
1099  if (last_higher == qscale - 1) {
1100  qscale = last_higher;
1101  break;
1102  }
1103  last_lower = FFMIN(qscale, last_lower);
1104  if (last_higher != 0)
1105  qscale = (qscale + last_higher) >> 1;
1106  else
1107  qscale -= down_step++;
1108  if (qscale < 1)
1109  qscale = 1;
1110  up_step = 1;
1111  } else {
1112  if (last_lower == qscale + 1)
1113  break;
1114  last_higher = FFMAX(qscale, last_higher);
1115  if (last_lower != INT_MAX)
1116  qscale = (qscale + last_lower) >> 1;
1117  else
1118  qscale += up_step++;
1119  down_step = 1;
1120  if (qscale >= ctx->m.c.avctx->qmax)
1121  return AVERROR(EINVAL);
1122  }
1123  }
1124  ctx->qscale = qscale;
1125  return 0;
1126 }
1127 
1128 #define BUCKET_BITS 8
1129 #define RADIX_PASSES 4
1130 #define NBUCKETS (1 << BUCKET_BITS)
1131 
1132 static inline int get_bucket(int value, int shift)
1133 {
1134  value >>= shift;
1135  value &= NBUCKETS - 1;
1136  return NBUCKETS - 1 - value;
1137 }
1138 
1139 static void radix_count(const RCCMPEntry *data, int size,
1140  int buckets[RADIX_PASSES][NBUCKETS])
1141 {
1142  int i, j;
1143  memset(buckets, 0, sizeof(buckets[0][0]) * RADIX_PASSES * NBUCKETS);
1144  for (i = 0; i < size; i++) {
1145  int v = data[i].value;
1146  for (j = 0; j < RADIX_PASSES; j++) {
1147  buckets[j][get_bucket(v, 0)]++;
1148  v >>= BUCKET_BITS;
1149  }
1150  av_assert1(!v);
1151  }
1152  for (j = 0; j < RADIX_PASSES; j++) {
1153  int offset = size;
1154  for (i = NBUCKETS - 1; i >= 0; i--)
1155  buckets[j][i] = offset -= buckets[j][i];
1156  av_assert1(!buckets[j][0]);
1157  }
1158 }
1159 
1161  int size, int buckets[NBUCKETS], int pass)
1162 {
1163  int shift = pass * BUCKET_BITS;
1164  int i;
1165  for (i = 0; i < size; i++) {
1166  int v = get_bucket(data[i].value, shift);
1167  int pos = buckets[v]++;
1168  dst[pos] = data[i];
1169  }
1170 }
1171 
1173 {
1174  int buckets[RADIX_PASSES][NBUCKETS];
1175  radix_count(data, size, buckets);
1176  radix_sort_pass(tmp, data, size, buckets[0], 0);
1177  radix_sort_pass(data, tmp, size, buckets[1], 1);
1178  if (buckets[2][NBUCKETS - 1] || buckets[3][NBUCKETS - 1]) {
1179  radix_sort_pass(tmp, data, size, buckets[2], 2);
1180  radix_sort_pass(data, tmp, size, buckets[3], 3);
1181  }
1182 }
1183 
1185 {
1186  int max_bits = 0;
1187  int ret;
1188  if ((ret = dnxhd_find_qscale(ctx)) < 0)
1189  return ret;
1190  for (int y = 0; y < ctx->m.c.mb_height; y++) {
1191  for (int x = 0; x < ctx->m.c.mb_width; x++) {
1192  int mb = y * ctx->m.c.mb_width + x;
1193  int rc = (ctx->qscale * ctx->m.c.mb_num ) + mb;
1194  int delta_bits;
1195  ctx->mb_qscale[mb] = ctx->qscale;
1196  ctx->mb_bits[mb] = ctx->mb_rc[rc].bits;
1197  max_bits += ctx->mb_rc[rc].bits;
1198  if (!RC_VARIANCE) {
1199  delta_bits = ctx->mb_rc[rc].bits -
1200  ctx->mb_rc[rc + ctx->m.c.mb_num].bits;
1201  ctx->mb_cmp[mb].mb = mb;
1202  ctx->mb_cmp[mb].value =
1203  delta_bits ? ((ctx->mb_rc[rc].ssd -
1204  ctx->mb_rc[rc + ctx->m.c.mb_num].ssd) * 100) /
1205  delta_bits
1206  : INT_MIN; // avoid increasing qscale
1207  }
1208  }
1209  max_bits += 31; // worst padding
1210  }
1211  if (!ret) {
1212  if (RC_VARIANCE)
1214  NULL, NULL, ctx->m.c.mb_height);
1215  radix_sort(ctx->mb_cmp, ctx->mb_cmp_tmp, ctx->m.c.mb_num);
1216 retry:
1217  for (int x = 0; x < ctx->m.c.mb_num && max_bits > ctx->frame_bits; x++) {
1218  int mb = ctx->mb_cmp[x].mb;
1219  int rc = (ctx->qscale * ctx->m.c.mb_num ) + mb;
1220  max_bits -= ctx->mb_rc[rc].bits -
1221  ctx->mb_rc[rc + ctx->m.c.mb_num].bits;
1222  if (ctx->mb_qscale[mb] < 255)
1223  ctx->mb_qscale[mb]++;
1224  ctx->mb_bits[mb] = ctx->mb_rc[rc + ctx->m.c.mb_num].bits;
1225  }
1226 
1227  if (max_bits > ctx->frame_bits)
1228  goto retry;
1229  }
1230  return 0;
1231 }
1232 
1234 {
1235  for (int i = 0; i < ctx->m.c.avctx->thread_count; i++) {
1236  ctx->thread[i]->m.c.linesize = frame->linesize[0] << ctx->interlaced;
1237  ctx->thread[i]->m.c.uvlinesize = frame->linesize[1] << ctx->interlaced;
1238  ctx->thread[i]->dct_y_offset = ctx->m.c.linesize *8;
1239  ctx->thread[i]->dct_uv_offset = ctx->m.c.uvlinesize*8;
1240  }
1241 
1242  ctx->cur_field = (frame->flags & AV_FRAME_FLAG_INTERLACED) &&
1244 }
1245 
1247  const AVFrame *frame, int *got_packet)
1248 {
1250  int first_field = 1;
1251  int offset, i, ret;
1252  uint8_t *buf;
1253 
1254  if ((ret = ff_get_encode_buffer(avctx, pkt, ctx->frame_size, 0)) < 0)
1255  return ret;
1256  buf = pkt->data;
1257 
1259 
1260 encode_coding_unit:
1261  for (i = 0; i < 3; i++) {
1262  ctx->src[i] = frame->data[i];
1263  if (ctx->interlaced && ctx->cur_field)
1264  ctx->src[i] += frame->linesize[i];
1265  }
1266 
1268 
1271  else
1273  if (ret < 0) {
1275  "picture could not fit ratecontrol constraints, increase qmax\n");
1276  return ret;
1277  }
1278 
1280 
1281  offset = 0;
1282  for (i = 0; i < ctx->m.c.mb_height; i++) {
1283  AV_WB32(ctx->msip + i * 4, offset);
1284  offset += ctx->slice_size[i];
1285  av_assert1(!(ctx->slice_size[i] & 3));
1286  }
1287 
1288  avctx->execute2(avctx, dnxhd_encode_thread, buf, NULL, ctx->m.c.mb_height);
1289 
1290  av_assert1(ctx->data_offset + offset + 4 <= ctx->coding_unit_size);
1291  memset(buf + ctx->data_offset + offset, 0,
1292  ctx->coding_unit_size - 4 - offset - ctx->data_offset);
1293 
1294  AV_WB32(buf + ctx->coding_unit_size - 4, 0x600DC0DE); // EOF
1295 
1296  if (ctx->interlaced && first_field) {
1297  first_field = 0;
1298  ctx->cur_field ^= 1;
1299  buf += ctx->coding_unit_size;
1300  goto encode_coding_unit;
1301  }
1302 
1304 
1305  *got_packet = 1;
1306  return 0;
1307 }
1308 
1310 {
1312  int i;
1313 
1314  av_freep(&ctx->orig_vlc_codes);
1315  av_freep(&ctx->orig_vlc_bits);
1316  av_freep(&ctx->run_codes);
1317  av_freep(&ctx->run_bits);
1318 
1319  av_freep(&ctx->mb_bits);
1320  av_freep(&ctx->mb_qscale);
1321  av_freep(&ctx->mb_rc);
1322  av_freep(&ctx->mb_cmp);
1323  av_freep(&ctx->mb_cmp_tmp);
1324  av_freep(&ctx->slice_size);
1325  av_freep(&ctx->slice_offs);
1326 
1327  av_freep(&ctx->qmatrix_c);
1328  av_freep(&ctx->qmatrix_l);
1329  av_freep(&ctx->qmatrix_c16);
1330  av_freep(&ctx->qmatrix_l16);
1331 
1332  if (ctx->thread[1]) {
1333  for (i = 1; i < avctx->thread_count; i++)
1334  av_freep(&ctx->thread[i]);
1335  }
1336 
1337  return 0;
1338 }
1339 
1340 static const FFCodecDefault dnxhd_defaults[] = {
1341  { "qmax", "1024" }, /* Maximum quantization scale factor allowed for VC-3 */
1342  { NULL },
1343 };
1344 
1346  .p.name = "dnxhd",
1347  CODEC_LONG_NAME("VC3/DNxHD"),
1348  .p.type = AVMEDIA_TYPE_VIDEO,
1349  .p.id = AV_CODEC_ID_DNXHD,
1350  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
1352  .priv_data_size = sizeof(DNXHDEncContext),
1355  .close = dnxhd_encode_end,
1358  .color_ranges = AVCOL_RANGE_MPEG,
1359  .p.priv_class = &dnxhd_class,
1360  .defaults = dnxhd_defaults,
1361  .p.profiles = NULL_IF_CONFIG_SMALL(ff_dnxhd_profiles),
1362  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1363 };
1364 
1366 {
1367 #if ARCH_X86
1369 #endif
1370 }
FF_ALLOCZ_TYPED_ARRAY
#define FF_ALLOCZ_TYPED_ARRAY(p, nelem)
Definition: internal.h:78
CODEC_PIXFMTS
#define CODEC_PIXFMTS(...)
Definition: codec_internal.h:386
dnxhd_encode_init
static av_cold int dnxhd_encode_init(AVCodecContext *avctx)
Definition: dnxhdenc.c:354
options
static const AVOption options[]
Definition: dnxhdenc.c:51
level
uint8_t level
Definition: svq3.c:205
MPVEncContext
Definition: mpegvideoenc.h:45
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:42
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
opt.h
dnxhd_init_rc
static av_cold int dnxhd_init_rc(DNXHDEncContext *ctx)
Definition: dnxhdenc.c:337
mem_internal.h
dnxhd_calc_ac_bits
static av_always_inline int dnxhd_calc_ac_bits(DNXHDEncContext *ctx, int16_t *block, int last_index)
Definition: dnxhdenc.c:657
mpegvideoenc.h
int64_t
long long int64_t
Definition: coverity.c:34
init_put_bits
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition: put_bits.h:62
ff_dct_encode_init
av_cold void ff_dct_encode_init(MPVEncContext *const s)
Definition: mpegvideo_enc.c:301
dnxhd_encode_fast
static int dnxhd_encode_fast(AVCodecContext *avctx, DNXHDEncContext *ctx)
Definition: dnxhdenc.c:1184
av_log2_16bit
int av_log2_16bit(unsigned v)
Definition: intmath.c:31
dnxhd_8bit_get_pixels_8x4_sym
static void dnxhd_8bit_get_pixels_8x4_sym(int16_t *restrict block, const uint8_t *pixels, ptrdiff_t line_size)
Definition: dnxhdenc.c:82
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:410
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:28
put_bits
static void put_bits(Jpeg2000EncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:223
dnxhdenc.h
AV_PROFILE_DNXHR_444
#define AV_PROFILE_DNXHR_444
Definition: defs.h:85
AVPacket::data
uint8_t * data
Definition: packet.h:535
AVOption
AVOption.
Definition: opt.h:429
encode.h
data
const char data[16]
Definition: mxf.c:149
DNX10BIT_QMAT_SHIFT
#define DNX10BIT_QMAT_SHIFT
Definition: dnxhdenc.c:46
FFCodec
Definition: codec_internal.h:127
MASK_ABS
#define MASK_ABS(mask, level)
Definition: mathops.h:165
ff_pixblockdsp_init
av_cold void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx)
Definition: pixblockdsp.c:88
BUCKET_BITS
#define BUCKET_BITS
Definition: dnxhdenc.c:1128
RADIX_PASSES
#define RADIX_PASSES
Definition: dnxhdenc.c:1129
max
#define max(a, b)
Definition: cuda_runtime.h:33
mpegvideo.h
dnxhd_write_header
static int dnxhd_write_header(AVCodecContext *avctx, uint8_t *buf)
Definition: dnxhdenc.c:522
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
dnxhd_encode_rdo
static int dnxhd_encode_rdo(AVCodecContext *avctx, DNXHDEncContext *ctx)
Definition: dnxhdenc.c:997
AVCodecContext::mb_decision
int mb_decision
macroblock decision mode
Definition: avcodec.h:939
AVCodecContext::qmax
int qmax
maximum quantizer
Definition: avcodec.h:1244
dnxhd_defaults
static const FFCodecDefault dnxhd_defaults[]
Definition: dnxhdenc.c:1340
bit_depth
static void bit_depth(AudioStatsContext *s, const uint64_t *const mask, uint8_t *depth)
Definition: af_astats.c:246
dnxhd_encode_end
static av_cold int dnxhd_encode_end(AVCodecContext *avctx)
Definition: dnxhdenc.c:1309
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
av_memdup
void * av_memdup(const void *p, size_t size)
Duplicate a buffer with av_malloc().
Definition: mem.c:304
FFCodecDefault
Definition: codec_internal.h:96
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:131
dnxhd_10bit_get_pixels_8x4_sym
static av_always_inline void dnxhd_10bit_get_pixels_8x4_sym(int16_t *restrict block, const uint8_t *pixels, ptrdiff_t line_size)
Definition: dnxhdenc.c:106
AVCodecContext::thread_count
int thread_count
thread count is used to decide how many independent tasks should be passed to execute()
Definition: avcodec.h:1564
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:544
ff_dnxhd_print_profiles
void ff_dnxhd_print_profiles(AVCodecContext *avctx, int loglevel)
Definition: dnxhddata.c:1157
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:488
MAX_THREADS
#define MAX_THREADS
Definition: frame_thread_encoder.c:37
val
static double val(void *priv, double ch)
Definition: aeval.c:77
LAMBDA_FRAC_BITS
#define LAMBDA_FRAC_BITS
Definition: dnxhdenc.c:48
ff_videodsp_init
av_cold void ff_videodsp_init(VideoDSPContext *ctx, int bpc)
Definition: videodsp.c:39
AV_PROFILE_DNXHR_SQ
#define AV_PROFILE_DNXHR_SQ
Definition: defs.h:82
FF_CODEC_ENCODE_CB
#define FF_CODEC_ENCODE_CB(func)
Definition: codec_internal.h:353
dnxhd_encode_thread
static int dnxhd_encode_thread(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
Definition: dnxhdenc.c:874
put_bytes_left
static int put_bytes_left(const PutBitContext *s, int round_up)
Definition: put_bits.h:135
DNXHDEncContext
Definition: dnxhdenc.h:44
AV_CODEC_FLAG_INTERLACED_DCT
#define AV_CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
Definition: avcodec.h:310
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:531
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
av_cold
#define av_cold
Definition: attributes.h:90
AV_PROFILE_DNXHR_LB
#define AV_PROFILE_DNXHR_LB
Definition: defs.h:81
AV_PROFILE_DNXHR_HQ
#define AV_PROFILE_DNXHR_HQ
Definition: defs.h:83
ff_blockdsp_init
av_cold void ff_blockdsp_init(BlockDSPContext *c)
Definition: blockdsp.c:58
dnxhd_mb_var_thread
static int dnxhd_mb_var_thread(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
Definition: dnxhdenc.c:929
ff_dnxhd_get_hr_frame_size
int ff_dnxhd_get_hr_frame_size(int cid, int w, int h)
Definition: dnxhddata.c:1096
AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE
This encoder can reorder user opaque values from input AVFrames and return them with corresponding ou...
Definition: codec.h:144
bits
uint8_t bits
Definition: vp3data.h:128
LOCAL_ALIGNED_16
#define LOCAL_ALIGNED_16(t, v,...)
Definition: mem_internal.h:130
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:40
AV_PROFILE_DNXHR_HQX
#define AV_PROFILE_DNXHR_HQX
Definition: defs.h:84
AVCodecContext::bits_per_raw_sample
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
Definition: avcodec.h:1556
dnxhd_load_picture
static void dnxhd_load_picture(DNXHDEncContext *ctx, const AVFrame *frame)
Definition: dnxhdenc.c:1233
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:230
ctx
AVFormatContext * ctx
Definition: movenc.c:49
dnxhd_encode_block
static av_always_inline void dnxhd_encode_block(PutBitContext *pb, DNXHDEncContext *ctx, int16_t *block, int last_index, int n)
Definition: dnxhdenc.c:573
radix_sort
static void radix_sort(RCCMPEntry *data, RCCMPEntry *tmp, int size)
Definition: dnxhdenc.c:1172
PixblockDSPContext::get_pixels
void(* get_pixels)(int16_t *restrict block, const uint8_t *pixels, ptrdiff_t stride)
Definition: pixblockdsp.h:27
ff_block_permute
void ff_block_permute(int16_t *block, const uint8_t *permutation, const uint8_t *scantable, int last)
Permute an 8x8 block according to permutation.
Definition: mpegvideo_enc.c:4622
PutBitContext
Definition: put_bits.h:50
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:326
ff_dnxhd_profiles
const AVProfile ff_dnxhd_profiles[]
Definition: profiles.c:62
arg
const char * arg
Definition: jacosubdec.c:67
dnxhd_init_qmat
static av_cold int dnxhd_init_qmat(DNXHDEncContext *ctx, int lbias, int cbias)
Definition: dnxhdenc.c:265
VE
#define VE
Definition: dnxhdenc.c:50
PixblockDSPContext
Definition: pixblockdsp.h:26
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:95
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
dnxhd_10bit_dct_quantize_444
static int dnxhd_10bit_dct_quantize_444(MPVEncContext *ctx, int16_t *block, int n, int qscale, int *overflow)
Definition: dnxhdenc.c:120
NULL
#define NULL
Definition: coverity.c:32
RCCMPEntry
Definition: dnxhdenc.h:34
run
uint8_t run
Definition: svq3.c:204
bias
static int bias(int x, int c)
Definition: vqcdec.c:115
ff_mpv_idct_init
av_cold void ff_mpv_idct_init(MpegEncContext *s)
Definition: mpegvideo.c:95
DNXHDContext::avctx
AVCodecContext * avctx
Definition: dnxhddec.c:55
AV_WB16
#define AV_WB16(p, v)
Definition: intreadwrite.h:401
radix_sort_pass
static void radix_sort_pass(RCCMPEntry *dst, const RCCMPEntry *data, int size, int buckets[NBUCKETS], int pass)
Definition: dnxhdenc.c:1160
DNXHD_VARIABLE
#define DNXHD_VARIABLE
Indicate that a CIDEntry value must be read in the bitstream.
Definition: dnxhddata.h:41
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:239
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition: avutil.h:279
profiles.h
dnxhd_10bit_dct_quantize
static int dnxhd_10bit_dct_quantize(MPVEncContext *ctx, int16_t *block, int n, int qscale, int *overflow)
Definition: dnxhdenc.c:179
mathops.h
options
Definition: swscale.c:43
radix_count
static void radix_count(const RCCMPEntry *data, int size, int buckets[RADIX_PASSES][NBUCKETS])
Definition: dnxhdenc.c:1139
dnxhd_class
static const AVClass dnxhd_class
Definition: dnxhdenc.c:75
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:529
index
int index
Definition: gxfenc.c:90
dnxhd_setup_threads_slices
static void dnxhd_setup_threads_slices(DNXHDEncContext *ctx)
Definition: dnxhdenc.c:912
dnxhd_encode_dc
static av_always_inline void dnxhd_encode_dc(PutBitContext *pb, DNXHDEncContext *ctx, int diff)
Definition: dnxhdenc.c:558
AV_WB32
#define AV_WB32(p, v)
Definition: intreadwrite.h:415
FF_SIGNBIT
#define FF_SIGNBIT(x)
Definition: mathops.h:128
dnxhd_encode_picture
static int dnxhd_encode_picture(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
Definition: dnxhdenc.c:1246
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:368
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
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:94
codec_internal.h
ff_dnxhdenc_init_x86
void ff_dnxhdenc_init_x86(DNXHDEncContext *ctx)
Definition: dnxhdenc_init.c:31
shift
static int shift(int a, int b)
Definition: bonk.c:261
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:83
FF_IDCT_PERM_NONE
@ FF_IDCT_PERM_NONE
Definition: idctdsp.h:28
sample
#define sample
Definition: flacdsp_template.c:44
size
int size
Definition: twinvq_data.h:10344
FF_THREAD_SLICE
#define FF_THREAD_SLICE
Decode more than one part of a single frame at once.
Definition: avcodec.h:1576
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:166
dnxhd_init_vlc
static av_cold int dnxhd_init_vlc(DNXHDEncContext *ctx)
Definition: dnxhdenc.c:210
dnxhd_ssd_block
static av_always_inline int dnxhd_ssd_block(int16_t *qblock, int16_t *block)
Definition: dnxhdenc.c:647
AV_CODEC_CAP_SLICE_THREADS
#define AV_CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
Definition: codec.h:99
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
attributes.h
av_zero_extend
#define av_zero_extend
Definition: common.h:151
dnxhd_find_qscale
static int dnxhd_find_qscale(DNXHDEncContext *ctx)
Definition: dnxhdenc.c:1073
mb
#define mb
Definition: vf_colormatrix.c:99
ff_dnxhd_get_cid_table
const CIDEntry * ff_dnxhd_get_cid_table(int cid)
Definition: dnxhddata.c:1080
VideoDSPContext::emulated_edge_mc
void(* emulated_edge_mc)(uint8_t *dst, const uint8_t *src, ptrdiff_t dst_linesize, ptrdiff_t src_linesize, int block_w, int block_h, int src_x, int src_y, int w, int h)
Copy a rectangular area of samples to a temporary buffer and replicate the border samples.
Definition: videodsp.h:62
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
ff_dnxhd_encoder
const FFCodec ff_dnxhd_encoder
Definition: dnxhdenc.c:1345
ff_dnxhdenc_init
void ff_dnxhdenc_init(DNXHDEncContext *ctx)
Definition: dnxhdenc.c:1365
ff_fdctdsp_init
av_cold void ff_fdctdsp_init(FDCTDSPContext *c, AVCodecContext *avctx)
Definition: fdctdsp.c:25
internal.h
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:56
av_always_inline
#define av_always_inline
Definition: attributes.h:49
value
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 default value
Definition: writing_filters.txt:86
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
fdctdsp.h
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:256
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:179
profile
int profile
Definition: mxfenc.c:2250
AVCodecContext::height
int height
Definition: avcodec.h:595
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:634
AV_FRAME_FLAG_INTERLACED
#define AV_FRAME_FLAG_INTERLACED
A flag to mark frames whose content is interlaced.
Definition: frame.h:633
AVCOL_RANGE_MPEG
@ AVCOL_RANGE_MPEG
Narrow or limited range content.
Definition: pixfmt.h:733
avcodec.h
ff_zigzag_direct
const uint8_t ff_zigzag_direct[64]
Definition: mathtables.c:98
AV_PROFILE_DNXHD
#define AV_PROFILE_DNXHD
Definition: defs.h:80
ret
ret
Definition: filter_design.txt:187
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:80
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
get_bucket
static int get_bucket(int value, int shift)
Definition: dnxhdenc.c:1132
pos
unsigned int pos
Definition: spdifenc.c:414
ff_convert_matrix
void ff_convert_matrix(MPVEncContext *const s, int(*qmat)[64], uint16_t(*qmat16)[2][64], const uint16_t *quant_matrix, int bias, int qmin, int qmax, int intra)
Definition: mpegvideo_enc.c:111
U
#define U(x)
Definition: vpx_arith.h:37
DNXHDContext::buf
const uint8_t * buf
Definition: dnxhddec.c:58
AVCodecContext
main external API structure.
Definition: avcodec.h:431
AVCodecContext::active_thread_type
int active_thread_type
Which multithreading methods are in use by the codec.
Definition: avcodec.h:1583
put_bits_ptr
static uint8_t * put_bits_ptr(PutBitContext *s)
Return the pointer to the byte where the bitstream writer will put the next bit.
Definition: put_bits.h:392
ff_get_encode_buffer
int ff_get_encode_buffer(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int flags)
Get a buffer for a packet.
Definition: encode.c:106
dnxhd_get_blocks
static av_always_inline void dnxhd_get_blocks(DNXHDEncContext *ctx, int mb_x, int mb_y)
Definition: dnxhdenc.c:676
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
AVCodecContext::profile
int profile
profile
Definition: avcodec.h:1621
ff_dnxhd_find_cid
int ff_dnxhd_find_cid(AVCodecContext *avctx, int bit_depth)
Definition: dnxhddata.c:1127
dnxhd_switch_matrix
static av_always_inline int dnxhd_switch_matrix(DNXHDEncContext *ctx, int i)
Definition: dnxhdenc.c:804
mean
static float mean(const float *input, int size)
Definition: vf_nnedi.c:861
VideoDSPContext
Definition: videodsp.h:40
FF_MB_DECISION_RD
#define FF_MB_DECISION_RD
rate distortion
Definition: avcodec.h:942
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
packet_internal.h
overflow
Undefined Behavior In the C some operations are like signed integer overflow
Definition: undefined.txt:3
flush_put_bits
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:143
AVCodecContext::codec_tag
unsigned int codec_tag
fourcc (LSB first, so "ABCD" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').
Definition: avcodec.h:456
AVPacket
This structure stores compressed data.
Definition: packet.h:512
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:458
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Underlying C type is int.
Definition: opt.h:327
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
ff_mpegvideoencdsp_init
av_cold void ff_mpegvideoencdsp_init(MpegvideoEncDSPContext *c, AVCodecContext *avctx)
Definition: mpegvideoencdsp.c:253
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:595
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:27
ff_side_data_set_encoder_stats
int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type)
Definition: packet.c:610
MKTAG
#define MKTAG(a, b, c, d)
Definition: macros.h:55
dnxhd_calc_bits_thread
static int dnxhd_calc_bits_thread(AVCodecContext *avctx, void *arg, int jobnr, int threadnr)
Definition: dnxhdenc.c:817
FF_QP2LAMBDA
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:227
first_field
static int first_field(const struct video_data *s)
Definition: v4l2.c:256
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
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:1613
RC_VARIANCE
#define RC_VARIANCE
Definition: dnxhdenc.c:47
NBUCKETS
#define NBUCKETS
Definition: dnxhdenc.c:1130
AV_CODEC_ID_DNXHD
@ AV_CODEC_ID_DNXHD
Definition: codec_id.h:151
dnxhd_unquantize_c
static av_always_inline void dnxhd_unquantize_c(DNXHDEncContext *ctx, int16_t *block, int n, int qscale, int last_index)
Definition: dnxhdenc.c:599
pixblockdsp.h
min
float min
Definition: vorbis_enc_data.h:429