On 14/04/17 02:01, Jun Zhao wrote:
> 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 <jun.z...@intel.com>
>>> 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 <jun.z...@intel.com>
>>
>> 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) .

Try encoding video of a solid colour:

ffmpeg -y -vaapi_device /dev/dri/renderD128 -f lavfi -i color=s=1280x720:r=30 
-vf format=nv12,hwupload -c:v h264_vaapi -b 1M -maxrate 1M out.h264

I get output packets that are about 1600 bits each after the initial few.  With 
cbr_flag set the HSS must add 1000000 bits to the CPB every second, but we are 
only removing 30 packets totalling about 30*1600 = 48000 bits in that same 
time.  Hence it will always overflow after not very long.
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to