Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 7a7367fb8f432c911a00f234ec49949324ca69ef
      
https://github.com/WebKit/WebKit/commit/7a7367fb8f432c911a00f234ec49949324ca69ef
  Author: Vivienne Watermeier <[email protected]>
  Date:   2024-11-13 (Wed, 13 Nov 2024)

  Changed paths:
    M Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp
    M Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.h
    M Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp
    M Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h
    M 
Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp
    M 
Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h
    M Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
    M Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h
    M Source/WebCore/platform/graphics/gstreamer/TextSinkGStreamer.cpp
    M Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp
    M Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h
    M Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp
    M Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.h
    M Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp
    M Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.h
    M 
Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp
    M 
Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.cpp
    M 
Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.h
    M 
Source/WebCore/platform/graphics/gstreamer/mse/MediaSourceTrackGStreamer.cpp
    M Source/WebCore/platform/graphics/gstreamer/mse/MediaSourceTrackGStreamer.h
    M 
Source/WebCore/platform/graphics/gstreamer/mse/SourceBufferPrivateGStreamer.cpp
    M 
Source/WebCore/platform/graphics/gstreamer/mse/SourceBufferPrivateGStreamer.h
    M Source/WebCore/platform/graphics/gstreamer/mse/TrackQueue.cpp
    M Source/WebCore/platform/graphics/gstreamer/mse/TrackQueue.h
    M 
Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp
    M 
Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.h

  Log Message:
  -----------
  [GStreamer] Use integers as track ID instead of AtomString
https://bugs.webkit.org/show_bug.cgi?id=270638

Reviewed by Philippe Normand.

Switch to using integers for track IDs internally instead of AtomString.

Some notable special cases:
- as MediaStream tracks are recommended by the spec to use UUID strings,
  we just truncate it to 64 bits for the internal TrackID,
  and return the full ID as String (stored in m_gstStreamId) in `trackUID()`
- In MSE, there is the potential for multiple SourceBuffers providing tracks
  with identical IDs. Previously, this was less of an issue since IDs were
  also based on track type, so two tracks "A0" and "V0" would still have
  distinct IDs. However, now they would both get ID 0, and one would get
  dropped in `MediaSourceTrackGStreamer::filterOutRepeatingTracks`
  To work around this, AppendPipeline will register any IDs it creates
  with `MediaSourcePrivateGStreamer::m_trackIdRegistry`, which will
  assign different IDs in case of a collision.
  There has been some consideration as to where to place this registry,
  and how to assign fallback IDs, which is both explained in comments.
  One test that produced these collisions is:
  
imported/w3c/web-platform-tests/encrypted-media/clearkey-mp4-playback-temporary-waitingforkey.https.html

* Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.cpp:
(WebCore::AudioTrackPrivateGStreamer::AudioTrackPrivateGStreamer):
Add constructor with an explicit TrackID argument.
(WebCore::AudioTrackPrivateGStreamer::capsChanged):
* Source/WebCore/platform/graphics/gstreamer/AudioTrackPrivateGStreamer.h:
(WebCore::AudioTrackPrivateGStreamer::create):

* Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp:
(WebCore::getTrackIdFromPad): wrapper around gst_pad_get_stream_id, parses 
stream-id into a TrackID
(WebCore::getTrackIdFromStream): ditto, wraps around gst_stream_get_stream_id
(WebCore::trackIdFromString): parses a stream-id.
Can handle plain integers, the qtdemux-style ".../<ID>" format, and UUIDs.
* Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h:

* 
Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.cpp:
(WebCore::InbandTextTrackPrivateGStreamer::InbandTextTrackPrivateGStreamer):
Add constructor with an explicit TrackID argument.
* Source/WebCore/platform/graphics/gstreamer/InbandTextTrackPrivateGStreamer.h:
(WebCore::InbandTextTrackPrivateGStreamer::create):

* Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivateGStreamer::notifyPlayerOfTrack):
(WebCore::MediaPlayerPrivateGStreamer::handleTextSample):
(WebCore::MediaPlayerPrivateGStreamer::updateEnabledVideoTrack):
(WebCore::MediaPlayerPrivateGStreamer::updateEnabledAudioTrack):
(WebCore::MediaPlayerPrivateGStreamer::playbin3SendSelectStreamsIfAppropriate):
(WebCore::MediaPlayerPrivateGStreamer::updateTracks):
(WebCore::MediaPlayerPrivateGStreamer::setupCodecProbe):
(WebCore::MediaPlayerPrivateGStreamer::codecForStreamId):
* Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:

* Source/WebCore/platform/graphics/gstreamer/TextSinkGStreamer.cpp:
(webkitTextSinkHandleSample):

* Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp:
(WebCore::TrackPrivateBaseGStreamer::TrackPrivateBaseGStreamer):
Add constructor with an explicit TrackID argument.
Sets the new m_shouldUsePadStreamId field false, to avoid the ID being changed 
elsewhere.
(WebCore::TrackPrivateBaseGStreamer::setPad):
(WebCore::TrackPrivateBaseGStreamer::notifyTrackOfStreamChanged):
(WebCore::TrackPrivateBaseGStreamer::installUpdateConfigurationHandlers):
(WebCore::TrackPrivateBaseGStreamer::updateTrackIDFromTags):
(WebCore::TrackPrivateBaseGStreamer::prefixForType): Deleted.
(WebCore::trimStreamId): Deleted.
(WebCore::TrackPrivateBaseGStreamer::generateUniquePlaybin2StreamID): Deleted.
(WebCore::TrackPrivateBaseGStreamer::trackIdFromPadStreamStartOrUniqueID): 
Deleted.
(WebCore::TrackPrivateBaseGStreamer::trackIdFromStringIdOrIndex): Deleted.
* Source/WebCore/platform/graphics/gstreamer/TrackPrivateBaseGStreamer.h:
(WebCore::TrackPrivateBaseGStreamer::streamId const):
Added, returns m_id. This is different to TrackPrivateBase::id(), since
its implementations first try to return the ID derived from the
container-specific-track-id tag if available.
(WebCore::TrackPrivateBaseGStreamer::gstStreamId const): Added.
(WebCore::TrackPrivateBaseGStreamer::capsChanged):
(WebCore::TrackPrivateBaseGStreamer::stringId const): Deleted.
- Removed m_stringId, instead using m_id everywhere.
- Added m_gstStreamId, storing the stream-id string as reported by
  GStreamer.

* Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp:
(WebCore::VideoTrackPrivateGStreamer::VideoTrackPrivateGStreamer):
(WebCore::VideoTrackPrivateGStreamer::capsChanged):
* Source/WebCore/platform/graphics/gstreamer/VideoTrackPrivateGStreamer.h:
Added constructor with an explicit TrackID argument.

* Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.cpp:
(WebCore::AppendPipeline::~AppendPipeline):
(WebCore::AppendPipeline::didReceiveInitializationSegment):
(WebCore::createOptionalParserForFormat):
(WebCore::AppendPipeline::recycleTrackForPad):
(WebCore::AppendPipeline::linkPadWithTrack):
(WebCore::AppendPipeline::makeWebKitTrack):
Explicitly construct tracks with our IDs, as relying on
TrackPrivateBaseGStreamer to pick one up from stream-id risks collisions.
(WebCore::AppendPipeline::Track::emplaceOptionalParserForFormat):
(WebCore::AppendPipeline::generateTrackId): Deleted.
* Source/WebCore/platform/graphics/gstreamer/mse/AppendPipeline.h:
(WebCore::AppendPipeline::Track::Track):
(WebCore::AppendPipeline::tryCreateTrackFromPad):
Instead of generating an ID based on track type and index, parse stream-id,
and add it to the registry so potential ID collisions can be caught and avoided.

* 
Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp:
(WebCore::filterOutRepeatingTracks):

* 
Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.cpp:
(WebCore::MediaSourcePrivateGStreamer::registerTrackId): Added.
(WebCore::MediaSourcePrivateGStreamer::unregisterTrackId): Added.
* Source/WebCore/platform/graphics/gstreamer/mse/MediaSourcePrivateGStreamer.h:
- Added m_trackIdRegistry, to be used by AppendPipeline.

* Source/WebCore/platform/graphics/gstreamer/mse/MediaSourceTrackGStreamer.cpp:
(WebCore::MediaSourceTrackGStreamer::MediaSourceTrackGStreamer):
(WebCore::MediaSourceTrackGStreamer::create):
* Source/WebCore/platform/graphics/gstreamer/mse/MediaSourceTrackGStreamer.h:

* 
Source/WebCore/platform/graphics/gstreamer/mse/SourceBufferPrivateGStreamer.cpp:
(WebCore::SourceBufferPrivateGStreamer::flush):
(WebCore::SourceBufferPrivateGStreamer::allSamplesInTrackEnqueued):
(WebCore::SourceBufferPrivateGStreamer::precheckInitializationSegment):
(WebCore::SourceBufferPrivateGStreamer::tryRegisterTrackId):
Added, calls `MediaSourcePrivateGStreamer` to try to register an ID.
(WebCore::SourceBufferPrivateGStreamer::tryUnregisterTrackId): ditto
* Source/WebCore/platform/graphics/gstreamer/mse/SourceBufferPrivateGStreamer.h:

* Source/WebCore/platform/graphics/gstreamer/mse/TrackQueue.cpp:
(WebCore::TrackQueue::TrackQueue):
(WebCore::TrackQueue::enqueueObject):
(WebCore::TrackQueue::clear):
(WebCore::TrackQueue::flush):
(WebCore::TrackQueue::notifyWhenLowLevel):
(WebCore::TrackQueue::pop):
(WebCore::TrackQueue::notifyWhenNotEmpty):
(WebCore::TrackQueue::resetNotEmptyHandler):
(WebCore::TrackQueue::checkLowLevel):
* Source/WebCore/platform/graphics/gstreamer/mse/TrackQueue.h:

* Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp:
(WebKitMediaSrcPrivate::streamById): Renamed from streamByName.
(dumpPipeline):
(webKitMediaSrcEmitStreams):
(webKitMediaSrcTearDownStream):
(webKitMediaSrcLoop):
(webKitMediaSrcStreamFlush):
(webKitMediaSrcFlush):
(WebKitMediaSrcPrivate::streamByName): Deleted.
* Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.h:

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



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to