On Mon, 2022-08-22 at 14:29 +0800, Xiang, Haihao wrote: > From: Haihao Xiang <[email protected]> > > User may get better experience after providing corresponding senario hint > to encoder for the encoding session. See [1] for scenario support in the > SDK > > [1] > https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#scenarioinfo > --- > doc/encoders.texi | 30 ++++++++++++++++++++++++++++++ > libavcodec/qsvenc.c | 3 +++ > libavcodec/qsvenc.h | 14 ++++++++++++++ > libavcodec/qsvenc_h264.c | 1 + > libavcodec/qsvenc_hevc.c | 1 + > 5 files changed, 49 insertions(+) > > diff --git a/doc/encoders.texi b/doc/encoders.texi > index 6d73f74196..1a7e34a272 100644 > --- a/doc/encoders.texi > +++ b/doc/encoders.texi > @@ -3503,6 +3503,21 @@ Maximum video quantizer scale for B frame. > > @item @var{min_qp_b} > Minimum video quantizer scale for B frame. > + > +@item @var{scenario} > +Provides a hint to encoder about the scenario for the encoding session. > +@table @samp > +@item unknown > +@item displayremoting > +@item videoconference > +@item archive > +@item livestreaming > +@item cameracapture > +@item videosurveillance > +@item gamestreaming > +@item remotegaming > +@end table > + > @end table > > @subsection HEVC Options > @@ -3644,6 +3659,21 @@ Maximum video quantizer scale for B frame. > > @item @var{min_qp_b} > Minimum video quantizer scale for B frame. > + > +@item @var{scenario} > +Provides a hint to encoder about the scenario for the encoding session. > +@table @samp > +@item unknown > +@item displayremoting > +@item videoconference > +@item archive > +@item livestreaming > +@item cameracapture > +@item videosurveillance > +@item gamestreaming > +@item remotegaming > +@end table > + > @end table > > @subsection MPEG2 Options > diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c > index 4831640868..fc9a59c483 100644 > --- a/libavcodec/qsvenc.c > +++ b/libavcodec/qsvenc.c > @@ -337,6 +337,7 @@ static void dump_video_param(AVCodecContext *avctx, > QSVEncContext *q, > av_log(avctx, AV_LOG_VERBOSE, "LowDelayBRC: %s\n", > print_threestate(co3->LowDelayBRC)); > av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSizeI: %d; ", co3- > >MaxFrameSizeI); > av_log(avctx, AV_LOG_VERBOSE, "MaxFrameSizeP: %d\n", co3- > >MaxFrameSizeP); > + av_log(avctx, AV_LOG_VERBOSE, "ScenarioInfo: %"PRId16"\n", co3- > >ScenarioInfo); > } > > if (exthevctiles) { > @@ -924,6 +925,8 @@ static int init_video_param(AVCodecContext *avctx, > QSVEncContext *q) > q->extco3.MaxFrameSizeI = q->max_frame_size_i; > if (q->max_frame_size_p >= 0) > q->extco3.MaxFrameSizeP = q->max_frame_size_p; > + > + q->extco3.ScenarioInfo = q->scenario; > } > > if (avctx->codec_id == AV_CODEC_ID_HEVC) { > diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h > index d35a1318f2..a983651dda 100644 > --- a/libavcodec/qsvenc.h > +++ b/libavcodec/qsvenc.h > @@ -111,6 +111,19 @@ > { "max_qp_b", "Maximum video quantizer scale for B > frame", OFFSET(qsv.max_qp_b), AV_OPT_TYPE_INT, { .i64 = -1 }, - > 1, 51, VE}, \ > { "min_qp_b", "Minimum video quantizer scale for B > frame", OFFSET(qsv.min_qp_b), AV_OPT_TYPE_INT, { .i64 = -1 }, - > 1, 51, VE}, > > +#define QSV_OPTION_SCENARIO \ > +{ "scenario", "A hint to encoder about the scenario for the encoding > session", OFFSET(qsv.scenario), AV_OPT_TYPE_INT, { .i64 = MFX_SCENARIO_UNKNOWN > }, \ > + MFX_SCENARIO_UNKNOWN, MFX_SCENARIO_REMOTE_GAMING, VE, "scenario" }, \ > +{ "unknown", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = > MFX_SCENARIO_UNKNOWN }, .flags = VE, "scenario" > }, \ > +{ "displayremoting", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = > MFX_SCENARIO_DISPLAY_REMOTING }, .flags = VE, "scenario" > }, \ > +{ "videoconference", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = > MFX_SCENARIO_VIDEO_CONFERENCE }, .flags = VE, "scenario" > }, \ > +{ "archive", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = > MFX_SCENARIO_ARCHIVE }, .flags = VE, "scenario" > }, \ > +{ "livestreaming", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = > MFX_SCENARIO_LIVE_STREAMING }, .flags = VE, "scenario" > }, \ > +{ "cameracapture", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = > MFX_SCENARIO_CAMERA_CAPTURE }, .flags = VE, "scenario" > }, \ > +{ "videosurveillance", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = > MFX_SCENARIO_VIDEO_SURVEILLANCE }, .flags = VE, "scenario" > }, \ > +{ "gamestreaming", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = > MFX_SCENARIO_GAME_STREAMING }, .flags = VE, "scenario" > }, \ > +{ "remotegaming", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = > MFX_SCENARIO_REMOTE_GAMING }, .flags = VE, "scenario" }, > + > extern const AVCodecHWConfigInternal *const ff_qsv_enc_hw_configs[]; > > typedef int SetEncodeCtrlCB (AVCodecContext *avctx, > @@ -179,6 +192,7 @@ typedef struct QSVEncContext { > int max_frame_size_p; > int max_slice_size; > int dblk_idc; > + int scenario; > > int tile_cols; > int tile_rows; > diff --git a/libavcodec/qsvenc_h264.c b/libavcodec/qsvenc_h264.c > index ad9cf629df..a0dc31e24a 100644 > --- a/libavcodec/qsvenc_h264.c > +++ b/libavcodec/qsvenc_h264.c > @@ -114,6 +114,7 @@ static const AVOption options[] = { > QSV_OPTION_DBLK_IDC > QSV_OPTION_LOW_DELAY_BRC > QSV_OPTION_MAX_MIN_QP > + QSV_OPTION_SCENARIO > > { "cavlc", "Enable > CAVLC", OFFSET(qsv.cavlc), AV_OPT_TYPE_BOOL > , { .i64 = 0 }, 0, 1, VE }, > #if QSV_HAVE_VCM > diff --git a/libavcodec/qsvenc_hevc.c b/libavcodec/qsvenc_hevc.c > index e11f5dec4a..a46df18a09 100644 > --- a/libavcodec/qsvenc_hevc.c > +++ b/libavcodec/qsvenc_hevc.c > @@ -233,6 +233,7 @@ static const AVOption options[] = { > QSV_OPTION_DBLK_IDC > QSV_OPTION_LOW_DELAY_BRC > QSV_OPTION_MAX_MIN_QP > + QSV_OPTION_SCENARIO > > { "idr_interval", "Distance (in I-frames) between IDR frames", > OFFSET(qsv.idr_interval), AV_OPT_TYPE_INT, { .i64 = 0 }, -1, INT_MAX, VE, > "idr_interval" }, > { "begin_only", "Output an IDR-frame only at the beginning of the > stream", 0, AV_OPT_TYPE_CONST, { .i64 = -1 }, 0, 0, VE, "idr_interval" },
Applied, thx -Haihao _______________________________________________ ffmpeg-devel mailing list [email protected] https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email [email protected] with subject "unsubscribe".
