summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2011-03-01 23:50:25 +0000
committerMans Rullgard <mans@mansr.com>2011-03-01 23:55:55 +0000
commit99bbc781e9c134066887fc521db7a9d3607e3de1 (patch)
tree8a16c918d85433668a730bbea84f661fb84b7e16
parentfffdee89cc0712ed3324bae1f86e271a36c02822 (diff)
dnxhd: allow encoding with Avid Nitris compatibility.
Signed-off-by: Mans Rullgard <mans@mansr.com>
-rw-r--r--libavcodec/dnxhdenc.c16
-rw-r--r--libavcodec/dnxhdenc.h3
2 files changed, 18 insertions, 1 deletions
diff --git a/libavcodec/dnxhdenc.c b/libavcodec/dnxhdenc.c
index d6f8bd3cad..2e8720ac45 100644
--- a/libavcodec/dnxhdenc.c
+++ b/libavcodec/dnxhdenc.c
@@ -24,11 +24,20 @@
//#define DEBUG
#define RC_VARIANCE 1 // use variance or ssd for fast rc
+#include "libavutil/opt.h"
#include "avcodec.h"
#include "dsputil.h"
#include "mpegvideo.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);
#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)
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->lambda = 2<<LAMBDA_FRAC_BITS; // qscale 2
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
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)
return -1;
if (dnxhd_init_rc(ctx) < 0)
@@ -858,4 +871,5 @@ AVCodec ff_dnxhd_encoder = {
dnxhd_encode_end,
.pix_fmts = (const enum PixelFormat[]){PIX_FMT_YUV422P, PIX_FMT_NONE},
.long_name = NULL_IF_CONFIG_SMALL("VC3/DNxHD"),
+ .priv_class = &class,
};
diff --git a/libavcodec/dnxhdenc.h b/libavcodec/dnxhdenc.h
index eaf33d5cb9..f0b38a5981 100644
--- a/libavcodec/dnxhdenc.h
+++ b/libavcodec/dnxhdenc.h
@@ -55,6 +55,9 @@ typedef struct DNXHDEncContext {
int interlaced;
int cur_field;
+ int nitris_compat;
+ unsigned min_padding;
+
DECLARE_ALIGNED(16, DCTELEM, blocks)[8][64];
int (*qmatrix_c) [64];