videodecoder: Retry setting configuration with modified config
authorNicolas Dufresne <nicolas.dufresne@collabora.com>
Tue, 15 Apr 2014 18:51:46 +0000 (14:51 -0400)
committerNicolas Dufresne <nicolas.dufresne@collabora.com>
Thu, 8 May 2014 19:09:47 +0000 (15:09 -0400)
Buffer pool set_config() may return FALSE if requested configuration needed small
changes. Reget the config and try setting it again. This ensure we have a configured
pool if possible.

gst-libs/gst/video/gstvideodecoder.c

index fce2ea7..eb2d5a1 100644 (file)
@@ -3169,7 +3169,24 @@ gst_video_decoder_decide_allocation_default (GstVideoDecoder * decoder,
   config = gst_buffer_pool_get_config (pool);
   gst_buffer_pool_config_set_params (config, outcaps, size, min, max);
   gst_buffer_pool_config_set_allocator (config, allocator, &params);
-  gst_buffer_pool_set_config (pool, config);
+
+  if (!gst_buffer_pool_set_config (pool, config)) {
+    config = gst_buffer_pool_get_config (pool);
+
+    /* If change are not acceptable, fallback to generic pool */
+    if (!gst_buffer_pool_config_validate_params (config, outcaps, size, min,
+            max)) {
+      GST_DEBUG_OBJECT (decoder, "unsuported pool, making new pool");
+
+      gst_object_unref (pool);
+      pool = gst_video_buffer_pool_new ();
+      gst_buffer_pool_config_set_params (config, outcaps, size, min, max);
+      gst_buffer_pool_config_set_allocator (config, allocator, &params);
+    }
+
+    if (!gst_buffer_pool_set_config (pool, config))
+      goto config_failed;
+  }
 
   if (update_allocator)
     gst_query_set_nth_allocation_param (query, 0, allocator, &params);
@@ -3187,6 +3204,12 @@ gst_video_decoder_decide_allocation_default (GstVideoDecoder * decoder,
     gst_object_unref (pool);
 
   return TRUE;
+
+config_failed:
+  GST_ELEMENT_ERROR (decoder, RESOURCE, SETTINGS,
+      ("Failed to configure the buffer pool"),
+      ("Configuration is most likely invalid, please report this issue."));
+  return FALSE;
 }
 
 static gboolean