Changeset 261685 in webkit


Ignore:
Timestamp:
May 14, 2020 5:07:18 AM (4 years ago)
Author:
commit-queue@webkit.org
Message:

[GStreamer] webrtc/disable-encryption.html is a crashing flaky
https://bugs.webkit.org/show_bug.cgi?id=211166

Patch by Philippe Normand <pnormand@igalia.com> on 2020-05-14
Reviewed by Xabier Rodriguez-Calvar.

Source/WebCore:

Make sure the audio and video mediastream source elements are correctly removed and disposed
from their parent bin when resetting the track sources. Before this change there was a
possibility of disposing the elements while they were still in PLAYING state.

  • platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:

(WebCore::_WebKitMediaStreamSrc::SourceData::reset):
(WebCore::webkitMediaStreamSrcDispose):
(WebCore::webkitMediaStreamSrcRemoveTrackByType):

LayoutTests:

  • platform/gtk/TestExpectations: Marking webrtc/disable-encryption.html as no longer flaky.
Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r261678 r261685  
     12020-05-14  Philippe Normand  <pnormand@igalia.com>
     2
     3        [GStreamer] webrtc/disable-encryption.html is a crashing flaky
     4        https://bugs.webkit.org/show_bug.cgi?id=211166
     5
     6        Reviewed by Xabier Rodriguez-Calvar.
     7
     8        * platform/gtk/TestExpectations: Marking webrtc/disable-encryption.html as no longer flaky.
     9
    1102020-05-13  Myles C. Maxfield  <mmaxfield@apple.com>
    211
  • trunk/LayoutTests/platform/gtk/TestExpectations

    r261613 r261685  
    29022902webkit.org/b/210541 imported/w3c/web-platform-tests/html/cross-origin-embedder-policy/require-corp-load-from-cache-storage.https.html [ Failure Pass ]
    29032903
    2904 webkit.org/b/211166 webrtc/disable-encryption.html [ Crash Pass ]
    2905 
    29062904webkit.org/b/211614 imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate.any.worker.html [ Failure Pass ]
    29072905
  • trunk/Source/WebCore/ChangeLog

    r261684 r261685  
     12020-05-14  Philippe Normand  <pnormand@igalia.com>
     2
     3        [GStreamer] webrtc/disable-encryption.html is a crashing flaky
     4        https://bugs.webkit.org/show_bug.cgi?id=211166
     5
     6        Reviewed by Xabier Rodriguez-Calvar.
     7
     8        Make sure the audio and video mediastream source elements are correctly removed and disposed
     9        from their parent bin when resetting the track sources. Before this change there was a
     10        possibility of disposing the elements while they were still in PLAYING state.
     11
     12        * platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:
     13        (WebCore::_WebKitMediaStreamSrc::SourceData::reset):
     14        (WebCore::webkitMediaStreamSrcDispose):
     15        (WebCore::webkitMediaStreamSrcRemoveTrackByType):
     16
    1172020-05-14  Adrian Perez de Castro  <aperez@igalia.com>
    218
  • trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp

    r261553 r261685  
    192192            m_firstBufferPts = GST_CLOCK_TIME_NONE;
    193193            m_isVideo = isVideo;
     194
     195            if (!m_src)
     196                return;
     197
     198            gst_element_set_locked_state(m_src.get(), true);
     199            gst_element_set_state(m_src.get(), GST_STATE_NULL);
     200            auto parent = adoptGRef(gst_object_get_parent(GST_OBJECT_CAST(m_src.get())));
     201            if (parent)
     202                gst_bin_remove(GST_BIN_CAST(parent.get()), m_src.get());
     203            gst_element_set_locked_state(m_src.get(), false);
    194204            m_src = nullptr;
    195205        }
     
    200210        }
    201211
    202         static void needDataCb(GstElement*, guint, WebKitMediaStreamSrc::SourceData *self)
     212        static void needDataCallback(WebKitMediaStreamSrc::SourceData* self, unsigned)
    203213        {
    204214            self->setEnoughData(false);
    205215        }
    206216
    207         static void enoughDataCb(GstElement*, WebKitMediaStreamSrc::SourceData *self)
     217        static void enoughDataCallback(WebKitMediaStreamSrc::SourceData* self)
    208218        {
    209219            self->setEnoughData(true);
    210220        }
    211221
    212         void setSrc(GstElement *src)
     222        void setSrc(GRefPtr<GstElement>&& src)
    213223        {
    214             m_src = adoptGRef(GST_ELEMENT(g_object_ref_sink(src)));
    215             if (GST_IS_APP_SRC(src)) {
    216                 g_object_set(src, "is-live", true, "format", GST_FORMAT_TIME, "emit-signals", TRUE, "min-percent", 100, nullptr);
    217                 g_signal_connect(src, "enough-data", G_CALLBACK(enoughDataCb), this);
    218                 g_signal_connect(src, "need-data", G_CALLBACK(needDataCb), this);
    219             }
     224            m_src = WTFMove(src);
     225            if (!GST_IS_APP_SRC(m_src.get()))
     226                return;
     227
     228            g_object_set(m_src.get(), "is-live", true, "format", GST_FORMAT_TIME, "emit-signals", true, "min-percent", 100, nullptr);
     229            g_signal_connect_swapped(m_src.get(), "enough-data", G_CALLBACK(enoughDataCallback), this);
     230            g_signal_connect_swapped(m_src.get(), "need-data", G_CALLBACK(needDataCallback), this);
    220231        }
    221232
     
    370381    WebKitMediaStreamSrc* self = WEBKIT_MEDIA_STREAM_SRC(object);
    371382
    372     if (self->audioSrc.isUsed()) {
    373         gst_bin_remove(GST_BIN(self), self->audioSrc.src());
    374         self->audioSrc.reset(false);
    375     }
    376 
    377     if (self->videoSrc.isUsed()) {
    378         gst_bin_remove(GST_BIN(self), self->videoSrc.src());
    379         self->videoSrc.reset(true);
    380     }
     383    self->audioSrc.reset(false);
     384    self->videoSrc.reset(true);
    381385}
    382386
     
    585589    GstStaticPadTemplate* pad_template, bool onlyTrack)
    586590{
    587     data->setSrc(gst_element_factory_make("appsrc", nullptr));
     591    GRefPtr<GstElement> src = gst_element_factory_make("appsrc", nullptr);
     592    data->setSrc(WTFMove(src));
    588593    if (track->isCaptureTrack())
    589594        g_object_set(data->src(), "do-timestamp", true, nullptr);
     
    625630static void webkitMediaStreamSrcRemoveTrackByType(WebKitMediaStreamSrc* self, RealtimeMediaSource::Type trackType)
    626631{
    627     if (trackType == RealtimeMediaSource::Type::Audio) {
    628         if (self->audioSrc.isUsed()) {
    629             gst_element_set_state(self->audioSrc.src(), GST_STATE_NULL);
    630             gst_bin_remove(GST_BIN(self), self->audioSrc.src());
    631             self->audioSrc.reset(false);
    632         }
    633     } else if (trackType == RealtimeMediaSource::Type::Video) {
    634         if (self->videoSrc.isUsed()) {
    635             gst_element_set_state(self->videoSrc.src(), GST_STATE_NULL);
    636             gst_bin_remove(GST_BIN(self), self->videoSrc.src());
    637             self->videoSrc.reset(true);
    638         }
    639     } else
     632    if (trackType == RealtimeMediaSource::Type::Audio)
     633        self->audioSrc.reset(false);
     634    else if (trackType == RealtimeMediaSource::Type::Video)
     635        self->videoSrc.reset(true);
     636    else
    640637        GST_INFO("Unsupported track type: %d", static_cast<int>(trackType));
    641638}
Note: See TracChangeset for help on using the changeset viewer.