bufferpool: Don't stop the pool in set_config()

Don't stop the pool in set_config(). Instead, let the controlling
element manage it. Most of the time, when an active pool is being
configured is because the caps didn't change.

https://bugzilla.gnome.org/show_bug.cgi?id=745377
This commit is contained in:
Nicolas Dufresne 2015-03-01 13:15:40 -05:00 committed by Nicolas Dufresne
parent 5e15d4aa60
commit c740bad1a0
2 changed files with 8 additions and 34 deletions

View file

@ -609,9 +609,9 @@ wrong_config:
* *
* Set the configuration of the pool. If the pool is already configured, and * 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 * the configuration haven't change, this function will return %TRUE. If the
* pool is active, this function will try deactivating it. Buffers allocated * pool is active, this method will return %FALSE and active configuration
* form this pool must be returned or else this function will do nothing and * will remain. Buffers allocated form this pool must be returned or else this
* return %FALSE. * function will do nothing and return %FALSE.
* *
* @config is a #GstStructure that contains the configuration parameters for * @config is a #GstStructure that contains the configuration parameters for
* the pool. A default and mandatory set of parameters can be configured with * the pool. A default and mandatory set of parameters can be configured with
@ -645,18 +645,8 @@ gst_buffer_pool_set_config (GstBufferPool * pool, GstStructure * config)
goto config_unchanged; goto config_unchanged;
/* can't change the settings when active */ /* can't change the settings when 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) if (priv->active)
goto was_active; goto was_active;
}
/* we can't change when outstanding buffers */ /* we can't change when outstanding buffers */
if (g_atomic_int_get (&priv->outstanding) != 0) if (g_atomic_int_get (&priv->outstanding) != 0)
@ -694,7 +684,7 @@ config_unchanged:
was_active: was_active:
{ {
gst_structure_free (config); gst_structure_free (config);
GST_WARNING_OBJECT (pool, "can't change config, we are active"); GST_INFO_OBJECT (pool, "can't change config, we are active");
GST_BUFFER_POOL_UNLOCK (pool); GST_BUFFER_POOL_UNLOCK (pool);
return FALSE; return FALSE;
} }

View file

@ -179,7 +179,6 @@ GST_START_TEST (test_pool_activation_and_config)
GstBufferPool *pool = gst_buffer_pool_new (); GstBufferPool *pool = gst_buffer_pool_new ();
GstStructure *config = gst_buffer_pool_get_config (pool); GstStructure *config = gst_buffer_pool_get_config (pool);
GstCaps *caps = gst_caps_new_empty_simple ("test/data"); GstCaps *caps = gst_caps_new_empty_simple ("test/data");
GstBuffer *buffer = NULL;
/* unconfigured pool cannot be activated */ /* unconfigured pool cannot be activated */
fail_if (gst_buffer_pool_set_active (pool, TRUE)); fail_if (gst_buffer_pool_set_active (pool, TRUE));
@ -192,26 +191,11 @@ GST_START_TEST (test_pool_activation_and_config)
config = gst_buffer_pool_get_config (pool); config = gst_buffer_pool_get_config (pool);
fail_unless (gst_buffer_pool_set_config (pool, config)); fail_unless (gst_buffer_pool_set_config (pool, config));
/* setting a different config should deactivate the pool */ /* setting a different config on active pool should fail */
config = gst_buffer_pool_get_config (pool); config = gst_buffer_pool_get_config (pool);
gst_buffer_pool_config_set_params (config, caps, 12, 10, 0); 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)); fail_if (gst_buffer_pool_set_config (pool, config));
fail_unless (gst_buffer_pool_is_active (pool));
/* 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_buffer_pool_set_active (pool, FALSE);
gst_object_unref (pool); gst_object_unref (pool);