Changeset 207874 in webkit
- Timestamp:
- Oct 26, 2016 1:37:08 AM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r207873 r207874 1 2016-10-26 Enrique Ocaña González <eocanha@igalia.com> 2 3 [GStreamer] Drain query support 4 https://bugs.webkit.org/show_bug.cgi?id=162872 5 6 Reviewed by Žan Doberšek. 7 8 Under some circumstances, GStreamer deadlocks completely during MSE seeks on OpenGL ES 9 systems. This is because the video sink still holds samples. Proper DRAIN support 10 fixes this issue and is also good for all the platforms, not only OpenGL ES. 11 12 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp: 13 (WebCore::MediaPlayerPrivateGStreamerBase::triggerDrain): 14 (WebCore::MediaPlayerPrivateGStreamerBase::drainCallback): 15 (WebCore::MediaPlayerPrivateGStreamerBase::createVideoSink): 16 (WebCore::MediaPlayerPrivateGStreamerBase::createVideoSinkGL): Deleted. 17 * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h: 18 * platform/graphics/gstreamer/VideoSinkGStreamer.cpp: 19 (VideoRenderRequestScheduler::drain): 20 (webkitVideoSinkQuery): 21 (webkitVideoSinkEvent): 22 (webkit_video_sink_class_init): 23 (VideoRenderRequestScheduler::stop): Deleted. 24 (webkitVideoSinkProposeAllocation): Deleted. 25 1 26 2016-10-26 Enrique Ocaña González <eocanha@igalia.com> 2 27 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.cpp
r207666 r207874 629 629 } 630 630 631 void MediaPlayerPrivateGStreamerBase::triggerDrain() 632 { 633 WTF::GMutexLocker<GMutex> lock(m_sampleMutex); 634 m_videoSize = FloatSize(); 635 m_sample = nullptr; 636 } 637 631 638 void MediaPlayerPrivateGStreamerBase::repaintCallback(MediaPlayerPrivateGStreamerBase* player, GstSample* sample) 632 639 { 633 640 player->triggerRepaint(sample); 641 } 642 643 void MediaPlayerPrivateGStreamerBase::drainCallback(MediaPlayerPrivateGStreamerBase* player) 644 { 645 player->triggerDrain(); 634 646 } 635 647 … … 968 980 m_videoSink = webkitVideoSinkNew(); 969 981 g_signal_connect_swapped(m_videoSink.get(), "repaint-requested", G_CALLBACK(repaintCallback), this); 982 g_signal_connect_swapped(m_videoSink.get(), "drain", G_CALLBACK(drainCallback), this); 970 983 } 971 984 -
trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerBase.h
r207666 r207874 151 151 virtual bool handleSyncMessage(GstMessage*); 152 152 153 void triggerDrain(); 154 153 155 void triggerRepaint(GstSample*); 154 156 void repaint(); 155 157 158 static void drainCallback(MediaPlayerPrivateGStreamerBase*); 156 159 static void repaintCallback(MediaPlayerPrivateGStreamerBase*, GstSample*); 157 160 -
trunk/Source/WebCore/platform/graphics/gstreamer/VideoSinkGStreamer.cpp
r205180 r207874 2 2 * Copyright (C) 2007 OpenedHand 3 3 * Copyright (C) 2007 Alp Toker <alp@atoker.com> 4 * Copyright (C) 2009, 2010, 2011, 2012 Igalia S.L 4 * Copyright (C) 2009, 2010, 2011, 2012, 2015, 2016 Igalia S.L 5 * Copyright (C) 2015, 2016 Metrological Group B.V. 5 6 * 6 7 * This library is free software; you can redistribute it and/or … … 58 59 enum { 59 60 REPAINT_REQUESTED, 61 DRAIN, 60 62 LAST_SIGNAL 61 63 }; … … 94 96 m_dataCondition.notifyOne(); 95 97 #endif 98 } 99 100 void drain() 101 { 102 LockHolder locker(m_sampleMutex); 103 m_sample = nullptr; 96 104 } 97 105 … … 348 356 } 349 357 358 static gboolean webkitVideoSinkQuery(GstBaseSink* baseSink, GstQuery* query) 359 { 360 WebKitVideoSink* sink = WEBKIT_VIDEO_SINK(baseSink); 361 362 switch (GST_QUERY_TYPE(query)) { 363 case GST_QUERY_DRAIN: 364 GST_OBJECT_LOCK(sink); 365 g_signal_emit(sink, webkitVideoSinkSignals[DRAIN], 0); 366 GST_OBJECT_UNLOCK(sink); 367 return TRUE; 368 default: 369 return GST_CALL_PARENT_WITH_DEFAULT(GST_BASE_SINK_CLASS, query, (baseSink, query), TRUE); 370 } 371 } 372 373 static gboolean webkitVideoSinkEvent(GstBaseSink* baseSink, GstEvent* event) 374 { 375 switch (GST_EVENT_TYPE(event)) { 376 case GST_EVENT_FLUSH_START: { 377 WebKitVideoSink* sink = WEBKIT_VIDEO_SINK(baseSink); 378 sink->priv->scheduler.drain(); 379 380 GST_DEBUG_OBJECT(sink, "Flush-start, emitting DRAIN signal and releasing m_sample"); 381 382 GST_OBJECT_LOCK(sink); 383 g_signal_emit(sink, webkitVideoSinkSignals[DRAIN], 0); 384 GST_OBJECT_UNLOCK(sink); 385 } 386 FALLTHROUGH; 387 default: 388 return GST_CALL_PARENT_WITH_DEFAULT(GST_BASE_SINK_CLASS, event, (baseSink, event), TRUE); 389 } 390 } 391 350 392 static void webkit_video_sink_class_init(WebKitVideoSinkClass* klass) 351 393 { … … 369 411 baseSinkClass->set_caps = webkitVideoSinkSetCaps; 370 412 baseSinkClass->propose_allocation = webkitVideoSinkProposeAllocation; 413 baseSinkClass->query = webkitVideoSinkQuery; 414 baseSinkClass->event = webkitVideoSinkEvent; 371 415 372 416 webkitVideoSinkSignals[REPAINT_REQUESTED] = g_signal_new("repaint-requested", … … 380 424 1, // Only one parameter 381 425 GST_TYPE_SAMPLE); 426 427 webkitVideoSinkSignals[DRAIN] = g_signal_new("drain", 428 G_TYPE_FROM_CLASS(klass), 429 static_cast<GSignalFlags>(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), 430 0, // Class offset. 431 0, // Accumulator. 432 0, // Accumulator data. 433 g_cclosure_marshal_generic, 434 G_TYPE_NONE, // Return type. 435 0); // No parameters. 382 436 } 383 437
Note: See TracChangeset
for help on using the changeset viewer.