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) . > Thanks, > > - Mark > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel