summaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorZhong Li <zhongli_dev@126.com>2019-10-26 22:18:31 +0800
committerZhong Li <zhongli_dev@126.com>2019-11-03 16:45:35 +0800
commit33583803e107b6d532def0f9d949364b01b6ad5a (patch)
tree5c64d79eff6ad3d2fe35ef89cd5e269f6aae91a1 /libavcodec
parente786e37326d4274c1dfbc37a6478680684c779c9 (diff)
downloadffmpeg-streaming-33583803e107b6d532def0f9d949364b01b6ad5a.zip
ffmpeg-streaming-33583803e107b6d532def0f9d949364b01b6ad5a.tar.gz
lavc/qsvenc: enable vp9 encoder
1. must enable low_power mode since just VDENC can be supported by iHD driver right now 2. Coding option1 and extra_data are not supported by MSDK 3. IVF header will be inserted in MSDK by default, but it is not needed for FFmpeg, so disable it. Signed-off-by: Zhong Li <zhongli_dev@126.com>
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/Makefile1
-rw-r--r--libavcodec/allcodecs.c1
-rw-r--r--libavcodec/qsvenc.c62
-rw-r--r--libavcodec/qsvenc.h6
4 files changed, 69 insertions, 1 deletions
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 34c3a22..2b6fbbc 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -685,6 +685,7 @@ OBJS-$(CONFIG_VP9_CUVID_DECODER) += cuviddec.o
OBJS-$(CONFIG_VP9_MEDIACODEC_DECODER) += mediacodecdec.o
OBJS-$(CONFIG_VP9_RKMPP_DECODER) += rkmppdec.o
OBJS-$(CONFIG_VP9_VAAPI_ENCODER) += vaapi_encode_vp9.o
+OBJS-$(CONFIG_VP9_QSV_ENCODER) += qsvenc_vp9.o
OBJS-$(CONFIG_VPLAYER_DECODER) += textdec.o ass.o
OBJS-$(CONFIG_VP9_V4L2M2M_DECODER) += v4l2_m2m_dec.o
OBJS-$(CONFIG_VQA_DECODER) += vqavideo.o
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 41f6801..23a778e 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -784,6 +784,7 @@ extern AVCodec ff_vp9_cuvid_decoder;
extern AVCodec ff_vp9_mediacodec_decoder;
extern AVCodec ff_vp9_qsv_decoder;
extern AVCodec ff_vp9_vaapi_encoder;
+extern AVCodec ff_vp9_qsv_encoder;
// The iterate API is not usable with ossfuzz due to the excessive size of binaries created
#if CONFIG_OSSFUZZ
diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c
index dcff778..93d49ba 100644
--- a/libavcodec/qsvenc.c
+++ b/libavcodec/qsvenc.c
@@ -637,7 +637,8 @@ static int init_video_param(AVCodecContext *avctx, QSVEncContext *q)
// The HEVC encoder plugin currently fails with some old libmfx version if coding options
// are provided. Can't find the extract libmfx version which fixed it, just enable it from
// V1.28 in order to keep compatibility security.
- if ((avctx->codec_id != AV_CODEC_ID_HEVC) || QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 28)) {
+ if (((avctx->codec_id != AV_CODEC_ID_HEVC) || QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 28))
+ && (avctx->codec_id != AV_CODEC_ID_VP9)) {
q->extco.Header.BufferId = MFX_EXTBUFF_CODING_OPTION;
q->extco.Header.BufferSz = sizeof(q->extco);
@@ -761,6 +762,15 @@ FF_ENABLE_DEPRECATION_WARNINGS
#endif
}
+#if QSV_HAVE_EXT_VP9_PARAM
+ if (avctx->codec_id == AV_CODEC_ID_VP9) {
+ q->extvp9param.Header.BufferId = MFX_EXTBUFF_VP9_PARAM;
+ q->extvp9param.Header.BufferSz = sizeof(q->extvp9param);
+ q->extvp9param.WriteIVFHeaders = MFX_CODINGOPTION_OFF;
+ q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extvp9param;
+ }
+#endif
+
if (!check_enc_param(avctx,q)) {
av_log(avctx, AV_LOG_ERROR,
"some encoding parameters are not supported by the QSV "
@@ -789,6 +799,53 @@ static int qsv_retrieve_enc_jpeg_params(AVCodecContext *avctx, QSVEncContext *q)
return 0;
}
+static int qsv_retrieve_enc_vp9_params(AVCodecContext *avctx, QSVEncContext *q)
+{
+ int ret = 0;
+#if QSV_HAVE_EXT_VP9_PARAM
+ mfxExtVP9Param vp9_extend_buf = {
+ .Header.BufferId = MFX_EXTBUFF_VP9_PARAM,
+ .Header.BufferSz = sizeof(vp9_extend_buf),
+ };
+#endif
+
+#if QSV_HAVE_CO2
+ mfxExtCodingOption2 co2 = {
+ .Header.BufferId = MFX_EXTBUFF_CODING_OPTION2,
+ .Header.BufferSz = sizeof(co2),
+ };
+#endif
+
+#if QSV_HAVE_CO3
+ mfxExtCodingOption3 co3 = {
+ .Header.BufferId = MFX_EXTBUFF_CODING_OPTION3,
+ .Header.BufferSz = sizeof(co3),
+ };
+#endif
+
+ mfxExtBuffer *ext_buffers[] = {
+ (mfxExtBuffer*)&vp9_extend_buf,
+#if QSV_HAVE_CO2
+ (mfxExtBuffer*)&co2,
+#endif
+#if QSV_HAVE_CO3
+ (mfxExtBuffer*)&co3,
+#endif
+ };
+
+ q->param.ExtParam = ext_buffers;
+ q->param.NumExtParam = FF_ARRAY_ELEMS(ext_buffers);
+
+ ret = MFXVideoENCODE_GetVideoParam(q->session, &q->param);
+ if (ret < 0)
+ return ff_qsv_print_error(avctx, ret,
+ "Error calling GetVideoParam");
+
+ q->packet_size = q->param.mfx.BufferSizeInKB * q->param.mfx.BRCParamMultiplier * 1000;
+
+ return 0;
+}
+
static int qsv_retrieve_enc_params(AVCodecContext *avctx, QSVEncContext *q)
{
AVCPBProperties *cpb_props;
@@ -1112,6 +1169,9 @@ int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q)
case AV_CODEC_ID_MJPEG:
ret = qsv_retrieve_enc_jpeg_params(avctx, q);
break;
+ case AV_CODEC_ID_VP9:
+ ret = qsv_retrieve_enc_vp9_params(avctx, q);
+ break;
default:
ret = qsv_retrieve_enc_params(avctx, q);
break;
diff --git a/libavcodec/qsvenc.h b/libavcodec/qsvenc.h
index ec8b541..a3e9357 100644
--- a/libavcodec/qsvenc.h
+++ b/libavcodec/qsvenc.h
@@ -38,6 +38,8 @@
#define QSV_HAVE_CO3 QSV_VERSION_ATLEAST(1, 11)
#define QSV_HAVE_CO_VPS QSV_VERSION_ATLEAST(1, 17)
+#define QSV_HAVE_EXT_VP9_PARAM QSV_VERSION_ATLEAST(1, 26)
+
#define QSV_HAVE_TRELLIS QSV_VERSION_ATLEAST(1, 8)
#define QSV_HAVE_MAX_SLICE_SIZE QSV_VERSION_ATLEAST(1, 9)
#define QSV_HAVE_BREF_TYPE QSV_VERSION_ATLEAST(1, 8)
@@ -122,6 +124,10 @@ typedef struct QSVEncContext {
mfxExtMultiFrameParam extmfp;
mfxExtMultiFrameControl extmfc;
#endif
+#if QSV_HAVE_EXT_VP9_PARAM
+ mfxExtVP9Param extvp9param;
+#endif
+
mfxExtOpaqueSurfaceAlloc opaque_alloc;
mfxFrameSurface1 **opaque_surfaces;
AVBufferRef *opaque_alloc_buf;
OpenPOWER on IntegriCloud