]> git.sesse.net Git - ffmpeg/blob - libavcodec/dnxhdenc.c
Merge commit '373a6dda5422186bc057297342a9e559a564595e'
[ffmpeg] / libavcodec / dnxhdenc.c
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/opt.h"
29 #include "libavutil/timer.h"
30
31 #include "avcodec.h"
32 #include "blockdsp.h"
33 #include "dsputil.h"
34 #include "internal.h"
35 #include "mpegvideo.h"
36 #include "dnxhdenc.h"
37
38
39 // The largest value that will not lead to overflow for 10bit samples.
40 #define DNX10BIT_QMAT_SHIFT 18
41 #define RC_VARIANCE 1 // use variance or ssd for fast rc
42 #define LAMBDA_FRAC_BITS 10
43
44 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
45 static const AVOption options[] = {
46     { "nitris_compat", "encode with Avid Nitris compatibility",
47         offsetof(DNXHDEncContext, nitris_compat), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE },
48     { NULL }
49 };
50
51 static const AVClass dnxhd_class = {
52     .class_name = "dnxhd",
53     .item_name  = av_default_item_name,
54     .option     = options,
55     .version    = LIBAVUTIL_VERSION_INT,
56 };
57
58 static void dnxhd_8bit_get_pixels_8x4_sym(int16_t *av_restrict block,
59                                           const uint8_t *pixels,
60                                           ptrdiff_t line_size)
61 {
62     int i;
63     for (i = 0; i < 4; i++) {
64         block[0] = pixels[0];
65         block[1] = pixels[1];
66         block[2] = pixels[2];
67         block[3] = pixels[3];
68         block[4] = pixels[4];
69         block[5] = pixels[5];
70         block[6] = pixels[6];
71         block[7] = pixels[7];
72         pixels  += line_size;
73         block   += 8;
74     }
75     memcpy(block,      block -  8, sizeof(*block) * 8);
76     memcpy(block +  8, block - 16, sizeof(*block) * 8);
77     memcpy(block + 16, block - 24, sizeof(*block) * 8);
78     memcpy(block + 24, block - 32, sizeof(*block) * 8);
79 }
80
81 static av_always_inline
82 void dnxhd_10bit_get_pixels_8x4_sym(int16_t *av_restrict block,
83                                     const uint8_t *pixels,
84                                     ptrdiff_t line_size)
85 {
86     int i;
87     const uint16_t* pixels16 = (const uint16_t*)pixels;
88     line_size >>= 1;
89
90     for (i = 0; i < 4; i++) {
91         block[0] = pixels16[0]; block[1] = pixels16[1];
92         block[2] = pixels16[2]; block[3] = pixels16[3];
93         block[4] = pixels16[4]; block[5] = pixels16[5];
94         block[6] = pixels16[6]; block[7] = pixels16[7];
95         pixels16 += line_size;
96         block += 8;
97     }
98     memcpy(block,      block -  8, sizeof(*block) * 8);
99     memcpy(block +  8, block - 16, sizeof(*block) * 8);
100     memcpy(block + 16, block - 24, sizeof(*block) * 8);
101     memcpy(block + 24, block - 32, sizeof(*block) * 8);
102 }
103
104 static int dnxhd_10bit_dct_quantize(MpegEncContext *ctx, int16_t *block,
105                                     int n, int qscale, int *overflow)
106 {
107     const uint8_t *scantable= ctx->intra_scantable.scantable;
108     const int *qmat = n<4 ? ctx->q_intra_matrix[qscale] : ctx->q_chroma_intra_matrix[qscale];
109     int last_non_zero = 0;
110     int i;
111
112     ctx->dsp.fdct(block);
113
114     // Divide by 4 with rounding, to compensate scaling of DCT coefficients
115     block[0] = (block[0] + 2) >> 2;
116
117     for (i = 1; i < 64; ++i) {
118         int j = scantable[i];
119         int sign = block[j] >> 31;
120         int level = (block[j] ^ sign) - sign;
121         level = level * qmat[j] >> DNX10BIT_QMAT_SHIFT;
122         block[j] = (level ^ sign) - sign;
123         if (level)
124             last_non_zero = i;
125     }
126
127     return last_non_zero;
128 }
129
130 static av_cold int dnxhd_init_vlc(DNXHDEncContext *ctx)
131 {
132     int i, j, level, run;
133     int max_level = 1 << (ctx->cid_table->bit_depth + 2);
134
135     FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->vlc_codes,
136                       max_level * 4 * sizeof(*ctx->vlc_codes), fail);
137     FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->vlc_bits,
138                       max_level * 4 * sizeof(*ctx->vlc_bits), fail);
139     FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->run_codes,
140                       63 * 2, fail);
141     FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->run_bits,
142                       63, fail);
143
144     ctx->vlc_codes += max_level * 2;
145     ctx->vlc_bits  += max_level * 2;
146     for (level = -max_level; level < max_level; level++) {
147         for (run = 0; run < 2; run++) {
148             int index = (level << 1) | run;
149             int sign, offset = 0, alevel = level;
150
151             MASK_ABS(sign, alevel);
152             if (alevel > 64) {
153                 offset  = (alevel - 1) >> 6;
154                 alevel -= offset << 6;
155             }
156             for (j = 0; j < 257; j++) {
157                 if (ctx->cid_table->ac_level[j] >> 1 == alevel &&
158                     (!offset || (ctx->cid_table->ac_flags[j] & 1) && offset) &&
159                     (!run    || (ctx->cid_table->ac_flags[j] & 2) && run)) {
160                     av_assert1(!ctx->vlc_codes[index]);
161                     if (alevel) {
162                         ctx->vlc_codes[index] =
163                             (ctx->cid_table->ac_codes[j] << 1) | (sign & 1);
164                         ctx->vlc_bits[index] = ctx->cid_table->ac_bits[j] + 1;
165                     } else {
166                         ctx->vlc_codes[index] = ctx->cid_table->ac_codes[j];
167                         ctx->vlc_bits[index]  = ctx->cid_table->ac_bits[j];
168                     }
169                     break;
170                 }
171             }
172             av_assert0(!alevel || j < 257);
173             if (offset) {
174                 ctx->vlc_codes[index] =
175                     (ctx->vlc_codes[index] << ctx->cid_table->index_bits) | offset;
176                 ctx->vlc_bits[index] += ctx->cid_table->index_bits;
177             }
178         }
179     }
180     for (i = 0; i < 62; i++) {
181         int run = ctx->cid_table->run[i];
182         av_assert0(run < 63);
183         ctx->run_codes[run] = ctx->cid_table->run_codes[i];
184         ctx->run_bits[run]  = ctx->cid_table->run_bits[i];
185     }
186     return 0;
187 fail:
188     return AVERROR(ENOMEM);
189 }
190
191 static av_cold int dnxhd_init_qmat(DNXHDEncContext *ctx, int lbias, int cbias)
192 {
193     // init first elem to 1 to avoid div by 0 in convert_matrix
194     uint16_t weight_matrix[64] = { 1, }; // convert_matrix needs uint16_t*
195     int qscale, i;
196     const uint8_t *luma_weight_table   = ctx->cid_table->luma_weight;
197     const uint8_t *chroma_weight_table = ctx->cid_table->chroma_weight;
198
199     FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->qmatrix_l,
200                       (ctx->m.avctx->qmax + 1) * 64 * sizeof(int), fail);
201     FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->qmatrix_c,
202                       (ctx->m.avctx->qmax + 1) * 64 * sizeof(int), fail);
203     FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->qmatrix_l16,
204                       (ctx->m.avctx->qmax + 1) * 64 * 2 * sizeof(uint16_t),
205                       fail);
206     FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->qmatrix_c16,
207                       (ctx->m.avctx->qmax + 1) * 64 * 2 * sizeof(uint16_t),
208                       fail);
209
210     if (ctx->cid_table->bit_depth == 8) {
211         for (i = 1; i < 64; i++) {
212             int j = ctx->m.idsp.idct_permutation[ff_zigzag_direct[i]];
213             weight_matrix[j] = ctx->cid_table->luma_weight[i];
214         }
215         ff_convert_matrix(&ctx->m, ctx->qmatrix_l, ctx->qmatrix_l16,
216                           weight_matrix, ctx->m.intra_quant_bias, 1,
217                           ctx->m.avctx->qmax, 1);
218         for (i = 1; i < 64; i++) {
219             int j = ctx->m.idsp.idct_permutation[ff_zigzag_direct[i]];
220             weight_matrix[j] = ctx->cid_table->chroma_weight[i];
221         }
222         ff_convert_matrix(&ctx->m, ctx->qmatrix_c, ctx->qmatrix_c16,
223                           weight_matrix, ctx->m.intra_quant_bias, 1,
224                           ctx->m.avctx->qmax, 1);
225
226         for (qscale = 1; qscale <= ctx->m.avctx->qmax; qscale++) {
227             for (i = 0; i < 64; i++) {
228                 ctx->qmatrix_l[qscale][i]      <<= 2;
229                 ctx->qmatrix_c[qscale][i]      <<= 2;
230                 ctx->qmatrix_l16[qscale][0][i] <<= 2;
231                 ctx->qmatrix_l16[qscale][1][i] <<= 2;
232                 ctx->qmatrix_c16[qscale][0][i] <<= 2;
233                 ctx->qmatrix_c16[qscale][1][i] <<= 2;
234             }
235         }
236     } else {
237         // 10-bit
238         for (qscale = 1; qscale <= ctx->m.avctx->qmax; qscale++) {
239             for (i = 1; i < 64; i++) {
240                 int j = ctx->m.idsp.idct_permutation[ff_zigzag_direct[i]];
241
242                 /* The quantization formula from the VC-3 standard is:
243                  * quantized = sign(block[i]) * floor(abs(block[i]/s) * p /
244                  *             (qscale * weight_table[i]))
245                  * Where p is 32 for 8-bit samples and 8 for 10-bit ones.
246                  * The s factor compensates scaling of DCT coefficients done by
247                  * the DCT routines, and therefore is not present in standard.
248                  * It's 8 for 8-bit samples and 4 for 10-bit ones.
249                  * We want values of ctx->qtmatrix_l and ctx->qtmatrix_r to be:
250                  *     ((1 << DNX10BIT_QMAT_SHIFT) * (p / s)) /
251                  *     (qscale * weight_table[i])
252                  * For 10-bit samples, p / s == 2 */
253                 ctx->qmatrix_l[qscale][j] = (1 << (DNX10BIT_QMAT_SHIFT + 1)) /
254                                             (qscale * luma_weight_table[i]);
255                 ctx->qmatrix_c[qscale][j] = (1 << (DNX10BIT_QMAT_SHIFT + 1)) /
256                                             (qscale * chroma_weight_table[i]);
257             }
258         }
259     }
260
261     ctx->m.q_chroma_intra_matrix16 = ctx->qmatrix_c16;
262     ctx->m.q_chroma_intra_matrix   = ctx->qmatrix_c;
263     ctx->m.q_intra_matrix16        = ctx->qmatrix_l16;
264     ctx->m.q_intra_matrix          = ctx->qmatrix_l;
265
266     return 0;
267 fail:
268     return AVERROR(ENOMEM);
269 }
270
271 static av_cold int dnxhd_init_rc(DNXHDEncContext *ctx)
272 {
273     FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_rc, 8160 * (ctx->m.avctx->qmax + 1) * sizeof(RCEntry), fail);
274     if (ctx->m.avctx->mb_decision != FF_MB_DECISION_RD)
275         FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_cmp,
276                           ctx->m.mb_num * sizeof(RCCMPEntry), fail);
277
278     ctx->frame_bits = (ctx->cid_table->coding_unit_size -
279                        640 - 4 - ctx->min_padding) * 8;
280     ctx->qscale = 1;
281     ctx->lambda = 2 << LAMBDA_FRAC_BITS; // qscale 2
282     return 0;
283 fail:
284     return AVERROR(ENOMEM);
285 }
286
287 static av_cold int dnxhd_encode_init(AVCodecContext *avctx)
288 {
289     DNXHDEncContext *ctx = avctx->priv_data;
290     int i, index, bit_depth, ret;
291
292     switch (avctx->pix_fmt) {
293     case AV_PIX_FMT_YUV422P:
294         bit_depth = 8;
295         break;
296     case AV_PIX_FMT_YUV422P10:
297         bit_depth = 10;
298         break;
299     default:
300         av_log(avctx, AV_LOG_ERROR,
301                "pixel format is incompatible with DNxHD\n");
302         return AVERROR(EINVAL);
303     }
304
305     ctx->cid = ff_dnxhd_find_cid(avctx, bit_depth);
306     if (!ctx->cid) {
307         av_log(avctx, AV_LOG_ERROR,
308                "video parameters incompatible with DNxHD. Valid DNxHD profiles:\n");
309         ff_dnxhd_print_profiles(avctx, AV_LOG_ERROR);
310         return AVERROR(EINVAL);
311     }
312     av_log(avctx, AV_LOG_DEBUG, "cid %d\n", ctx->cid);
313
314     index = ff_dnxhd_get_cid_table(ctx->cid);
315     av_assert0(index >= 0);
316     ctx->cid_table = &ff_dnxhd_cid_table[index];
317
318     ctx->m.avctx    = avctx;
319     ctx->m.mb_intra = 1;
320     ctx->m.h263_aic = 1;
321
322     avctx->bits_per_raw_sample = ctx->cid_table->bit_depth;
323
324     ff_blockdsp_init(&ctx->bdsp, avctx);
325     ff_idctdsp_init(&ctx->m.idsp, avctx);
326     ff_dct_common_init(&ctx->m);
327     ff_dct_encode_init(&ctx->m);
328
329     if (!ctx->m.dct_quantize)
330         ctx->m.dct_quantize = ff_dct_quantize_c;
331
332     if (ctx->cid_table->bit_depth == 10) {
333         ctx->m.dct_quantize     = dnxhd_10bit_dct_quantize;
334         ctx->get_pixels_8x4_sym = dnxhd_10bit_get_pixels_8x4_sym;
335         ctx->block_width_l2     = 4;
336     } else {
337         ctx->get_pixels_8x4_sym = dnxhd_8bit_get_pixels_8x4_sym;
338         ctx->block_width_l2     = 3;
339     }
340
341     if (ARCH_X86)
342         ff_dnxhdenc_init_x86(ctx);
343
344     ctx->m.mb_height = (avctx->height + 15) / 16;
345     ctx->m.mb_width  = (avctx->width  + 15) / 16;
346
347     if (avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
348         ctx->interlaced   = 1;
349         ctx->m.mb_height /= 2;
350     }
351
352     ctx->m.mb_num = ctx->m.mb_height * ctx->m.mb_width;
353
354     if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
355         ctx->m.intra_quant_bias = avctx->intra_quant_bias;
356     // XXX tune lbias/cbias
357     if ((ret = dnxhd_init_qmat(ctx, ctx->m.intra_quant_bias, 0)) < 0)
358         return ret;
359
360     /* Avid Nitris hardware decoder requires a minimum amount of padding
361      * in the coding unit payload */
362     if (ctx->nitris_compat)
363         ctx->min_padding = 1600;
364
365     if ((ret = dnxhd_init_vlc(ctx)) < 0)
366         return ret;
367     if ((ret = dnxhd_init_rc(ctx)) < 0)
368         return ret;
369
370     FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->slice_size,
371                       ctx->m.mb_height * sizeof(uint32_t), fail);
372     FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->slice_offs,
373                       ctx->m.mb_height * sizeof(uint32_t), fail);
374     FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_bits,
375                       ctx->m.mb_num * sizeof(uint16_t), fail);
376     FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_qscale,
377                       ctx->m.mb_num * sizeof(uint8_t), fail);
378
379     avctx->coded_frame = av_frame_alloc();
380     if (!avctx->coded_frame)
381         return AVERROR(ENOMEM);
382
383     avctx->coded_frame->key_frame = 1;
384     avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
385
386     if (avctx->thread_count > MAX_THREADS) {
387         av_log(avctx, AV_LOG_ERROR, "too many threads\n");
388         return AVERROR(EINVAL);
389     }
390
391     if (avctx->qmax <= 1) {
392         av_log(avctx, AV_LOG_ERROR, "qmax must be at least 2\n");
393         return AVERROR(EINVAL);
394     }
395
396     ctx->thread[0] = ctx;
397     for (i = 1; i < avctx->thread_count; i++) {
398         ctx->thread[i] = av_malloc(sizeof(DNXHDEncContext));
399         memcpy(ctx->thread[i], ctx, sizeof(DNXHDEncContext));
400     }
401
402     return 0;
403 fail:  // for FF_ALLOCZ_OR_GOTO
404     return AVERROR(ENOMEM);
405 }
406
407 static int dnxhd_write_header(AVCodecContext *avctx, uint8_t *buf)
408 {
409     DNXHDEncContext *ctx = avctx->priv_data;
410     static const uint8_t header_prefix[5] = { 0x00, 0x00, 0x02, 0x80, 0x01 };
411
412     memset(buf, 0, 640);
413
414     memcpy(buf, header_prefix, 5);
415     buf[5] = ctx->interlaced ? ctx->cur_field + 2 : 0x01;
416     buf[6] = 0x80; // crc flag off
417     buf[7] = 0xa0; // reserved
418     AV_WB16(buf + 0x18, avctx->height >> ctx->interlaced); // ALPF
419     AV_WB16(buf + 0x1a, avctx->width);  // SPL
420     AV_WB16(buf + 0x1d, avctx->height >> ctx->interlaced); // NAL
421
422     buf[0x21] = ctx->cid_table->bit_depth == 10 ? 0x58 : 0x38;
423     buf[0x22] = 0x88 + (ctx->interlaced << 2);
424     AV_WB32(buf + 0x28, ctx->cid); // CID
425     buf[0x2c] = ctx->interlaced ? 0 : 0x80;
426
427     buf[0x5f] = 0x01; // UDL
428
429     buf[0x167] = 0x02; // reserved
430     AV_WB16(buf + 0x16a, ctx->m.mb_height * 4 + 4); // MSIPS
431     buf[0x16d] = ctx->m.mb_height; // Ns
432     buf[0x16f] = 0x10; // reserved
433
434     ctx->msip = buf + 0x170;
435     return 0;
436 }
437
438 static av_always_inline void dnxhd_encode_dc(DNXHDEncContext *ctx, int diff)
439 {
440     int nbits;
441     if (diff < 0) {
442         nbits = av_log2_16bit(-2 * diff);
443         diff--;
444     } else {
445         nbits = av_log2_16bit(2 * diff);
446     }
447     put_bits(&ctx->m.pb, ctx->cid_table->dc_bits[nbits] + nbits,
448              (ctx->cid_table->dc_codes[nbits] << nbits) +
449              (diff & ((1 << nbits) - 1)));
450 }
451
452 static av_always_inline
453 void dnxhd_encode_block(DNXHDEncContext *ctx, int16_t *block,
454                         int last_index, int n)
455 {
456     int last_non_zero = 0;
457     int slevel, i, j;
458
459     dnxhd_encode_dc(ctx, block[0] - ctx->m.last_dc[n]);
460     ctx->m.last_dc[n] = block[0];
461
462     for (i = 1; i <= last_index; i++) {
463         j = ctx->m.intra_scantable.permutated[i];
464         slevel = block[j];
465         if (slevel) {
466             int run_level = i - last_non_zero - 1;
467             int rlevel = (slevel << 1) | !!run_level;
468             put_bits(&ctx->m.pb, ctx->vlc_bits[rlevel], ctx->vlc_codes[rlevel]);
469             if (run_level)
470                 put_bits(&ctx->m.pb, ctx->run_bits[run_level],
471                          ctx->run_codes[run_level]);
472             last_non_zero = i;
473         }
474     }
475     put_bits(&ctx->m.pb, ctx->vlc_bits[0], ctx->vlc_codes[0]); // EOB
476 }
477
478 static av_always_inline
479 void dnxhd_unquantize_c(DNXHDEncContext *ctx, int16_t *block, int n,
480                         int qscale, int last_index)
481 {
482     const uint8_t *weight_matrix;
483     int level;
484     int i;
485
486     weight_matrix = (n & 2) ? ctx->cid_table->chroma_weight
487                             : ctx->cid_table->luma_weight;
488
489     for (i = 1; i <= last_index; i++) {
490         int j = ctx->m.intra_scantable.permutated[i];
491         level = block[j];
492         if (level) {
493             if (level < 0) {
494                 level = (1 - 2 * level) * qscale * weight_matrix[i];
495                 if (ctx->cid_table->bit_depth == 10) {
496                     if (weight_matrix[i] != 8)
497                         level += 8;
498                     level >>= 4;
499                 } else {
500                     if (weight_matrix[i] != 32)
501                         level += 32;
502                     level >>= 6;
503                 }
504                 level = -level;
505             } else {
506                 level = (2 * level + 1) * qscale * weight_matrix[i];
507                 if (ctx->cid_table->bit_depth == 10) {
508                     if (weight_matrix[i] != 8)
509                         level += 8;
510                     level >>= 4;
511                 } else {
512                     if (weight_matrix[i] != 32)
513                         level += 32;
514                     level >>= 6;
515                 }
516             }
517             block[j] = level;
518         }
519     }
520 }
521
522 static av_always_inline int dnxhd_ssd_block(int16_t *qblock, int16_t *block)
523 {
524     int score = 0;
525     int i;
526     for (i = 0; i < 64; i++)
527         score += (block[i] - qblock[i]) * (block[i] - qblock[i]);
528     return score;
529 }
530
531 static av_always_inline
532 int dnxhd_calc_ac_bits(DNXHDEncContext *ctx, int16_t *block, int last_index)
533 {
534     int last_non_zero = 0;
535     int bits = 0;
536     int i, j, level;
537     for (i = 1; i <= last_index; i++) {
538         j = ctx->m.intra_scantable.permutated[i];
539         level = block[j];
540         if (level) {
541             int run_level = i - last_non_zero - 1;
542             bits += ctx->vlc_bits[(level << 1) |
543                     !!run_level] + ctx->run_bits[run_level];
544             last_non_zero = i;
545         }
546     }
547     return bits;
548 }
549
550 static av_always_inline
551 void dnxhd_get_blocks(DNXHDEncContext *ctx, int mb_x, int mb_y)
552 {
553     const int bs = ctx->block_width_l2;
554     const int bw = 1 << bs;
555     const uint8_t *ptr_y = ctx->thread[0]->src[0] +
556                            ((mb_y << 4) * ctx->m.linesize) + (mb_x << bs + 1);
557     const uint8_t *ptr_u = ctx->thread[0]->src[1] +
558                            ((mb_y << 4) * ctx->m.uvlinesize) + (mb_x << bs);
559     const uint8_t *ptr_v = ctx->thread[0]->src[2] +
560                            ((mb_y << 4) * ctx->m.uvlinesize) + (mb_x << bs);
561     DSPContext *dsp = &ctx->m.dsp;
562
563     dsp->get_pixels(ctx->blocks[0], ptr_y,      ctx->m.linesize);
564     dsp->get_pixels(ctx->blocks[1], ptr_y + bw, ctx->m.linesize);
565     dsp->get_pixels(ctx->blocks[2], ptr_u,      ctx->m.uvlinesize);
566     dsp->get_pixels(ctx->blocks[3], ptr_v,      ctx->m.uvlinesize);
567
568     if (mb_y + 1 == ctx->m.mb_height && ctx->m.avctx->height == 1080) {
569         if (ctx->interlaced) {
570             ctx->get_pixels_8x4_sym(ctx->blocks[4],
571                                     ptr_y + ctx->dct_y_offset,
572                                     ctx->m.linesize);
573             ctx->get_pixels_8x4_sym(ctx->blocks[5],
574                                     ptr_y + ctx->dct_y_offset + bw,
575                                     ctx->m.linesize);
576             ctx->get_pixels_8x4_sym(ctx->blocks[6],
577                                     ptr_u + ctx->dct_uv_offset,
578                                     ctx->m.uvlinesize);
579             ctx->get_pixels_8x4_sym(ctx->blocks[7],
580                                     ptr_v + ctx->dct_uv_offset,
581                                     ctx->m.uvlinesize);
582         } else {
583             ctx->bdsp.clear_block(ctx->blocks[4]);
584             ctx->bdsp.clear_block(ctx->blocks[5]);
585             ctx->bdsp.clear_block(ctx->blocks[6]);
586             ctx->bdsp.clear_block(ctx->blocks[7]);
587         }
588     } else {
589         dsp->get_pixels(ctx->blocks[4],
590                         ptr_y + ctx->dct_y_offset, ctx->m.linesize);
591         dsp->get_pixels(ctx->blocks[5],
592                         ptr_y + ctx->dct_y_offset + bw, ctx->m.linesize);
593         dsp->get_pixels(ctx->blocks[6],
594                         ptr_u + ctx->dct_uv_offset, ctx->m.uvlinesize);
595         dsp->get_pixels(ctx->blocks[7],
596                         ptr_v + ctx->dct_uv_offset, ctx->m.uvlinesize);
597     }
598 }
599
600 static av_always_inline
601 int dnxhd_switch_matrix(DNXHDEncContext *ctx, int i)
602 {
603     const static uint8_t component[8]={0,0,1,2,0,0,1,2};
604     return component[i];
605 }
606
607 static int dnxhd_calc_bits_thread(AVCodecContext *avctx, void *arg,
608                                   int jobnr, int threadnr)
609 {
610     DNXHDEncContext *ctx = avctx->priv_data;
611     int mb_y = jobnr, mb_x;
612     int qscale = ctx->qscale;
613     LOCAL_ALIGNED_16(int16_t, block, [64]);
614     ctx = ctx->thread[threadnr];
615
616     ctx->m.last_dc[0] =
617     ctx->m.last_dc[1] =
618     ctx->m.last_dc[2] = 1 << (ctx->cid_table->bit_depth + 2);
619
620     for (mb_x = 0; mb_x < ctx->m.mb_width; mb_x++) {
621         unsigned mb = mb_y * ctx->m.mb_width + mb_x;
622         int ssd     = 0;
623         int ac_bits = 0;
624         int dc_bits = 0;
625         int i;
626
627         dnxhd_get_blocks(ctx, mb_x, mb_y);
628
629         for (i = 0; i < 8; i++) {
630             int16_t *src_block = ctx->blocks[i];
631             int overflow, nbits, diff, last_index;
632             int n = dnxhd_switch_matrix(ctx, i);
633
634             memcpy(block, src_block, 64 * sizeof(*block));
635             last_index = ctx->m.dct_quantize(&ctx->m, block, 4 & (2*i),
636                                              qscale, &overflow);
637             ac_bits   += dnxhd_calc_ac_bits(ctx, block, last_index);
638
639             diff = block[0] - ctx->m.last_dc[n];
640             if (diff < 0)
641                 nbits = av_log2_16bit(-2 * diff);
642             else
643                 nbits = av_log2_16bit(2 * diff);
644
645             av_assert1(nbits < ctx->cid_table->bit_depth + 4);
646             dc_bits += ctx->cid_table->dc_bits[nbits] + nbits;
647
648             ctx->m.last_dc[n] = block[0];
649
650             if (avctx->mb_decision == FF_MB_DECISION_RD || !RC_VARIANCE) {
651                 dnxhd_unquantize_c(ctx, block, i, qscale, last_index);
652                 ctx->m.idsp.idct(block);
653                 ssd += dnxhd_ssd_block(block, src_block);
654             }
655         }
656         ctx->mb_rc[qscale][mb].ssd  = ssd;
657         ctx->mb_rc[qscale][mb].bits = ac_bits + dc_bits + 12 +
658                                       8 * ctx->vlc_bits[0];
659     }
660     return 0;
661 }
662
663 static int dnxhd_encode_thread(AVCodecContext *avctx, void *arg,
664                                int jobnr, int threadnr)
665 {
666     DNXHDEncContext *ctx = avctx->priv_data;
667     int mb_y = jobnr, mb_x;
668     ctx = ctx->thread[threadnr];
669     init_put_bits(&ctx->m.pb, (uint8_t *)arg + 640 + ctx->slice_offs[jobnr],
670                   ctx->slice_size[jobnr]);
671
672     ctx->m.last_dc[0] =
673     ctx->m.last_dc[1] =
674     ctx->m.last_dc[2] = 1 << (ctx->cid_table->bit_depth + 2);
675     for (mb_x = 0; mb_x < ctx->m.mb_width; mb_x++) {
676         unsigned mb = mb_y * ctx->m.mb_width + mb_x;
677         int qscale = ctx->mb_qscale[mb];
678         int i;
679
680         put_bits(&ctx->m.pb, 12, qscale << 1);
681
682         dnxhd_get_blocks(ctx, mb_x, mb_y);
683
684         for (i = 0; i < 8; i++) {
685             int16_t *block = ctx->blocks[i];
686             int overflow, n = dnxhd_switch_matrix(ctx, i);
687             int last_index = ctx->m.dct_quantize(&ctx->m, block, 4 & (2*i),
688                                                  qscale, &overflow);
689             // START_TIMER;
690             dnxhd_encode_block(ctx, block, last_index, n);
691             // STOP_TIMER("encode_block");
692         }
693     }
694     if (put_bits_count(&ctx->m.pb) & 31)
695         put_bits(&ctx->m.pb, 32 - (put_bits_count(&ctx->m.pb) & 31), 0);
696     flush_put_bits(&ctx->m.pb);
697     return 0;
698 }
699
700 static void dnxhd_setup_threads_slices(DNXHDEncContext *ctx)
701 {
702     int mb_y, mb_x;
703     int offset = 0;
704     for (mb_y = 0; mb_y < ctx->m.mb_height; mb_y++) {
705         int thread_size;
706         ctx->slice_offs[mb_y] = offset;
707         ctx->slice_size[mb_y] = 0;
708         for (mb_x = 0; mb_x < ctx->m.mb_width; mb_x++) {
709             unsigned mb = mb_y * ctx->m.mb_width + mb_x;
710             ctx->slice_size[mb_y] += ctx->mb_bits[mb];
711         }
712         ctx->slice_size[mb_y]   = (ctx->slice_size[mb_y] + 31) & ~31;
713         ctx->slice_size[mb_y] >>= 3;
714         thread_size = ctx->slice_size[mb_y];
715         offset += thread_size;
716     }
717 }
718
719 static int dnxhd_mb_var_thread(AVCodecContext *avctx, void *arg,
720                                int jobnr, int threadnr)
721 {
722     DNXHDEncContext *ctx = avctx->priv_data;
723     int mb_y = jobnr, mb_x, x, y;
724     int partial_last_row = (mb_y == ctx->m.mb_height - 1) &&
725                            ((avctx->height >> ctx->interlaced) & 0xF);
726
727     ctx = ctx->thread[threadnr];
728     if (ctx->cid_table->bit_depth == 8) {
729         uint8_t *pix = ctx->thread[0]->src[0] + ((mb_y << 4) * ctx->m.linesize);
730         for (mb_x = 0; mb_x < ctx->m.mb_width; ++mb_x, pix += 16) {
731             unsigned mb = mb_y * ctx->m.mb_width + mb_x;
732             int sum;
733             int varc;
734
735             if (!partial_last_row && mb_x * 16 <= avctx->width - 16) {
736                 sum  = ctx->m.dsp.pix_sum(pix, ctx->m.linesize);
737                 varc = ctx->m.dsp.pix_norm1(pix, ctx->m.linesize);
738             } else {
739                 int bw = FFMIN(avctx->width - 16 * mb_x, 16);
740                 int bh = FFMIN((avctx->height >> ctx->interlaced) - 16 * mb_y, 16);
741                 sum = varc = 0;
742                 for (y = 0; y < bh; y++) {
743                     for (x = 0; x < bw; x++) {
744                         uint8_t val = pix[x + y * ctx->m.linesize];
745                         sum  += val;
746                         varc += val * val;
747                     }
748                 }
749             }
750             varc = (varc - (((unsigned) sum * sum) >> 8) + 128) >> 8;
751
752             ctx->mb_cmp[mb].value = varc;
753             ctx->mb_cmp[mb].mb    = mb;
754         }
755     } else { // 10-bit
756         int const linesize = ctx->m.linesize >> 1;
757         for (mb_x = 0; mb_x < ctx->m.mb_width; ++mb_x) {
758             uint16_t *pix = (uint16_t *)ctx->thread[0]->src[0] +
759                             ((mb_y << 4) * linesize) + (mb_x << 4);
760             unsigned mb  = mb_y * ctx->m.mb_width + mb_x;
761             int sum = 0;
762             int sqsum = 0;
763             int mean, sqmean;
764             int i, j;
765             // Macroblocks are 16x16 pixels, unlike DCT blocks which are 8x8.
766             for (i = 0; i < 16; ++i) {
767                 for (j = 0; j < 16; ++j) {
768                     // Turn 16-bit pixels into 10-bit ones.
769                     int const sample = (unsigned) pix[j] >> 6;
770                     sum   += sample;
771                     sqsum += sample * sample;
772                     // 2^10 * 2^10 * 16 * 16 = 2^28, which is less than INT_MAX
773                 }
774                 pix += linesize;
775             }
776             mean = sum >> 8; // 16*16 == 2^8
777             sqmean = sqsum >> 8;
778             ctx->mb_cmp[mb].value = sqmean - mean * mean;
779             ctx->mb_cmp[mb].mb    = mb;
780         }
781     }
782     return 0;
783 }
784
785 static int dnxhd_encode_rdo(AVCodecContext *avctx, DNXHDEncContext *ctx)
786 {
787     int lambda, up_step, down_step;
788     int last_lower = INT_MAX, last_higher = 0;
789     int x, y, q;
790
791     for (q = 1; q < avctx->qmax; q++) {
792         ctx->qscale = q;
793         avctx->execute2(avctx, dnxhd_calc_bits_thread,
794                         NULL, NULL, ctx->m.mb_height);
795     }
796     up_step = down_step = 2 << LAMBDA_FRAC_BITS;
797     lambda  = ctx->lambda;
798
799     for (;;) {
800         int bits = 0;
801         int end  = 0;
802         if (lambda == last_higher) {
803             lambda++;
804             end = 1; // need to set final qscales/bits
805         }
806         for (y = 0; y < ctx->m.mb_height; y++) {
807             for (x = 0; x < ctx->m.mb_width; x++) {
808                 unsigned min = UINT_MAX;
809                 int qscale = 1;
810                 int mb     = y * ctx->m.mb_width + x;
811                 for (q = 1; q < avctx->qmax; q++) {
812                     unsigned score = ctx->mb_rc[q][mb].bits * lambda +
813                                      ((unsigned) ctx->mb_rc[q][mb].ssd << LAMBDA_FRAC_BITS);
814                     if (score < min) {
815                         min    = score;
816                         qscale = q;
817                     }
818                 }
819                 bits += ctx->mb_rc[qscale][mb].bits;
820                 ctx->mb_qscale[mb] = qscale;
821                 ctx->mb_bits[mb]   = ctx->mb_rc[qscale][mb].bits;
822             }
823             bits = (bits + 31) & ~31; // padding
824             if (bits > ctx->frame_bits)
825                 break;
826         }
827         // av_dlog(ctx->m.avctx,
828         //         "lambda %d, up %u, down %u, bits %d, frame %d\n",
829         //         lambda, last_higher, last_lower, bits, ctx->frame_bits);
830         if (end) {
831             if (bits > ctx->frame_bits)
832                 return AVERROR(EINVAL);
833             break;
834         }
835         if (bits < ctx->frame_bits) {
836             last_lower = FFMIN(lambda, last_lower);
837             if (last_higher != 0)
838                 lambda = (lambda+last_higher)>>1;
839             else
840                 lambda -= down_step;
841             down_step = FFMIN((int64_t)down_step*5, INT_MAX);
842             up_step = 1<<LAMBDA_FRAC_BITS;
843             lambda = FFMAX(1, lambda);
844             if (lambda == last_lower)
845                 break;
846         } else {
847             last_higher = FFMAX(lambda, last_higher);
848             if (last_lower != INT_MAX)
849                 lambda = (lambda+last_lower)>>1;
850             else if ((int64_t)lambda + up_step > INT_MAX)
851                 return AVERROR(EINVAL);
852             else
853                 lambda += up_step;
854             up_step = FFMIN((int64_t)up_step*5, INT_MAX);
855             down_step = 1<<LAMBDA_FRAC_BITS;
856         }
857     }
858     //av_dlog(ctx->m.avctx, "out lambda %d\n", lambda);
859     ctx->lambda = lambda;
860     return 0;
861 }
862
863 static int dnxhd_find_qscale(DNXHDEncContext *ctx)
864 {
865     int bits = 0;
866     int up_step = 1;
867     int down_step = 1;
868     int last_higher = 0;
869     int last_lower = INT_MAX;
870     int qscale;
871     int x, y;
872
873     qscale = ctx->qscale;
874     for (;;) {
875         bits = 0;
876         ctx->qscale = qscale;
877         // XXX avoid recalculating bits
878         ctx->m.avctx->execute2(ctx->m.avctx, dnxhd_calc_bits_thread,
879                                NULL, NULL, ctx->m.mb_height);
880         for (y = 0; y < ctx->m.mb_height; y++) {
881             for (x = 0; x < ctx->m.mb_width; x++)
882                 bits += ctx->mb_rc[qscale][y*ctx->m.mb_width+x].bits;
883             bits = (bits+31)&~31; // padding
884             if (bits > ctx->frame_bits)
885                 break;
886         }
887         // av_dlog(ctx->m.avctx,
888         //         "%d, qscale %d, bits %d, frame %d, higher %d, lower %d\n",
889         //         ctx->m.avctx->frame_number, qscale, bits, ctx->frame_bits,
890         //         last_higher, last_lower);
891         if (bits < ctx->frame_bits) {
892             if (qscale == 1)
893                 return 1;
894             if (last_higher == qscale - 1) {
895                 qscale = last_higher;
896                 break;
897             }
898             last_lower = FFMIN(qscale, last_lower);
899             if (last_higher != 0)
900                 qscale = (qscale + last_higher) >> 1;
901             else
902                 qscale -= down_step++;
903             if (qscale < 1)
904                 qscale = 1;
905             up_step = 1;
906         } else {
907             if (last_lower == qscale + 1)
908                 break;
909             last_higher = FFMAX(qscale, last_higher);
910             if (last_lower != INT_MAX)
911                 qscale = (qscale + last_lower) >> 1;
912             else
913                 qscale += up_step++;
914             down_step = 1;
915             if (qscale >= ctx->m.avctx->qmax)
916                 return AVERROR(EINVAL);
917         }
918     }
919     //av_dlog(ctx->m.avctx, "out qscale %d\n", qscale);
920     ctx->qscale = qscale;
921     return 0;
922 }
923
924 #define BUCKET_BITS 8
925 #define RADIX_PASSES 4
926 #define NBUCKETS (1 << BUCKET_BITS)
927
928 static inline int get_bucket(int value, int shift)
929 {
930     value >>= shift;
931     value  &= NBUCKETS - 1;
932     return NBUCKETS - 1 - value;
933 }
934
935 static void radix_count(const RCCMPEntry *data, int size,
936                         int buckets[RADIX_PASSES][NBUCKETS])
937 {
938     int i, j;
939     memset(buckets, 0, sizeof(buckets[0][0]) * RADIX_PASSES * NBUCKETS);
940     for (i = 0; i < size; i++) {
941         int v = data[i].value;
942         for (j = 0; j < RADIX_PASSES; j++) {
943             buckets[j][get_bucket(v, 0)]++;
944             v >>= BUCKET_BITS;
945         }
946         av_assert1(!v);
947     }
948     for (j = 0; j < RADIX_PASSES; j++) {
949         int offset = size;
950         for (i = NBUCKETS - 1; i >= 0; i--)
951             buckets[j][i] = offset -= buckets[j][i];
952         av_assert1(!buckets[j][0]);
953     }
954 }
955
956 static void radix_sort_pass(RCCMPEntry *dst, const RCCMPEntry *data,
957                             int size, int buckets[NBUCKETS], int pass)
958 {
959     int shift = pass * BUCKET_BITS;
960     int i;
961     for (i = 0; i < size; i++) {
962         int v   = get_bucket(data[i].value, shift);
963         int pos = buckets[v]++;
964         dst[pos] = data[i];
965     }
966 }
967
968 static void radix_sort(RCCMPEntry *data, int size)
969 {
970     int buckets[RADIX_PASSES][NBUCKETS];
971     RCCMPEntry *tmp = av_malloc_array(size, sizeof(*tmp));
972     radix_count(data, size, buckets);
973     radix_sort_pass(tmp, data, size, buckets[0], 0);
974     radix_sort_pass(data, tmp, size, buckets[1], 1);
975     if (buckets[2][NBUCKETS - 1] || buckets[3][NBUCKETS - 1]) {
976         radix_sort_pass(tmp, data, size, buckets[2], 2);
977         radix_sort_pass(data, tmp, size, buckets[3], 3);
978     }
979     av_free(tmp);
980 }
981
982 static int dnxhd_encode_fast(AVCodecContext *avctx, DNXHDEncContext *ctx)
983 {
984     int max_bits = 0;
985     int ret, x, y;
986     if ((ret = dnxhd_find_qscale(ctx)) < 0)
987         return ret;
988     for (y = 0; y < ctx->m.mb_height; y++) {
989         for (x = 0; x < ctx->m.mb_width; x++) {
990             int mb = y * ctx->m.mb_width + x;
991             int delta_bits;
992             ctx->mb_qscale[mb] = ctx->qscale;
993             ctx->mb_bits[mb] = ctx->mb_rc[ctx->qscale][mb].bits;
994             max_bits += ctx->mb_rc[ctx->qscale][mb].bits;
995             if (!RC_VARIANCE) {
996                 delta_bits = ctx->mb_rc[ctx->qscale][mb].bits -
997                              ctx->mb_rc[ctx->qscale + 1][mb].bits;
998                 ctx->mb_cmp[mb].mb = mb;
999                 ctx->mb_cmp[mb].value =
1000                     delta_bits ? ((ctx->mb_rc[ctx->qscale][mb].ssd -
1001                                    ctx->mb_rc[ctx->qscale + 1][mb].ssd) * 100) /
1002                                   delta_bits
1003                                : INT_MIN; // avoid increasing qscale
1004             }
1005         }
1006         max_bits += 31; // worst padding
1007     }
1008     if (!ret) {
1009         if (RC_VARIANCE)
1010             avctx->execute2(avctx, dnxhd_mb_var_thread,
1011                             NULL, NULL, ctx->m.mb_height);
1012         radix_sort(ctx->mb_cmp, ctx->m.mb_num);
1013         for (x = 0; x < ctx->m.mb_num && max_bits > ctx->frame_bits; x++) {
1014             int mb = ctx->mb_cmp[x].mb;
1015             max_bits -= ctx->mb_rc[ctx->qscale][mb].bits -
1016                         ctx->mb_rc[ctx->qscale + 1][mb].bits;
1017             ctx->mb_qscale[mb] = ctx->qscale + 1;
1018             ctx->mb_bits[mb]   = ctx->mb_rc[ctx->qscale + 1][mb].bits;
1019         }
1020     }
1021     return 0;
1022 }
1023
1024 static void dnxhd_load_picture(DNXHDEncContext *ctx, const AVFrame *frame)
1025 {
1026     int i;
1027
1028     for (i = 0; i < ctx->m.avctx->thread_count; i++) {
1029         ctx->thread[i]->m.linesize    = frame->linesize[0] << ctx->interlaced;
1030         ctx->thread[i]->m.uvlinesize  = frame->linesize[1] << ctx->interlaced;
1031         ctx->thread[i]->dct_y_offset  = ctx->m.linesize  *8;
1032         ctx->thread[i]->dct_uv_offset = ctx->m.uvlinesize*8;
1033     }
1034
1035     ctx->m.avctx->coded_frame->interlaced_frame = frame->interlaced_frame;
1036     ctx->cur_field = frame->interlaced_frame && !frame->top_field_first;
1037 }
1038
1039 static int dnxhd_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
1040                                 const AVFrame *frame, int *got_packet)
1041 {
1042     DNXHDEncContext *ctx = avctx->priv_data;
1043     int first_field = 1;
1044     int offset, i, ret;
1045     uint8_t *buf;
1046
1047     if ((ret = ff_alloc_packet2(avctx, pkt, ctx->cid_table->frame_size)) < 0)
1048         return ret;
1049     buf = pkt->data;
1050
1051     dnxhd_load_picture(ctx, frame);
1052
1053 encode_coding_unit:
1054     for (i = 0; i < 3; i++) {
1055         ctx->src[i] = frame->data[i];
1056         if (ctx->interlaced && ctx->cur_field)
1057             ctx->src[i] += frame->linesize[i];
1058     }
1059
1060     dnxhd_write_header(avctx, buf);
1061
1062     if (avctx->mb_decision == FF_MB_DECISION_RD)
1063         ret = dnxhd_encode_rdo(avctx, ctx);
1064     else
1065         ret = dnxhd_encode_fast(avctx, ctx);
1066     if (ret < 0) {
1067         av_log(avctx, AV_LOG_ERROR,
1068                "picture could not fit ratecontrol constraints, increase qmax\n");
1069         return ret;
1070     }
1071
1072     dnxhd_setup_threads_slices(ctx);
1073
1074     offset = 0;
1075     for (i = 0; i < ctx->m.mb_height; i++) {
1076         AV_WB32(ctx->msip + i * 4, offset);
1077         offset += ctx->slice_size[i];
1078         av_assert1(!(ctx->slice_size[i] & 3));
1079     }
1080
1081     avctx->execute2(avctx, dnxhd_encode_thread, buf, NULL, ctx->m.mb_height);
1082
1083     av_assert1(640 + offset + 4 <= ctx->cid_table->coding_unit_size);
1084     memset(buf + 640 + offset, 0,
1085            ctx->cid_table->coding_unit_size - 4 - offset - 640);
1086
1087     AV_WB32(buf + ctx->cid_table->coding_unit_size - 4, 0x600DC0DE); // EOF
1088
1089     if (ctx->interlaced && first_field) {
1090         first_field     = 0;
1091         ctx->cur_field ^= 1;
1092         buf            += ctx->cid_table->coding_unit_size;
1093         goto encode_coding_unit;
1094     }
1095
1096     avctx->coded_frame->quality = ctx->qscale * FF_QP2LAMBDA;
1097
1098     pkt->flags |= AV_PKT_FLAG_KEY;
1099     *got_packet = 1;
1100     return 0;
1101 }
1102
1103 static av_cold int dnxhd_encode_end(AVCodecContext *avctx)
1104 {
1105     DNXHDEncContext *ctx = avctx->priv_data;
1106     int max_level        = 1 << (ctx->cid_table->bit_depth + 2);
1107     int i;
1108
1109     av_free(ctx->vlc_codes - max_level * 2);
1110     av_free(ctx->vlc_bits - max_level * 2);
1111     av_freep(&ctx->run_codes);
1112     av_freep(&ctx->run_bits);
1113
1114     av_freep(&ctx->mb_bits);
1115     av_freep(&ctx->mb_qscale);
1116     av_freep(&ctx->mb_rc);
1117     av_freep(&ctx->mb_cmp);
1118     av_freep(&ctx->slice_size);
1119     av_freep(&ctx->slice_offs);
1120
1121     av_freep(&ctx->qmatrix_c);
1122     av_freep(&ctx->qmatrix_l);
1123     av_freep(&ctx->qmatrix_c16);
1124     av_freep(&ctx->qmatrix_l16);
1125
1126     for (i = 1; i < avctx->thread_count; i++)
1127         av_freep(&ctx->thread[i]);
1128
1129     av_frame_free(&avctx->coded_frame);
1130
1131     return 0;
1132 }
1133
1134 static const AVCodecDefault dnxhd_defaults[] = {
1135     { "qmax", "1024" }, /* Maximum quantization scale factor allowed for VC-3 */
1136     { NULL },
1137 };
1138
1139 AVCodec ff_dnxhd_encoder = {
1140     .name           = "dnxhd",
1141     .long_name      = NULL_IF_CONFIG_SMALL("VC3/DNxHD"),
1142     .type           = AVMEDIA_TYPE_VIDEO,
1143     .id             = AV_CODEC_ID_DNXHD,
1144     .priv_data_size = sizeof(DNXHDEncContext),
1145     .init           = dnxhd_encode_init,
1146     .encode2        = dnxhd_encode_picture,
1147     .close          = dnxhd_encode_end,
1148     .capabilities   = CODEC_CAP_SLICE_THREADS,
1149     .pix_fmts       = (const enum AVPixelFormat[]) {
1150         AV_PIX_FMT_YUV422P,
1151         AV_PIX_FMT_YUV422P10,
1152         AV_PIX_FMT_NONE
1153     },
1154     .priv_class     = &dnxhd_class,
1155     .defaults       = dnxhd_defaults,
1156 };