videorate: Implement allocation query
authorNicolas Dufresne <nicolas.dufresne@collabora.co.uk>
Sun, 18 Jan 2015 16:02:00 +0000 (11:02 -0500)
committerNicolas Dufresne <nicolas.dufresne@collabora.co.uk>
Sun, 18 Jan 2015 16:02:00 +0000 (11:02 -0500)
VideRate keeps 1 buffer in order to duplicate base on closest buffer
relative to targeted time. This extra buffer need to be request
otherwise the pipeline may stall when fixed size buffer pool is used.

https://bugzilla.gnome.org/show_bug.cgi?id=738302

gst/videorate/Makefile.am
gst/videorate/gstvideorate.c

index d950ad9840e6376420670bb2783fb82f67ca6a53..1a5631ed83a915d492b0be2fae81c23e941c6346 100644 (file)
@@ -5,7 +5,8 @@ plugin_LTLIBRARIES = libgstvideorate.la
 libgstvideorate_la_SOURCES = gstvideorate.c
 libgstvideorate_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS)
 libgstvideorate_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstvideorate_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS)
+libgstvideorate_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) \
+       $(top_builddir)/gst-libs/gst/video/libgstvideo-$(GST_API_VERSION).la
 libgstvideorate_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
 
 Android.mk: Makefile.am $(BUILT_SOURCES)
index 6a20258526353e5e569f238b970514c476209c36..f996dc5ca38088c2fed1fd4bbd399a31a6b3354a 100644 (file)
@@ -70,6 +70,7 @@
 #endif
 
 #include "gstvideorate.h"
+#include <gst/video/video.h>
 
 GST_DEBUG_CATEGORY_STATIC (video_rate_debug);
 #define GST_CAT_DEFAULT video_rate_debug
@@ -848,18 +849,48 @@ gst_video_rate_query (GstBaseTransform * trans, GstPadDirection direction,
           gst_query_set_latency (query, live, min, max);
         }
         gst_object_unref (peer);
-        break;
       }
-      /* Simple fallthrough if we don't have a latency or not a peer that we
-       * can't ask about its latency yet.. */
+      break;
+    }
+    case GST_QUERY_ALLOCATION:
+    {
+      guint i, n_allocation;
+
+      n_allocation = gst_query_get_n_allocation_pools (query);
+
+      for (i = 0; i < n_allocation; i++) {
+        GstBufferPool *pool;
+        guint size, min, max;
+
+        gst_query_parse_nth_allocation_pool (query, i, &pool, &size, &min,
+            &max);
+
+        min += 1;
+
+        if (max != 0)
+          max = MAX (min, max);
+
+        gst_query_set_nth_allocation_pool (query, i, pool, size, min, max);
+      }
+
+      if (n_allocation == 0) {
+        GstCaps *caps;
+        GstVideoInfo info;
+
+        gst_query_parse_allocation (query, &caps, NULL);
+        gst_video_info_from_caps (&info, caps);
+
+        gst_query_add_allocation_pool (query, NULL, info.size, 1, 0);
+      }
+      break;
     }
     default:
-      res =
-          GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, direction,
-          query);
       break;
   }
 
+  res =
+      GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, direction, query);
+
   return res;
 }