23
23
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26
#define RC_VARIANCE 1 // use variance or ssd for fast rc
28
26
#include "libavutil/attributes.h"
29
27
#include "libavutil/internal.h"
30
28
#include "libavutil/opt.h"
31
29
#include "libavutil/timer.h"
32
31
#include "avcodec.h"
34
34
#include "internal.h"
35
35
#include "mpegvideo.h"
36
#include "pixblockdsp.h"
36
37
#include "dnxhdenc.h"
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
38
44
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
39
#define DNX10BIT_QMAT_SHIFT 18 // The largest value that will not lead to overflow for 10bit samples.
41
static const AVOption options[]={
42
{"nitris_compat", "encode with Avid Nitris compatibility", offsetof(DNXHDEncContext, nitris_compat), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, VE},
45
static const AVClass class = { "dnxhd", av_default_item_name, options, LIBAVUTIL_VERSION_INT };
47
#define LAMBDA_FRAC_BITS 10
49
static void dnxhd_8bit_get_pixels_8x4_sym(int16_t *restrict block, const uint8_t *pixels, int line_size)
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 },
51
static const AVClass class = {
58
static void dnxhd_8bit_get_pixels_8x4_sym(int16_t *restrict block,
59
const uint8_t *pixels,
52
63
for (i = 0; i < 4; i++) {
53
block[0] = pixels[0]; block[1] = pixels[1];
54
block[2] = pixels[2]; block[3] = pixels[3];
55
block[4] = pixels[4]; block[5] = pixels[5];
56
block[6] = pixels[6]; block[7] = pixels[7];
60
75
memcpy(block, block - 8, sizeof(*block) * 8);
61
76
memcpy(block + 8, block - 16, sizeof(*block) * 8);
104
122
static av_cold int dnxhd_init_vlc(DNXHDEncContext *ctx)
106
124
int i, j, level, run;
107
int max_level = 1<<(ctx->cid_table->bit_depth+2);
109
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->vlc_codes, max_level*4*sizeof(*ctx->vlc_codes), fail);
110
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->vlc_bits, max_level*4*sizeof(*ctx->vlc_bits) , fail);
111
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->run_codes, 63*2, fail);
112
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->run_bits, 63, fail);
114
ctx->vlc_codes += max_level*2;
115
ctx->vlc_bits += max_level*2;
125
int max_level = 1 << (ctx->cid_table->bit_depth + 2);
127
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->vlc_codes,
128
max_level * 4 * sizeof(*ctx->vlc_codes), fail);
129
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->vlc_bits,
130
max_level * 4 * sizeof(*ctx->vlc_bits), fail);
131
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->run_codes,
133
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->run_bits,
136
ctx->vlc_codes += max_level * 2;
137
ctx->vlc_bits += max_level * 2;
116
138
for (level = -max_level; level < max_level; level++) {
117
139
for (run = 0; run < 2; run++) {
118
int index = (level<<1)|run;
140
int index = (level << 1) | run;
119
141
int sign, offset = 0, alevel = level;
121
143
MASK_ABS(sign, alevel);
122
144
if (alevel > 64) {
123
offset = (alevel-1)>>6;
145
offset = (alevel - 1) >> 6;
146
alevel -= offset << 6;
126
148
for (j = 0; j < 257; j++) {
127
149
if (ctx->cid_table->ac_level[j] == alevel &&
149
173
int run = ctx->cid_table->run[i];
150
174
assert(run < 63);
151
175
ctx->run_codes[run] = ctx->cid_table->run_codes[i];
152
ctx->run_bits [run] = ctx->cid_table->run_bits[i];
176
ctx->run_bits[run] = ctx->cid_table->run_bits[i];
180
return AVERROR(ENOMEM);
159
183
static av_cold int dnxhd_init_qmat(DNXHDEncContext *ctx, int lbias, int cbias)
161
185
// init first elem to 1 to avoid div by 0 in convert_matrix
162
uint16_t weight_matrix[64] = {1,}; // convert_matrix needs uint16_t*
186
uint16_t weight_matrix[64] = { 1, }; // convert_matrix needs uint16_t*
164
188
const uint8_t *luma_weight_table = ctx->cid_table->luma_weight;
165
189
const uint8_t *chroma_weight_table = ctx->cid_table->chroma_weight;
167
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->qmatrix_l, (ctx->m.avctx->qmax+1) * 64 * sizeof(int), fail);
168
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->qmatrix_c, (ctx->m.avctx->qmax+1) * 64 * sizeof(int), fail);
169
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->qmatrix_l16, (ctx->m.avctx->qmax+1) * 64 * 2 * sizeof(uint16_t), fail);
170
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->qmatrix_c16, (ctx->m.avctx->qmax+1) * 64 * 2 * sizeof(uint16_t), fail);
191
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->qmatrix_l,
192
(ctx->m.avctx->qmax + 1) * 64 * sizeof(int), fail);
193
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->qmatrix_c,
194
(ctx->m.avctx->qmax + 1) * 64 * sizeof(int), fail);
195
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->qmatrix_l16,
196
(ctx->m.avctx->qmax + 1) * 64 * 2 * sizeof(uint16_t),
198
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->qmatrix_c16,
199
(ctx->m.avctx->qmax + 1) * 64 * 2 * sizeof(uint16_t),
172
202
if (ctx->cid_table->bit_depth == 8) {
173
203
for (i = 1; i < 64; i++) {
174
int j = ctx->m.dsp.idct_permutation[ff_zigzag_direct[i]];
204
int j = ctx->m.idsp.idct_permutation[ff_zigzag_direct[i]];
175
205
weight_matrix[j] = ctx->cid_table->luma_weight[i];
177
ff_convert_matrix(&ctx->m.dsp, ctx->qmatrix_l, ctx->qmatrix_l16, weight_matrix,
178
ctx->m.intra_quant_bias, 1, ctx->m.avctx->qmax, 1);
207
ff_convert_matrix(&ctx->m, ctx->qmatrix_l, ctx->qmatrix_l16,
208
weight_matrix, ctx->m.intra_quant_bias, 1,
209
ctx->m.avctx->qmax, 1);
179
210
for (i = 1; i < 64; i++) {
180
int j = ctx->m.dsp.idct_permutation[ff_zigzag_direct[i]];
211
int j = ctx->m.idsp.idct_permutation[ff_zigzag_direct[i]];
181
212
weight_matrix[j] = ctx->cid_table->chroma_weight[i];
183
ff_convert_matrix(&ctx->m.dsp, ctx->qmatrix_c, ctx->qmatrix_c16, weight_matrix,
184
ctx->m.intra_quant_bias, 1, ctx->m.avctx->qmax, 1);
214
ff_convert_matrix(&ctx->m, ctx->qmatrix_c, ctx->qmatrix_c16,
215
weight_matrix, ctx->m.intra_quant_bias, 1,
216
ctx->m.avctx->qmax, 1);
186
218
for (qscale = 1; qscale <= ctx->m.avctx->qmax; qscale++) {
187
219
for (i = 0; i < 64; i++) {
188
ctx->qmatrix_l [qscale] [i] <<= 2; ctx->qmatrix_c [qscale] [i] <<= 2;
189
ctx->qmatrix_l16[qscale][0][i] <<= 2; ctx->qmatrix_l16[qscale][1][i] <<= 2;
190
ctx->qmatrix_c16[qscale][0][i] <<= 2; ctx->qmatrix_c16[qscale][1][i] <<= 2;
220
ctx->qmatrix_l[qscale][i] <<= 2;
221
ctx->qmatrix_c[qscale][i] <<= 2;
222
ctx->qmatrix_l16[qscale][0][i] <<= 2;
223
ctx->qmatrix_l16[qscale][1][i] <<= 2;
224
ctx->qmatrix_c16[qscale][0][i] <<= 2;
225
ctx->qmatrix_c16[qscale][1][i] <<= 2;
195
230
for (qscale = 1; qscale <= ctx->m.avctx->qmax; qscale++) {
196
231
for (i = 1; i < 64; i++) {
197
int j = ctx->m.dsp.idct_permutation[ff_zigzag_direct[i]];
232
int j = ctx->m.idsp.idct_permutation[ff_zigzag_direct[i]];
199
// The quantization formula from the VC-3 standard is:
200
// quantized = sign(block[i]) * floor(abs(block[i]/s) * p / (qscale * weight_table[i]))
201
// Where p is 32 for 8-bit samples and 8 for 10-bit ones.
202
// The s factor compensates scaling of DCT coefficients done by the DCT routines,
203
// and therefore is not present in standard. It's 8 for 8-bit samples and 4 for 10-bit ones.
204
// We want values of ctx->qtmatrix_l and ctx->qtmatrix_r to be:
205
// ((1 << DNX10BIT_QMAT_SHIFT) * (p / s)) / (qscale * weight_table[i])
206
// For 10-bit samples, p / s == 2
207
ctx->qmatrix_l[qscale][j] = (1 << (DNX10BIT_QMAT_SHIFT + 1)) / (qscale * luma_weight_table[i]);
208
ctx->qmatrix_c[qscale][j] = (1 << (DNX10BIT_QMAT_SHIFT + 1)) / (qscale * chroma_weight_table[i]);
234
/* The quantization formula from the VC-3 standard is:
235
* quantized = sign(block[i]) * floor(abs(block[i]/s) * p /
236
* (qscale * weight_table[i]))
237
* Where p is 32 for 8-bit samples and 8 for 10-bit ones.
238
* The s factor compensates scaling of DCT coefficients done by
239
* the DCT routines, and therefore is not present in standard.
240
* It's 8 for 8-bit samples and 4 for 10-bit ones.
241
* We want values of ctx->qtmatrix_l and ctx->qtmatrix_r to be:
242
* ((1 << DNX10BIT_QMAT_SHIFT) * (p / s)) /
243
* (qscale * weight_table[i])
244
* For 10-bit samples, p / s == 2 */
245
ctx->qmatrix_l[qscale][j] = (1 << (DNX10BIT_QMAT_SHIFT + 1)) /
246
(qscale * luma_weight_table[i]);
247
ctx->qmatrix_c[qscale][j] = (1 << (DNX10BIT_QMAT_SHIFT + 1)) /
248
(qscale * chroma_weight_table[i]);
255
return AVERROR(ENOMEM);
218
258
static av_cold int dnxhd_init_rc(DNXHDEncContext *ctx)
220
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_rc, 8160*ctx->m.avctx->qmax*sizeof(RCEntry), fail);
260
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_rc,
261
8160 * ctx->m.avctx->qmax * sizeof(RCEntry), fail);
221
262
if (ctx->m.avctx->mb_decision != FF_MB_DECISION_RD)
222
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_cmp, ctx->m.mb_num*sizeof(RCCMPEntry), fail);
263
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_cmp,
264
ctx->m.mb_num * sizeof(RCCMPEntry), fail);
224
ctx->frame_bits = (ctx->cid_table->coding_unit_size - 640 - 4 - ctx->min_padding) * 8;
266
ctx->frame_bits = (ctx->cid_table->coding_unit_size -
267
640 - 4 - ctx->min_padding) * 8;
226
ctx->lambda = 2<<LAMBDA_FRAC_BITS; // qscale 2
269
ctx->lambda = 2 << LAMBDA_FRAC_BITS; // qscale 2
272
return AVERROR(ENOMEM);
232
275
static av_cold int dnxhd_encode_init(AVCodecContext *avctx)
234
277
DNXHDEncContext *ctx = avctx->priv_data;
235
int i, index, bit_depth;
278
int i, index, bit_depth, ret;
237
280
switch (avctx->pix_fmt) {
238
281
case AV_PIX_FMT_YUV422P:
245
av_log(avctx, AV_LOG_ERROR, "pixel format is incompatible with DNxHD\n");
288
av_log(avctx, AV_LOG_ERROR,
289
"pixel format is incompatible with DNxHD\n");
290
return AVERROR(EINVAL);
249
293
ctx->cid = ff_dnxhd_find_cid(avctx, bit_depth);
251
av_log(avctx, AV_LOG_ERROR, "video parameters incompatible with DNxHD\n");
295
av_log(avctx, AV_LOG_ERROR,
296
"video parameters incompatible with DNxHD\n");
297
return AVERROR(EINVAL);
254
299
av_log(avctx, AV_LOG_DEBUG, "cid %d\n", ctx->cid);
256
301
index = ff_dnxhd_get_cid_table(ctx->cid);
257
302
ctx->cid_table = &ff_dnxhd_cid_table[index];
259
ctx->m.avctx = avctx;
304
ctx->m.avctx = avctx;
260
305
ctx->m.mb_intra = 1;
261
306
ctx->m.h263_aic = 1;
263
308
avctx->bits_per_raw_sample = ctx->cid_table->bit_depth;
265
ff_dsputil_init(&ctx->m.dsp, avctx);
266
ff_dct_common_init(&ctx->m);
310
ff_blockdsp_init(&ctx->bdsp, avctx);
311
ff_fdctdsp_init(&ctx->m.fdsp, avctx);
312
ff_mpv_idct_init(&ctx->m);
313
ff_mpegvideoencdsp_init(&ctx->m.mpvencdsp, avctx);
314
ff_pixblockdsp_init(&ctx->m.pdsp, avctx);
267
315
if (!ctx->m.dct_quantize)
268
316
ctx->m.dct_quantize = ff_dct_quantize_c;
270
318
if (ctx->cid_table->bit_depth == 10) {
271
ctx->m.dct_quantize = dnxhd_10bit_dct_quantize;
272
ctx->get_pixels_8x4_sym = dnxhd_10bit_get_pixels_8x4_sym;
273
ctx->block_width_l2 = 4;
319
ctx->m.dct_quantize = dnxhd_10bit_dct_quantize;
320
ctx->get_pixels_8x4_sym = dnxhd_10bit_get_pixels_8x4_sym;
321
ctx->block_width_l2 = 4;
275
ctx->get_pixels_8x4_sym = dnxhd_8bit_get_pixels_8x4_sym;
276
ctx->block_width_l2 = 3;
323
ctx->get_pixels_8x4_sym = dnxhd_8bit_get_pixels_8x4_sym;
324
ctx->block_width_l2 = 3;
292
340
if (avctx->intra_quant_bias != FF_DEFAULT_QUANT_BIAS)
293
341
ctx->m.intra_quant_bias = avctx->intra_quant_bias;
294
if (dnxhd_init_qmat(ctx, ctx->m.intra_quant_bias, 0) < 0) // XXX tune lbias/cbias
342
// XXX tune lbias/cbias
343
if ((ret = dnxhd_init_qmat(ctx, ctx->m.intra_quant_bias, 0)) < 0)
297
// Avid Nitris hardware decoder requires a minimum amount of padding in the coding unit payload
346
/* Avid Nitris hardware decoder requires a minimum amount of padding
347
* in the coding unit payload */
298
348
if (ctx->nitris_compat)
299
349
ctx->min_padding = 1600;
301
if (dnxhd_init_vlc(ctx) < 0)
303
if (dnxhd_init_rc(ctx) < 0)
351
if ((ret = dnxhd_init_vlc(ctx)) < 0)
353
if ((ret = dnxhd_init_rc(ctx)) < 0)
306
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->slice_size, ctx->m.mb_height*sizeof(uint32_t), fail);
307
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->slice_offs, ctx->m.mb_height*sizeof(uint32_t), fail);
308
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_bits, ctx->m.mb_num *sizeof(uint16_t), fail);
309
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_qscale, ctx->m.mb_num *sizeof(uint8_t), fail);
356
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->slice_size,
357
ctx->m.mb_height * sizeof(uint32_t), fail);
358
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->slice_offs,
359
ctx->m.mb_height * sizeof(uint32_t), fail);
360
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_bits,
361
ctx->m.mb_num * sizeof(uint16_t), fail);
362
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_qscale,
363
ctx->m.mb_num * sizeof(uint8_t), fail);
311
365
avctx->coded_frame = av_frame_alloc();
312
366
if (!avctx->coded_frame)
318
372
if (avctx->thread_count > MAX_THREADS) {
319
373
av_log(avctx, AV_LOG_ERROR, "too many threads\n");
374
return AVERROR(EINVAL);
323
377
ctx->thread[0] = ctx;
324
378
for (i = 1; i < avctx->thread_count; i++) {
325
ctx->thread[i] = av_malloc(sizeof(DNXHDEncContext));
379
ctx->thread[i] = av_malloc(sizeof(DNXHDEncContext));
326
380
memcpy(ctx->thread[i], ctx, sizeof(DNXHDEncContext));
330
fail: //for FF_ALLOCZ_OR_GOTO
384
fail: // for FF_ALLOCZ_OR_GOTO
385
return AVERROR(ENOMEM);
334
388
static int dnxhd_write_header(AVCodecContext *avctx, uint8_t *buf)
336
390
DNXHDEncContext *ctx = avctx->priv_data;
337
const uint8_t header_prefix[5] = { 0x00,0x00,0x02,0x80,0x01 };
391
const uint8_t header_prefix[5] = { 0x00, 0x00, 0x02, 0x80, 0x01 };
339
393
memset(buf, 0, 640);
341
395
memcpy(buf, header_prefix, 5);
342
buf[5] = ctx->interlaced ? ctx->cur_field+2 : 0x01;
396
buf[5] = ctx->interlaced ? ctx->cur_field + 2 : 0x01;
343
397
buf[6] = 0x80; // crc flag off
344
398
buf[7] = 0xa0; // reserved
345
AV_WB16(buf + 0x18, avctx->height>>ctx->interlaced); // ALPF
399
AV_WB16(buf + 0x18, avctx->height >> ctx->interlaced); // ALPF
346
400
AV_WB16(buf + 0x1a, avctx->width); // SPL
347
AV_WB16(buf + 0x1d, avctx->height>>ctx->interlaced); // NAL
401
AV_WB16(buf + 0x1d, avctx->height >> ctx->interlaced); // NAL
349
403
buf[0x21] = ctx->cid_table->bit_depth == 10 ? 0x58 : 0x38;
350
buf[0x22] = 0x88 + (ctx->interlaced<<2);
404
buf[0x22] = 0x88 + (ctx->interlaced << 2);
351
405
AV_WB32(buf + 0x28, ctx->cid); // CID
352
406
buf[0x2c] = ctx->interlaced ? 0 : 0x80;
388
445
slevel = block[j];
390
447
int run_level = i - last_non_zero - 1;
391
int rlevel = (slevel<<1)|!!run_level;
448
int rlevel = (slevel << 1) | !!run_level;
392
449
put_bits(&ctx->m.pb, ctx->vlc_bits[rlevel], ctx->vlc_codes[rlevel]);
394
put_bits(&ctx->m.pb, ctx->run_bits[run_level], ctx->run_codes[run_level]);
451
put_bits(&ctx->m.pb, ctx->run_bits[run_level],
452
ctx->run_codes[run_level]);
395
453
last_non_zero = i;
398
456
put_bits(&ctx->m.pb, ctx->vlc_bits[0], ctx->vlc_codes[0]); // EOB
401
static av_always_inline void dnxhd_unquantize_c(DNXHDEncContext *ctx, int16_t *block, int n, int qscale, int last_index)
459
static av_always_inline
460
void dnxhd_unquantize_c(DNXHDEncContext *ctx, int16_t *block, int n,
461
int qscale, int last_index)
403
463
const uint8_t *weight_matrix;
407
weight_matrix = (n&2) ? ctx->cid_table->chroma_weight : ctx->cid_table->luma_weight;
467
weight_matrix = (n & 2) ? ctx->cid_table->chroma_weight
468
: ctx->cid_table->luma_weight;
409
470
for (i = 1; i <= last_index; i++) {
410
471
int j = ctx->m.intra_scantable.permutated[i];
411
472
level = block[j];
414
level = (1-2*level) * qscale * weight_matrix[i];
475
level = (1 - 2 * level) * qscale * weight_matrix[i];
415
476
if (ctx->cid_table->bit_depth == 10) {
416
477
if (weight_matrix[i] != 8)
458
520
level = block[j];
460
522
int run_level = i - last_non_zero - 1;
461
bits += ctx->vlc_bits[(level<<1)|!!run_level]+ctx->run_bits[run_level];
523
bits += ctx->vlc_bits[(level << 1) |
524
!!run_level] + ctx->run_bits[run_level];
462
525
last_non_zero = i;
468
static av_always_inline void dnxhd_get_blocks(DNXHDEncContext *ctx, int mb_x, int mb_y)
531
static av_always_inline
532
void dnxhd_get_blocks(DNXHDEncContext *ctx, int mb_x, int mb_y)
470
534
const int bs = ctx->block_width_l2;
471
535
const int bw = 1 << bs;
472
const uint8_t *ptr_y = ctx->thread[0]->src[0] + ((mb_y << 4) * ctx->m.linesize) + (mb_x << bs+1);
473
const uint8_t *ptr_u = ctx->thread[0]->src[1] + ((mb_y << 4) * ctx->m.uvlinesize) + (mb_x << bs);
474
const uint8_t *ptr_v = ctx->thread[0]->src[2] + ((mb_y << 4) * ctx->m.uvlinesize) + (mb_x << bs);
475
DSPContext *dsp = &ctx->m.dsp;
477
dsp->get_pixels(ctx->blocks[0], ptr_y, ctx->m.linesize);
478
dsp->get_pixels(ctx->blocks[1], ptr_y + bw, ctx->m.linesize);
479
dsp->get_pixels(ctx->blocks[2], ptr_u, ctx->m.uvlinesize);
480
dsp->get_pixels(ctx->blocks[3], ptr_v, ctx->m.uvlinesize);
482
if (mb_y+1 == ctx->m.mb_height && ctx->m.avctx->height == 1080) {
536
const uint8_t *ptr_y = ctx->thread[0]->src[0] +
537
((mb_y << 4) * ctx->m.linesize) + (mb_x << bs + 1);
538
const uint8_t *ptr_u = ctx->thread[0]->src[1] +
539
((mb_y << 4) * ctx->m.uvlinesize) + (mb_x << bs);
540
const uint8_t *ptr_v = ctx->thread[0]->src[2] +
541
((mb_y << 4) * ctx->m.uvlinesize) + (mb_x << bs);
542
PixblockDSPContext *pdsp = &ctx->m.pdsp;
544
pdsp->get_pixels(ctx->blocks[0], ptr_y, ctx->m.linesize);
545
pdsp->get_pixels(ctx->blocks[1], ptr_y + bw, ctx->m.linesize);
546
pdsp->get_pixels(ctx->blocks[2], ptr_u, ctx->m.uvlinesize);
547
pdsp->get_pixels(ctx->blocks[3], ptr_v, ctx->m.uvlinesize);
549
if (mb_y + 1 == ctx->m.mb_height && ctx->m.avctx->height == 1080) {
483
550
if (ctx->interlaced) {
484
ctx->get_pixels_8x4_sym(ctx->blocks[4], ptr_y + ctx->dct_y_offset, ctx->m.linesize);
485
ctx->get_pixels_8x4_sym(ctx->blocks[5], ptr_y + ctx->dct_y_offset + bw, ctx->m.linesize);
486
ctx->get_pixels_8x4_sym(ctx->blocks[6], ptr_u + ctx->dct_uv_offset, ctx->m.uvlinesize);
487
ctx->get_pixels_8x4_sym(ctx->blocks[7], ptr_v + ctx->dct_uv_offset, ctx->m.uvlinesize);
551
ctx->get_pixels_8x4_sym(ctx->blocks[4],
552
ptr_y + ctx->dct_y_offset,
554
ctx->get_pixels_8x4_sym(ctx->blocks[5],
555
ptr_y + ctx->dct_y_offset + bw,
557
ctx->get_pixels_8x4_sym(ctx->blocks[6],
558
ptr_u + ctx->dct_uv_offset,
560
ctx->get_pixels_8x4_sym(ctx->blocks[7],
561
ptr_v + ctx->dct_uv_offset,
489
dsp->clear_block(ctx->blocks[4]);
490
dsp->clear_block(ctx->blocks[5]);
491
dsp->clear_block(ctx->blocks[6]);
492
dsp->clear_block(ctx->blocks[7]);
564
ctx->bdsp.clear_block(ctx->blocks[4]);
565
ctx->bdsp.clear_block(ctx->blocks[5]);
566
ctx->bdsp.clear_block(ctx->blocks[6]);
567
ctx->bdsp.clear_block(ctx->blocks[7]);
495
dsp->get_pixels(ctx->blocks[4], ptr_y + ctx->dct_y_offset, ctx->m.linesize);
496
dsp->get_pixels(ctx->blocks[5], ptr_y + ctx->dct_y_offset + bw, ctx->m.linesize);
497
dsp->get_pixels(ctx->blocks[6], ptr_u + ctx->dct_uv_offset, ctx->m.uvlinesize);
498
dsp->get_pixels(ctx->blocks[7], ptr_v + ctx->dct_uv_offset, ctx->m.uvlinesize);
570
pdsp->get_pixels(ctx->blocks[4],
571
ptr_y + ctx->dct_y_offset, ctx->m.linesize);
572
pdsp->get_pixels(ctx->blocks[5],
573
ptr_y + ctx->dct_y_offset + bw, ctx->m.linesize);
574
pdsp->get_pixels(ctx->blocks[6],
575
ptr_u + ctx->dct_uv_offset, ctx->m.uvlinesize);
576
pdsp->get_pixels(ctx->blocks[7],
577
ptr_v + ctx->dct_uv_offset, ctx->m.uvlinesize);
502
static av_always_inline int dnxhd_switch_matrix(DNXHDEncContext *ctx, int i)
581
static av_always_inline
582
int dnxhd_switch_matrix(DNXHDEncContext *ctx, int i)
505
585
ctx->m.q_intra_matrix16 = ctx->qmatrix_c16;
506
586
ctx->m.q_intra_matrix = ctx->qmatrix_c;
509
589
ctx->m.q_intra_matrix16 = ctx->qmatrix_l16;
510
590
ctx->m.q_intra_matrix = ctx->qmatrix_l;
538
619
int overflow, nbits, diff, last_index;
539
620
int n = dnxhd_switch_matrix(ctx, i);
541
memcpy(block, src_block, 64*sizeof(*block));
542
last_index = ctx->m.dct_quantize(&ctx->m, block, i, qscale, &overflow);
543
ac_bits += dnxhd_calc_ac_bits(ctx, block, last_index);
622
memcpy(block, src_block, 64 * sizeof(*block));
623
last_index = ctx->m.dct_quantize(&ctx->m, block, i,
625
ac_bits += dnxhd_calc_ac_bits(ctx, block, last_index);
545
627
diff = block[0] - ctx->m.last_dc[n];
546
if (diff < 0) nbits = av_log2_16bit(-2*diff);
547
else nbits = av_log2_16bit( 2*diff);
629
nbits = av_log2_16bit(-2 * diff);
631
nbits = av_log2_16bit(2 * diff);
549
633
assert(nbits < ctx->cid_table->bit_depth + 4);
550
634
dc_bits += ctx->cid_table->dc_bits[nbits] + nbits;
705
795
for (x = 0; x < ctx->m.mb_width; x++) {
706
796
unsigned min = UINT_MAX;
708
int mb = y*ctx->m.mb_width+x;
798
int mb = y * ctx->m.mb_width + x;
709
799
for (q = 1; q < avctx->qmax; q++) {
710
unsigned score = ctx->mb_rc[q][mb].bits*lambda+
711
((unsigned)ctx->mb_rc[q][mb].ssd<<LAMBDA_FRAC_BITS);
800
unsigned score = ctx->mb_rc[q][mb].bits * lambda +
801
((unsigned) ctx->mb_rc[q][mb].ssd << LAMBDA_FRAC_BITS);
712
802
if (score < min) {
717
807
bits += ctx->mb_rc[qscale][mb].bits;
718
808
ctx->mb_qscale[mb] = qscale;
719
ctx->mb_bits[mb] = ctx->mb_rc[qscale][mb].bits;
809
ctx->mb_bits[mb] = ctx->mb_rc[qscale][mb].bits;
721
bits = (bits+31)&~31; // padding
811
bits = (bits + 31) & ~31; // padding
722
812
if (bits > ctx->frame_bits)
725
//av_dlog(ctx->m.avctx, "lambda %d, up %u, down %u, bits %d, frame %d\n",
726
// lambda, last_higher, last_lower, bits, ctx->frame_bits);
815
// av_dlog(ctx->m.avctx,
816
// "lambda %d, up %u, down %u, bits %d, frame %d\n",
817
// lambda, last_higher, last_lower, bits, ctx->frame_bits);
728
819
if (bits > ctx->frame_bits)
820
return AVERROR(EINVAL);
732
823
if (bits < ctx->frame_bits) {
876
972
int max_bits = 0;
878
974
if ((ret = dnxhd_find_qscale(ctx)) < 0)
880
976
for (y = 0; y < ctx->m.mb_height; y++) {
881
977
for (x = 0; x < ctx->m.mb_width; x++) {
882
int mb = y*ctx->m.mb_width+x;
978
int mb = y * ctx->m.mb_width + x;
884
980
ctx->mb_qscale[mb] = ctx->qscale;
885
981
ctx->mb_bits[mb] = ctx->mb_rc[ctx->qscale][mb].bits;
886
982
max_bits += ctx->mb_rc[ctx->qscale][mb].bits;
887
983
if (!RC_VARIANCE) {
888
delta_bits = ctx->mb_rc[ctx->qscale][mb].bits-ctx->mb_rc[ctx->qscale+1][mb].bits;
984
delta_bits = ctx->mb_rc[ctx->qscale][mb].bits -
985
ctx->mb_rc[ctx->qscale + 1][mb].bits;
889
986
ctx->mb_cmp[mb].mb = mb;
890
ctx->mb_cmp[mb].value = delta_bits ?
891
((ctx->mb_rc[ctx->qscale][mb].ssd-ctx->mb_rc[ctx->qscale+1][mb].ssd)*100)/delta_bits
892
: INT_MIN; //avoid increasing qscale
987
ctx->mb_cmp[mb].value =
988
delta_bits ? ((ctx->mb_rc[ctx->qscale][mb].ssd -
989
ctx->mb_rc[ctx->qscale + 1][mb].ssd) * 100) /
991
: INT_MIN; // avoid increasing qscale
895
max_bits += 31; //worst padding
994
max_bits += 31; // worst padding
899
avctx->execute2(avctx, dnxhd_mb_var_thread, NULL, NULL, ctx->m.mb_height);
998
avctx->execute2(avctx, dnxhd_mb_var_thread,
999
NULL, NULL, ctx->m.mb_height);
900
1000
radix_sort(ctx->mb_cmp, ctx->m.mb_num);
901
1001
for (x = 0; x < ctx->m.mb_num && max_bits > ctx->frame_bits; x++) {
902
1002
int mb = ctx->mb_cmp[x].mb;
903
max_bits -= ctx->mb_rc[ctx->qscale][mb].bits - ctx->mb_rc[ctx->qscale+1][mb].bits;
904
ctx->mb_qscale[mb] = ctx->qscale+1;
905
ctx->mb_bits[mb] = ctx->mb_rc[ctx->qscale+1][mb].bits;
1003
max_bits -= ctx->mb_rc[ctx->qscale][mb].bits -
1004
ctx->mb_rc[ctx->qscale + 1][mb].bits;
1005
ctx->mb_qscale[mb] = ctx->qscale + 1;
1006
ctx->mb_bits[mb] = ctx->mb_rc[ctx->qscale + 1][mb].bits;