download: use GstVideoInfo facilities to build output caps.
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>
Sat, 21 Dec 2013 07:27:30 +0000 (08:27 +0100)
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>
Sat, 21 Dec 2013 11:35:24 +0000 (12:35 +0100)
Use standard GstVideoInfo related functions to build the output caps,
thus directly preserving additional fields as needed, instead of
manually copying them over through gst_vaapi_append_surface_caps().

Also ensure that the input caps are fixated first.

gst/vaapi/gstvaapidownload.c

index 9a9a3ca5e20697ec00c05365b5ec0b19a7de2cf8..045a6de343d9dc222e015444bd3d65c7c2878a0c 100644 (file)
@@ -282,6 +282,7 @@ gst_vaapidownload_update_src_caps(GstVaapiDownload *download, GstBuffer *buffer)
     GstVaapiVideoMeta *meta;
     GstVaapiSurface *surface;
     GstVideoFormat format;
+    GstVideoInfo vi;
     GstPad *srcpad;
     GstCaps *in_caps, *out_caps;
 
@@ -297,20 +298,22 @@ gst_vaapidownload_update_src_caps(GstVaapiDownload *download, GstBuffer *buffer)
         return TRUE;
 
     in_caps = GST_BUFFER_CAPS(buffer);
-    if (!in_caps) {
+    if (!in_caps || !gst_caps_is_fixed(in_caps)) {
         GST_WARNING("failed to retrieve caps from buffer");
         return FALSE;
     }
 
-    out_caps = gst_vaapi_video_format_to_caps(download->image_format);
-    if (!out_caps) {
-        GST_WARNING("failed to create caps from format %s",
-                    gst_video_format_to_string(download->image_format));
+    if (!gst_video_info_from_caps(&vi, in_caps)) {
+        GST_WARNING("failed to parse caps %" GST_PTR_FORMAT, in_caps);
         return FALSE;
     }
 
-    if (!gst_vaapi_append_surface_caps(out_caps, in_caps)) {
-        gst_caps_unref(out_caps);
+    gst_video_info_set_format(&vi, download->image_format,
+        GST_VIDEO_INFO_WIDTH(&vi), GST_VIDEO_INFO_HEIGHT(&vi));
+    out_caps = gst_video_info_to_caps(&vi);
+    if (!out_caps) {
+        GST_WARNING("failed to create caps from format %s",
+                    gst_video_format_to_string(download->image_format));
         return FALSE;
     }