mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 05:16:13 +00:00
msdkenc: clean up code by using switch
It is convenient for us to add support for new formats in future, there is no change in functionality.
This commit is contained in:
parent
0c1c2ce45a
commit
85914997f5
2 changed files with 63 additions and 49 deletions
|
@ -244,6 +244,7 @@ gst_msdkenc_init_encoder (GstMsdkEnc * thiz)
|
||||||
mfxStatus status;
|
mfxStatus status;
|
||||||
mfxFrameAllocRequest request[2];
|
mfxFrameAllocRequest request[2];
|
||||||
guint i;
|
guint i;
|
||||||
|
gboolean need_vpp = TRUE;
|
||||||
|
|
||||||
if (thiz->initialized)
|
if (thiz->initialized)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -266,14 +267,34 @@ gst_msdkenc_init_encoder (GstMsdkEnc * thiz)
|
||||||
if (thiz->use_video_memory)
|
if (thiz->use_video_memory)
|
||||||
gst_msdk_set_frame_allocator (thiz->context);
|
gst_msdk_set_frame_allocator (thiz->context);
|
||||||
|
|
||||||
/* Check 10bit input */
|
switch (GST_VIDEO_INFO_FORMAT (info)) {
|
||||||
if (GST_VIDEO_INFO_COMP_DEPTH (info, 0) == 10) {
|
case GST_VIDEO_FORMAT_NV12:
|
||||||
if (GST_VIDEO_INFO_FORMAT (info) != GST_VIDEO_FORMAT_P010_10LE) {
|
case GST_VIDEO_FORMAT_P010_10LE:
|
||||||
GST_WARNING_OBJECT (thiz,
|
need_vpp = FALSE;
|
||||||
"P010_10LE is the only supported 10bit format\n");
|
break;
|
||||||
goto failed;
|
case GST_VIDEO_FORMAT_YV12:
|
||||||
}
|
case GST_VIDEO_FORMAT_I420:
|
||||||
} else if (GST_VIDEO_INFO_FORMAT (info) != GST_VIDEO_FORMAT_NV12) {
|
thiz->vpp_param.vpp.In.FourCC = MFX_FOURCC_YV12;
|
||||||
|
thiz->vpp_param.vpp.In.ChromaFormat = MFX_CHROMAFORMAT_YUV420;
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_YUY2:
|
||||||
|
thiz->vpp_param.vpp.In.FourCC = MFX_FOURCC_YUY2;
|
||||||
|
thiz->vpp_param.vpp.In.ChromaFormat = MFX_CHROMAFORMAT_YUV422;
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_UYVY:
|
||||||
|
thiz->vpp_param.vpp.In.FourCC = MFX_FOURCC_UYVY;
|
||||||
|
thiz->vpp_param.vpp.In.ChromaFormat = MFX_CHROMAFORMAT_YUV422;
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_BGRA:
|
||||||
|
thiz->vpp_param.vpp.In.FourCC = MFX_FOURCC_RGB4;
|
||||||
|
thiz->vpp_param.vpp.In.ChromaFormat = MFX_CHROMAFORMAT_YUV444;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (need_vpp) {
|
||||||
if (thiz->use_video_memory)
|
if (thiz->use_video_memory)
|
||||||
thiz->vpp_param.IOPattern =
|
thiz->vpp_param.IOPattern =
|
||||||
MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY;
|
MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY;
|
||||||
|
@ -290,36 +311,20 @@ gst_msdkenc_init_encoder (GstMsdkEnc * thiz)
|
||||||
thiz->vpp_param.vpp.In.AspectRatioW = info->par_n;
|
thiz->vpp_param.vpp.In.AspectRatioW = info->par_n;
|
||||||
thiz->vpp_param.vpp.In.AspectRatioH = info->par_d;
|
thiz->vpp_param.vpp.In.AspectRatioH = info->par_d;
|
||||||
thiz->vpp_param.vpp.In.PicStruct = MFX_PICSTRUCT_PROGRESSIVE;
|
thiz->vpp_param.vpp.In.PicStruct = MFX_PICSTRUCT_PROGRESSIVE;
|
||||||
switch (GST_VIDEO_INFO_FORMAT (info)) {
|
|
||||||
case GST_VIDEO_FORMAT_YV12:
|
|
||||||
case GST_VIDEO_FORMAT_I420:
|
|
||||||
thiz->vpp_param.vpp.In.FourCC = MFX_FOURCC_YV12;
|
|
||||||
thiz->vpp_param.vpp.In.ChromaFormat = MFX_CHROMAFORMAT_YUV420;
|
|
||||||
break;
|
|
||||||
case GST_VIDEO_FORMAT_YUY2:
|
|
||||||
thiz->vpp_param.vpp.In.FourCC = MFX_FOURCC_YUY2;
|
|
||||||
thiz->vpp_param.vpp.In.ChromaFormat = MFX_CHROMAFORMAT_YUV422;
|
|
||||||
break;
|
|
||||||
case GST_VIDEO_FORMAT_UYVY:
|
|
||||||
thiz->vpp_param.vpp.In.FourCC = MFX_FOURCC_UYVY;
|
|
||||||
thiz->vpp_param.vpp.In.ChromaFormat = MFX_CHROMAFORMAT_YUV422;
|
|
||||||
break;
|
|
||||||
case GST_VIDEO_FORMAT_BGRA:
|
|
||||||
thiz->vpp_param.vpp.In.FourCC = MFX_FOURCC_RGB4;
|
|
||||||
thiz->vpp_param.vpp.In.ChromaFormat = MFX_CHROMAFORMAT_YUV444;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* work-around to avoid zero fps in msdk structure */
|
/* work-around to avoid zero fps in msdk structure */
|
||||||
if (0 == thiz->vpp_param.vpp.In.FrameRateExtN)
|
if (0 == thiz->vpp_param.vpp.In.FrameRateExtN)
|
||||||
thiz->vpp_param.vpp.In.FrameRateExtN = 30;
|
thiz->vpp_param.vpp.In.FrameRateExtN = 30;
|
||||||
|
|
||||||
thiz->vpp_param.vpp.Out = thiz->vpp_param.vpp.In;
|
thiz->vpp_param.vpp.Out = thiz->vpp_param.vpp.In;
|
||||||
thiz->vpp_param.vpp.Out.FourCC = MFX_FOURCC_NV12;
|
|
||||||
thiz->vpp_param.vpp.Out.ChromaFormat = MFX_CHROMAFORMAT_YUV420;
|
if ((GST_VIDEO_INFO_COMP_DEPTH (info, 0)) == 10) {
|
||||||
|
thiz->vpp_param.vpp.Out.FourCC = MFX_FOURCC_P010;
|
||||||
|
thiz->vpp_param.vpp.Out.ChromaFormat = MFX_CHROMAFORMAT_YUV420;
|
||||||
|
} else {
|
||||||
|
thiz->vpp_param.vpp.Out.FourCC = MFX_FOURCC_NV12;
|
||||||
|
thiz->vpp_param.vpp.Out.ChromaFormat = MFX_CHROMAFORMAT_YUV420;
|
||||||
|
}
|
||||||
|
|
||||||
/* validate parameters and allow the Media SDK to make adjustments */
|
/* validate parameters and allow the Media SDK to make adjustments */
|
||||||
status = MFXVideoVPP_Query (session, &thiz->vpp_param, &thiz->vpp_param);
|
status = MFXVideoVPP_Query (session, &thiz->vpp_param, &thiz->vpp_param);
|
||||||
|
@ -405,15 +410,17 @@ gst_msdkenc_init_encoder (GstMsdkEnc * thiz)
|
||||||
thiz->param.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE;
|
thiz->param.mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE;
|
||||||
thiz->param.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420;
|
thiz->param.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420;
|
||||||
|
|
||||||
if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_P010_10LE) {
|
switch (GST_VIDEO_INFO_FORMAT (info)) {
|
||||||
thiz->param.mfx.FrameInfo.FourCC = MFX_FOURCC_P010;
|
case GST_VIDEO_FORMAT_P010_10LE:
|
||||||
thiz->param.mfx.FrameInfo.BitDepthLuma = 10;
|
thiz->param.mfx.FrameInfo.FourCC = MFX_FOURCC_P010;
|
||||||
thiz->param.mfx.FrameInfo.BitDepthChroma = 10;
|
thiz->param.mfx.FrameInfo.BitDepthLuma = 10;
|
||||||
thiz->param.mfx.FrameInfo.Shift = 1;
|
thiz->param.mfx.FrameInfo.BitDepthChroma = 10;
|
||||||
} else {
|
thiz->param.mfx.FrameInfo.Shift = 1;
|
||||||
thiz->param.mfx.FrameInfo.FourCC = MFX_FOURCC_NV12;
|
break;
|
||||||
thiz->param.mfx.FrameInfo.BitDepthLuma = 8;
|
default:
|
||||||
thiz->param.mfx.FrameInfo.BitDepthChroma = 8;
|
thiz->param.mfx.FrameInfo.FourCC = MFX_FOURCC_NV12;
|
||||||
|
thiz->param.mfx.FrameInfo.BitDepthLuma = 8;
|
||||||
|
thiz->param.mfx.FrameInfo.BitDepthChroma = 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* work-around to avoid zero fps in msdk structure */
|
/* work-around to avoid zero fps in msdk structure */
|
||||||
|
|
|
@ -102,10 +102,13 @@ gst_msdkh265enc_configure (GstMsdkEnc * encoder)
|
||||||
|
|
||||||
encoder->param.mfx.CodecId = MFX_CODEC_HEVC;
|
encoder->param.mfx.CodecId = MFX_CODEC_HEVC;
|
||||||
|
|
||||||
if (encoder->param.mfx.FrameInfo.FourCC == MFX_FOURCC_P010)
|
switch (encoder->param.mfx.FrameInfo.FourCC) {
|
||||||
encoder->param.mfx.CodecProfile = MFX_PROFILE_HEVC_MAIN10;
|
case MFX_FOURCC_P010:
|
||||||
else
|
encoder->param.mfx.CodecProfile = MFX_PROFILE_HEVC_MAIN10;
|
||||||
encoder->param.mfx.CodecProfile = MFX_PROFILE_HEVC_MAIN;
|
break;
|
||||||
|
default:
|
||||||
|
encoder->param.mfx.CodecProfile = MFX_PROFILE_HEVC_MAIN;
|
||||||
|
}
|
||||||
|
|
||||||
/* IdrInterval field of MediaSDK HEVC encoder behaves differently
|
/* IdrInterval field of MediaSDK HEVC encoder behaves differently
|
||||||
* than other encoders. IdrInteval == 1 indicate every
|
* than other encoders. IdrInteval == 1 indicate every
|
||||||
|
@ -175,10 +178,14 @@ gst_msdkh265enc_set_src_caps (GstMsdkEnc * encoder)
|
||||||
|
|
||||||
gst_structure_set (structure, "alignment", G_TYPE_STRING, "au", NULL);
|
gst_structure_set (structure, "alignment", G_TYPE_STRING, "au", NULL);
|
||||||
|
|
||||||
if (encoder->param.mfx.FrameInfo.FourCC == MFX_FOURCC_P010)
|
switch (encoder->param.mfx.FrameInfo.FourCC) {
|
||||||
gst_structure_set (structure, "profile", G_TYPE_STRING, "main-10", NULL);
|
case MFX_FOURCC_P010:
|
||||||
else
|
gst_structure_set (structure, "profile", G_TYPE_STRING, "main-10", NULL);
|
||||||
gst_structure_set (structure, "profile", G_TYPE_STRING, "main", NULL);
|
break;
|
||||||
|
default:
|
||||||
|
gst_structure_set (structure, "profile", G_TYPE_STRING, "main", NULL);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
level = level_to_string (encoder->param.mfx.CodecLevel);
|
level = level_to_string (encoder->param.mfx.CodecLevel);
|
||||||
if (level)
|
if (level)
|
||||||
|
|
Loading…
Reference in a new issue