On 2016/12/15 7:02, Mark Thompson wrote: > On 14/12/16 01:55, Jun Zhao wrote: >> From 03030392ec2458679cdfb14802b80cbb196eae40 Mon Sep 17 00:00:00 2001 >> From: Yi A Wang <yi.a.w...@intel.com> >> Date: Tue, 13 Dec 2016 10:50:54 +0800 >> Subject: [PATCH] lavc/vaapi_encode_h264: add option to indicate the h264 >> encode profile >> >> add h264 encode profile option and update the docs, for avc >> constrained baseline, disable B frames base on H.264 spec Annex A.2.1 >> >> Signed-off-by: Jun Zhao <jun.z...@intel.com> >> Signed-off-by: Yi A Wang <yi.a.w...@intel.com> >> --- >> doc/codecs.texi | 8 ++++++++ >> libavcodec/options_table.h | 5 ++++- >> libavcodec/vaapi_encode_h264.c | 5 +++++ >> 3 files changed, 17 insertions(+), 1 deletion(-) > > Notwithstanding the below, this should probably be two patches (one for > options/docs, one for VAAPI). > > >> diff --git a/doc/codecs.texi b/doc/codecs.texi >> index 9a3a56d..9ee9061 100644 >> --- a/doc/codecs.texi >> +++ b/doc/codecs.texi >> @@ -893,6 +893,14 @@ Possible values: >> >> @item dts_hd_ma >> >> +@item hevc_main10 >> + >> +@item h264_constrained_baseline >> + >> +@item h264_main >> + >> +@item h264_high >> + >> @end table >> >> @item level @var{integer} (@emph{encoding,audio,video}) >> diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h >> index 3fe7925..94b2d9b 100644 >> --- a/libavcodec/options_table.h >> +++ b/libavcodec/options_table.h >> @@ -395,7 +395,10 @@ static const AVOption avcodec_options[] = { >> {"mpeg4_core", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_PROFILE_MPEG4_CORE }, >> INT_MIN, INT_MAX, V|E, "profile"}, >> {"mpeg4_main", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_PROFILE_MPEG4_MAIN }, >> INT_MIN, INT_MAX, V|E, "profile"}, >> {"mpeg4_asp", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = >> FF_PROFILE_MPEG4_ADVANCED_SIMPLE }, INT_MIN, INT_MAX, V|E, "profile"}, >> -{"main10", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_PROFILE_HEVC_MAIN_10 }, >> INT_MIN, INT_MAX, V|E, "profile"}, > > This table is part of the public API of libavcodec, you can't remove things > from it like this. > >> +{"hevc_main10", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = >> FF_PROFILE_HEVC_MAIN_10 }, INT_MIN, INT_MAX, V|E, "profile"}, >> +{"h264_constrained_baseline", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = >> FF_PROFILE_H264_CONSTRAINED_BASELINE}, INT_MIN, INT_MAX, V|E, "profile"}, >> +{"h264_main", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_PROFILE_H264_MAIN}, >> INT_MIN, INT_MAX, V|E, "profile"}, >> +{"h264_high", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_PROFILE_H264_HIGH}, >> INT_MIN, INT_MAX, V|E, "profile"}, > > This seems reasonable, but I'd like to hear from other people why there is > only a small subset of video profiles there already? Confusingly, the > libx264, nvenc and videotoolbox encoders all have private options (also > called "profile") which implement exactly the same thing where they could be > using the generic one (were it to support suitable options). > > If the change is desirable, it should probably get the full set of profiles > corresponding to FF_PROFILE_H264_* values rather than just a restricted set > coming from what VAAPI exposes. (Also deprecate the anomalous "main10" and > add the H.265 profiles properly as well, I guess?) > Will move to private options, tks. > >> {"level", NULL, OFFSET(level), AV_OPT_TYPE_INT, {.i64 = FF_LEVEL_UNKNOWN }, >> INT_MIN, INT_MAX, V|A|E, "level"}, >> {"unknown", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = FF_LEVEL_UNKNOWN }, >> INT_MIN, INT_MAX, V|A|E, "level"}, >> {"lowres", "decode at 1= 1/2, 2=1/4, 3=1/8 resolutions", OFFSET(lowres), >> AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, V|A|D}, >> diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c >> index 69cc483..5f37770 100644 >> --- a/libavcodec/vaapi_encode_h264.c >> +++ b/libavcodec/vaapi_encode_h264.c >> @@ -1190,6 +1190,11 @@ static av_cold int >> vaapi_encode_h264_init(AVCodecContext *avctx) >> switch (avctx->profile) { >> case FF_PROFILE_H264_CONSTRAINED_BASELINE: >> ctx->va_profile = VAProfileH264ConstrainedBaseline; >> + if (avctx->max_b_frames != 0) { >> + avctx->max_b_frames = 0; >> + av_log(avctx, AV_LOG_WARNING, "H.264 constrained baseline " >> + "profile don't support encode B frame.\n"); > > ..." doesn't support encoding B frames.\n", maybe > >> + } > > I guess this makes sense. It's not really a bitstream restriction, though, > only a conformance one - you can perfectly well make a usable stream with > profile_idc 66 which contains B frames (though only decodable with an > extended or main profile decoder), and indeed the i965 encoder is happy to do > so. Should that matter? > I hope I can give a user case for disable B frame in ConstrainedBaseline/Baseline: for example, in video conference, user used the ConstrainedBaseline/Baseline profile without B frame to reduce the encode/decode latency.
For i965 can decode the stream with profile_idc 66 which contains B frame, I think the root cause is the i965 driver used the loose check for this type case. :) >> break; >> case FF_PROFILE_H264_BASELINE: >> ctx->va_profile = VAProfileH264Baseline; > > In any case, the restriction applies to baseline profile as well as > constrained baseline. Agree > > 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