From fda4918cc89350d155f5c6310b3835e465dd136b Mon Sep 17 00:00:00 2001 From: "Xiang, Haihao" Date: Mon, 19 Nov 2018 15:34:38 +0800 Subject: [PATCH] msdk: don't use hard-coded video format Some codecs may support varied formats, e.g. HEVC may support NV12 and P010_10LE etc --- sys/msdk/gstmsdkdec.c | 13 ++++++++++++- sys/msdk/msdk.c | 13 +++++++++++++ sys/msdk/msdk.h | 3 +++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/sys/msdk/gstmsdkdec.c b/sys/msdk/gstmsdkdec.c index cb81400188..4a52999744 100644 --- a/sys/msdk/gstmsdkdec.c +++ b/sys/msdk/gstmsdkdec.c @@ -476,6 +476,7 @@ gst_msdkdec_set_src_caps (GstMsdkDec * thiz, gboolean need_allocation) GstVideoInfo *vinfo; GstVideoAlignment align; GstCaps *allocation_caps = NULL; + GstVideoFormat format; guint width, height; const gchar *format_str; @@ -487,9 +488,19 @@ gst_msdkdec_set_src_caps (GstMsdkDec * thiz, gboolean need_allocation) height = thiz->param.mfx.FrameInfo.CropH ? thiz->param.mfx. FrameInfo.CropH : GST_VIDEO_INFO_HEIGHT (&thiz->input_state->info); + + format = + gst_msdk_get_video_format_from_mfx_fourcc (thiz->param.mfx. + FrameInfo.FourCC); + + if (format == GST_VIDEO_FORMAT_UNKNOWN) { + GST_WARNING_OBJECT (thiz, "Failed to find a valid video format\n"); + return FALSE; + } + output_state = gst_video_decoder_set_output_state (GST_VIDEO_DECODER (thiz), - GST_VIDEO_FORMAT_NV12, width, height, thiz->input_state); + format, width, height, thiz->input_state); if (!output_state) return FALSE; diff --git a/sys/msdk/msdk.c b/sys/msdk/msdk.c index 718039639a..28ba1994f1 100644 --- a/sys/msdk/msdk.c +++ b/sys/msdk/msdk.c @@ -312,3 +312,16 @@ gst_msdk_get_surface_from_buffer (GstBuffer * buf) return NULL; } + +GstVideoFormat +gst_msdk_get_video_format_from_mfx_fourcc (mfxU32 fourcc) +{ + const struct map *m = gst_msdk_video_format_to_mfx_map; + + for (; m->mfx_fourcc != 0; m++) { + if (m->mfx_fourcc == fourcc) + return m->format; + } + + return GST_VIDEO_FORMAT_UNKNOWN; +} diff --git a/sys/msdk/msdk.h b/sys/msdk/msdk.h index d56bb3a814..a2775a65b1 100644 --- a/sys/msdk/msdk.h +++ b/sys/msdk/msdk.h @@ -75,6 +75,9 @@ gst_msdk_is_msdk_buffer (GstBuffer * buf); mfxFrameSurface1 * gst_msdk_get_surface_from_buffer (GstBuffer * buf); +GstVideoFormat +gst_msdk_get_video_format_from_mfx_fourcc (mfxU32 fourcc); + G_END_DECLS #endif /* __MSDK_H__ */