* @pool: a #GstBufferPool
* @config: (transfer full): a #GstStructure
*
- * Set the configuration of the pool. The pool must be inactive and all buffers
- * allocated form this pool must be returned or else this function will do
- * nothing and return FALSE.
+ * Set the configuration of the pool. If the pool is already configured, and
+ * the configuration haven't change, this function will return %TRUE. If the
+ * pool is active, this function will try deactivating it. Buffers allocated
+ * form this pool must be returned or else this function will do nothing and
+ * return FALSE.
*
* @config is a #GstStructure that contains the configuration parameters for
* the pool. A default and mandatory set of parameters can be configured with
priv = pool->priv;
GST_BUFFER_POOL_LOCK (pool);
+
+ /* nothing to do if config is unchanged */
+ if (priv->configured && gst_structure_is_equal (config, priv->config))
+ goto config_unchanged;
+
/* can't change the settings when active */
- if (priv->active)
- goto was_active;
+ if (priv->active) {
+ GST_BUFFER_POOL_UNLOCK (pool);
+ if (!gst_buffer_pool_set_active (pool, FALSE)) {
+ GST_BUFFER_POOL_LOCK (pool);
+ goto was_active;
+ }
+ GST_BUFFER_POOL_LOCK (pool);
+
+ /* not likely but as we released the lock */
+ if (priv->active)
+ goto was_active;
+ }
/* we can't change when outstanding buffers */
if (g_atomic_int_get (&priv->outstanding) != 0)
return result;
+config_unchanged:
+ {
+ gst_structure_free (config);
+ GST_BUFFER_POOL_UNLOCK (pool);
+ return TRUE;
+ }
/* ERRORS */
was_active:
{
{
GstBufferPool *pool = gst_buffer_pool_new ();
GstStructure *conf = gst_buffer_pool_get_config (pool);
+ GstCaps *caps = gst_caps_new_empty_simple ("test/data");
- gst_buffer_pool_config_set_params (conf, NULL, size, min_buf, max_buf);
+ gst_buffer_pool_config_set_params (conf, caps, size, min_buf, max_buf);
gst_buffer_pool_set_config (pool, conf);
+ gst_caps_unref (caps);
return pool;
}
GST_END_TEST;
+GST_START_TEST (test_pool_activation_and_config)
+{
+ GstBufferPool *pool = gst_buffer_pool_new ();
+ GstStructure *config = gst_buffer_pool_get_config (pool);
+ GstCaps *caps = gst_caps_new_empty_simple ("test/data");
+ GstBuffer *buffer = NULL;
+
+ /* unconfigured pool cannot be activated */
+ fail_if (gst_buffer_pool_set_active (pool, TRUE));
+
+ gst_buffer_pool_config_set_params (config, caps, 10, 10, 0);
+ fail_unless (gst_buffer_pool_set_config (pool, config));
+ fail_unless (gst_buffer_pool_set_active (pool, TRUE));
+
+ /* setting the same config on an active pool is ok */
+ config = gst_buffer_pool_get_config (pool);
+ fail_unless (gst_buffer_pool_set_config (pool, config));
+
+ /* setting a different config should deactivate the pool */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set_params (config, caps, 12, 10, 0);
+ fail_unless (gst_buffer_pool_set_config (pool, config));
+ fail_if (gst_buffer_pool_is_active (pool));
+
+ /* though it should fail if there is outstanding buffers */
+ gst_buffer_pool_set_active (pool, TRUE);
+ gst_buffer_pool_acquire_buffer (pool, &buffer, NULL);
+ fail_if (buffer == NULL);
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set_params (config, caps, 10, 10, 0);
+ fail_if (gst_buffer_pool_set_config (pool, config));
+
+ /* and work when last buffer is back */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set_params (config, caps, 10, 10, 0);
+ gst_buffer_unref (buffer);
+ fail_unless (gst_buffer_pool_set_config (pool, config));
+ fail_unless (gst_buffer_pool_set_active (pool, TRUE));
+
+ gst_buffer_pool_set_active (pool, FALSE);
+ gst_object_unref (pool);
+ gst_caps_unref (caps);
+}
+
+GST_END_TEST;
+
static Suite *
gst_buffer_pool_suite (void)
{
tcase_add_test (tc_chain, test_pool_config_buffer_size);
tcase_add_test (tc_chain, test_inactive_pool_returns_flushing);
tcase_add_test (tc_chain, test_buffer_modify_discard);
+ tcase_add_test (tc_chain, test_pool_activation_and_config);
return s;
}