[FFmpeg-devel] [PATCH] QSV : Added look ahead rate control mode
Sven Dueking
sven at nablet.com
Thu Aug 27 11:02:44 CEST 2015
> -----Ursprüngliche Nachricht-----
> Von: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] Im Auftrag
> von Sven Dueking
> Gesendet: Freitag, 21. August 2015 10:18
> An: ffmpeg-devel at ffmpeg.org
> Cc: Sven Dueking
> Betreff: [FFmpeg-devel] [PATCH] QSV : Added look ahead rate control
> mode
>
> From: Sven Dueking <sven at nablet.com>
>
> ---
> libavcodec/qsvenc.c | 31 +++++++++++++++++++++++++++++--
> libavcodec/qsvenc.h | 8 ++++++++
> libavcodec/qsvenc_h264.c | 12 ++++++++++++
> 3 files changed, 49 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index
> 1532258..1aeab03 100644
> --- a/libavcodec/qsvenc.c
> +++ b/libavcodec/qsvenc.c
> @@ -107,8 +107,16 @@ static int init_video_param(AVCodecContext *avctx,
> QSVEncContext *q)
> q->param.mfx.RateControlMethod = MFX_RATECONTROL_CBR;
> ratecontrol_desc = "constant bitrate (CBR)";
> } else if (!avctx->rc_max_rate) {
> - q->param.mfx.RateControlMethod = MFX_RATECONTROL_AVBR;
> - ratecontrol_desc = "average variable bitrate (AVBR)";
> +#if QSV_VERSION_ATLEAST(1,7)
> + if (q->look_ahead) {
> + q->param.mfx.RateControlMethod = MFX_RATECONTROL_LA;
> + ratecontrol_desc = "lookahead (LA)";
> + } else
> +#endif
> + {
> + q->param.mfx.RateControlMethod = MFX_RATECONTROL_AVBR;
> + ratecontrol_desc = "average variable bitrate (AVBR)";
> + }
> } else {
> q->param.mfx.RateControlMethod = MFX_RATECONTROL_VBR;
> ratecontrol_desc = "variable bitrate (VBR)"; @@ -132,6 +140,9
> @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q)
>
> break;
> case MFX_RATECONTROL_AVBR:
> +#if QSV_VERSION_ATLEAST(1,7)
> + case MFX_RATECONTROL_LA:
> +#endif
> q->param.mfx.TargetKbps = avctx->bit_rate / 1000;
> q->param.mfx.Convergence = q->avbr_convergence;
> q->param.mfx.Accuracy = q->avbr_accuracy;
> @@ -151,6 +162,22 @@ static int init_video_param(AVCodecContext *avctx,
> QSVEncContext *q)
>
> q->extparam[0] = (mfxExtBuffer *)&q->extco;
>
> +#if QSV_VERSION_ATLEAST(1,6)
> + q->extco2.Header.BufferId = MFX_EXTBUFF_CODING_OPTION2;
> + q->extco2.Header.BufferSz = sizeof(q->extco2);
> +
> +#if QSV_VERSION_ATLEAST(1,7)
> + // valid value range is from 10 to 100 inclusive
> + // to instruct the encoder to use the default value this
> should be set to zero
> + q->extco2.LookAheadDepth = q->look_ahead_depth != 0 ?
> FFMAX(10, q->look_ahead_depth) : 0;
> +#endif
> +#if QSV_VERSION_ATLEAST(1,8)
> + q->extco2.LookAheadDS = q->look_ahead_downsampling;
> +#endif
> +
> + q->extparam[1] = (mfxExtBuffer *)&q->extco2;
> +
> +#endif
> q->param.ExtParam = q->extparam;
> q->param.NumExtParam = FF_ARRAY_ELEMS(q->extparam);
> }
> diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h index
> 2316488..2a21f82 100644
> --- a/libavcodec/qsvenc.h
> +++ b/libavcodec/qsvenc.h
> @@ -50,7 +50,12 @@ typedef struct QSVEncContext {
> mfxFrameAllocRequest req;
>
> mfxExtCodingOption extco;
> +#if QSV_VERSION_ATLEAST(1,6)
> + mfxExtCodingOption2 extco2;
> + mfxExtBuffer *extparam[2];
> +#else
> mfxExtBuffer *extparam[1];
> +#endif
>
> AVFifoBuffer *async_fifo;
>
> @@ -62,6 +67,9 @@ typedef struct QSVEncContext {
> int avbr_accuracy;
> int avbr_convergence;
> int pic_timing_sei;
> + int look_ahead;
> + int look_ahead_depth;
> + int look_ahead_downsampling;
>
> char *load_plugins;
> } QSVEncContext;
> diff --git a/libavcodec/qsvenc_h264.c b/libavcodec/qsvenc_h264.c index
> b15f6b2..b569efe 100644
> --- a/libavcodec/qsvenc_h264.c
> +++ b/libavcodec/qsvenc_h264.c
> @@ -71,6 +71,18 @@ static const AVOption options[] = {
> { "avbr_convergence", "Convergence of the AVBR ratecontrol",
> OFFSET(qsv.avbr_convergence), AV_OPT_TYPE_INT, { .i64 = 0 }, 0,
> INT_MAX, VE },
> { "pic_timing_sei", "Insert picture timing SEI with
> pic_struct_syntax element", OFFSET(qsv.pic_timing_sei),
> AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, VE },
>
> +#if QSV_VERSION_ATLEAST(1,7)
> + { "look_ahead", "Use VBR algorithm with look ahead",
> OFFSET(qsv.look_ahead), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, VE
> },
> + { "look_ahead_depth", "Depth of look ahead in number frames",
> +OFFSET(qsv.look_ahead_depth), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 100,
> VE
> +}, #endif
> +
> +#if QSV_VERSION_ATLEAST(1,8)
> + { "look_ahead_downsampling", NULL,
> OFFSET(qsv.look_ahead_downsampling), AV_OPT_TYPE_INT, { .i64 =
> MFX_LOOKAHEAD_DS_UNKNOWN }, MFX_LOOKAHEAD_DS_UNKNOWN,
> MFX_LOOKAHEAD_DS_2x, VE, "look_ahead_downsampling" },
> + { "unknown" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 =
> MFX_LOOKAHEAD_DS_UNKNOWN }, INT_MIN, INT_MAX, VE,
> "look_ahead_downsampling" },
> + { "off" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 =
> MFX_LOOKAHEAD_DS_OFF }, INT_MIN, INT_MAX, VE,
> "look_ahead_downsampling" },
> + { "2x" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 =
> MFX_LOOKAHEAD_DS_2x }, INT_MIN, INT_MAX, VE,
> "look_ahead_downsampling" },
> +#endif
> +
> { "profile", NULL, OFFSET(qsv.profile), AV_OPT_TYPE_INT, { .i64 =
> MFX_PROFILE_UNKNOWN }, 0, INT_MAX, VE, "profile" },
> { "unknown" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 =
> MFX_PROFILE_UNKNOWN }, INT_MIN, INT_MAX, VE, "profile" },
> { "baseline", NULL, 0, AV_OPT_TYPE_CONST, { .i64 =
> MFX_PROFILE_AVC_BASELINE }, INT_MIN, INT_MAX, VE, "profile" },
> --
> 1.8.3.1
Hi Michael,
sorry to bother you, is this patch still not ok ?
Thanks,
Sven
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
More information about the ffmpeg-devel
mailing list