take padding into account
authorWim Taymans <wim.taymans@collabora.co.uk>
Wed, 14 Mar 2012 18:52:03 +0000 (19:52 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Wed, 14 Mar 2012 18:56:51 +0000 (19:56 +0100)
ext/libvisual/visual.c
ext/theora/gsttheoradec.c
gst-libs/gst/video/gstvideofilter.c
gst-libs/gst/video/gstvideopool.c
gst/videotestsrc/gstvideotestsrc.c
sys/ximage/ximagepool.c
sys/ximage/ximagesink.c
sys/xvimage/xvimagepool.c
sys/xvimage/xvimagesink.c

index 6cc0d64..29e85ff 100644 (file)
@@ -422,7 +422,7 @@ gst_vis_src_negotiate (GstVisual * visual)
   GstCaps *caps;
   GstQuery *query;
   GstBufferPool *pool = NULL;
-  guint size, min, max, prefix, alignment;
+  guint size, min, max, prefix, padding, alignment;
 
   caps = gst_pad_query_caps (visual->srcpad, NULL);
 
@@ -464,11 +464,12 @@ gst_vis_src_negotiate (GstVisual * visual)
   if (gst_pad_peer_query (visual->srcpad, query)) {
     /* we got configuration from our peer, parse them */
     gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
-        &alignment, &pool);
+        &padding, &alignment, &pool);
   } else {
     size = visual->outsize;
     min = max = 0;
     prefix = 0;
+    padding = 0;
     alignment = 0;
   }
 
@@ -480,7 +481,7 @@ gst_vis_src_negotiate (GstVisual * visual)
 
     config = gst_buffer_pool_get_config (pool);
     gst_buffer_pool_config_set (config, target, size, min, max, prefix,
-        alignment);
+        padding, alignment);
     gst_buffer_pool_set_config (pool, config);
   }
 
index 4baee38..358c6b4 100644 (file)
@@ -773,7 +773,7 @@ theora_negotiate (GstTheoraDec * dec)
   GstVideoFormat format;
   GstQuery *query;
   GstBufferPool *pool;
-  guint size, min, max, prefix, alignment;
+  guint size, min, max, prefix, padding, alignment;
   GstStructure *config;
   GstCaps *caps;
   GstVideoInfo info, cinfo;
@@ -879,7 +879,7 @@ theora_negotiate (GstTheoraDec * dec)
     GST_DEBUG_OBJECT (dec, "got downstream ALLOCATION hints");
     /* we got configuration from our peer, parse them */
     gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
-        &alignment, &pool);
+        &padding, &alignment, &pool);
 
     /* check if downstream supports cropping */
     dec->has_cropping =
@@ -889,6 +889,7 @@ theora_negotiate (GstTheoraDec * dec)
     size = 0;
     min = max = 0;
     prefix = 0;
+    padding = 0;
     alignment = 0;
     pool = NULL;
     dec->has_cropping = FALSE;
@@ -917,7 +918,8 @@ theora_negotiate (GstTheoraDec * dec)
   size = MAX (size, GST_VIDEO_INFO_SIZE (&dec->vinfo));
 
   config = gst_buffer_pool_get_config (pool);
-  gst_buffer_pool_config_set (config, caps, size, min, max, prefix, alignment);
+  gst_buffer_pool_config_set (config, caps, size, min, max, prefix, padding,
+      alignment);
   gst_caps_unref (caps);
 
   /* just set the option, if the pool can support it we will transparently use
index ec4e692..706ac22 100644 (file)
@@ -86,13 +86,13 @@ gst_video_filter_propose_allocation (GstBaseTransform * trans,
     pool = gst_video_buffer_pool_new ();
 
     structure = gst_buffer_pool_get_config (pool);
-    gst_buffer_pool_config_set (structure, caps, size, 0, 0, 0, 15);
+    gst_buffer_pool_config_set (structure, caps, size, 0, 0, 0, 0, 15);
     if (!gst_buffer_pool_set_config (pool, structure))
       goto config_failed;
   } else
     pool = NULL;
 
-  gst_query_set_allocation_params (query, size, 0, 0, 0, 15, pool);
+  gst_query_set_allocation_params (query, size, 0, 0, 0, 0, 15, pool);
   gst_object_unref (pool);
 
   gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE);
@@ -114,10 +114,10 @@ static gboolean
 gst_video_filter_decide_allocation (GstBaseTransform * trans, GstQuery * query)
 {
   GstBufferPool *pool = NULL;
-  guint size, min, max, prefix, alignment;
+  guint size, min, max, prefix, padding, alignment;
 
   gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
-      &alignment, &pool);
+      &padding, &alignment, &pool);
 
   if (pool) {
     GstStructure *config;
index 91d07eb..d26d72d 100644 (file)
@@ -145,6 +145,7 @@ struct _GstVideoBufferPoolPrivate
   gboolean add_videometa;
   gboolean need_alignment;
   guint prefix;
+  guint padding;
   guint align;
 };
 
@@ -173,10 +174,10 @@ video_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
   GstVideoInfo info;
   const GstCaps *caps;
   gint width, height;
-  guint prefix, align;
+  guint prefix, padding, align;
 
   if (!gst_buffer_pool_config_get (config, &caps, NULL, NULL, NULL, &prefix,
-          &align))
+          &padding, &align))
     goto wrong_config;
 
   if (caps == NULL)
@@ -195,6 +196,7 @@ video_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
     gst_caps_unref (priv->caps);
   priv->caps = gst_caps_copy (caps);
   priv->prefix = prefix;
+  priv->padding = padding;
   priv->align = align;
 
   /* enable metadata based on config of the pool */
@@ -242,19 +244,20 @@ video_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer,
   GstVideoBufferPoolPrivate *priv = vpool->priv;
   GstVideoInfo *info;
   GstMemory *mem;
+  gint maxsize;
 
   info = &priv->info;
 
   GST_DEBUG_OBJECT (pool, "alloc %" G_GSIZE_FORMAT, info->size);
 
-  mem =
-      gst_allocator_alloc (priv->allocator, info->size + priv->prefix,
-      priv->align);
+  maxsize = info->size + priv->prefix + priv->padding;
+  mem = gst_allocator_alloc (priv->allocator, maxsize, priv->align);
   if (mem == NULL)
     goto no_memory;
 
   *buffer = gst_buffer_new ();
-  gst_memory_resize (mem, priv->prefix, info->size);
+  if (priv->prefix != 0 || priv->padding != 0)
+    gst_memory_resize (mem, priv->prefix, info->size);
   gst_buffer_take_memory (*buffer, -1, mem);
 
   if (priv->add_videometa) {
index de83957..72b21b6 100644 (file)
@@ -611,12 +611,12 @@ gst_video_test_src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
 {
   GstVideoTestSrc *videotestsrc;
   GstBufferPool *pool;
-  guint size, min, max, prefix, alignment;
+  guint size, min, max, prefix, padding, alignment;
 
   videotestsrc = GST_VIDEO_TEST_SRC (bsrc);
 
   gst_query_parse_allocation_params (query, &size, &min, &max, &prefix,
-      &alignment, &pool);
+      &padding, &alignment, &pool);
   /* adjust size */
   size = MAX (size, videotestsrc->info.size);
 
@@ -629,7 +629,7 @@ gst_video_test_src_decide_allocation (GstBaseSrc * bsrc, GstQuery * query)
     gst_buffer_pool_set_config (pool, config);
   }
   gst_query_set_allocation_params (query, size, min, max, prefix,
-      alignment, pool);
+      padding, alignment, pool);
 
   if (pool)
     gst_object_unref (pool);
index 02c47a5..4c3f593 100644 (file)
@@ -483,7 +483,8 @@ ximage_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
   GstVideoInfo info;
   const GstCaps *caps;
 
-  if (!gst_buffer_pool_config_get (config, &caps, NULL, NULL, NULL, NULL, NULL))
+  if (!gst_buffer_pool_config_get (config, &caps, NULL, NULL, NULL, NULL, NULL,
+          NULL))
     goto wrong_config;
 
   if (caps == NULL)
index 916cd45..305169b 100644 (file)
@@ -1148,12 +1148,16 @@ gst_ximagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
   newpool = gst_ximage_buffer_pool_new (ximagesink);
 
   structure = gst_buffer_pool_get_config (newpool);
-  gst_buffer_pool_config_set (structure, caps, size, 2, 0, 0, 15);
+  gst_buffer_pool_config_set (structure, caps, size, 2, 0, 0, 0, 15);
   if (!gst_buffer_pool_set_config (newpool, structure))
     goto config_failed;
 
   oldpool = ximagesink->pool;
+  /* we don't activate the pool yet, this will be done by downstream after it
+   * has configured the pool. If downstream does not want our pool we will
+   * activate it when we render into it */
   ximagesink->pool = newpool;
+  g_mutex_unlock (ximagesink->flow_lock);
 
   /* unref the old sink */
   if (oldpool) {
@@ -1161,7 +1165,6 @@ gst_ximagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
      * deactivated when the last ref is gone */
     gst_object_unref (oldpool);
   }
-  g_mutex_unlock (ximagesink->flow_lock);
 
   return TRUE;
 
@@ -1439,7 +1442,8 @@ gst_ximagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
 
     /* we had a pool, check caps */
     config = gst_buffer_pool_get_config (pool);
-    gst_buffer_pool_config_get (config, &pcaps, &size, NULL, NULL, NULL, NULL);
+    gst_buffer_pool_config_get (config, &pcaps, &size, NULL, NULL, NULL, NULL,
+        NULL);
 
     GST_DEBUG_OBJECT (ximagesink,
         "we had a pool with caps %" GST_PTR_FORMAT, pcaps);
@@ -1463,12 +1467,12 @@ gst_ximagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
     size = info.size;
 
     config = gst_buffer_pool_get_config (pool);
-    gst_buffer_pool_config_set (config, caps, size, 0, 0, 0, 0);
+    gst_buffer_pool_config_set (config, caps, size, 0, 0, 0, 0, 0);
     if (!gst_buffer_pool_set_config (pool, config))
       goto config_failed;
   }
   /* we need at least 2 buffer because we hold on to the last one */
-  gst_query_set_allocation_params (query, size, 2, 0, 0, 0, pool);
+  gst_query_set_allocation_params (query, size, 2, 0, 0, 0, 0, pool);
 
   /* we also support various metadata */
   gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE);
index ad2a51d..eac9f23 100644 (file)
@@ -519,7 +519,8 @@ xvimage_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
   GstVideoInfo info;
   const GstCaps *caps;
 
-  if (!gst_buffer_pool_config_get (config, &caps, NULL, NULL, NULL, NULL, NULL))
+  if (!gst_buffer_pool_config_get (config, &caps, NULL, NULL, NULL, NULL, NULL,
+          NULL))
     goto wrong_config;
 
   if (caps == NULL)
index 93d62d6..2460973 100644 (file)
@@ -1656,11 +1656,14 @@ gst_xvimagesink_setcaps (GstBaseSink * bsink, GstCaps * caps)
   newpool = gst_xvimage_buffer_pool_new (xvimagesink);
 
   structure = gst_buffer_pool_get_config (newpool);
-  gst_buffer_pool_config_set (structure, caps, size, 2, 0, 0, 15);
+  gst_buffer_pool_config_set (structure, caps, size, 2, 0, 0, 0, 15);
   if (!gst_buffer_pool_set_config (newpool, structure))
     goto config_failed;
 
   oldpool = xvimagesink->pool;
+  /* we don't activate the pool yet, this will be done by downstream after it
+   * has configured the pool. If downstream does not want our pool we will
+   * activate it when we render into it */
   xvimagesink->pool = newpool;
   g_mutex_unlock (xvimagesink->flow_lock);
 
@@ -1954,7 +1957,8 @@ gst_xvimagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
     /* we had a pool, check caps */
     GST_DEBUG_OBJECT (xvimagesink, "check existing pool caps");
     config = gst_buffer_pool_get_config (pool);
-    gst_buffer_pool_config_get (config, &pcaps, &size, NULL, NULL, NULL, NULL);
+    gst_buffer_pool_config_get (config, &pcaps, &size, NULL, NULL, NULL, NULL,
+        NULL);
 
     if (!gst_caps_is_equal (caps, pcaps)) {
       GST_DEBUG_OBJECT (xvimagesink, "pool has different caps");
@@ -1977,12 +1981,12 @@ gst_xvimagesink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
     size = info.size;
 
     config = gst_buffer_pool_get_config (pool);
-    gst_buffer_pool_config_set (config, caps, size, 0, 0, 0, 0);
+    gst_buffer_pool_config_set (config, caps, size, 0, 0, 0, 0, 0);
     if (!gst_buffer_pool_set_config (pool, config))
       goto config_failed;
   }
   /* we need at least 2 buffer because we hold on to the last one */
-  gst_query_set_allocation_params (query, size, 2, 0, 0, 0, pool);
+  gst_query_set_allocation_params (query, size, 2, 0, 0, 0, 0, pool);
 
   /* we also support various metadata */
   gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE);