[FFmpeg-devel] [PATCH] In dnxhd encoder, allow encoding with nitris compatibility.

Måns Rullgård mans
Wed Mar 2 00:36:15 CET 2011


Baptiste Coudurier <baptiste.coudurier at gmail.com> writes:

> ---
>  libavcodec/dnxhdenc.c |   16 +++++++++++++++-
>  libavcodec/dnxhdenc.h |    3 +++
>  2 files changed, 18 insertions(+), 1 deletions(-)
>
> diff --git a/libavcodec/dnxhdenc.c b/libavcodec/dnxhdenc.c
> index d6f8bd3..cd24edb 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},

The help text could use some capitalisation (Avid Nitris).

> +{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 eaf33d5..f0b38a5 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];
> -- 
> 1.7.4.1

If that's what it needs, patch is fine.

-- 
M?ns Rullg?rd
mans at mansr.com



More information about the ffmpeg-devel mailing list