Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 14cb80d8a004ff61c5550db2b35f7c0d66771313
https://github.com/WebKit/WebKit/commit/14cb80d8a004ff61c5550db2b35f7c0d66771313
Author: Enrique Ocaña González <[email protected]>
Date: 2025-04-04 (Fri, 04 Apr 2025)
Changed paths:
M Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp
M
Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp
M Source/WebCore/platform/gstreamer/GStreamerQuirkAmLogic.h
M Source/WebCore/platform/gstreamer/GStreamerQuirkBroadcom.h
M Source/WebCore/platform/gstreamer/GStreamerQuirkRealtek.h
M Source/WebCore/platform/gstreamer/GStreamerQuirkRialto.h
M Source/WebCore/platform/gstreamer/GStreamerQuirkWesteros.h
M Source/WebCore/platform/gstreamer/GStreamerQuirks.cpp
M Source/WebCore/platform/gstreamer/GStreamerQuirks.h
Log Message:
-----------
[GStreamer][Quirks] Add quirk supporting instant rate change with custom event
https://bugs.webkit.org/show_bug.cgi?id=290933
Reviewed by Xabier Rodriguez-Calvar.
Some downstream platforms don't use GstClock for audio/video
synchronization, don't support existing
GST_SEEK_FLAG_INSTANT_RATE_CHANGE, or it doesn't work well in all use
cases.
This patch uses a "custom-instant-rate-change" custom OOB downstream
event sent by MediaPlayerPrivateGStreamer to the pipeline. That event is
then processed by WebKitMediaSrcGStreamer, who forwards it to all its
src pads and checks that it has been processed in all the streams. If
that happens, the rate field is updated in the GstSegment and regular
media processing continues.
As this is platform-specific behaviour, both MediaPlayerPrivateGStreamer
and WebKitMediaSrc delegate part of the implementation to the GStreamer
Quirks system. The custom event added in this patch needs to be
forwarded to all the pads, instead of just to the first one processing
it. This needs a behaviour change in webKitMediaSrcSendEvent(), but only
for specific cases (the regular case is to forward it to the first pad
attending it), and that's why the analyzeWebKitMediaSrcCustomEvent()
method is needed in the Quirks.
As a style choice, the quirk functions that need to return one or more
meaningful values do that directly (as a direct return type), optionally,
or by means of an std::pair. In all those cases, the "meaning" of each
value is named in a /* comment */ after the type. If this scheme evolves
in the future and the methods need to return more fields, and std::pair
or even a specific struct with the field names should be used. Ideally,
we might have used structs in this patch, but creating a struct to hold
a single value doesn't seem sensible at this point.
This patch is co-authored by Eugene Mutavchi <[email protected]>
See: https://github.com/WebPlatformForEmbedded/WPEWebKit/pull/1475
* Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
(WebCore::MediaPlayerPrivateGStreamer::updatePlaybackRate): Apply (by
delegating to the Quirks) custom instant rate change in those platforms that
need, instead of doing a seek to change it. Update the last playback rate if
the change succeeded.
(WebCore::MediaPlayerPrivateGStreamer::createGSTPlayBin): Don't use the
scaletempo element on platforms that rely on instant rate change.
* Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp:
(webKitMediaSrcStreamFlush): Update the GstSegment rate to the one currently
configured in WebKitMediaSrcGStreamer (which might have been set when
processing the "custom-instant-rate-change" event)
(webKitMediaSrcSendEvent): Added code to process OOB custom events (in
general), by delegating in the Quirks. The Quirks can now decide if the event
has to be propagated to all the pads or only to the first one processing it
(default behaviour). In the specific case of the "custom-instant-rate-change"
event, the Quirks will decide to propagate to all the pads, and the result of
the propagation will be communicated to the Quirks, which will then decide to
update the rate stored by WebKitMediaSourceGStreamer if the propagation was
successful.in that case
* Source/WebCore/platform/gstreamer/GStreamerQuirkAmLogic.h: Override default
behaviour and enable custom instant rate change on this platform.
* Source/WebCore/platform/gstreamer/GStreamerQuirkBroadcom.h: Ditto.
* Source/WebCore/platform/gstreamer/GStreamerQuirkRealtek.h: Ditto.
* Source/WebCore/platform/gstreamer/GStreamerQuirkRialto.h: Ditto.
* Source/WebCore/platform/gstreamer/GStreamerQuirkWesteros.h: Ditto.
* Source/WebCore/platform/gstreamer/GStreamerQuirks.cpp:
(WebCore::GStreamerQuirksManager::needsCustomInstantRateChange const): True if
any registered quirk needs instant rate change. Evaluated in short-circuit (if
one quirk is true, evaluation stops).
(WebCore::GStreamerQuirksManager::applyCustomInstantRateChange const): Returns
a pair with a first field indicating that the request to apply the instant rate
has been processed (acknowledged by the first quirk that needs instant rate
change), and a second field indicating if the instant rate change succeeded
(was actually performed). Look at the GStreamerQuirk implementation for an
explanation of what this method does.
(WebCore::GStreamerQuirksManager::analyzeWebKitMediaSrcCustomEvent const):
Returns true if the first quirk that needs instant rate change indicates that
the OOB event needs to be forwarded by all the src pads.
(WebCore::GStreamerQuirksManager::processWebKitMediaSrcCustomEvent const):
Returns an optional new rate if the the first quirk that needs instant rate
change has been able to retrieve a rate from the event (the event is of the
"custom-instant-rate-change" kind and has a rate).
(WebCore::GStreamerQuirk::applyCustomInstantRateChange const): Default
implementation (to be inherited/reused by the subclasses) to perform instant
rate change on already playing pipelines. A "custom-instant-rate-change" event
is sent to the pipeline, and the pipeline mute status is updated accordingly.
This implementation is guarded, so it won't run in case of the method being
called by mistake on platforms not supporting custom instant rate changes.
(WebCore::GStreamerQuirk::analyzeWebKitMediaSrcCustomEvent const): Default
guarded implementation to determine if the custom event must be forwarded to
all the streams/pads (required for "custom-instant-rate-change" on platforms
supporting it) or only to the first one successfully processing it (default
behaviour for the rest of the events).
(WebCore::GStreamerQuirk::processWebKitMediaSrcCustomEvent const): Default
guarded implementation to extract the rate from the
"custom-instant-rate-change" event, so that WebKitMediaSrcGStreamer can update
its stored rate with that parsed value. This is a method with a parameter
passed by reference (to store the result there), instead of returned as a
method result, because that's the common way to do it in GStreamer parse
functions (this operation is similar to a parsing). This design can better
accept future evolution, where other fields may need to be provided by the
analysis performed in this method.
* Source/WebCore/platform/gstreamer/GStreamerQuirks.h:
(WebCore::GStreamerQuirk::needsCustomInstantRateChange const): False by
default, meaning that custom instant rate change isn't required on the
platforms that don't override this method.
Canonical link: https://commits.webkit.org/293255@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