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;
};