Changeset 160216 in webkit


Ignore:
Timestamp:
Dec 6, 2013 3:20:15 AM (10 years ago)
Author:
Philippe Normand
Message:

[GStreamer] webkitwebaudiosrc element needs to emit stream-start, caps and segment events
https://bugs.webkit.org/show_bug.cgi?id=123015

Reviewed by Martin Robinson.

When the source element starts emitting buffers send along various
events to notify downstream elements.

No new tests, change covered by existing webaudio tests.

  • platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp:

(webkit_web_audio_src_init): Initialize segment.
(webKitWebAudioSrcConstructed): Give an explicit name to each
queue added in front of the interleave element.
(webKitWebAudioSrcLoop): Before sending the first buffers push
stream-start, caps and segment events on each queue's sinkpad.

Location:
trunk/Source/WebCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r160214 r160216  
     12013-11-11  Philippe Normand  <pnormand@igalia.com>
     2
     3        [GStreamer] webkitwebaudiosrc element needs to emit stream-start, caps and segment events
     4        https://bugs.webkit.org/show_bug.cgi?id=123015
     5
     6        Reviewed by Martin Robinson.
     7
     8        When the source element starts emitting buffers send along various
     9        events to notify downstream elements.
     10
     11        No new tests, change covered by existing webaudio tests.
     12
     13        * platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp:
     14        (webkit_web_audio_src_init): Initialize segment.
     15        (webKitWebAudioSrcConstructed): Give an explicit name to each
     16        queue added in front of the interleave element.
     17        (webKitWebAudioSrcLoop): Before sending the first buffers push
     18        stream-start, caps and segment events on each queue's sinkpad.
     19
    1202013-12-05  Philippe Normand  <pnormand@igalia.com>
    221
  • trunk/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp

    r159730 r160216  
    6161    GSList* pads; // List of queue sink pads. One queue for each planar audio channel.
    6262    GstPad* sourcePad; // src pad of the element, interleaved wav data is pushed to it.
     63
     64    bool newStreamEventPending;
     65    GstSegment segment;
    6366};
    6467
     
    182185    priv->bus = 0;
    183186
     187    priv->newStreamEventPending = true;
     188    gst_segment_init(&priv->segment, GST_FORMAT_TIME);
     189
    184190    g_rec_mutex_init(&priv->mutex);
    185191    priv->task = gst_task_new(reinterpret_cast<GstTaskFunction>(webKitWebAudioSrcLoop), src, 0);
     
    216222    // queue ! capsfilter ! audioconvert. which is plugged to a new interleave request sinkpad.
    217223    for (unsigned channelIndex = 0; channelIndex < priv->bus->numberOfChannels(); channelIndex++) {
    218         GstElement* queue = gst_element_factory_make("queue", 0);
     224        GOwnPtr<gchar> queueName(g_strdup_printf("webaudioQueue%u", channelIndex));
     225        GstElement* queue = gst_element_factory_make("queue", queueName.get());
    219226        GstElement* capsfilter = gst_element_factory_make("capsfilter", 0);
    220227        GstElement* audioconvert = gst_element_factory_make("audioconvert", 0);
     
    335342    GSList* padsIt = priv->pads;
    336343    GSList* buffersIt = channelBufferList;
     344
     345#if GST_CHECK_VERSION(1, 2, 0)
     346    guint groupId = 0;
     347    if (priv->newStreamEventPending)
     348        groupId = gst_util_group_id_next();
     349#endif
     350
    337351    for (i = 0; padsIt && buffersIt; padsIt = g_slist_next(padsIt), buffersIt = g_slist_next(buffersIt), ++i) {
    338352        GstPad* pad = static_cast<GstPad*>(padsIt->data);
    339353        GstBuffer* channelBuffer = static_cast<GstBuffer*>(buffersIt->data);
    340354
     355        // Send stream-start, segment and caps events downstream, along with the first buffer.
     356        if (priv->newStreamEventPending) {
     357            GRefPtr<GstElement> queue = adoptGRef(gst_pad_get_parent_element(pad));
     358            GRefPtr<GstPad> sinkPad = adoptGRef(gst_element_get_static_pad(queue.get(), "sink"));
     359            GOwnPtr<gchar> queueName(gst_element_get_name(queue.get()));
     360            GOwnPtr<gchar> streamId(g_strdup_printf("webaudio/%s", queueName.get()));
     361            GstEvent* streamStartEvent = gst_event_new_stream_start(streamId.get());
     362#if GST_CHECK_VERSION(1, 2, 0)
     363            gst_event_set_group_id(streamStartEvent, groupId);
     364#endif
     365            gst_pad_send_event(sinkPad.get(), streamStartEvent);
     366
     367            GRefPtr<GstCaps> monoCaps = adoptGRef(getGStreamerMonoAudioCaps(priv->sampleRate));
     368            GstAudioInfo info;
     369            gst_audio_info_from_caps(&info, monoCaps.get());
     370            GST_AUDIO_INFO_POSITION(&info, 0) = webKitWebAudioGStreamerChannelPosition(i);
     371            GRefPtr<GstCaps> capsWithChannelPosition = adoptGRef(gst_audio_info_to_caps(&info));
     372            gst_pad_send_event(sinkPad.get(), gst_event_new_caps(capsWithChannelPosition.get()));
     373
     374            gst_pad_send_event(sinkPad.get(), gst_event_new_segment(&priv->segment));
     375        }
     376
    341377        GstFlowReturn ret = gst_pad_chain(pad, channelBuffer);
    342378        if (ret != GST_FLOW_OK)
    343             GST_ELEMENT_ERROR(src, CORE, PAD, ("Internal WebAudioSrc error"), ("Failed to push buffer on %s:%s", GST_DEBUG_PAD_NAME(pad)));
    344     }
     379            GST_ELEMENT_ERROR(src, CORE, PAD, ("Internal WebAudioSrc error"), ("Failed to push buffer on %s:%s flow: %s", GST_DEBUG_PAD_NAME(pad), gst_flow_get_name(ret)));
     380    }
     381
     382    priv->newStreamEventPending = false;
    345383
    346384    g_slist_free(channelBufferList);
     
    382420        break;
    383421    case GST_STATE_CHANGE_PAUSED_TO_READY:
     422        src->priv->newStreamEventPending = true;
    384423        GST_DEBUG_OBJECT(src, "PAUSED->READY");
    385424        if (!gst_task_join(src->priv->task.get()))
Note: See TracChangeset for help on using the changeset viewer.