Changeset 160216 in webkit
- Timestamp:
- Dec 6, 2013 3:20:15 AM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r160214 r160216 1 2013-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 1 20 2013-12-05 Philippe Normand <pnormand@igalia.com> 2 21 -
trunk/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp
r159730 r160216 61 61 GSList* pads; // List of queue sink pads. One queue for each planar audio channel. 62 62 GstPad* sourcePad; // src pad of the element, interleaved wav data is pushed to it. 63 64 bool newStreamEventPending; 65 GstSegment segment; 63 66 }; 64 67 … … 182 185 priv->bus = 0; 183 186 187 priv->newStreamEventPending = true; 188 gst_segment_init(&priv->segment, GST_FORMAT_TIME); 189 184 190 g_rec_mutex_init(&priv->mutex); 185 191 priv->task = gst_task_new(reinterpret_cast<GstTaskFunction>(webKitWebAudioSrcLoop), src, 0); … … 216 222 // queue ! capsfilter ! audioconvert. which is plugged to a new interleave request sinkpad. 217 223 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()); 219 226 GstElement* capsfilter = gst_element_factory_make("capsfilter", 0); 220 227 GstElement* audioconvert = gst_element_factory_make("audioconvert", 0); … … 335 342 GSList* padsIt = priv->pads; 336 343 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 337 351 for (i = 0; padsIt && buffersIt; padsIt = g_slist_next(padsIt), buffersIt = g_slist_next(buffersIt), ++i) { 338 352 GstPad* pad = static_cast<GstPad*>(padsIt->data); 339 353 GstBuffer* channelBuffer = static_cast<GstBuffer*>(buffersIt->data); 340 354 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 341 377 GstFlowReturn ret = gst_pad_chain(pad, channelBuffer); 342 378 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; 345 383 346 384 g_slist_free(channelBufferList); … … 382 420 break; 383 421 case GST_STATE_CHANGE_PAUSED_TO_READY: 422 src->priv->newStreamEventPending = true; 384 423 GST_DEBUG_OBJECT(src, "PAUSED->READY"); 385 424 if (!gst_task_join(src->priv->task.get()))
Note: See TracChangeset
for help on using the changeset viewer.