[FFmpeg-devel] [PATCH] lavc/vaapi_encode_h264: Enable MB rate control
Jun Zhao
mypopydev at gmail.com
Fri May 12 07:00:59 EEST 2017
On 2017/5/11 19:39, Mark Thompson wrote:
> On 11/05/17 01:29, Jun Zhao wrote:
>> Enable the MB level rate control, verified in i965 driver master branch with Skylake.
>
> I think it makes sense to expose this, but can you explain a bit more what this actually does? All I can see in the i965 driver is that it allocates an extra buffer (as scratch data somehow?) and then passes the option to the proprietary driver blob.
>
> (VAAPI encoder documentation is incoming from <https://git.libav.org/?p=libav.git;a=commit;h=41dda860870fb1566b17f6b0b61922f0ef89be47>, if you want to write a bit more for that.)
>
> Also, what set of platforms is it usable on? Can we detect whether it will do anything or not?
Now libva don't have a query interface for mb_rate_control, and I think mb_rate_control supported by SKL+ (SKL/APL/KBL/GML)
>
>
>> From b32e4c9c1de47b3bf76327b0ecd11ccf9e3c693f Mon Sep 17 00:00:00 2001
>> From: Jun Zhao <jun.zhao at intel.com>
>> Date: Tue, 9 May 2017 08:19:16 +0800
>> Subject: [PATCH] lavc/vaapi_encode_h264: Enable MB rate control.
>>
>> Enables macroblock-level bitrate control that generally improves
>> subjective visual quality. It may have a negative impact on
>> performance and objective visual quality metrics. Default is off
>> and can't compatible with Constant QP.
>>
>> Signed-off-by: Jun Zhao <jun.zhao at intel.com>
>> ---
>> libavcodec/vaapi_encode_h264.c | 11 +++++++++++
>> 1 file changed, 11 insertions(+)
>>
>> diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
>> index 92e29554ed..130a9302eb 100644
>> --- a/libavcodec/vaapi_encode_h264.c
>> +++ b/libavcodec/vaapi_encode_h264.c
>> @@ -168,6 +168,7 @@ typedef struct VAAPIEncodeH264Options {
>> int qp;
>> int quality;
>> int low_power;
>> + int mbbrc;
>
> Maybe call it "mb_rate_control" to match the actual option?
>
>> } VAAPIEncodeH264Options;
>>
>>
>> @@ -1157,6 +1158,12 @@ static av_cold int vaapi_encode_h264_configure(AVCodecContext *avctx)
>> #endif
>> }
>>
>> + if (ctx->va_rc_mode == VA_RC_CQP && opt->mbbrc != 0)
>> + av_log(avctx, AV_LOG_WARNING, "The MB level bitrate control is not "
>> + "compatible with Constant QP, it's will ignored it.\n");
>
> I wouldn't include this warning - I think it's implicit that any rate control parameters will by unused in non-RC modes (compare bit_rate, rc_max_rate, rc_buffer_size, etc.).
>
> On the other hand, it might make sense to warn if we know the option isn't implemented by the driver (if we can even detect that).
>
Now Libva don't have a query interface, I will open a request for this.
>> + else
>> + ctx->rc_params.rc.rc_flags.bits.mb_rate_control = opt->mbbrc;
>
> The documentation says that 0 is default, 1 is enable and 2 is disable. Since this is becoming an active choice, pass 1 or 2 here depending on the option setting? (Given the explanation, avoiding "default" seems reasonable to me.)
>
Now i965 driver use default (0) == disable (2), (1) is enable, I think libva/va.h comment for mb_rate_control is confused.
>> +
>> return 0;
>> }
>>
>> @@ -1283,6 +1290,10 @@ static const AVOption vaapi_encode_h264_options[] = {
>> { "low_power", "Use low-power encoding mode (experimental: only supported "
>> "on some platforms, does not support all features)",
>> OFFSET(low_power), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS },
>> + { "mbbrc", "MB level bitrate control",
>
> Again, I think "mb_rate_control" would be clearer.
>
>> + OFFSET(mbbrc), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, 0, 1, FLAGS, "mbbrc" },
>> + { "off", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, "mbbrc"},
>> + { "on", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, "mbbrc"},
>
> FLAGS will do something very strange here (like allowing you to specify "on+off", which would end up meaning 0|1 == 1 == "on"). You want AV_OPT_TYPE_BOOL.
>
Will change to used AV_OPT_TYPE_BOOL in V2 patch.
>> { NULL },
>> };
>>
>> --
>> 2.11.0
>>
>
> Thanks,
>
> - Mark
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
More information about the ffmpeg-devel
mailing list