Title: [293531] trunk/Source/WebCore
Revision
293531
Author
[email protected]
Date
2022-04-27 13:20:30 -0700 (Wed, 27 Apr 2022)

Log Message

[GStreamer] Track handling fixes
https://bugs.webkit.org/show_bug.cgi?id=239702

Patch by Philippe Normand <[email protected]> on 2022-04-27
Reviewed by Xabier Rodriguez-Calvar.

When the player is using playbin3 the audio/video/text tracks are associated to the
corresponding GstStream, itself part of a single GstStreamCollection. There is no need to
use a GRefPtr for GstStream in this case because those streams are not meant to be modified
and they remain valid as long as the parent collection is alive. So the player now keeps
track of the current stream collection and the private tracks handle GstStream pointers.

The stream collection handling was refactored, removing redundant logging, making use of
ScopeExit and removing the special case for text tracks creation.

This patch also changes the internal storage of tracks from HashMap<AtomString,RePtr<T>> to
HashMap<AtomString,Ref<T>>, bringing us a bit closer to the AVF implementation.

* platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp:
(WebCore::AudioTrackPrivateGStreamer::AudioTrackPrivateGStreamer):
(WebCore::AudioTrackPrivateGStreamer::updateConfigurationFromTags):
(WebCore::AudioTrackPrivateGStreamer::updateConfigurationFromCaps):
(WebCore::AudioTrackPrivateGStreamer::kind const):
(WebCore::AudioTrackPrivateGStreamer::disconnect):
* platform/graphics/gstreamer/AudioTrackPrivateGStreamer.h:
* platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp:
(WebCore::InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer):
* platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h:
(WebCore::InbandTextTrackPrivateGStreamer::create):
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfTrack):
(WebCore::MediaPlayerPrivateGStreamer::updateEnabledVideoTrack):
(WebCore::MediaPlayerPrivateGStreamer::updateEnabledAudioTrack):
(WebCore::MediaPlayerPrivateGStreamer::playbin3SendSelectStreamsIfAppropriate):
(WebCore::MediaPlayerPrivateGStreamer::updateTracks):
(WebCore::MediaPlayerPrivateGStreamer::handleStreamCollectionMessage):
(WebCore::MediaPlayerPrivateGStreamer::handleMessage):
* platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
* platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp:
(WebCore::TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer):
(WebCore::TrackPrivateBaseGStreamer::disconnect):
(WebCore::TrackPrivateBaseGStreamer::tagsChanged):
* platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h:
(WebCore::TrackPrivateBaseGStreamer::stream const):
(WebCore::TrackPrivateBaseGStreamer::stream): Deleted.
* platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp:
(WebCore::VideoTrackPrivateGStreamer::VideoTrackPrivateGStreamer):
(WebCore::VideoTrackPrivateGStreamer::updateConfigurationFromTags):
(WebCore::VideoTrackPrivateGStreamer::updateConfigurationFromCaps):
(WebCore::VideoTrackPrivateGStreamer::kind const):
(WebCore::VideoTrackPrivateGStreamer::disconnect):
* platform/graphics/gstreamer/VideoTrackPrivateGStreamer.h:

Canonical link: https://commits.webkit.org/250060@main

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (293530 => 293531)


--- trunk/Source/WebCore/ChangeLog	2022-04-27 20:18:06 UTC (rev 293530)
+++ trunk/Source/WebCore/ChangeLog	2022-04-27 20:20:30 UTC (rev 293531)
@@ -1,3 +1,57 @@
+2022-04-24  Philippe Normand  <[email protected]>
+
+        [GStreamer] Track handling fixes
+        https://bugs.webkit.org/show_bug.cgi?id=239702
+
+        Reviewed by Xabier Rodriguez-Calvar.
+
+        When the player is using playbin3 the audio/video/text tracks are associated to the
+        corresponding GstStream, itself part of a single GstStreamCollection. There is no need to
+        use a GRefPtr for GstStream in this case because those streams are not meant to be modified
+        and they remain valid as long as the parent collection is alive. So the player now keeps
+        track of the current stream collection and the private tracks handle GstStream pointers.
+
+        The stream collection handling was refactored, removing redundant logging, making use of
+        ScopeExit and removing the special case for text tracks creation.
+
+        This patch also changes the internal storage of tracks from HashMap<AtomString,RePtr<T>> to
+        HashMap<AtomString,Ref<T>>, bringing us a bit closer to the AVF implementation.
+
+        * platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp:
+        (WebCore::AudioTrackPrivateGStreamer::AudioTrackPrivateGStreamer):
+        (WebCore::AudioTrackPrivateGStreamer::updateConfigurationFromTags):
+        (WebCore::AudioTrackPrivateGStreamer::updateConfigurationFromCaps):
+        (WebCore::AudioTrackPrivateGStreamer::kind const):
+        (WebCore::AudioTrackPrivateGStreamer::disconnect):
+        * platform/graphics/gstreamer/AudioTrackPrivateGStreamer.h:
+        * platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp:
+        (WebCore::InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer):
+        * platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h:
+        (WebCore::InbandTextTrackPrivateGStreamer::create):
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+        (WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfTrack):
+        (WebCore::MediaPlayerPrivateGStreamer::updateEnabledVideoTrack):
+        (WebCore::MediaPlayerPrivateGStreamer::updateEnabledAudioTrack):
+        (WebCore::MediaPlayerPrivateGStreamer::playbin3SendSelectStreamsIfAppropriate):
+        (WebCore::MediaPlayerPrivateGStreamer::updateTracks):
+        (WebCore::MediaPlayerPrivateGStreamer::handleStreamCollectionMessage):
+        (WebCore::MediaPlayerPrivateGStreamer::handleMessage):
+        * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
+        * platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp:
+        (WebCore::TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer):
+        (WebCore::TrackPrivateBaseGStreamer::disconnect):
+        (WebCore::TrackPrivateBaseGStreamer::tagsChanged):
+        * platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h:
+        (WebCore::TrackPrivateBaseGStreamer::stream const):
+        (WebCore::TrackPrivateBaseGStreamer::stream): Deleted.
+        * platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp:
+        (WebCore::VideoTrackPrivateGStreamer::VideoTrackPrivateGStreamer):
+        (WebCore::VideoTrackPrivateGStreamer::updateConfigurationFromTags):
+        (WebCore::VideoTrackPrivateGStreamer::updateConfigurationFromCaps):
+        (WebCore::VideoTrackPrivateGStreamer::kind const):
+        (WebCore::VideoTrackPrivateGStreamer::disconnect):
+        * platform/graphics/gstreamer/VideoTrackPrivateGStreamer.h:
+
 2022-04-27  Eric Carlson  <[email protected]>
 
         [iOS] unable to start playing audio when device is locked

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp (293530 => 293531)


--- trunk/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp	2022-04-27 20:18:06 UTC (rev 293530)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp	2022-04-27 20:20:30 UTC (rev 293531)
@@ -40,22 +40,22 @@
 {
 }
 
-AudioTrackPrivateGStreamer::AudioTrackPrivateGStreamer(WeakPtr<MediaPlayerPrivateGStreamer> player, unsigned index, GRefPtr<GstStream>&& stream)
-    : TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Audio, this, index, WTFMove(stream))
+AudioTrackPrivateGStreamer::AudioTrackPrivateGStreamer(WeakPtr<MediaPlayerPrivateGStreamer> player, unsigned index, GstStream* stream)
+    : TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Audio, this, index, stream)
     , m_player(player)
 {
     int kind;
-    auto tags = adoptGRef(gst_stream_get_tags(m_stream.get()));
+    auto tags = adoptGRef(gst_stream_get_tags(m_stream));
 
     if (tags && gst_tag_list_get_int(tags.get(), "webkit-media-stream-kind", &kind) && kind == static_cast<int>(AudioTrackPrivate::Kind::Main)) {
-        auto streamFlags = gst_stream_get_stream_flags(m_stream.get());
-        gst_stream_set_stream_flags(m_stream.get(), static_cast<GstStreamFlags>(streamFlags | GST_STREAM_FLAG_SELECT));
+        auto streamFlags = gst_stream_get_stream_flags(m_stream);
+        gst_stream_set_stream_flags(m_stream, static_cast<GstStreamFlags>(streamFlags | GST_STREAM_FLAG_SELECT));
     }
 
-    g_signal_connect_swapped(m_stream.get(), "notify::caps", G_CALLBACK(+[](AudioTrackPrivateGStreamer* track) {
+    g_signal_connect_swapped(m_stream, "notify::caps", G_CALLBACK(+[](AudioTrackPrivateGStreamer* track) {
         track->updateConfigurationFromCaps();
     }), this);
-    g_signal_connect_swapped(m_stream.get(), "notify::tags", G_CALLBACK(+[](AudioTrackPrivateGStreamer* track) {
+    g_signal_connect_swapped(m_stream, "notify::tags", G_CALLBACK(+[](AudioTrackPrivateGStreamer* track) {
         track->updateConfigurationFromTags();
     }), this);
 
@@ -65,7 +65,7 @@
 
 void AudioTrackPrivateGStreamer::updateConfigurationFromTags()
 {
-    auto tags = adoptGRef(gst_stream_get_tags(m_stream.get()));
+    auto tags = adoptGRef(gst_stream_get_tags(m_stream));
     unsigned bitrate;
     if (!tags || !gst_tag_list_get_uint(tags.get(), GST_TAG_BITRATE, &bitrate))
         return;
@@ -79,7 +79,7 @@
 
 void AudioTrackPrivateGStreamer::updateConfigurationFromCaps()
 {
-    auto caps = adoptGRef(gst_stream_get_caps(m_stream.get()));
+    auto caps = adoptGRef(gst_stream_get_caps(m_stream));
     if (!caps || !gst_caps_is_fixed(caps.get()))
         return;
 
@@ -102,7 +102,7 @@
 
 AudioTrackPrivate::Kind AudioTrackPrivateGStreamer::kind() const
 {
-    if (m_stream.get() && gst_stream_get_stream_flags(m_stream.get()) & GST_STREAM_FLAG_SELECT)
+    if (m_stream && gst_stream_get_stream_flags(m_stream) & GST_STREAM_FLAG_SELECT)
         return AudioTrackPrivate::Kind::Main;
 
     return AudioTrackPrivate::kind();
@@ -111,7 +111,7 @@
 void AudioTrackPrivateGStreamer::disconnect()
 {
     if (m_stream)
-        g_signal_handlers_disconnect_matched(m_stream.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this);
+        g_signal_handlers_disconnect_matched(m_stream, G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this);
 
     m_player = nullptr;
     TrackPrivateBaseGStreamer::disconnect();

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.h (293530 => 293531)


--- trunk/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.h	2022-04-27 20:18:06 UTC (rev 293530)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.h	2022-04-27 20:20:30 UTC (rev 293531)
@@ -42,9 +42,9 @@
         return adoptRef(*new AudioTrackPrivateGStreamer(player, index, WTFMove(pad), shouldHandleStreamStartEvent));
     }
 
-    static Ref<AudioTrackPrivateGStreamer> create(WeakPtr<MediaPlayerPrivateGStreamer> player, unsigned index, GRefPtr<GstStream>&& stream)
+    static Ref<AudioTrackPrivateGStreamer> create(WeakPtr<MediaPlayerPrivateGStreamer> player, unsigned index, GstStream* stream)
     {
-        return adoptRef(*new AudioTrackPrivateGStreamer(player, index, WTFMove(stream)));
+        return adoptRef(*new AudioTrackPrivateGStreamer(player, index, stream));
     }
 
     Kind kind() const final;
@@ -66,7 +66,7 @@
 
 private:
     AudioTrackPrivateGStreamer(WeakPtr<MediaPlayerPrivateGStreamer>, unsigned index, GRefPtr<GstPad>&&, bool shouldHandleStreamStartEvent);
-    AudioTrackPrivateGStreamer(WeakPtr<MediaPlayerPrivateGStreamer>, unsigned index, GRefPtr<GstStream>&&);
+    AudioTrackPrivateGStreamer(WeakPtr<MediaPlayerPrivateGStreamer>, unsigned index, GstStream*);
 
     WeakPtr<MediaPlayerPrivateGStreamer> m_player;
 };

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp (293530 => 293531)


--- trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp	2022-04-27 20:18:06 UTC (rev 293530)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp	2022-04-27 20:20:30 UTC (rev 293531)
@@ -43,15 +43,15 @@
 {
 }
 
-InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer(unsigned index, GRefPtr<GstStream>&& stream)
+InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer(unsigned index, GstStream* stream)
     : InbandTextTrackPrivate(CueFormat::WebVTT)
-    , TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Text, this, index, WTFMove(stream))
+    , TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Text, this, index, stream)
 {
-    m_id = AtomString::fromLatin1(gst_stream_get_stream_id(m_stream.get()));
+    m_id = AtomString::fromLatin1(gst_stream_get_stream_id(m_stream));
     GST_INFO("Track %d got stream start for stream %s.", m_index, m_id.string().utf8().data());
 
-    GST_DEBUG("Stream %" GST_PTR_FORMAT, m_stream.get());
-    auto caps = adoptGRef(gst_stream_get_caps(m_stream.get()));
+    GST_DEBUG("Stream %" GST_PTR_FORMAT, m_stream);
+    auto caps = adoptGRef(gst_stream_get_caps(m_stream));
     const char* mediaType = capsMediaType(caps.get());
     m_kind = g_str_has_prefix(mediaType, "closedcaption/") ? Kind::Captions : Kind::Subtitles;
 }

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h (293530 => 293531)


--- trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h	2022-04-27 20:18:06 UTC (rev 293530)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h	2022-04-27 20:20:30 UTC (rev 293531)
@@ -47,9 +47,9 @@
         return create(index, WTFMove(pad));
     }
 
-    static Ref<InbandTextTrackPrivateGStreamer> create(unsigned index, GRefPtr<GstStream>&& stream)
+    static Ref<InbandTextTrackPrivateGStreamer> create(WeakPtr<MediaPlayerPrivateGStreamer>, unsigned index, GstStream* stream)
     {
-        return adoptRef(*new InbandTextTrackPrivateGStreamer(index, WTFMove(stream)));
+        return adoptRef(*new InbandTextTrackPrivateGStreamer(index, stream));
     }
 
     Kind kind() const final { return m_kind; }
@@ -62,7 +62,7 @@
 
 private:
     InbandTextTrackPrivateGStreamer(unsigned index, GRefPtr<GstPad>&&, bool shouldHandleStreamStartEvent);
-    InbandTextTrackPrivateGStreamer(unsigned index, GRefPtr<GstStream>&&);
+    InbandTextTrackPrivateGStreamer(unsigned index, GstStream*);
 
     void notifyTrackOfSample();
 

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (293530 => 293531)


--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp	2022-04-27 20:18:06 UTC (rev 293530)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp	2022-04-27 20:20:30 UTC (rev 293531)
@@ -87,6 +87,7 @@
 #include <wtf/MathExtras.h>
 #include <wtf/MediaTime.h>
 #include <wtf/NeverDestroyed.h>
+#include <wtf/Scope.h>
 #include <wtf/StdLibExtras.h>
 #include <wtf/StringPrintStream.h>
 #include <wtf/text/AtomString.h>
@@ -981,7 +982,7 @@
     ASSERT(m_isLegacyPlaybin);
 
     using TrackType = TrackPrivateBaseGStreamer::TrackType;
-    std::variant<HashMap<AtomString, RefPtr<AudioTrackPrivateGStreamer>>*, HashMap<AtomString, RefPtr<VideoTrackPrivateGStreamer>>*, HashMap<AtomString, RefPtr<InbandTextTrackPrivateGStreamer>>*> variantTracks = static_cast<HashMap<AtomString, RefPtr<TrackPrivateType>>*>(0);
+    std::variant<HashMap<AtomString, Ref<AudioTrackPrivateGStreamer>>*, HashMap<AtomString, Ref<VideoTrackPrivateGStreamer>>*, HashMap<AtomString, Ref<InbandTextTrackPrivateGStreamer>>*> variantTracks = static_cast<HashMap<AtomString, Ref<TrackPrivateType>>*>(0);
     auto type(static_cast<TrackType>(variantTracks.index()));
     const char* typeName;
     bool* hasType;
@@ -1004,7 +1005,7 @@
     default:
         ASSERT_NOT_REACHED();
     }
-    HashMap<AtomString, RefPtr<TrackPrivateType>>& tracks = *std::get<HashMap<AtomString, RefPtr<TrackPrivateType>>*>(variantTracks);
+    auto& tracks = *std::get<HashMap<AtomString, Ref<TrackPrivateType>>*>(variantTracks);
 
     // Ignore notifications after a EOS. We don't want the tracks to disappear when the video is finished.
     if (m_isEndReached && (type == TrackType::Audio || type == TrackType::Video))
@@ -1057,7 +1058,6 @@
         if (!track->trackIndex() && (type == TrackType::Audio || type == TrackType::Video))
             track->setActive(true);
         ASSERT(streamId == track->id());
-        tracks.add(streamId, track.copyRef());
 
         std::variant<AudioTrackPrivate*, VideoTrackPrivate*, InbandTextTrackPrivate*> variantTrack(&track.get());
         switch (variantTrack.index()) {
@@ -1071,6 +1071,7 @@
             m_player->addTextTrack(*std::get<InbandTextTrackPrivate*>(variantTrack));
             break;
         }
+        tracks.add(streamId, WTFMove(track));
     }
 
     // Purge invalid tracks
@@ -1335,9 +1336,9 @@
 {
     VideoTrackPrivateGStreamer* wantedTrack = nullptr;
     for (auto& pair : m_videoTracks) {
-        VideoTrackPrivateGStreamer* track = pair.value.get();
-        if (track->selected()) {
-            wantedTrack = track;
+        auto& track = pair.value.get();
+        if (track.selected()) {
+            wantedTrack = &track;
             break;
         }
     }
@@ -1359,9 +1360,9 @@
 {
     AudioTrackPrivateGStreamer* wantedTrack = nullptr;
     for (auto& pair : m_audioTracks) {
-        AudioTrackPrivateGStreamer* track = pair.value.get();
-        if (track->enabled()) {
-            wantedTrack = track;
+        auto& track = pair.value.get();
+        if (track.enabled()) {
+            wantedTrack = &track;
             break;
         }
     }
@@ -1399,6 +1400,10 @@
         m_requestedAudioStreamId = m_wantedAudioStreamId;
         streams = g_list_append(streams, g_strdup(m_wantedAudioStreamId.string().utf8().data()));
     }
+    if (!m_wantedTextStreamId.isNull()) {
+        m_requestedTextStreamId = m_wantedTextStreamId;
+        streams = g_list_append(streams, g_strdup(m_wantedTextStreamId.string().utf8().data()));
+    }
 
     if (!streams)
         return;
@@ -1408,14 +1413,10 @@
     g_list_free_full(streams, reinterpret_cast<GDestroyNotify>(g_free));
 }
 
-void MediaPlayerPrivateGStreamer::updateTracks(const GRefPtr<GstStreamCollection>& streamCollection)
+void MediaPlayerPrivateGStreamer::updateTracks(const GRefPtr<GstObject>& collectionOwner)
 {
     ASSERT(!m_isLegacyPlaybin);
 
-    bool useMediaSource = isMediaSource();
-    unsigned length = gst_stream_collection_get_size(streamCollection.get());
-    GST_DEBUG_OBJECT(pipeline(), "Processing a stream collection with %u streams", length);
-
     bool oldHasAudio = m_hasAudio;
     bool oldHasVideo = m_hasVideo;
 
@@ -1433,29 +1434,52 @@
     REMOVE_OLD_TRACKS(video, Video);
     REMOVE_OLD_TRACKS(text, Text);
 
+    auto scopeExit = makeScopeExit([oldHasAudio, oldHasVideo, protectedThis = WeakPtr { *this }, this] {
+        if (!protectedThis)
+            return;
+
+        m_hasAudio = !m_audioTracks.isEmpty();
+        m_hasVideo = !m_videoTracks.isEmpty();
+
+        if (oldHasVideo != m_hasVideo || oldHasAudio != m_hasAudio)
+            m_player->characteristicChanged();
+
+        if (!oldHasVideo && m_hasVideo)
+            m_player->sizeChanged();
+
+        m_player->mediaEngineUpdated();
+    });
+
+    if (!m_streamCollection)
+        return;
+
+    using TextTrackPrivateGStreamer = InbandTextTrackPrivateGStreamer;
+#define CREATE_TRACK(type, Type) G_STMT_START { \
+        auto track = Type##TrackPrivateGStreamer::create(*this, type##TrackIndex, stream); \
+        auto trackId = track->id();                                     \
+        if (!type##TrackIndex) { \
+            m_wanted##Type##StreamId = trackId;                         \
+            m_requested##Type##StreamId = trackId;                      \
+            track->setActive(true);                                     \
+        }                                                               \
+        type##TrackIndex++;                                             \
+        m_player->add##Type##Track(track);                              \
+        m_##type##Tracks.add(trackId, WTFMove(track));                  \
+    } G_STMT_END
+
+    bool useMediaSource = isMediaSource();
     unsigned audioTrackIndex = 0;
     unsigned videoTrackIndex = 0;
     unsigned textTrackIndex = 0;
-
-#define CREATE_TRACK(type, Type) G_STMT_START {                     \
-        RefPtr<Type##TrackPrivateGStreamer> track = Type##TrackPrivateGStreamer::create(*this, type##TrackIndex, WTFMove(stream)); \
-        auto trackId = track->id();                                 \
-        if (!type##TrackIndex) {                                    \
-            m_wanted##Type##StreamId = trackId;                     \
-            m_requested##Type##StreamId = trackId;                  \
-            track->setActive(true);                                 \
-        }                                                           \
-        type##TrackIndex++;                                         \
-        m_##type##Tracks.add(trackId, track);                       \
-        m_player->add##Type##Track(*track);                         \
-    } G_STMT_END
-
+    unsigned length = gst_stream_collection_get_size(m_streamCollection.get());
+    GST_DEBUG_OBJECT(pipeline(), "Received STREAM_COLLECTION message with upstream id \"%s\" from %" GST_PTR_FORMAT " defining the following streams:", gst_stream_collection_get_upstream_id(m_streamCollection.get()), collectionOwner.get());
     for (unsigned i = 0; i < length; i++) {
-        GRefPtr<GstStream> stream = gst_stream_collection_get_stream(streamCollection.get(), i);
-        const char* streamId = gst_stream_get_stream_id(stream.get());
-        auto type = gst_stream_get_stream_type(stream.get());
+        auto* stream = gst_stream_collection_get_stream(m_streamCollection.get(), i);
+        RELEASE_ASSERT(stream);
+        const char* streamId = gst_stream_get_stream_id(stream);
+        auto type = gst_stream_get_stream_type(stream);
 
-        GST_DEBUG_OBJECT(pipeline(), "Inspecting %s track with ID %s", gst_stream_type_get_name(type), streamId);
+        GST_DEBUG_OBJECT(pipeline(), "#%u %s track with ID %s", i, gst_stream_type_get_name(type), streamId);
 
         if (type & GST_STREAM_TYPE_AUDIO) {
             CREATE_TRACK(audio, Audio);
@@ -1462,24 +1486,11 @@
             configureMediaStreamAudioTracks();
         } else if (type & GST_STREAM_TYPE_VIDEO && m_player->isVideoPlayer())
             CREATE_TRACK(video, Video);
-        else if (type & GST_STREAM_TYPE_TEXT && !useMediaSource) {
-            auto track = InbandTextTrackPrivateGStreamer::create(textTrackIndex++, WTFMove(stream));
-            m_textTracks.add(AtomString::fromLatin1(streamId), track.copyRef());
-            m_player->addTextTrack(track.get());
-        } else
+        else if (type & GST_STREAM_TYPE_TEXT && !useMediaSource)
+            CREATE_TRACK(text, Text);
+        else
             GST_WARNING("Unknown track type found for stream %s", streamId);
     }
-
-    m_hasAudio = !m_audioTracks.isEmpty();
-    m_hasVideo = !m_videoTracks.isEmpty();
-
-    if (oldHasVideo != m_hasVideo || oldHasAudio != m_hasAudio)
-        m_player->characteristicChanged();
-
-    if (!oldHasVideo && m_hasVideo)
-        m_player->sizeChanged();
-
-    m_player->mediaEngineUpdated();
 }
 
 void MediaPlayerPrivateGStreamer::videoChangedCallback(MediaPlayerPrivateGStreamer* player)
@@ -1504,23 +1515,11 @@
     }
 
     ASSERT(GST_MESSAGE_TYPE(message) == GST_MESSAGE_STREAM_COLLECTION);
-    GRefPtr<GstStreamCollection> collection;
-    gst_message_parse_stream_collection(message, &collection.outPtr());
-    if (!collection)
-        return;
+    gst_message_parse_stream_collection(message, &m_streamCollection.outPtr());
 
-#ifndef GST_DISABLE_DEBUG
-    GST_DEBUG_OBJECT(pipeline(), "Received STREAM_COLLECTION message with upstream id \"%s\" from %" GST_PTR_FORMAT " defining the following streams:", gst_stream_collection_get_upstream_id(collection.get()), GST_MESSAGE_SRC(message));
-    unsigned numStreams = gst_stream_collection_get_size(collection.get());
-    for (unsigned i = 0; i < numStreams; i++) {
-        GstStream* stream = gst_stream_collection_get_stream(collection.get(), i);
-        GST_DEBUG_OBJECT(pipeline(), "#%u %s %s", i, gst_stream_type_get_name(gst_stream_get_stream_type(stream)), gst_stream_get_stream_id(stream));
-    }
-#endif
-
-    auto callback = [player = WeakPtr { *this }, collection = WTFMove(collection)] {
+    auto callback = [player = WeakPtr { *this }, owner = GRefPtr<GstObject>(GST_MESSAGE_SRC(message))] {
         if (player)
-            player->updateTracks(collection);
+            player->updateTracks(owner);
     };
 
     if (isMediaSource())
@@ -1973,6 +1972,7 @@
         // Therefore, instead of reading the event data, we will just assume our previously requested selection was honored.
         m_currentAudioStreamId = m_requestedAudioStreamId;
         m_currentVideoStreamId = m_requestedVideoStreamId;
+        m_currentTextStreamId = m_requestedTextStreamId;
 
         // It's possible the user made a track switch before the initial STREAMS_SELECED. Now it's a good moment to
         // request it being attended. Note that it's not possible to send a SELECT_STREAMS before the first

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h (293530 => 293531)


--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h	2022-04-27 20:18:06 UTC (rev 293530)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h	2022-04-27 20:20:30 UTC (rev 293531)
@@ -483,7 +483,7 @@
 
     void setPlaybinURL(const URL& urlString);
 
-    void updateTracks(const GRefPtr<GstStreamCollection>&);
+    void updateTracks(const GRefPtr<GstObject>& collectionOwner);
     void videoSinkCapsChanged(GstPad*);
     void updateVideoSizeAndOrientationFromCaps(const GstCaps*);
     bool hasFirstVideoSampleReachedSink() const;
@@ -543,10 +543,13 @@
     bool m_waitingForStreamsSelectedEvent { true };
     AtomString m_currentAudioStreamId; // Currently playing.
     AtomString m_currentVideoStreamId;
+    AtomString m_currentTextStreamId;
     AtomString m_wantedAudioStreamId; // Set in _javascript_.
     AtomString m_wantedVideoStreamId;
+    AtomString m_wantedTextStreamId;
     AtomString m_requestedAudioStreamId; // Expected in the next STREAMS_SELECTED message.
     AtomString m_requestedVideoStreamId;
+    AtomString m_requestedTextStreamId;
 
 #if ENABLE(WEB_AUDIO)
     std::unique_ptr<AudioSourceProviderGStreamer> m_audioSourceProvider;
@@ -553,9 +556,10 @@
 #endif
     GRefPtr<GstElement> m_downloadBuffer;
     Vector<RefPtr<MediaPlayerRequestInstallMissingPluginsCallback>> m_missingPluginCallbacks;
-    HashMap<AtomString, RefPtr<AudioTrackPrivateGStreamer>> m_audioTracks;
-    HashMap<AtomString, RefPtr<InbandTextTrackPrivateGStreamer>> m_textTracks;
-    HashMap<AtomString, RefPtr<VideoTrackPrivateGStreamer>> m_videoTracks;
+
+    HashMap<AtomString, Ref<AudioTrackPrivateGStreamer>> m_audioTracks;
+    HashMap<AtomString, Ref<VideoTrackPrivateGStreamer>> m_videoTracks;
+    HashMap<AtomString, Ref<InbandTextTrackPrivateGStreamer>> m_textTracks;
     RefPtr<InbandMetadataTextTrackPrivateGStreamer> m_chaptersTrack;
 #if USE(GSTREAMER_MPEGTS)
     HashMap<AtomString, RefPtr<InbandMetadataTextTrackPrivateGStreamer>> m_metadataTracks;
@@ -592,6 +596,8 @@
 #if USE(TEXTURE_MAPPER_DMABUF)
     RefPtr<GBMBufferSwapchain> m_swapchain;
 #endif
+
+    GRefPtr<GstStreamCollection> m_streamCollection;
 };
 
 }

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp (293530 => 293531)


--- trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp	2022-04-27 20:18:06 UTC (rev 293530)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp	2022-04-27 20:20:30 UTC (rev 293531)
@@ -85,15 +85,15 @@
     tagsChanged();
 }
 
-TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer(TrackType type, TrackPrivateBase* owner, unsigned index, GRefPtr<GstStream>&& stream)
+TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer(TrackType type, TrackPrivateBase* owner, unsigned index, GstStream* stream)
     : m_notifier(MainThreadNotifier<MainThreadNotification>::create())
     , m_index(index)
-    , m_stream(WTFMove(stream))
+    , m_stream(stream)
     , m_type(type)
     , m_owner(owner)
 {
     ASSERT(m_stream);
-    m_id = AtomString::fromLatin1(gst_stream_get_stream_id(m_stream.get()));
+    m_id = AtomString::fromLatin1(gst_stream_get_stream_id(m_stream));
 
     // We can't call notifyTrackOfTagsChanged() directly, because we need tagsChanged() to setup m_tags.
     tagsChanged();
@@ -135,9 +135,6 @@
 {
     m_tags.clear();
 
-    if (m_stream)
-        m_stream.clear();
-
     m_notifier->cancelPendingNotifications();
 
     if (m_bestUpstreamPad && m_eventProbe) {
@@ -175,7 +172,7 @@
             i++;
         } while (tagEvent);
     } else if (m_stream)
-        tags = adoptGRef(gst_stream_get_tags(m_stream.get()));
+        tags = adoptGRef(gst_stream_get_tags(m_stream));
 
     if (!tags)
         tags = adoptGRef(gst_tag_list_new_empty());

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h (293530 => 293531)


--- trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h	2022-04-27 20:18:06 UTC (rev 293530)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h	2022-04-27 20:20:30 UTC (rev 293531)
@@ -59,7 +59,7 @@
 
     void setIndex(unsigned index) { m_index =  index; }
 
-    GstStream* stream() { return m_stream.get(); }
+    GstStream* stream() const { return m_stream; }
 
     // Used for MSE, where the initial caps of the pad are relevant for initializing the matching pad in the
     // playback pipeline.
@@ -68,7 +68,7 @@
 
 protected:
     TrackPrivateBaseGStreamer(TrackType, TrackPrivateBase*, unsigned index, GRefPtr<GstPad>&&, bool shouldHandleStreamStartEvent);
-    TrackPrivateBaseGStreamer(TrackType, TrackPrivateBase*, unsigned index, GRefPtr<GstStream>&&);
+    TrackPrivateBaseGStreamer(TrackType, TrackPrivateBase*, unsigned index, GstStream*);
 
     void notifyTrackOfTagsChanged();
     void notifyTrackOfStreamChanged();
@@ -86,7 +86,7 @@
     AtomString m_id;
     GRefPtr<GstPad> m_pad;
     GRefPtr<GstPad> m_bestUpstreamPad;
-    GRefPtr<GstStream> m_stream;
+    GstStream* m_stream { nullptr };
     unsigned long m_eventProbe { 0 };
     GRefPtr<GstCaps> m_initialCaps;
 

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp (293530 => 293531)


--- trunk/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp	2022-04-27 20:18:06 UTC (rev 293530)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp	2022-04-27 20:20:30 UTC (rev 293531)
@@ -40,22 +40,22 @@
 {
 }
 
-VideoTrackPrivateGStreamer::VideoTrackPrivateGStreamer(WeakPtr<MediaPlayerPrivateGStreamer> player, unsigned index, GRefPtr<GstStream>&& stream)
-    : TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Video, this, index, WTFMove(stream))
+VideoTrackPrivateGStreamer::VideoTrackPrivateGStreamer(WeakPtr<MediaPlayerPrivateGStreamer> player, unsigned index, GstStream* stream)
+    : TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Video, this, index, stream)
     , m_player(player)
 {
     int kind;
-    auto tags = adoptGRef(gst_stream_get_tags(m_stream.get()));
+    auto tags = adoptGRef(gst_stream_get_tags(m_stream));
 
     if (tags && gst_tag_list_get_int(tags.get(), "webkit-media-stream-kind", &kind) && kind == static_cast<int>(VideoTrackPrivate::Kind::Main)) {
-        auto streamFlags = gst_stream_get_stream_flags(m_stream.get());
-        gst_stream_set_stream_flags(m_stream.get(), static_cast<GstStreamFlags>(streamFlags | GST_STREAM_FLAG_SELECT));
+        auto streamFlags = gst_stream_get_stream_flags(m_stream);
+        gst_stream_set_stream_flags(m_stream, static_cast<GstStreamFlags>(streamFlags | GST_STREAM_FLAG_SELECT));
     }
 
-    g_signal_connect_swapped(m_stream.get(), "notify::caps", G_CALLBACK(+[](VideoTrackPrivateGStreamer* track) {
+    g_signal_connect_swapped(m_stream, "notify::caps", G_CALLBACK(+[](VideoTrackPrivateGStreamer* track) {
         track->updateConfigurationFromCaps();
     }), this);
-    g_signal_connect_swapped(m_stream.get(), "notify::tags", G_CALLBACK(+[](VideoTrackPrivateGStreamer* track) {
+    g_signal_connect_swapped(m_stream, "notify::tags", G_CALLBACK(+[](VideoTrackPrivateGStreamer* track) {
         track->updateConfigurationFromTags();
     }), this);
 
@@ -65,7 +65,7 @@
 
 void VideoTrackPrivateGStreamer::updateConfigurationFromTags()
 {
-    auto tags = adoptGRef(gst_stream_get_tags(m_stream.get()));
+    auto tags = adoptGRef(gst_stream_get_tags(m_stream));
     unsigned bitrate;
     if (!tags || !gst_tag_list_get_uint(tags.get(), GST_TAG_BITRATE, &bitrate))
         return;
@@ -79,7 +79,7 @@
 
 void VideoTrackPrivateGStreamer::updateConfigurationFromCaps()
 {
-    auto caps = adoptGRef(gst_stream_get_caps(m_stream.get()));
+    auto caps = adoptGRef(gst_stream_get_caps(m_stream));
     if (!caps || !gst_caps_is_fixed(caps.get()))
         return;
 
@@ -165,7 +165,7 @@
 
 VideoTrackPrivate::Kind VideoTrackPrivateGStreamer::kind() const
 {
-    if (m_stream.get() && gst_stream_get_stream_flags(m_stream.get()) & GST_STREAM_FLAG_SELECT)
+    if (m_stream && gst_stream_get_stream_flags(m_stream) & GST_STREAM_FLAG_SELECT)
         return VideoTrackPrivate::Kind::Main;
 
     return VideoTrackPrivate::kind();
@@ -174,7 +174,7 @@
 void VideoTrackPrivateGStreamer::disconnect()
 {
     if (m_stream)
-        g_signal_handlers_disconnect_matched(m_stream.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this);
+        g_signal_handlers_disconnect_matched(m_stream, G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this);
 
     m_player = nullptr;
     TrackPrivateBaseGStreamer::disconnect();

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.h (293530 => 293531)


--- trunk/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.h	2022-04-27 20:18:06 UTC (rev 293530)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.h	2022-04-27 20:20:30 UTC (rev 293531)
@@ -43,9 +43,9 @@
         return adoptRef(*new VideoTrackPrivateGStreamer(player, index, WTFMove(pad), shouldHandleStreamStartEvent));
     }
 
-    static Ref<VideoTrackPrivateGStreamer> create(WeakPtr<MediaPlayerPrivateGStreamer> player, unsigned index, GRefPtr<GstStream>&& stream)
+    static Ref<VideoTrackPrivateGStreamer> create(WeakPtr<MediaPlayerPrivateGStreamer> player, unsigned index, GstStream* stream)
     {
-        return adoptRef(*new VideoTrackPrivateGStreamer(player, index, WTFMove(stream)));
+        return adoptRef(*new VideoTrackPrivateGStreamer(player, index, stream));
     }
 
     Kind kind() const final;
@@ -67,7 +67,7 @@
 
 private:
     VideoTrackPrivateGStreamer(WeakPtr<MediaPlayerPrivateGStreamer>, unsigned index, GRefPtr<GstPad>&&, bool shouldHandleStreamStartEvent);
-    VideoTrackPrivateGStreamer(WeakPtr<MediaPlayerPrivateGStreamer>, unsigned index, GRefPtr<GstStream>&&);
+    VideoTrackPrivateGStreamer(WeakPtr<MediaPlayerPrivateGStreamer>, unsigned index, GstStream*);
 
     WeakPtr<MediaPlayerPrivateGStreamer> m_player;
 };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to