Skip to content

Commit 366d5b1

Browse files
philncalvaris
authored andcommitted
[GStreamer] Implement "id" property for in-band audio, text and video tracks
https://bugs.webkit.org/show_bug.cgi?id=123901 Reviewed by Xabier Rodriguez-Calvar. Support for container-specific-track-id GStreamer tag was implemented in: https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6041 Which is scheduled to ship in GStreamer 1.24. The demuxers supported initially are DASH, qtdemux and matroskademux, so we have coverage for the most common formats. * LayoutTests/platform/glib/TestExpectations: * Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp: (WebCore::AudioTrackPrivateGStreamer::updateConfigurationFromTags): * Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.h: * Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp: (WebCore::ensureTextTrackDebugCategoryInitialized): (WebCore::InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer): (WebCore::InbandTextTrackPrivateGStreamer::tagsChanged): * Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h: * Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp: (WebCore::VideoTrackPrivateGStreamer::updateConfigurationFromTags): * Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.h: Canonical link: https://commits.webkit.org/274623@main
1 parent cd1fdb8 commit 366d5b1

7 files changed

Lines changed: 65 additions & 7 deletions

File tree

LayoutTests/platform/glib/TestExpectations

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1060,7 +1060,7 @@ webkit.org/b/213699 http/wpt/mediarecorder/MediaRecorder-AV-audio-video-dataavai
10601060
webkit.org/b/218317 media/media-source/media-source-trackid-change.html [ Failure ]
10611061
webkit.org/b/238201 media/media-source/media-mp4-hevc-bframes.html [ Failure ]
10621062

1063-
# GStreamer doesn't set the track's id to the container's value.
1063+
# GStreamer (< 1.24) doesn't set the track's id to the container's value.
10641064
webkit.org/b/265919 media/track/media-audio-track.html [ Failure ]
10651065
webkit.org/b/265919 media/track/media-source-audio-track.html [ Failure ]
10661066

Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "GStreamerCommon.h"
3333
#include "MediaPlayerPrivateGStreamer.h"
3434
#include <wtf/Scope.h>
35+
#include <wtf/text/StringToIntegerConversion.h>
3536

3637
namespace WebCore {
3738

@@ -93,6 +94,16 @@ void AudioTrackPrivateGStreamer::updateConfigurationFromTags(const GRefPtr<GstTa
9394
if (!tags)
9495
return;
9596

97+
GUniqueOutPtr<char> trackIDString;
98+
if (gst_tag_list_get_string(tags.get(), "container-specific-track-id", &trackIDString.outPtr())) {
99+
if (auto trackID = WTF::parseInteger<TrackID>(StringView { trackIDString.get(), static_cast<unsigned>(strlen(trackIDString.get())) })) {
100+
m_trackID = *trackID;
101+
GST_DEBUG_OBJECT(objectForLogging(), "Audio track ID set from container-specific-track-id tag %" G_GUINT64_FORMAT, *m_trackID);
102+
m_stringId = AtomString::number(static_cast<unsigned long long>(*m_trackID));
103+
client()->idChanged(*m_trackID);
104+
}
105+
}
106+
96107
unsigned bitrate;
97108
if (!gst_tag_list_get_uint(tags.get(), GST_TAG_BITRATE, &bitrate))
98109
return;

Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class AudioTrackPrivateGStreamer final : public AudioTrackPrivate, public TrackP
5656

5757
int trackIndex() const final { return m_index; }
5858

59-
TrackID id() const final { return m_index; }
59+
TrackID id() const final { return m_trackID.value_or(m_index); }
6060
std::optional<AtomString> trackUID() const final { return m_stringId; }
6161
AtomString label() const final { return m_label; }
6262
AtomString language() const final { return m_language; }
@@ -73,6 +73,7 @@ class AudioTrackPrivateGStreamer final : public AudioTrackPrivate, public TrackP
7373
AudioTrackPrivateGStreamer(WeakPtr<MediaPlayerPrivateGStreamer>, unsigned index, GstStream*);
7474

7575
WeakPtr<MediaPlayerPrivateGStreamer> m_player;
76+
std::optional<TrackID> m_trackID;
7677
};
7778

7879
} // namespace WebCore

Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,23 +30,37 @@
3030
#include "InbandTextTrackPrivateGStreamer.h"
3131

3232
#include <wtf/Lock.h>
33-
34-
GST_DEBUG_CATEGORY_EXTERN(webkit_media_player_debug);
35-
#define GST_CAT_DEFAULT webkit_media_player_debug
33+
#include <wtf/text/StringToIntegerConversion.h>
3634

3735
namespace WebCore {
3836

37+
GST_DEBUG_CATEGORY(webkit_text_track_debug);
38+
#define GST_CAT_DEFAULT webkit_text_track_debug
39+
40+
static void ensureTextTrackDebugCategoryInitialized()
41+
{
42+
static std::once_flag debugRegisteredFlag;
43+
std::call_once(debugRegisteredFlag, [] {
44+
GST_DEBUG_CATEGORY_INIT(webkit_text_track_debug, "webkittexttrack", 0, "WebKit Text Track");
45+
});
46+
}
47+
3948
InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer(unsigned index, GRefPtr<GstPad>&& pad, bool shouldHandleStreamStartEvent)
4049
: InbandTextTrackPrivate(CueFormat::WebVTT)
4150
, TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Text, this, index, WTFMove(pad), shouldHandleStreamStartEvent)
4251
, m_kind(Kind::Subtitles)
4352
{
53+
ensureTextTrackDebugCategoryInitialized();
54+
installUpdateConfigurationHandlers();
4455
}
4556

4657
InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer(unsigned index, GstStream* stream)
4758
: InbandTextTrackPrivate(CueFormat::WebVTT)
4859
, TrackPrivateBaseGStreamer(TrackPrivateBaseGStreamer::TrackType::Text, this, index, stream)
4960
{
61+
ensureTextTrackDebugCategoryInitialized();
62+
installUpdateConfigurationHandlers();
63+
5064
GST_INFO("Track %d got stream start for stream %s.", m_index, m_stringId.string().utf8().data());
5165

5266
GST_DEBUG("Stream %" GST_PTR_FORMAT, m_stream.get());
@@ -55,6 +69,22 @@ InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer(unsigned index,
5569
m_kind = g_str_has_prefix(mediaType, "closedcaption/") ? Kind::Captions : Kind::Subtitles;
5670
}
5771

72+
void InbandTextTrackPrivateGStreamer::tagsChanged(GRefPtr<GstTagList>&& tags)
73+
{
74+
if (!tags)
75+
return;
76+
77+
GUniqueOutPtr<char> trackIDString;
78+
if (gst_tag_list_get_string(tags.get(), "container-specific-track-id", &trackIDString.outPtr())) {
79+
if (auto trackID = WTF::parseInteger<TrackID>(StringView { trackIDString.get(), static_cast<unsigned>(strlen(trackIDString.get())) })) {
80+
m_trackID = *trackID;
81+
GST_DEBUG_OBJECT(objectForLogging(), "Text track ID set from container-specific-track-id tag %" G_GUINT64_FORMAT, *m_trackID);
82+
m_stringId = AtomString::number(static_cast<unsigned long long>(*m_trackID));
83+
client()->idChanged(*m_trackID);
84+
}
85+
}
86+
}
87+
5888
void InbandTextTrackPrivateGStreamer::handleSample(GRefPtr<GstSample> sample)
5989
{
6090
{

Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,17 @@ class InbandTextTrackPrivateGStreamer : public InbandTextTrackPrivate, public Tr
5353
}
5454

5555
Kind kind() const final { return m_kind; }
56-
TrackID id() const final { return m_index; }
56+
TrackID id() const final { return m_trackID.value_or(m_index); }
5757
std::optional<AtomString> trackUID() const final { return m_stringId; }
5858
AtomString label() const final { return m_label; }
5959
AtomString language() const final { return m_language; }
6060
int trackIndex() const final { return m_index; }
6161

6262
void handleSample(GRefPtr<GstSample>);
6363

64+
protected:
65+
void tagsChanged(GRefPtr<GstTagList>&&) final;
66+
6467
private:
6568
InbandTextTrackPrivateGStreamer(unsigned index, GRefPtr<GstPad>&&, bool shouldHandleStreamStartEvent);
6669
InbandTextTrackPrivateGStreamer(unsigned index, GstStream*);
@@ -70,6 +73,7 @@ class InbandTextTrackPrivateGStreamer : public InbandTextTrackPrivate, public Tr
7073
Vector<GRefPtr<GstSample>> m_pendingSamples WTF_GUARDED_BY_LOCK(m_sampleMutex);
7174
Kind m_kind;
7275
Lock m_sampleMutex;
76+
std::optional<TrackID> m_trackID;
7377
};
7478

7579
} // namespace WebCore

Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "GStreamerCommon.h"
3333
#include "MediaPlayerPrivateGStreamer.h"
3434
#include <wtf/Scope.h>
35+
#include <wtf/text/StringToIntegerConversion.h>
3536

3637
namespace WebCore {
3738

@@ -93,6 +94,16 @@ void VideoTrackPrivateGStreamer::updateConfigurationFromTags(const GRefPtr<GstTa
9394
if (!tags)
9495
return;
9596

97+
GUniqueOutPtr<char> trackIDString;
98+
if (gst_tag_list_get_string(tags.get(), "container-specific-track-id", &trackIDString.outPtr())) {
99+
if (auto trackID = WTF::parseInteger<TrackID>(StringView { trackIDString.get(), static_cast<unsigned>(strlen(trackIDString.get())) })) {
100+
m_trackID = *trackID;
101+
GST_DEBUG_OBJECT(objectForLogging(), "Video track ID set from container-specific-track-id tag %" G_GUINT64_FORMAT, *m_trackID);
102+
m_stringId = AtomString::number(static_cast<unsigned long long>(*m_trackID));
103+
client()->idChanged(*m_trackID);
104+
}
105+
}
106+
96107
unsigned bitrate;
97108
if (!gst_tag_list_get_uint(tags.get(), GST_TAG_BITRATE, &bitrate))
98109
return;

Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class VideoTrackPrivateGStreamer final : public VideoTrackPrivate, public TrackP
5757

5858
int trackIndex() const final { return m_index; }
5959

60-
TrackID id() const final { return m_index; }
60+
TrackID id() const final { return m_trackID.value_or(m_index); }
6161
std::optional<AtomString> trackUID() const final { return m_stringId; }
6262
AtomString label() const final { return m_label; }
6363
AtomString language() const final { return m_language; }
@@ -74,6 +74,7 @@ class VideoTrackPrivateGStreamer final : public VideoTrackPrivate, public TrackP
7474
VideoTrackPrivateGStreamer(WeakPtr<MediaPlayerPrivateGStreamer>, unsigned index, GstStream*);
7575

7676
WeakPtr<MediaPlayerPrivateGStreamer> m_player;
77+
std::optional<TrackID> m_trackID;
7778
};
7879

7980
} // namespace WebCore

0 commit comments

Comments
 (0)