On 2017/4/13 22:05, Mark Thompson wrote:
> On 13/04/17 13:34, Jun Zhao wrote:
>> From 1fa48b45fe962d8c342d158d9c16ce24139ffd84 Mon Sep 17 00:00:00 2001
>> From: Jun Zhao <[email protected]>
>> Date: Thu, 13 Apr 2017 20:07:10 +0800
>> Subject: [PATCH] vaapi_encode: Fix the vaapi h264 encoder VBR/CBR metadata
>> setting error.
>>
>> before this fix, mediainfo check the bit rate control mode metadata info
>> is wrong.
>>
>> Reproduce step:
>> encode with CBR or VBR mode like this:
>> ./ffmpeg -y -hwaccel vaapi -vaapi_device /dev/dri/renderD128 \
>> -hwaccel_output_format vaapi -i input.mp4 -an -c:v h264_vaapi \
>> -maxrate 5M -b:v 5M output_cbr.mp4
>>
>> ./ffmpeg -y -hwaccel vaapi -vaapi_device /dev/dri/renderD128 \
>> -hwaccel_output_format vaapi -i input.mp4 -an -c:v h264_vaapi \
>> -maxrate 6M -b:v 5M output_cbr.mp4
>>
>> then use the mediainfo check the bit rate control mode.
>>
>> Signed-off-by: Jun Zhao <[email protected]>
>
> Not yet generating the HRD and timing information in VBR mode was deliberate,
> because I don't know enough about the conformance properties of the new
> proprietary rate controller which the Intel driver has switched to. The old
> CBR mode was straightforward to verify from the source code, and it seemed
> reasonable to assume that the new CBR mode would be too given the constraints
> on it (and also because existing versions of lavc couldn't be modified).
>
> Can you say anything about the HRD conformance of the Intel driver here, or
> was this patch purely for the metadata output (which may not actually match
> the stream, hence my concern)?
>
> Only the Intel driver is relevant to this as far as I know - the Mesa driver
> does not support the packed headers necessary for this information to be
> included in the stream.
>
>
I don't know the details about Intel driver's HRD conformance model, this patch
just want to correct the bit rate mode metadata information.
>> ---
>> libavcodec/vaapi_encode_h264.c | 7 +++----
>> 1 file changed, 3 insertions(+), 4 deletions(-)
>>
>> diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
>> index 92e2955..47d0c94 100644
>> --- a/libavcodec/vaapi_encode_h264.c
>> +++ b/libavcodec/vaapi_encode_h264.c
>> @@ -760,7 +760,7 @@ static int
>> vaapi_encode_h264_write_extra_header(AVCodecContext *avctx,
>> char tmp[256];
>> size_t header_len;
>>
>> - if (index == 0 && ctx->va_rc_mode == VA_RC_CBR) {
>> + if (index == 0 && (ctx->va_rc_mode == VA_RC_CBR || ctx->va_rc_mode ==
>> VA_RC_VBR)) {
>> *type = VAEncPackedHeaderH264_SEI;
>>
>> init_put_bits(&pbc, tmp, sizeof(tmp));
>> @@ -868,7 +868,7 @@ static int
>> vaapi_encode_h264_init_sequence_params(AVCodecContext *avctx)
>> mseq->fixed_frame_rate_flag = 0;
>> }
>>
>> - if (ctx->va_rc_mode == VA_RC_CBR) {
>> + if (ctx->va_rc_mode == VA_RC_CBR || ctx->va_rc_mode == VA_RC_VBR) {
>> priv->send_timing_sei = 1;
>> mseq->nal_hrd_parameters_present_flag = 1;
>>
>> @@ -886,8 +886,7 @@ static int
>> vaapi_encode_h264_init_sequence_params(AVCodecContext *avctx)
>> mseq->cpb_size_value_minus1[0] =
>> (ctx->hrd_params.hrd.buffer_size >> mseq->cpb_size_scale +
>> 4) - 1;
>>
>> - // CBR mode isn't actually available here, despite naming.
>> - mseq->cbr_flag[0] = 0;
>> + mseq->cbr_flag[0] = (ctx->va_rc_mode == VA_RC_CBR ? 1 : 0);
>
> As the comment notes, the necessary CBR mode isn't actually available.
> Drivers only offer "soft" CBR, which can result in HRD overflow; this
> specifies "hard" CBR, so if you want to set this flag you would need to
> insert filler NAL units as well.
>
In 1.8.0 release driver
(https://lists.01.org/pipermail/intel-vaapi-media/2017-March/000016.html),
I can't reproduce the overflow issue with CBR mode. So I guess the new driver
fix the HRD overflow
issue (I don't dig in the 1.8.0 driver) .
> Thanks,
>
> - Mark
>
> _______________________________________________
> ffmpeg-devel mailing list
> [email protected]
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
_______________________________________________
ffmpeg-devel mailing list
[email protected]
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel