Title: [177079] trunk/Source/WebCore
Revision
177079
Author
[email protected]
Date
2014-12-10 10:38:25 -0800 (Wed, 10 Dec 2014)

Log Message

[GStreamer] Use a buffer pool for allocations in the AudioDestination
https://bugs.webkit.org/show_bug.cgi?id=139487

Patch by Sebastian Dröge <[email protected]> on 2014-12-10
Reviewed by Philippe Normand.

* platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp:
(webKitWebAudioSrcLoop):
(webKitWebAudioSrcChangeState):
Use a buffer pool for the allocations instead of allocating a
new small buffer for every 128 samples we produce.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (177078 => 177079)


--- trunk/Source/WebCore/ChangeLog	2014-12-10 18:37:39 UTC (rev 177078)
+++ trunk/Source/WebCore/ChangeLog	2014-12-10 18:38:25 UTC (rev 177079)
@@ -1,3 +1,16 @@
+2014-12-10  Sebastian Dröge  <[email protected]>
+
+        [GStreamer] Use a buffer pool for allocations in the AudioDestination
+        https://bugs.webkit.org/show_bug.cgi?id=139487
+
+        Reviewed by Philippe Normand.
+
+        * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp:
+        (webKitWebAudioSrcLoop):
+        (webKitWebAudioSrcChangeState):
+        Use a buffer pool for the allocations instead of allocating a
+        new small buffer for every 128 samples we produce.
+
 2014-12-10  Martin Robinson  <[email protected]>
 
         [GTK] Add support for text-decoration-skip

Modified: trunk/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp (177078 => 177079)


--- trunk/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp	2014-12-10 18:37:39 UTC (rev 177078)
+++ trunk/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp	2014-12-10 18:38:25 UTC (rev 177079)
@@ -64,6 +64,8 @@
     bool newStreamEventPending;
     GstSegment segment;
     guint64 numberOfSamples;
+
+    GstBufferPool* pool;
 };
 
 enum {
@@ -318,6 +320,7 @@
     ASSERT(priv->bus);
     ASSERT(priv->provider);
     if (!priv->provider || !priv->bus) {
+        GST_ELEMENT_ERROR(src, CORE, FAILED, ("Internal WebAudioSrc error"), ("Can't start without provider or bus"));
         gst_task_pause(src->priv->task.get());
         return;
     }
@@ -328,10 +331,26 @@
 
     GSList* channelBufferList = 0;
     register int i;
-    unsigned bufferSize = priv->framesToPull * sizeof(float);
     for (i = g_slist_length(priv->pads) - 1; i >= 0; i--) {
         AudioSrcBuffer* buffer = g_new(AudioSrcBuffer, 1);
-        GstBuffer* channelBuffer = gst_buffer_new_and_alloc(bufferSize);
+        GstBuffer* channelBuffer;
+
+        GstFlowReturn ret = gst_buffer_pool_acquire_buffer(priv->pool, &channelBuffer, nullptr);
+
+        if (ret != GST_FLOW_OK) {
+            g_free(buffer);
+            while (channelBufferList) {
+                buffer = static_cast<AudioSrcBuffer*>(channelBufferList->data);
+                gst_buffer_unmap(buffer->buffer, &buffer->info);
+                gst_buffer_unref(buffer->buffer);
+                g_free(buffer);
+                channelBufferList = g_slist_delete_link(channelBufferList, channelBufferList);
+            }
+            GST_ELEMENT_ERROR(src, CORE, PAD, ("Internal WebAudioSrc error"), ("Failed to allocate buffer for flow: %s", gst_flow_get_name(ret)));
+            gst_task_pause(src->priv->task.get());
+            return;
+        }
+
         ASSERT(channelBuffer);
         buffer->buffer = channelBuffer;
         GST_BUFFER_TIMESTAMP(channelBuffer) = timestamp;
@@ -421,16 +440,26 @@
     }
 
     switch (transition) {
-    case GST_STATE_CHANGE_READY_TO_PAUSED:
+    case GST_STATE_CHANGE_READY_TO_PAUSED: {
         GST_DEBUG_OBJECT(src, "READY->PAUSED");
-        if (!gst_task_start(src->priv->task.get()))
+        src->priv->pool = gst_buffer_pool_new();
+        GstStructure* config = gst_buffer_pool_get_config(src->priv->pool);
+        gst_buffer_pool_config_set_params(config, nullptr, src->priv->framesToPull * sizeof(float), 0, 0);
+        gst_buffer_pool_set_config(src->priv->pool, config);
+        if (!gst_buffer_pool_set_active(src->priv->pool, TRUE))
             returnValue = GST_STATE_CHANGE_FAILURE;
+        else if (!gst_task_start(src->priv->task.get()))
+            returnValue = GST_STATE_CHANGE_FAILURE;
         break;
+    }
     case GST_STATE_CHANGE_PAUSED_TO_READY:
         src->priv->newStreamEventPending = true;
         GST_DEBUG_OBJECT(src, "PAUSED->READY");
         if (!gst_task_join(src->priv->task.get()))
             returnValue = GST_STATE_CHANGE_FAILURE;
+        gst_buffer_pool_set_active(src->priv->pool, FALSE);
+        gst_object_unref(src->priv->pool);
+        src->priv->pool = nullptr;
         break;
     default:
         break;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to