To enable Rialto in WebKit, apply patch below and rebuild webkit using bitbake command.
Solution tested with Broadcom device only. Important note: Rialto RIALTO_ENABLE_DECRYPT_BUFFER flag has to be enabled to support EME.
| Expand |
|---|
|
Change tested with WebKit 2.38.2 (e585b369185b29fbc514afd959295efd02df9426) | Code Block |
|---|
| language | diff |
|---|
| title | webkit.patch |
|---|
| diff --git a/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp b/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp |
|
...
index 08bdac7e1e45..5aa17911bbfc 100644 |
|
...
--- a/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp |
|
...
+++ b/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp |
|
...
@@ -402,12 +402,16 @@ void registerWebKitGStreamerElements() |
|
...
// The VAAPI plugin is not much maintained anymore and prone to rendering issues. In |
|
...
the
// mid-term we will leverage the new stateless VA decoders. Disable the legacy plugin, |
|
...
// unless the WEBKIT_GST_ENABLE_LEGACY_VAAPI environment variable is set to 1. |
|
...
+ auto* registry = gst_registry_get(); |
|
...
const char* enableLegacyVAAPIPlugin = getenv("WEBKIT_GST_ENABLE_LEGACY_VAAPI"); |
|
...
if (!enableLegacyVAAPIPlugin || !strcmp(enableLegacyVAAPIPlugin, "0")) { |
|
...
- auto* registry = gst_registry_get(); |
|
...
if (auto vaapiPlugin = adoptGRef(gst_registry_find_plugin(registry, "vaapi"))) |
|
...
gst_registry_remove_plugin(registry, vaapiPlugin.get()); |
|
...
}
+ if (auto brcmVidFilterPlugin = adoptGRef(gst_registry_find_plugin(registry, "brcmvidfilter"))) |
|
...
+ gst_registry_remove_plugin(registry, brcmVidFilterPlugin.get()); |
|
...
+ if (auto brcmAudFilterPlugin = adoptGRef(gst_registry_find_plugin(registry, "brcmaudfilter"))) |
|
...
+ gst_registry_remove_plugin(registry, brcmAudFilterPlugin.get()); |
|
...
registryWasUpdated = true;
});
diff --git a/Source/WebCore/platform/graphics/gstreamer/GStreamerRegistryScanner.cpp b/Source/WebCore/platform/graphics/gstreamer/GStreamerRegistryScanner.cpp |
|
...
index d2bbf1416e9b..6b4a5ddd6c45 100644 |
|
...
--- a/Source/WebCore/platform/graphics/gstreamer/GStreamerRegistryScanner.cpp |
|
...
+++ b/Source/WebCore/platform/graphics/gstreamer/GStreamerRegistryScanner.cpp |
|
...
@@ -77,17 +77,10 @@ void GStreamerRegistryScanner::getSupportedDecodingTypes(HashSet<String, |
|
...
ASCIICa
GStreamerRegistryScanner::ElementFactories::ElementFactories(OptionSet<ElementFactories::Type> types) |
|
...
...
-#if PLATFORM(BCM_NEXUS) || PLATFORM(BROADCOM) |
|
...
- if (types.contains(Type::AudioDecoder)) |
|
...
- audioDecoderFactories = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_PARSER | GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO, GST_RANK_MARGINAL); |
|
...
- if (types.contains(Type::VideoDecoder)) |
|
...
- videoDecoderFactories = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_PARSER | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO, GST_RANK_MARGINAL); |
|
...
...
if (types.contains(Type::AudioDecoder)) |
|
...
audioDecoderFactories = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_DECODER | GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO, GST_RANK_MARGINAL); |
|
...
if (types.contains(Type::VideoDecoder)) |
|
...
videoDecoderFactories = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_DECODER | GST_ELEMENT_FACTORY_TYPE_MEDIA_VIDEO, GST_RANK_MARGINAL); |
|
...
...
if (types.contains(Type::AudioParser)) |
|
...
audioParserFactories = gst_element_factory_list_get_elements(GST_ELEMENT_FACTORY_TYPE_PARSER | GST_ELEMENT_FACTORY_TYPE_MEDIA_AUDIO, GST_RANK_NONE); |
|
...
if (types.contains(Type::VideoParser)) |
|
...
diff --git a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp |
|
...
index 6e46736d07d0..8855840217ce 100644 |
|
...
--- a/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp |
|
...
+++ b/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp |
|
...
@@ -1321,28 +1321,12 @@ void MediaPlayerPrivateGStreamer::loadingFailed(MediaPlayer::NetworkState |
|
...
networ
GstElement* MediaPlayerPrivateGStreamer::createAudioSink() |
|
...
...
-#if PLATFORM(BROADCOM) || USE(WESTEROS_SINK) || PLATFORM(AMLOGIC) || PLATFORM(REALTEK) |
|
...
- // If audio is being controlled by an another pipeline, creating sink here may interfere with |
|
...
- // audio playback. Instead, check if an audio sink was setup in handleMessage and use it. |
|
...
...
...
...
- // For platform specific audio sinks, they need to be properly upranked so that they get properly autoplugged. |
|
...
...
- auto role = m_player->isVideoPlayer() ? "video"_s : "music"_s; |
|
...
- GstElement* audioSink = createPlatformAudioSink(role); |
|
...
- RELEASE_ASSERT(audioSink); |
|
...
...
- return nullptr;
-
-#if ENABLE(WEB_AUDIO) |
|
...
- GstElement* audioSinkBin = gst_bin_new("audio-sink"); |
|
...
- ensureAudioSourceProvider(); |
|
...
- m_audioSourceProvider->configureAudioBin(audioSinkBin, audioSink); |
|
...
...
...
...
...
+// #if ENABLE(WEB_AUDIO) |
|
...
...
// Rialto webaudio doesnt work, investigation needed |
|
...
...
return gst_element_factory_make("rialtowebaudiosink", "rialtowebaudiosink"); |
|
...
...
+ return gst_element_factory_make("rialtomseaudiosink", "rialtomseaudiosink"); |
|
...
...
}
GstElement* MediaPlayerPrivateGStreamer::audioSink() const |
|
...
@@ -1941,7 +1925,6 @@ void MediaPlayerPrivateGStreamer::handleMessage(GstMessage* |
|
...
message)
}
}
#endif
-
#if PLATFORM(BROADCOM) || USE(WESTEROS_SINK) || PLATFORM(AMLOGIC) || PLATFORM(REALTEK) |
|
...
if (currentState <= GST_STATE_READY && newState >= GST_STATE_READY) |
|
...
{
// Detect an audio sink element and store reference to it if it supersedes what we currently have.
@@ -4150,7 +4133,7 @@ GstElement* MediaPlayerPrivateGStreamer::createHolePunchVideoSink() |
|
...
if (m_isLegacyPlaybin && !isPIPRequested) |
|
...
return nullptr;
// Westeros using holepunch.
- GstElement* videoSink = makeGStreamerElement("westerossink", "WesterosVideoSink"); |
|
...
+ GstElement* videoSink = gst_element_factory_make("rialtomsevideosink", "rialtomsevideosink"); |
|
...
g_object_set(G_OBJECT(videoSink), "zorder", 0.0f, nullptr); |
|
...
...
{
g_object_set(G_OBJECT(videoSink), "res-usage", 0u, nullptr); |
|
...
@@ -4572,7 +4555,6 @@ std::optional<VideoFrameMetadata> MediaPlayerPrivateGStreamer::videoFrameMetadat |
|
...
void MediaPlayerPrivateGStreamer::setPageIsVisible(bool visible) |
|
...
...
-
if (m_visible != visible) |
|
...
{
#if USE(GSTREAMER_HOLEPUNCH) |
|
...
Locker locker { m_holePunchLock }; |
|
...
...
cmake/FindThunder.cmake b/Source/ |
|
...
cmake/FindThunder.cmake
index ab7064e3988b..bc086ad9105d 100644
--- a/Source/ |
|
...
cmake/FindThunder.cmake
+++ b/Source/ |
|
...
cmake/FindThunder.cmake
@@ -56,9 +56,7 @@ find_path(THUNDER_INCLUDE_DIR
)
find_library(THUNDER_LIBRARY
- NAMES ocdm
- HINTS ${PC_THUNDER_LIBDIR}
- ${PC_THUNDER_LIBRARY_DIRS}
+ NAMES ocdmRialto
)
include(FindPackageHandleStandardArgs) |
|
| Expand |
|---|
|
- Apply change with Rialto Quirks: https://github.com/WebPlatformForEmbedded/WPEWebKit/pull/1323 (this change has been merged in 1.38.6-r2 and maybe earlier)
- Apply this patch to enable EME:
| Code Block |
|---|
| language | diff |
|---|
| title | Rialto EME |
|---|
| diff --git a/Source/cmake/FindThunder.cmake b/Source/cmake/FindThunder.cmake
index ab7064e3988b..bc086ad9105d 100644
--- a/Source/cmake/FindThunder.cmake
+++ b/Source/cmake/FindThunder.cmake
@@ -56,9 +56,7 @@ find_path(THUNDER_INCLUDE_DIR
)
find_library(THUNDER_LIBRARY
- NAMES ocdm
- HINTS ${PC_THUNDER_LIBDIR}
- ${PC_THUNDER_LIBRARY_DIRS}
+ NAMES ocdmRialto
)
include(FindPackageHandleStandardArgs)
|
- SVPPAY is not supported in Rialto, so this patch has to be applied for AmLogic devices:
| Code Block |
|---|
| language | diff |
|---|
| title | Svppay removal |
|---|
| diff --git a/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp b/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp
index df182ae06550..49004c73feda 100644
--- a/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp
+++ b/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp
@@ -400,25 +400,7 @@ GstPadProbeReturn onWebKitMediaSourcePadEvent(GstPad* pad, GstPadProbeInfo* info
if (probData->didTryCreatePayloader == false)
{
probData->didTryCreatePayloader = true;
- if (WebCore::doCapsHaveType(caps, GST_VIDEO_CAPS_TYPE_PREFIX)) {
- // svppay element is always inserted even for non encrypted caps
- // to force secure memory video parser so we don't need to replace
- // parser when encrypted samples arrive
-
- // svppay payloader is available on Amlogic platform only
- GRefPtr<GstElementFactory> payloader_factory = adoptGRef(gst_element_factory_find("svppay"));
- if (payloader_factory) {
- probData->payloader = gst_element_factory_create(payloader_factory.get(), nullptr);
- payloader = probData->payloader.get();
- }
- if (payloader) {
- gst_bin_add(GST_BIN(parent_bin.get()), payloader);
- GST_INFO("svppay %s added to %s for pad %s",
- GST_ELEMENT_NAME(payloader), GST_ELEMENT_NAME(parent_bin.get()), GST_PAD_NAME(pad));
- } else {
- GST_INFO("svppay not found -> continuing without payloader");
- }
- }
+ GST_INFO("SVP PAY DISABLED FOR RIALTO");
}
if(!decryptorAttached && WebCore::areEncryptedCaps(caps)) |
Set two environment variables for widget/application:
| Code Block |
|---|
| language | bash |
|---|
| title | Environment variables |
|---|
| WEBKIT_GST_QUIRKS=rialto
WEBKIT_GST_HOLE_PUNCH_QUIRK=rialto |
|
| Expand |
|---|
|
- Apply these patches (this adds together steps 2 and 3 of the change given in section 2.38.5)
in the following sub-directory:- build-xione-sercomm/tmp/work/armv7vet2hf-neon-rdkmllib32-linux-gnueabi/lib32-wpe-webkit/2.38.6+gitAUTOINC+59d63a5298-r2/git
| Code Block |
|---|
| language | diff |
|---|
| title | Rialto EME |
|---|
| diff -NarU 6 a/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp b/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp
--- a/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp 2024-07-31 10:05:28.000000000 +0100
+++ b/Source/WebCore/platform/graphics/gstreamer/mse/WebKitMediaSourceGStreamer.cpp 2024-08-05 16:59:58.906225172 +0100
@@ -398,31 +398,13 @@
GstElement* payloader = probData->payloader.get();
bool payloaderAttached = payloader && probData->payloaderAttached;
if (probData->didTryCreatePayloader == false)
{
probData->didTryCreatePayloader = true;
- if (WebCore::doCapsHaveType(caps, GST_VIDEO_CAPS_TYPE_PREFIX)) {
- // svppay element is always inserted even for non encrypted caps
- // to force secure memory video parser so we don't need to replace
- // parser when encrypted samples arrive
-
- // svppay payloader is available on Amlogic platform only
- GRefPtr<GstElementFactory> payloader_factory = adoptGRef(gst_element_factory_find("svppay"));
- if (payloader_factory) {
- probData->payloader = gst_element_factory_create(payloader_factory.get(), nullptr);
- payloader = probData->payloader.get();
- }
- if (payloader) {
- gst_bin_add(GST_BIN(parent_bin.get()), payloader);
- GST_INFO("svppay %s added to %s for pad %s",
- GST_ELEMENT_NAME(payloader), GST_ELEMENT_NAME(parent_bin.get()), GST_PAD_NAME(pad));
- } else {
- GST_INFO("svppay not found -> continuing without payloader");
- }
- }
+ GST_INFO("SVP PAY DISABLED FOR RIALTO");
}
if(!decryptorAttached && WebCore::areEncryptedCaps(caps))
{
if(!decryptor)
{
diff -NarU 6 a/Source/cmake/FindThunder.cmake b/Source/cmake/FindThunder.cmake
--- a/Source/cmake/FindThunder.cmake 2024-07-31 10:04:55.000000000 +0100
+++ b/Source/cmake/FindThunder.cmake 2024-08-05 16:59:58.906225172 +0100
@@ -53,15 +53,13 @@
HINTS ${PC_THUNDER_INCLUDEDIR}
${PC_THUNDER_INCLUDE_DIRS}
PATH_SUFFIXES "WPEFramework/ocdm/" "Thunder/ocdm/"
)
find_library(THUNDER_LIBRARY
- NAMES ocdm
- HINTS ${PC_THUNDER_LIBDIR}
- ${PC_THUNDER_LIBRARY_DIRS}
+ NAMES ocdmRialto
)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Thunder
FOUND_VAR THUNDER_FOUND
|
- Set two environment variables for widget/application:
| Code Block |
|---|
| language | bash |
|---|
| title | Environment variables |
|---|
| WEBKIT_GST_QUIRKS=rialto
WEBKIT_GST_HOLE_PUNCH_QUIRK=rialto |
|
| Code Block |
|---|
|
| language | diff |
|---|
title | webkit.patch
|