msdk: don't use hard-coded video format
authorXiang, Haihao <haihao.xiang@intel.com>
Mon, 19 Nov 2018 07:34:38 +0000 (15:34 +0800)
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Mon, 26 Nov 2018 16:47:17 +0000 (16:47 +0000)
Some codecs may support varied formats, e.g. HEVC may support NV12
and P010_10LE etc

sys/msdk/gstmsdkdec.c
sys/msdk/msdk.c
sys/msdk/msdk.h

index cb81400..4a52999 100644 (file)
@@ -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;
 
index 7180396..28ba199 100644 (file)
@@ -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;
+}
index d56bb3a..a2775a6 100644 (file)
@@ -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__ */