mirror of https://git.ffmpeg.org/ffmpeg.git
dnxhd: allow encoding with Avid Nitris compatibility.
Signed-off-by: Mans Rullgard <mans@mansr.com>
(cherry picked from commit 99bbc781e9
)
This commit is contained in:
parent
5bb50c71a3
commit
176e176288
|
@ -24,11 +24,20 @@
|
||||||
//#define DEBUG
|
//#define DEBUG
|
||||||
#define RC_VARIANCE 1 // use variance or ssd for fast rc
|
#define RC_VARIANCE 1 // use variance or ssd for fast rc
|
||||||
|
|
||||||
|
#include "libavutil/opt.h"
|
||||||
#include "avcodec.h"
|
#include "avcodec.h"
|
||||||
#include "dsputil.h"
|
#include "dsputil.h"
|
||||||
#include "mpegvideo.h"
|
#include "mpegvideo.h"
|
||||||
#include "dnxhdenc.h"
|
#include "dnxhdenc.h"
|
||||||
|
|
||||||
|
#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
|
||||||
|
|
||||||
|
static const AVOption options[]={
|
||||||
|
{"nitris_compat", "encode with Avid Nitris compatibility", offsetof(DNXHDEncContext, nitris_compat), FF_OPT_TYPE_INT, 0, 0, 1, VE},
|
||||||
|
{NULL}
|
||||||
|
};
|
||||||
|
static const AVClass class = { "dnxhd", av_default_item_name, options, LIBAVUTIL_VERSION_INT };
|
||||||
|
|
||||||
int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
|
int dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
|
||||||
|
|
||||||
#define LAMBDA_FRAC_BITS 10
|
#define LAMBDA_FRAC_BITS 10
|
||||||
|
@ -146,7 +155,7 @@ static int dnxhd_init_rc(DNXHDEncContext *ctx)
|
||||||
if (ctx->m.avctx->mb_decision != FF_MB_DECISION_RD)
|
if (ctx->m.avctx->mb_decision != FF_MB_DECISION_RD)
|
||||||
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_cmp, ctx->m.mb_num*sizeof(RCCMPEntry), fail);
|
FF_ALLOCZ_OR_GOTO(ctx->m.avctx, ctx->mb_cmp, ctx->m.mb_num*sizeof(RCCMPEntry), fail);
|
||||||
|
|
||||||
ctx->frame_bits = (ctx->cid_table->coding_unit_size - 640 - 4) * 8;
|
ctx->frame_bits = (ctx->cid_table->coding_unit_size - 640 - 4 - ctx->min_padding) * 8;
|
||||||
ctx->qscale = 1;
|
ctx->qscale = 1;
|
||||||
ctx->lambda = 2<<LAMBDA_FRAC_BITS; // qscale 2
|
ctx->lambda = 2<<LAMBDA_FRAC_BITS; // qscale 2
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -198,6 +207,10 @@ static int dnxhd_encode_init(AVCodecContext *avctx)
|
||||||
if (dnxhd_init_qmat(ctx, ctx->m.intra_quant_bias, 0) < 0) // XXX tune lbias/cbias
|
if (dnxhd_init_qmat(ctx, ctx->m.intra_quant_bias, 0) < 0) // XXX tune lbias/cbias
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
// Avid Nitris hardware decoder requires a minimum amount of padding in the coding unit payload
|
||||||
|
if (ctx->nitris_compat)
|
||||||
|
ctx->min_padding = 1600;
|
||||||
|
|
||||||
if (dnxhd_init_vlc(ctx) < 0)
|
if (dnxhd_init_vlc(ctx) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (dnxhd_init_rc(ctx) < 0)
|
if (dnxhd_init_rc(ctx) < 0)
|
||||||
|
@ -858,4 +871,5 @@ AVCodec ff_dnxhd_encoder = {
|
||||||
dnxhd_encode_end,
|
dnxhd_encode_end,
|
||||||
.pix_fmts = (const enum PixelFormat[]){PIX_FMT_YUV422P, PIX_FMT_NONE},
|
.pix_fmts = (const enum PixelFormat[]){PIX_FMT_YUV422P, PIX_FMT_NONE},
|
||||||
.long_name = NULL_IF_CONFIG_SMALL("VC3/DNxHD"),
|
.long_name = NULL_IF_CONFIG_SMALL("VC3/DNxHD"),
|
||||||
|
.priv_class = &class,
|
||||||
};
|
};
|
||||||
|
|
|
@ -55,6 +55,9 @@ typedef struct DNXHDEncContext {
|
||||||
int interlaced;
|
int interlaced;
|
||||||
int cur_field;
|
int cur_field;
|
||||||
|
|
||||||
|
int nitris_compat;
|
||||||
|
unsigned min_padding;
|
||||||
|
|
||||||
DECLARE_ALIGNED(16, DCTELEM, blocks)[8][64];
|
DECLARE_ALIGNED(16, DCTELEM, blocks)[8][64];
|
||||||
|
|
||||||
int (*qmatrix_c) [64];
|
int (*qmatrix_c) [64];
|
||||||
|
|
Loading…
Reference in New Issue