Message ID | 20220822062918.9675-1-haihao.xiang@intel.com |
---|---|
State | New |
Headers | show |
Series | [FFmpeg-devel,v2] qsvenc_{hevc,h264}: add scenario option | expand |
Context | Check | Description |
---|---|---|
yinshiyou/make_loongarch64 | success | Make finished |
yinshiyou/make_fate_loongarch64 | success | Make fate finished |
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
On Mon, 2022-08-22 at 14:29 +0800, Xiang, Haihao wrote: > From: Haihao Xiang <haihao.xiang@intel.com> > > 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
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" },
From: Haihao Xiang <haihao.xiang@intel.com> 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(+)