Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

To enable Rialto in WebKit, apply patch below and rebuild webkit using bitbake command.
Solution tested with Broadcom device only. Change tested with WebKit 2.38.2 (e585b369185b29fbc514afd959295efd02df9426)

Code Block
languagediff
titlewebkit.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);

...


-#else

...


     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);

...


-#endif

...


     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.

...


-    return nullptr;

...


-#endif

...


-

...


-    // 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);

...


-    if (!audioSink)

...


-        return nullptr;
-
-#if ENABLE(WEB_AUDIO)

...


-    GstElement* audioSinkBin = gst_bin_new("audio-sink");

...


-    ensureAudioSourceProvider();

...


-    m_audioSourceProvider->configureAudioBin(audioSinkBin, audioSink);

...


-    return audioSinkBin;

...


-#else

...


-    return audioSink;

...


-#endif

...


+// #if ENABLE(WEB_AUDIO)

...


+//

...

     // Rialto webaudio doesnt work, investigation needed

...


+//

...

     return gst_element_factory_make("rialtowebaudiosink", "rialtowebaudiosink");

...


+// #else

...


+    return gst_element_factory_make("rialtomseaudiosink", "rialtomseaudiosink");

...


+// #endif

...


 }
 
 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);

...


     if (isPIPRequested)

...

 {
         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 };

...


diff --git a/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp b/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp

...


index fc7241444484..5d17ed721a61 100644

...


--- a/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp

...


+++ b/Source/WebCore/platform/graphics/gstreamer/mse/MediaPlayerPrivateGStreamerMSE.cpp

...


@@ -229,6 +229,30 @@ MediaTime MediaPlayerPrivateGStreamerMSE::durationMediaTime()

...

 const
 
 void MediaPlayerPrivateGStreamerMSE::seek(const MediaTime& time)

...


 {

...


+    // Rialto doesnt like when seek is performed below paused state

...


+    if (m_isSeeking) {

...


+        if (m_isSeekPending) {

...


+            m_seekTime = time;
+            return;
+        }
+    }
+
+    if (pipeline())

...


+    {
+        GstState state;
+        GstStateChangeReturn getStateResult = gst_element_get_state(pipeline(), &state, nullptr, 0);

...


+        if (getStateResult == GST_STATE_CHANGE_FAILURE || getStateResult == GST_STATE_CHANGE_NO_PREROLL) {

...


+            GST_DEBUG_OBJECT(pipeline(), "[Seek] cannot seek, current state change is %s", gst_element_state_change_return_get_name(getStateResult));

...


+            return;
+        }
+        if (getStateResult == GST_STATE_CHANGE_ASYNC || state < GST_STATE_PAUSED || m_isEndReached) {

...


+            m_isSeekPending = true;
+            m_isSeeking = true;
+            m_seekTime = time;
+            m_isEndReached = false;
+            return;
+        }
+    }
     GST_DEBUG_OBJECT(pipeline(), "Requested seek to %s", time.toString().utf8().data());

...


     doSeek(time, m_playbackRate, GST_SEEK_FLAG_FLUSH);

...


 }

...


@@ -409,6 +433,17 @@ void MediaPlayerPrivateGStreamerMSE::updateStates()

...


             GST_ERROR_OBJECT(pipeline(), "Setting the pipeline to PAUSED failed");

...


         m_isPipelinePlaying = false;

...


     }
+    if (getStateResult == GST_STATE_CHANGE_SUCCESS && m_currentState >= GST_STATE_PAUSED) {

...


+        if (m_isSeekPending) {

...


+            GST_DEBUG_OBJECT(pipeline(), "[Seek] committing pending seek to %s", toString(m_seekTime).utf8().data());

...


+            m_isSeekPending = false;
+            m_isSeeking = doSeek(m_seekTime, m_player->rate(), static_cast<GstSeekFlags>(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE));

...


+            if (!m_isSeeking) {

...


+                invalidateCachedPosition();

...


+                GST_DEBUG_OBJECT(pipeline(), "[Seek] seeking to %s failed", toString(m_seekTime).utf8().data());

...


+            }
+        }
+    }
 }
 
 bool MediaPlayerPrivateGStreamerMSE::isTimeBuffered(const MediaTime &time)

...

webkit.patch
Code Block
languagediff
title
 const