plugins: remove last negotiated video info if caps are same
authorU. Artie Eoff <ullysses.a.eoff@intel.com>
Tue, 11 Jun 2019 03:46:30 +0000 (20:46 -0700)
committerU. Artie Eoff <ullysses.a.eoff@intel.com>
Tue, 11 Jun 2019 04:28:13 +0000 (21:28 -0700)
If the allocation caps and negotiated caps are the same,
then ensure any previously negotiated video info is also
removed.  This can occur when multi-resolution video
decoding returns to it's original resolution.

Fixes #170

gst/vaapi/gstvaapipluginbase.c

index c7c929e..1753ad0 100644 (file)
@@ -532,7 +532,6 @@ static gboolean
 ensure_srcpad_allocator (GstVaapiPluginBase * plugin, GstVideoInfo * vinfo,
     GstCaps * caps)
 {
-  gboolean different_caps;
   const GstVideoInfo *image_info;
 
   if (!reset_allocator (plugin->srcpad_allocator, vinfo))
@@ -576,30 +575,37 @@ valid_allocator:
   /* update the size with the one generated by the allocator */
   GST_VIDEO_INFO_SIZE (vinfo) = GST_VIDEO_INFO_SIZE (image_info);
 
-  /* the received caps are the "allocation caps" which may be
-   * different from the "negotiation caps". In this case, we should
-   * indicate the allocator to store the negotiation caps since they
-   * are the one should be used for frame mapping with GstVideoMeta */
-  different_caps = GST_IS_VIDEO_DECODER (plugin) && plugin->srcpad_caps &&
-      !gst_caps_is_strictly_equal (plugin->srcpad_caps, caps);
-
-  if (different_caps) {
-    guint i;
-    GstVideoInfo vi = plugin->srcpad_info;
-
-    /* update the planes and the size with the allocator image/surface
-     * info, but not the resolution */
-    for (i = 0; i < GST_VIDEO_INFO_N_PLANES (image_info); i++) {
-      GST_VIDEO_INFO_PLANE_OFFSET (&vi, i) =
-          GST_VIDEO_INFO_PLANE_OFFSET (image_info, i);
-      GST_VIDEO_INFO_PLANE_STRIDE (&vi, i) =
-          GST_VIDEO_INFO_PLANE_STRIDE (image_info, i);
+  if (GST_IS_VIDEO_DECODER (plugin)) {
+    /* the received caps are the "allocation caps" which may be
+     * different from the "negotiation caps". In this case, we should
+     * indicate the allocator to store the negotiation caps since they
+     * are the one should be used for frame mapping with GstVideoMeta */
+    gboolean different_caps = plugin->srcpad_caps &&
+        !gst_caps_is_strictly_equal (plugin->srcpad_caps, caps);
+    const GstVideoInfo *previous_negotiated =
+        gst_allocator_get_vaapi_negotiated_video_info
+        (plugin->srcpad_allocator);
+
+    if (different_caps) {
+      guint i;
+      GstVideoInfo vi = plugin->srcpad_info;
+
+      /* update the planes and the size with the allocator image/surface
+       * info, but not the resolution */
+      for (i = 0; i < GST_VIDEO_INFO_N_PLANES (image_info); i++) {
+        GST_VIDEO_INFO_PLANE_OFFSET (&vi, i) =
+            GST_VIDEO_INFO_PLANE_OFFSET (image_info, i);
+        GST_VIDEO_INFO_PLANE_STRIDE (&vi, i) =
+            GST_VIDEO_INFO_PLANE_STRIDE (image_info, i);
+      }
+      GST_VIDEO_INFO_SIZE (&vi) = GST_VIDEO_INFO_SIZE (image_info);
+      gst_allocator_set_vaapi_negotiated_video_info (plugin->srcpad_allocator,
+          &vi);
+    } else if (previous_negotiated) {
+      gst_allocator_set_vaapi_negotiated_video_info (plugin->srcpad_allocator,
+          NULL);
     }
-    GST_VIDEO_INFO_SIZE (&vi) = GST_VIDEO_INFO_SIZE (image_info);
-    gst_allocator_set_vaapi_negotiated_video_info (plugin->srcpad_allocator,
-        &vi);
   }
-
   return TRUE;
 
   /* ERRORS */