videodec: Don't use non-growable pool
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 27 Mar 2014 22:53:53 +0000 (18:53 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 8 May 2014 19:33:39 +0000 (15:33 -0400)
As we don't know how many output buffers we need to operate, we need to
avoid pool that can't grow. Otherwise the pipeline may stall, waiting
for buffers. For now, we require it to be able to grow to at least
32 buffers, which I think is a fair amount of buffers for decoders.

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

ext/libav/gstavviddec.c

index b3ba5c0..5e6bd34 100644 (file)
@@ -47,6 +47,7 @@ GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE);
 #define DEFAULT_DEBUG_MV               FALSE
 #define DEFAULT_MAX_THREADS            0
 #define DEFAULT_OUTPUT_CORRUPT         TRUE
+#define REQUIRED_POOL_MAX_BUFFERS       32
 
 enum
 {
@@ -1693,7 +1694,7 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
   GstBufferPool *pool;
   guint size, min, max;
   GstStructure *config;
-  gboolean have_videometa, have_alignment;
+  gboolean have_videometa, have_alignment, update_pool;
   GstAllocator *allocator = NULL;
   GstAllocationParams params = { 0, 15, 0, 0, };
 
@@ -1712,6 +1713,22 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
 
   gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max);
 
+  /* Don't use pool that can't grow, as we don't know how many buffer we'll
+   * need, otherwise we may stall */
+  if (max != 0 && max < REQUIRED_POOL_MAX_BUFFERS) {
+    gst_object_unref (pool);
+    pool = gst_video_buffer_pool_new ();
+    max = 0;
+    update_pool = TRUE;
+
+    /* if there is an allocator, also drop it, as it might be the reason we
+     * have this limit. Default will be used */
+    if (allocator) {
+      gst_object_unref (allocator);
+      allocator = NULL;
+    }
+  }
+
   config = gst_buffer_pool_get_config (pool);
   gst_buffer_pool_config_set_params (config, state->caps, size, min, max);
   /* we are happy with the default allocator but we would like to have 16 bytes
@@ -1799,6 +1816,9 @@ gst_ffmpegviddec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
   /* and store */
   gst_buffer_pool_set_config (pool, config);
 
+  if (update_pool)
+    gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
+
   gst_object_unref (pool);
   if (allocator)
     gst_object_unref (allocator);