mirror of https://git.ffmpeg.org/ffmpeg.git
qsvenc_{hevc,h264}: add scenario option
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
This commit is contained in:
parent
ae7d19680b
commit
1adfd28f9e
|
@ -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
|
||||
|
@ -3651,6 +3666,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
|
||||
|
|
|
@ -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) {
|
||||
|
@ -923,6 +924,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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -235,6 +235,7 @@ static const AVOption options[] = {
|
|||
QSV_OPTION_MAX_MIN_QP
|
||||
QSV_OPTION_ADAPTIVE_I
|
||||
QSV_OPTION_ADAPTIVE_B
|
||||
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" },
|
||||
|
|
Loading…
Reference in New Issue