summaryrefslogtreecommitdiff
path: root/libavcodec/qsvenc.c
diff options
context:
space:
mode:
authorWenbin Chen <wenbin.chen-at-intel.com@ffmpeg.org>2022-01-17 13:11:21 +0800
committerHaihao Xiang <haihao.xiang@intel.com>2022-01-21 12:56:30 +0800
commit9d6cc6a5448c4464139c87ed05fb9a70ccbc7bac (patch)
tree829159cdd1217814e9eaed3c829cb191b2e141e9 /libavcodec/qsvenc.c
parent812b6ee6bdd1be7172af896088bd9a22eb538823 (diff)
libavcodec/qsvenc: Add low latency P-pyramid support to qsv
Add low latency P-pyramid support to qsv. This feature relates to command line option "-p_strategy". To enable this flag, user also need to set "-bf" to 0. P-strategy has two modes "1-simple" and "2-pyramid". The details of the two models refer to https://github.com/Intel-Media-SDK/MediaSDK/blob/master/doc/mediasdk-man.md#preftype Signed-off-by: Wenbin Chen <wenbin.chen@intel.com> Signed-off-by: Haihao Xiang <haihao.xiang@intel.com>
Diffstat (limited to 'libavcodec/qsvenc.c')
-rw-r--r--libavcodec/qsvenc.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index 99ec8c186c..53aa928200 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -318,6 +318,14 @@ static void dump_video_param(AVCodecContext *avctx, QSVEncContext *q,
case MFX_B_REF_PYRAMID: av_log(avctx, AV_LOG_VERBOSE, "pyramid"); break;
default: av_log(avctx, AV_LOG_VERBOSE, "auto"); break;
}
+
+ av_log(avctx, AV_LOG_VERBOSE, "; PRefType: ");
+ switch (co3->PRefType) {
+ case MFX_P_REF_DEFAULT: av_log(avctx, AV_LOG_VERBOSE, "default"); break;
+ case MFX_P_REF_SIMPLE: av_log(avctx, AV_LOG_VERBOSE, "simple"); break;
+ case MFX_P_REF_PYRAMID: av_log(avctx, AV_LOG_VERBOSE, "pyramid"); break;
+ default: av_log(avctx, AV_LOG_VERBOSE, "unknown"); break;
+ }
av_log(avctx, AV_LOG_VERBOSE, "\n");
#endif
@@ -936,6 +944,34 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q)
#if QSV_HAVE_CO3
q->extco3.Header.BufferId = MFX_EXTBUFF_CODING_OPTION3;
q->extco3.Header.BufferSz = sizeof(q->extco3);
+
+ if (avctx->codec_id == AV_CODEC_ID_HEVC ||
+ avctx->codec_id == AV_CODEC_ID_H264) {
+#if QSV_HAVE_PREF
+ switch (q->p_strategy) {
+ case 0:
+ q->extco3.PRefType = MFX_P_REF_DEFAULT;
+ break;
+ case 1:
+ q->extco3.PRefType = MFX_P_REF_SIMPLE;
+ break;
+ case 2:
+ q->extco3.PRefType = MFX_P_REF_PYRAMID;
+ break;
+ default:
+ q->extco3.PRefType = MFX_P_REF_DEFAULT;
+ av_log(avctx, AV_LOG_WARNING,
+ "invalid p_strategy, set to default\n");
+ break;
+ }
+ if (q->extco3.PRefType == MFX_P_REF_PYRAMID &&
+ avctx->max_b_frames != 0) {
+ av_log(avctx, AV_LOG_WARNING,
+ "Please set max_b_frames(-bf) to 0 to enable P-pyramid\n");
+ }
+#endif
+ }
+
#if QSV_HAVE_GPB
if (avctx->codec_id == AV_CODEC_ID_HEVC)
q->extco3.GPB = q->gpb ? MFX_CODINGOPTION_ON : MFX_CODINGOPTION_OFF;