Skip to content

Commit 5813c1e

Browse files
committed
[GStreamer][WPE] Replace platform ifdefs with runtime quirks
https://bugs.webkit.org/show_bug.cgi?id=269287 Reviewed by Xabier Rodriguez-Calvar. Compile-time quirks prevent re-usability of the same binaries across different platforms (using containers). The proposed solution is to always compile those, they don't depend on any specific APIs so that shouldn't be an issue. Then at runtime quirks can be tweaked using the WEBKIT_GST_QUIRKS and WEBKIT_GST_HOLE_PUNCH environment variables. * Source/WebCore/platform/SourcesGStreamer.txt: * Source/WebCore/platform/audio/gstreamer/AudioDestinationGStreamer.cpp: (WebCore::AudioDestinationGStreamer::AudioDestinationGStreamer): * Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp: (WebCore::decodebinAutoplugSelectCallback): (WebCore::AudioFileReader::~AudioFileReader): (WebCore::AudioFileReader::decodeAudioForBusCreation): * Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp: (WebCore::ensureGStreamerInitialized): (WebCore::registerWebKitGStreamerElements): * Source/WebCore/platform/graphics/gstreamer/GStreamerRegistryScanner.cpp: (WebCore::GStreamerRegistryScanner::ElementFactories::ElementFactories): (WebCore::GStreamerRegistryScanner::ElementFactories::hasElementForCaps const): * Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp: (WebCore::MediaPlayerPrivateGStreamer::MediaPlayerPrivateGStreamer): (WebCore::MediaPlayerPrivateGStreamer::~MediaPlayerPrivateGStreamer): (WebCore::setSyncOnClock): (WebCore::MediaPlayerPrivateGStreamer::createAudioSink): (WebCore::MediaPlayerPrivateGStreamer::gstreamerPositionFromSinks const): (WebCore::MediaPlayerPrivateGStreamer::naturalSize const): (WebCore::MediaPlayerPrivateGStreamer::handleMessage): (WebCore::MediaPlayerPrivateGStreamer::configureElement): (WebCore::MediaPlayerPrivateGStreamer::configureElementPlatformQuirks): (WebCore::MediaPlayerPrivateGStreamer::createGSTPlayBin): (WebCore::MediaPlayerPrivateGStreamer::swapBuffersIfNeeded): (WebCore::setRectangleToVideoSink): (WebCore::MediaPlayerPrivateGStreamer::isHolePunchRenderingEnabled const): (WebCore::MediaPlayerPrivateGStreamer::createHolePunchVideoSink): (WebCore::MediaPlayerPrivateGStreamer::shouldIgnoreIntrinsicSize): (WebCore::MediaPlayerPrivateGStreamer::createVideoSink): * Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h: * Source/WebCore/platform/gstreamer/GStreamerHolePunchQuirkBcmNexus.cpp: Added. (WebCore::GStreamerHolePunchQuirkBcmNexus::setHolePunchVideoRectangle): * Source/WebCore/platform/gstreamer/GStreamerHolePunchQuirkBcmNexus.h: Added. * Source/WebCore/platform/gstreamer/GStreamerHolePunchQuirkWesteros.cpp: Added. (WebCore::GStreamerHolePunchQuirkWesteros::createHolePunchVideoSink): (WebCore::GStreamerHolePunchQuirkWesteros::setHolePunchVideoRectangle): * Source/WebCore/platform/gstreamer/GStreamerHolePunchQuirkWesteros.h: Added. * Source/WebCore/platform/gstreamer/GStreamerQuirkAmLogic.cpp: Added. (WebCore::GStreamerQuirkAmLogic::GStreamerQuirkAmLogic): (WebCore::GStreamerQuirkAmLogic::createWebAudioSink): (WebCore::GStreamerQuirkAmLogic::configureElement): * Source/WebCore/platform/gstreamer/GStreamerQuirkAmLogic.h: Added. * Source/WebCore/platform/gstreamer/GStreamerQuirkBcmNexus.cpp: Added. (WebCore::GStreamerQuirkBcmNexus::GStreamerQuirkBcmNexus): (WebCore::GStreamerQuirkBcmNexus::isHardwareAccelerated): * Source/WebCore/platform/gstreamer/GStreamerQuirkBcmNexus.h: Added. * Source/WebCore/platform/gstreamer/GStreamerQuirkBroadcom.cpp: Added. (WebCore::GStreamerQuirkBroadcom::GStreamerQuirkBroadcom): (WebCore::GStreamerQuirkBroadcom::configureElement): (WebCore::GStreamerQuirkBroadcom::isHardwareAccelerated): * Source/WebCore/platform/gstreamer/GStreamerQuirkBroadcom.h: Added. * Source/WebCore/platform/gstreamer/GStreamerQuirkRealtek.cpp: Added. (WebCore::GStreamerQuirkRealtek::GStreamerQuirkRealtek): (WebCore::GStreamerQuirkRealtek::createWebAudioSink): (WebCore::GStreamerQuirkRealtek::configureElement): (WebCore::GStreamerQuirkRealtek::isHardwareAccelerated): * Source/WebCore/platform/gstreamer/GStreamerQuirkRealtek.h: Added. * Source/WebCore/platform/gstreamer/GStreamerQuirkWesteros.cpp: Added. (WebCore::GStreamerQuirkWesteros::GStreamerQuirkWesteros): (WebCore::GStreamerQuirkWesteros::configureElement): (WebCore::GStreamerQuirkWesteros::isHardwareAccelerated): * Source/WebCore/platform/gstreamer/GStreamerQuirkWesteros.h: Added. * Source/WebCore/platform/gstreamer/GStreamerQuirks.cpp: Added. (WebCore::GStreamerQuirksManager::singleton): (WebCore::GStreamerQuirksManager::GStreamerQuirksManager): (WebCore::GStreamerQuirksManager::isEnabled const): (WebCore::GStreamerQuirksManager::createWebAudioSink): (WebCore::GStreamerQuirksManager::createHolePunchVideoSink): (WebCore::GStreamerQuirksManager::setHolePunchVideoRectangle): (WebCore::GStreamerQuirksManager::configureElement): (WebCore::GStreamerQuirksManager::isHardwareAccelerated const): (WebCore::GStreamerQuirksManager::supportsVideoHolePunchRendering const): (WebCore::GStreamerQuirksManager::audioVideoDecoderFactoryListType const): (WebCore::GStreamerQuirksManager::disallowedWebAudioDecoders const): * Source/WebCore/platform/gstreamer/GStreamerQuirks.h: Added. (WebCore::GStreamerQuirk::isPlatformSupported const): (WebCore::GStreamerQuirk::createWebAudioSink): (WebCore::GStreamerQuirk::configureElement): (WebCore::GStreamerQuirk::isHardwareAccelerated): (WebCore::GStreamerQuirk::audioVideoDecoderFactoryListType const): (WebCore::GStreamerQuirk::disallowedWebAudioDecoders const): (WebCore::GStreamerHolePunchQuirk::createHolePunchVideoSink): (WebCore::GStreamerHolePunchQuirk::setHolePunchVideoRectangle): * Source/cmake/OptionsWPE.cmake: Canonical link: https://commits.webkit.org/276080@main
1 parent 7c138c8 commit 5813c1e

34 files changed

+1392
-266
lines changed
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
(GraphicsLayer
3+
(anchor 0.00 0.00)
4+
(bounds 1288.00 807.00)
5+
(children 1
6+
(GraphicsLayer
7+
(bounds 1288.00 807.00)
8+
(contentsOpaque 1)
9+
(children 1
10+
(GraphicsLayer
11+
(position 8.00 8.00)
12+
(bounds 1280.00 720.00)
13+
)
14+
)
15+
)
16+
)
17+
)
18+
RUN(internals.enableGStreamerHolePunching(video))
19+
RUN(video.src = findMediaFile('video', '../../../media/content/test'))
20+
RUN(video.play())
21+
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<script src="../../../media/media-file.js"></script>
5+
<script src="../../../media/video-test.js"></script>
6+
<script>
7+
function dumpLayers()
8+
{
9+
if (window.testRunner) {
10+
document.getElementById('outText').textContent = window.internals.layerTreeAsText(document);
11+
testRunner.notifyDone();
12+
}
13+
}
14+
window.addEventListener('load', async event => {
15+
findMediaElement();
16+
run("internals.enableGStreamerHolePunching(video)");
17+
run("video.src = findMediaFile('video', '../../../media/content/test')");
18+
run("video.play()");
19+
setTimeout(dumpLayers, 500);
20+
});
21+
</script>
22+
</head>
23+
<body>
24+
<video></video>
25+
<pre id="outText"></pre>
26+
</body>
27+
</html>

Source/WebCore/html/HTMLVideoElement.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,11 @@ class HTMLVideoElement final : public HTMLMediaElement, public Supplementable<HT
123123

124124
WEBCORE_EXPORT void setVideoFullscreenStandby(bool);
125125

126+
#if USE(GSTREAMER)
127+
void enableGStreamerHolePunching() { m_enableGStreamerHolePunching = true; }
128+
bool isGStreamerHolePunchingEnabled() const final { return m_enableGStreamerHolePunching; }
129+
#endif
130+
126131
private:
127132
HTMLVideoElement(const QualifiedName&, Document&, bool createdByParser);
128133

@@ -184,6 +189,10 @@ class HTMLVideoElement final : public HTMLMediaElement, public Supplementable<HT
184189
Vector<UniqueRef<VideoFrameRequest>> m_videoFrameRequests;
185190
Vector<UniqueRef<VideoFrameRequest>> m_servicedVideoFrameRequests;
186191
unsigned m_nextVideoFrameRequestIndex { 0 };
192+
193+
#if USE(GSTREAMER)
194+
bool m_enableGStreamerHolePunching { false };
195+
#endif
187196
};
188197

189198
} // namespace WebCore

Source/WebCore/platform/SourcesGStreamer.txt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,14 @@ platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp @no-unify
9898

9999
platform/gstreamer/GStreamerCodecUtilities.cpp
100100
platform/gstreamer/GStreamerElementHarness.cpp
101+
platform/gstreamer/GStreamerHolePunchQuirkBcmNexus.cpp
102+
platform/gstreamer/GStreamerHolePunchQuirkWesteros.cpp
103+
platform/gstreamer/GStreamerQuirkAmLogic.cpp
104+
platform/gstreamer/GStreamerQuirkBcmNexus.cpp
105+
platform/gstreamer/GStreamerQuirkBroadcom.cpp
106+
platform/gstreamer/GStreamerQuirkRealtek.cpp
107+
platform/gstreamer/GStreamerQuirkWesteros.cpp
108+
platform/gstreamer/GStreamerQuirks.cpp
101109
platform/gstreamer/PlatformSpeechSynthesizerGStreamer.cpp
102110
platform/gstreamer/VideoEncoderPrivateGStreamer.cpp @no-unify
103111
platform/gstreamer/WebKitFliteSourceGStreamer.cpp @no-unify

Source/WebCore/platform/audio/gstreamer/AudioDestinationGStreamer.cpp

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "AudioSourceProvider.h"
2828
#include "AudioUtilities.h"
2929
#include "GStreamerCommon.h"
30+
#include "GStreamerQuirks.h"
3031
#include "Logging.h"
3132
#include "WebKitAudioSinkGStreamer.h"
3233
#include "WebKitWebAudioSourceGStreamer.h"
@@ -126,34 +127,19 @@ AudioDestinationGStreamer::AudioDestinationGStreamer(AudioIOCallback& callback,
126127

127128
webkitWebAudioSourceSetBus(WEBKIT_WEB_AUDIO_SRC(m_src.get()), m_renderBus);
128129

129-
#if PLATFORM(AMLOGIC)
130-
// autoaudiosink changes child element state to READY internally in auto detection phase
131-
// that causes resource acquisition in some cases interrupting any playback already running.
132-
// On Amlogic we need to set direct-mode=false prop before changing state to READY
133-
// but this is not possible with autoaudiosink.
134-
GRefPtr<GstElement> audioSink = makeGStreamerElement("amlhalasink", nullptr);
135-
ASSERT_WITH_MESSAGE(audioSink, "amlhalasink should be available in the system but it is not");
136-
g_object_set(audioSink.get(), "direct-mode", FALSE, nullptr);
137-
#else
138-
GRefPtr<GstElement> audioSink = createPlatformAudioSink("music"_s);
139-
#endif
130+
auto& quirksManager = GStreamerQuirksManager::singleton();
131+
GRefPtr<GstElement> audioSink = quirksManager.createWebAudioSink();
140132
m_audioSinkAvailable = audioSink;
141133
if (!audioSink) {
142134
GST_ERROR("Failed to create GStreamer audio sink element");
143135
return;
144136
}
145137

146-
// Probe platform early on for a working audio output device. This is not needed for the WebKit
147-
// custom audio sink because it doesn't rely on autoaudiosink.
148-
if (!WEBKIT_IS_AUDIO_SINK(audioSink.get())) {
138+
// Probe platform early on for a working audio output device in autoaudiosink.
139+
if (g_str_has_prefix(GST_OBJECT_NAME(audioSink.get()), "autoaudiosink")) {
149140
g_signal_connect(audioSink.get(), "child-added", G_CALLBACK(+[](GstChildProxy*, GObject* object, gchar*, gpointer) {
150141
if (GST_IS_AUDIO_BASE_SINK(object))
151142
g_object_set(GST_AUDIO_BASE_SINK(object), "buffer-time", static_cast<gint64>(100000), nullptr);
152-
153-
#if PLATFORM(REALTEK)
154-
if (!g_strcmp0(G_OBJECT_TYPE_NAME(object), "GstRTKAudioSink"))
155-
g_object_set(object, "media-tunnel", FALSE, "audio-service", TRUE, nullptr);
156-
#endif
157143
}), nullptr);
158144

159145
// Autoaudiosink does the real sink detection in the GST_STATE_NULL->READY transition

Source/WebCore/platform/audio/gstreamer/AudioFileReaderGStreamer.cpp

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424

2525
#include "AudioBus.h"
2626
#include "GStreamerCommon.h"
27+
#include "GStreamerQuirks.h"
2728
#include <gio/gio.h>
2829
#include <gst/app/gstappsink.h>
2930
#include <gst/audio/audio-info.h>
@@ -76,11 +77,11 @@ class AudioFileReader : public CanMakeWeakPtr<AudioFileReader> {
7677
bool m_errorOccurred { false };
7778
};
7879

79-
#if PLATFORM(BCM_NEXUS) || PLATFORM(BROADCOM) || PLATFORM(REALTEK)
8080
int decodebinAutoplugSelectCallback(GstElement*, GstPad*, GstCaps*, GstElementFactory* factory, gpointer)
8181
{
8282
static int GST_AUTOPLUG_SELECT_SKIP;
8383
static int GST_AUTOPLUG_SELECT_TRY;
84+
static Vector<String> pluginsToSkip;
8485
static std::once_flag onceFlag;
8586
std::call_once(onceFlag, [] {
8687
GEnumClass* enumClass = G_ENUM_CLASS(g_type_class_ref(g_type_from_name("GstAutoplugSelectResult")));
@@ -89,32 +90,17 @@ int decodebinAutoplugSelectCallback(GstElement*, GstPad*, GstCaps*, GstElementFa
8990
value = g_enum_get_value_by_name(enumClass, "GST_AUTOPLUG_SELECT_TRY");
9091
GST_AUTOPLUG_SELECT_TRY = value->value;
9192
g_type_class_unref(enumClass);
93+
94+
pluginsToSkip = GStreamerQuirksManager::singleton().disallowedWebAudioDecoders();
9295
});
9396

94-
const Vector<String> pluginsToSkip = {
95-
#if PLATFORM(BCM_NEXUS) || PLATFORM(BROADCOM)
96-
"brcmaudfilter"_s,
97-
#endif
98-
#if PLATFORM(REALTEK)
99-
"omxaacdec"_s,
100-
"omxac3dec"_s,
101-
"omxac4dec"_s,
102-
"omxeac3dec"_s,
103-
"omxflacdec"_s,
104-
"omxlpcmdec"_s,
105-
"omxmp3dec"_s,
106-
"omxopusdec"_s,
107-
"omxvorbisdec"_s,
108-
#endif
109-
};
11097
auto factoryName = StringView::fromLatin1(gst_plugin_feature_get_name(GST_PLUGIN_FEATURE(factory)));
11198
for (const auto& pluginToSkip : pluginsToSkip) {
11299
if (pluginToSkip == factoryName)
113100
return GST_AUTOPLUG_SELECT_SKIP;
114101
}
115102
return GST_AUTOPLUG_SELECT_TRY;
116103
}
117-
#endif
118104

119105
static void copyGstreamerBuffersToAudioChannel(const GRefPtr<GstBufferList>& buffers, AudioChannel* audioChannel)
120106
{
@@ -166,9 +152,7 @@ AudioFileReader::~AudioFileReader()
166152

167153
if (m_decodebin) {
168154
g_signal_handlers_disconnect_matched(m_decodebin.get(), G_SIGNAL_MATCH_DATA, 0, 0, nullptr, nullptr, this);
169-
#if PLATFORM(BCM_NEXUS) || PLATFORM(BROADCOM) || PLATFORM(REALTEK)
170155
g_signal_handlers_disconnect_matched(m_decodebin.get(), G_SIGNAL_MATCH_FUNC, 0, 0, nullptr, reinterpret_cast<gpointer>(decodebinAutoplugSelectCallback), nullptr);
171-
#endif
172156
m_decodebin = nullptr;
173157
}
174158

@@ -424,9 +408,7 @@ void AudioFileReader::decodeAudioForBusCreation()
424408
g_object_set(source, "stream", memoryStream.get(), nullptr);
425409

426410
m_decodebin = makeGStreamerElement("decodebin", "decodebin");
427-
#if PLATFORM(BCM_NEXUS) || PLATFORM(BROADCOM) || PLATFORM(REALTEK)
428411
g_signal_connect(m_decodebin.get(), "autoplug-select", G_CALLBACK(decodebinAutoplugSelectCallback), nullptr);
429-
#endif
430412
g_signal_connect_swapped(m_decodebin.get(), "pad-added", G_CALLBACK(decodebinPadAddedCallback), this);
431413

432414
gst_bin_add_many(GST_BIN(m_pipeline.get()), source, m_decodebin.get(), nullptr);

Source/WebCore/platform/graphics/MediaPlayer.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1670,6 +1670,11 @@ void MediaPlayer::simulateAudioInterruption()
16701670

16711671
m_private->simulateAudioInterruption();
16721672
}
1673+
1674+
bool MediaPlayer::isGStreamerHolePunchingEnabled()
1675+
{
1676+
return client().isGStreamerHolePunchingEnabled();
1677+
}
16731678
#endif
16741679

16751680
void MediaPlayer::beginSimulatedHDCPError()

Source/WebCore/platform/graphics/MediaPlayer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,8 @@ class MediaPlayerClient : public CanMakeWeakPtr<MediaPlayerClient> {
303303
virtual FloatSize mediaPlayerVideoLayerSize() const { return { }; }
304304
virtual void mediaPlayerVideoLayerSizeDidChange(const FloatSize&) { }
305305

306+
virtual bool isGStreamerHolePunchingEnabled() const { return false; }
307+
306308
#if !RELEASE_LOG_DISABLED
307309
virtual const void* mediaPlayerLogIdentifier() { return nullptr; }
308310
virtual const Logger& mediaPlayerLogger() = 0;
@@ -633,6 +635,7 @@ class WEBCORE_EXPORT MediaPlayer : public MediaPlayerEnums, public ThreadSafeRef
633635

634636
#if USE(GSTREAMER)
635637
void simulateAudioInterruption();
638+
bool isGStreamerHolePunchingEnabled();
636639
#endif
637640

638641
void beginSimulatedHDCPError();

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

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "DMABufVideoSinkGStreamer.h"
2828
#include "GLVideoSinkGStreamer.h"
2929
#include "GStreamerAudioMixer.h"
30+
#include "GStreamerQuirks.h"
3031
#include "GStreamerRegistryScanner.h"
3132
#include "GStreamerSinksWorkarounds.h"
3233
#include "GUniquePtrGStreamer.h"
@@ -315,19 +316,6 @@ bool ensureGStreamerInitialized()
315316
gst_mpegts_initialize();
316317
#endif
317318

318-
#if PLATFORM(BCM_NEXUS)
319-
{
320-
auto registry = gst_registry_get();
321-
GRefPtr<GstPluginFeature> brcmaudfilter = adoptGRef(gst_registry_lookup_feature(registry, "brcmaudfilter"));
322-
GRefPtr<GstPluginFeature> mpegaudioparse = adoptGRef(gst_registry_lookup_feature(registry, "mpegaudioparse"));
323-
324-
if (brcmaudfilter && mpegaudioparse) {
325-
GST_INFO("overriding mpegaudioparse rank with brcmaudfilter rank + 1");
326-
gst_plugin_feature_set_rank(mpegaudioparse.get(), gst_plugin_feature_get_rank(brcmaudfilter.get()) + 1);
327-
}
328-
}
329-
#endif
330-
331319
registerAppsinkWithWorkaroundsIfNeeded();
332320
#endif
333321
});
@@ -440,6 +428,10 @@ void registerWebKitGStreamerElements()
440428
if (auto vaapiPlugin = adoptGRef(gst_registry_find_plugin(registry, "vaapi")))
441429
gst_registry_remove_plugin(registry, vaapiPlugin.get());
442430
}
431+
432+
// Make sure the quirks are created as early as possible.
433+
[[maybe_unused]] auto& quirksManager = GStreamerQuirksManager::singleton();
434+
443435
registryWasUpdated = true;
444436
});
445437

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

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include "config.h"
2121
#include "GStreamerRegistryScanner.h"
22+
#include "GStreamerQuirks.h"
2223

2324
#if USE(GSTREAMER)
2425
#include "ContentType.h"
@@ -139,17 +140,12 @@ void GStreamerRegistryScanner::getSupportedDecodingTypes(HashSet<String>& types)
139140

140141
GStreamerRegistryScanner::ElementFactories::ElementFactories(OptionSet<ElementFactories::Type> types)
141142
{
142-
#if PLATFORM(BCM_NEXUS) || PLATFORM(BROADCOM)
143+
auto& quirksManager = GStreamerQuirksManager::singleton();
144+
auto audioVideoDecoderFactory = quirksManager.audioVideoDecoderFactoryListType();
143145
if (types.contains(Type::AudioDecoder))
144-
audioDecoderFactories = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_PARSER | GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO, GST_RANK_MARGINAL);
146+
audioDecoderFactories = gst_element_factory_list_get_elements(audioVideoDecoderFactory | GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO, GST_RANK_MARGINAL);
145147
if (types.contains(Type::VideoDecoder))
146-
videoDecoderFactories = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_PARSER | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO, GST_RANK_MARGINAL);
147-
#else
148-
if (types.contains(Type::AudioDecoder))
149-
audioDecoderFactories = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_DECODER | GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO, GST_RANK_MARGINAL);
150-
if (types.contains(Type::VideoDecoder))
151-
videoDecoderFactories = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_DECODER | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO, GST_RANK_MARGINAL);
152-
#endif
148+
videoDecoderFactories = gst_element_factory_list_get_elements(audioVideoDecoderFactory | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO, GST_RANK_MARGINAL);
153149
if (types.contains(Type::AudioParser))
154150
audioParserFactories = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_PARSER | GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO, GST_RANK_NONE);
155151
if (types.contains(Type::VideoParser))
@@ -298,15 +294,16 @@ GStreamerRegistryScanner::RegistryLookupResult GStreamerRegistryScanner::Element
298294
auto* factory = reinterpret_cast<GstElementFactory*>(factories->data);
299295
auto metadata = String::fromLatin1(gst_element_factory_get_metadata(factory, GST_ELEMENT_METADATA_KLASS));
300296
auto components = metadata.split('/');
301-
if (components.contains("Hardware"_s)
302-
#if PLATFORM(BCM_NEXUS) || PLATFORM(BROADCOM)
303-
|| g_str_has_prefix(GST_OBJECT_NAME(factory), "brcm")
304-
#elif PLATFORM(REALTEK)
305-
|| g_str_has_prefix(GST_OBJECT_NAME(factory), "omx")
306-
#elif USE(WESTEROS_SINK)
307-
|| g_str_has_prefix(GST_OBJECT_NAME(factory), "westeros")
308-
#endif
309-
) {
297+
auto& quirksManager = GStreamerQuirksManager::singleton();
298+
if (quirksManager.isEnabled()) {
299+
auto isAccelerated = quirksManager.isHardwareAccelerated(factory);
300+
if (isAccelerated && *isAccelerated) {
301+
isUsingHardware = true;
302+
selectedFactory = factory;
303+
break;
304+
}
305+
}
306+
if (components.contains("Hardware"_s)) {
310307
isUsingHardware = true;
311308
selectedFactory = factory;
312309
break;

0 commit comments

Comments
 (0)