Skip to content

Commit be1e5b0

Browse files
philncalvaris
authored andcommitted
[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 4cc3d32 commit be1e5b0

34 files changed

+1398
-298
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
@@ -119,6 +119,11 @@ class HTMLVideoElement final : public HTMLMediaElement, public Supplementable<HT
119119
unsigned requestVideoFrameCallback(Ref<VideoFrameRequestCallback>&&);
120120
void cancelVideoFrameCallback(unsigned);
121121

122+
#if USE(GSTREAMER)
123+
void enableGStreamerHolePunching() { m_enableGStreamerHolePunching = true; }
124+
bool isGStreamerHolePunchingEnabled() const final { return m_enableGStreamerHolePunching; }
125+
#endif
126+
122127
private:
123128
HTMLVideoElement(const QualifiedName&, Document&, bool createdByParser);
124129

@@ -174,6 +179,10 @@ class HTMLVideoElement final : public HTMLMediaElement, public Supplementable<HT
174179
Vector<UniqueRef<VideoFrameRequest>> m_videoFrameRequests;
175180
Vector<UniqueRef<VideoFrameRequest>> m_servicedVideoFrameRequests;
176181
unsigned m_nextVideoFrameRequestIndex { 0 };
182+
183+
#if USE(GSTREAMER)
184+
bool m_enableGStreamerHolePunching { false };
185+
#endif
177186
};
178187

179188
} // namespace WebCore

Source/WebCore/platform/SourcesGStreamer.txt

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

9595
platform/gstreamer/GStreamerCodecUtilities.cpp
9696
platform/gstreamer/GStreamerElementHarness.cpp
97+
platform/gstreamer/GStreamerHolePunchQuirkBcmNexus.cpp
98+
platform/gstreamer/GStreamerHolePunchQuirkWesteros.cpp
99+
platform/gstreamer/GStreamerQuirkAmLogic.cpp
100+
platform/gstreamer/GStreamerQuirkBcmNexus.cpp
101+
platform/gstreamer/GStreamerQuirkBroadcom.cpp
102+
platform/gstreamer/GStreamerQuirkRealtek.cpp
103+
platform/gstreamer/GStreamerQuirkWesteros.cpp
104+
platform/gstreamer/GStreamerQuirks.cpp
97105
platform/gstreamer/PlatformSpeechSynthesizerGStreamer.cpp
98106
platform/gstreamer/VideoEncoderPrivateGStreamer.cpp @no-unify
99107
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
@@ -1662,6 +1662,11 @@ void MediaPlayer::simulateAudioInterruption()
16621662

16631663
m_private->simulateAudioInterruption();
16641664
}
1665+
1666+
bool MediaPlayer::isGStreamerHolePunchingEnabled()
1667+
{
1668+
return client().isGStreamerHolePunchingEnabled();
1669+
}
16651670
#endif
16661671

16671672
void MediaPlayer::beginSimulatedHDCPError()

Source/WebCore/platform/graphics/MediaPlayer.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,8 @@ class MediaPlayerClient {
332332

333333
virtual FloatSize mediaPlayerVideoInlineSize() const { return { }; }
334334

335+
virtual bool isGStreamerHolePunchingEnabled() const { return false; }
336+
335337
#if !RELEASE_LOG_DISABLED
336338
virtual const void* mediaPlayerLogIdentifier() { return nullptr; }
337339
virtual const Logger& mediaPlayerLogger() = 0;
@@ -661,6 +663,7 @@ class WEBCORE_EXPORT MediaPlayer : public MediaPlayerEnums, public ThreadSafeRef
661663

662664
#if USE(GSTREAMER)
663665
void simulateAudioInterruption();
666+
bool isGStreamerHolePunchingEnabled();
664667
#endif
665668

666669
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"
@@ -311,19 +312,6 @@ bool ensureGStreamerInitialized()
311312
gst_mpegts_initialize();
312313
#endif
313314

314-
#if PLATFORM(BCM_NEXUS)
315-
{
316-
auto registry = gst_registry_get();
317-
GRefPtr<GstPluginFeature> brcmaudfilter = adoptGRef(gst_registry_lookup_feature(registry, "brcmaudfilter"));
318-
GRefPtr<GstPluginFeature> mpegaudioparse = adoptGRef(gst_registry_lookup_feature(registry, "mpegaudioparse"));
319-
320-
if (brcmaudfilter && mpegaudioparse) {
321-
GST_INFO("overriding mpegaudioparse rank with brcmaudfilter rank + 1");
322-
gst_plugin_feature_set_rank(mpegaudioparse.get(), gst_plugin_feature_get_rank(brcmaudfilter.get()) + 1);
323-
}
324-
}
325-
#endif
326-
327315
registerAppsinkWithWorkaroundsIfNeeded();
328316
#endif
329317
});
@@ -436,6 +424,10 @@ void registerWebKitGStreamerElements()
436424
if (auto vaapiPlugin = adoptGRef(gst_registry_find_plugin(registry, "vaapi")))
437425
gst_registry_remove_plugin(registry, vaapiPlugin.get());
438426
}
427+
428+
// Make sure the quirks are created as early as possible.
429+
[[maybe_unused]] auto& quirksManager = GStreamerQuirksManager::singleton();
430+
439431
registryWasUpdated = true;
440432
});
441433

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, ASCIICa
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)