Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Step:15-SP1
webkit2gtk3.25307
webkit2gtk3-old-gstreamer.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File webkit2gtk3-old-gstreamer.patch of Package webkit2gtk3.25307
diff -urp webkitgtk-2.36.0.orig/Source/cmake/GStreamerChecks.cmake webkitgtk-2.36.0.gstreamer/Source/cmake/GStreamerChecks.cmake --- webkitgtk-2.36.0.orig/Source/cmake/GStreamerChecks.cmake 2022-02-23 02:59:06.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/cmake/GStreamerChecks.cmake 2022-03-22 13:18:04.341943346 -0500 @@ -28,7 +28,7 @@ if (ENABLE_VIDEO OR ENABLE_WEB_AUDIO) list(APPEND GSTREAMER_COMPONENTS audio fft) endif () - find_package(GStreamer 1.14.0 REQUIRED COMPONENTS ${GSTREAMER_COMPONENTS}) + find_package(GStreamer 1.10.0 REQUIRED COMPONENTS ${GSTREAMER_COMPONENTS}) if (ENABLE_WEB_AUDIO) if (NOT PC_GSTREAMER_AUDIO_FOUND OR NOT PC_GSTREAMER_FFT_FOUND) @@ -52,7 +52,14 @@ if (ENABLE_VIDEO OR ENABLE_WEB_AUDIO) endif () endif () +if (ENABLE_MEDIA_SOURCE AND PC_GSTREAMER_VERSION VERSION_LESS "1.14") + message(FATAL_ERROR "GStreamer 1.14 is needed for ENABLE_MEDIA_SOURCE.") +endif () + if (ENABLE_MEDIA_STREAM AND ENABLE_WEB_RTC) + if (PC_GSTREAMER_VERSION VERSION_LESS "1.12") + message(FATAL_ERROR "GStreamer 1.12 is needed for ENABLE_WEB_RTC.") + endif () SET_AND_EXPOSE_TO_BUILD(USE_LIBWEBRTC TRUE) else () SET_AND_EXPOSE_TO_BUILD(USE_LIBWEBRTC FALSE) diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp --- webkitgtk-2.36.0.orig/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp 2022-02-23 02:59:01.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/audio/gstreamer/WebKitWebAudioSourceGStreamer.cpp 2022-03-22 13:18:04.341943346 -0500 @@ -79,6 +79,7 @@ struct _WebKitWebAudioSrcPrivate { GRefPtr<GstBufferPool> pool; + bool enableGapBufferSupport; bool hasRenderedAudibleFrame { false }; Lock dispatchToRenderThreadLock; @@ -93,6 +94,11 @@ struct _WebKitWebAudioSrcPrivate { sourcePad = webkitGstGhostPadFromStaticTemplate(&srcTemplate, "src", nullptr); g_rec_mutex_init(&mutex); + + // GAP buffer support is enabled only for GStreamer 1.12.5 because of a + // memory leak that was fixed in that version. + // https://bugzilla.gnome.org/show_bug.cgi?id=793067 + enableGapBufferSupport = webkitGstCheckVersion(1, 12, 5); } ~_WebKitWebAudioSrcPrivate() @@ -378,7 +384,7 @@ static void webKitWebAudioSrcRenderAndPu GST_BUFFER_TIMESTAMP(buffer.get()) = outputTimestamp.position.nanoseconds(); GST_BUFFER_DURATION(buffer.get()) = duration; - if (priv->bus->channel(i)->isSilent()) + if (priv->enableGapBufferSupport && priv->bus->channel(i)->isSilent()) GST_BUFFER_FLAG_SET(buffer.get(), GST_BUFFER_FLAG_GAP); if (failed) @@ -437,7 +443,9 @@ static GstStateChangeReturn webKitWebAud auto* src = WEBKIT_WEB_AUDIO_SRC(element); auto* priv = src->priv; +#if GST_CHECK_VERSION(1, 14, 0) GST_DEBUG_OBJECT(element, "%s", gst_state_change_get_name(transition)); +#endif switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/eme/GStreamerEMEUtilities.h webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/eme/GStreamerEMEUtilities.h --- webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/eme/GStreamerEMEUtilities.h 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/eme/GStreamerEMEUtilities.h 2022-03-22 13:18:04.341943346 -0500 @@ -78,7 +78,7 @@ public: const String& systemId() const { return m_systemId; } String payloadContainerType() const { -#if GST_CHECK_VERSION(1, 16, 0) +#if GST_CHECK_VERSION(1, 15, 0) if (m_systemId == GST_PROTECTION_UNSPECIFIED_SYSTEM_ID) return "webm"_s; #endif diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp --- webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/eme/WebKitCommonEncryptionDecryptorGStreamer.cpp 2022-03-22 13:18:04.341943346 -0500 @@ -148,7 +148,7 @@ static GstCaps* transformCaps(GstBaseTra // GST_PROTECTION_UNSPECIFIED_SYSTEM_ID was added in the GStreamer // developement git master which will ship as version 1.16.0. gst_structure_set_name(outgoingStructure.get(), -#if GST_CHECK_VERSION(1, 16, 0) +#if GST_CHECK_VERSION(1, 15, 0) !g_strcmp0(klass->protectionSystemId(self), GST_PROTECTION_UNSPECIFIED_SYSTEM_ID) ? "application/x-webm-enc" : #endif "application/x-cenc"); diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp --- webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/GLVideoSinkGStreamer.cpp 2022-03-22 13:18:04.341943346 -0500 @@ -160,7 +160,11 @@ std::optional<GRefPtr<GstContext>> reque if (!g_strcmp0(contextType, "gst.gl.app_context")) { GstContext* appContext = gst_context_new("gst.gl.app_context", TRUE); GstStructure* structure = gst_context_writable_structure(appContext); +#if GST_CHECK_VERSION(1, 12, 0) gst_structure_set(structure, "context", GST_TYPE_GL_CONTEXT, gstGLContext, nullptr); +#else + gst_structure_set(structure, "context", GST_GL_TYPE_CONTEXT, gstGLContext, nullptr); +#endif return adoptGRef(appContext); } @@ -181,11 +185,15 @@ static bool setGLContext(GstElement* ele static GstStateChangeReturn webKitGLVideoSinkChangeState(GstElement* element, GstStateChange transition) { +#if GST_CHECK_VERSION(1, 14, 0) GST_DEBUG_OBJECT(element, "%s", gst_state_change_get_name(transition)); +#endif switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: +#if GST_CHECK_VERSION(1, 14, 0) case GST_STATE_CHANGE_READY_TO_READY: +#endif case GST_STATE_CHANGE_READY_TO_PAUSED: { if (!setGLContext(element, GST_GL_DISPLAY_CONTEXT_TYPE)) return GST_STATE_CHANGE_FAILURE; diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/GStreamerAudioMixer.cpp webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/GStreamerAudioMixer.cpp --- webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/GStreamerAudioMixer.cpp 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/GStreamerAudioMixer.cpp 2022-03-22 13:18:04.341943346 -0500 @@ -57,8 +57,9 @@ GStreamerAudioMixer::GStreamerAudioMixer void GStreamerAudioMixer::ensureState(GstStateChange stateChange) { +#if GST_CHECK_VERSION(1, 14, 0) GST_DEBUG_OBJECT(m_pipeline.get(), "Handling %s transition (%u mixer pads)", gst_state_change_get_name(stateChange), m_mixer->numsinkpads); - +#endif switch (stateChange) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_element_set_state(m_pipeline.get(), GST_STATE_PAUSED); diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp --- webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.cpp 2022-03-21 14:19:36.303412337 -0500 @@ -39,6 +39,7 @@ #include <wtf/Scope.h> #include <wtf/glib/GUniquePtr.h> #include <wtf/glib/RunLoopSourcePriority.h> +#include <wtf/PrintStream.h> #if USE(GSTREAMER_FULL) #include <gst/gstinitstaticplugins.h> diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h --- webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h 2022-03-16 08:48:02.000000000 -0500 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/GStreamerCommon.h 2022-03-21 15:12:02.672022277 -0500 @@ -83,14 +83,6 @@ inline GstClockTime toGstClockTime(const return static_cast<GstClockTime>(toGstUnsigned64Time(mediaTime)); } -inline MediaTime fromGstClockTime(GstClockTime time) -{ - if (!GST_CLOCK_TIME_IS_VALID(time)) - return MediaTime::invalidTime(); - - return MediaTime(GST_TIME_AS_USECONDS(time), G_USEC_PER_SEC); -} - class GstMappedBuffer { WTF_MAKE_NONCOPYABLE(GstMappedBuffer); public: diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp --- webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp 2022-03-22 13:18:04.345943367 -0500 @@ -51,7 +51,6 @@ #include "InbandTextTrackPrivateGStreamer.h" #include "TextCombinerGStreamer.h" #include "TextSinkGStreamer.h" -#include "VideoFrameMetadataGStreamer.h" #include "VideoTrackPrivateGStreamer.h" #if ENABLE(MEDIA_STREAM) @@ -134,6 +133,14 @@ using namespace std; static const FloatSize s_holePunchDefaultFrameSize(1280, 720); #endif +static void convertToInternalProtocol(URL& url) +{ + if (webkitGstCheckVersion(1, 12, 0)) + return; + if (url.protocolIsInHTTPFamily() || url.protocolIsBlob()) + url.setProtocol(makeString("webkit+", url.protocol())); +} + static void initializeDebugCategory() { static std::once_flag onceFlag; @@ -816,15 +823,20 @@ bool MediaPlayerPrivateGStreamer::hasSin std::optional<bool> MediaPlayerPrivateGStreamer::wouldTaintOrigin(const SecurityOrigin& origin) const { - GST_TRACE_OBJECT(pipeline(), "Checking %u origins", m_origins.size()); - for (auto& responseOrigin : m_origins) { - if (!origin.isSameOriginDomain(*responseOrigin)) { - GST_DEBUG_OBJECT(pipeline(), "Found reachable response origin"); - return true; + if (webkitGstCheckVersion(1, 12, 0)) { + GST_TRACE_OBJECT(pipeline(), "Checking %u origins", m_origins.size()); + for (auto& responseOrigin : m_origins) { + if (!origin.isSameOriginDomain(*responseOrigin)) { + GST_DEBUG_OBJECT(pipeline(), "Found reachable response origin"); + return true; + } } } - GST_DEBUG_OBJECT(pipeline(), "No valid response origin found"); - return false; + + // GStreamer < 1.12 has an incomplete uridownloader implementation so we + // can't use WebKitWebSrc for adaptive fragments downloading if this + // version is detected. + return m_hasTaintedOrigin; } void MediaPlayerPrivateGStreamer::simulateAudioInterruption() @@ -922,6 +934,7 @@ void MediaPlayerPrivateGStreamer::setPla cleanURLString = cleanURLString.substring(0, url.pathEnd()); m_url = URL(URL(), cleanURLString); + convertToInternalProtocol(m_url); GST_INFO_OBJECT(pipeline(), "Load %s", m_url.string().utf8().data()); g_object_set(m_pipeline.get(), "uri", m_url.string().utf8().data(), nullptr); } @@ -1863,6 +1876,7 @@ void MediaPlayerPrivateGStreamer::handle GST_DEBUG_OBJECT(pipeline(), "Processing HTTP headers: %" GST_PTR_FORMAT, structure); if (const char* uri = gst_structure_get_string(structure, "uri")) { URL url(URL(), uri); + convertToInternalProtocol(url); m_origins.add(SecurityOrigin::create(url)); if (url != m_url) { @@ -1901,6 +1915,11 @@ void MediaPlayerPrivateGStreamer::handle } else if (gst_structure_has_name(structure, "webkit-network-statistics")) { if (gst_structure_get(structure, "read-position", G_TYPE_UINT64, &m_networkReadPosition, "size", G_TYPE_UINT64, &m_httpResponseTotalSize, nullptr)) GST_DEBUG_OBJECT(pipeline(), "Updated network read position %" G_GUINT64_FORMAT ", size: %" G_GUINT64_FORMAT, m_networkReadPosition, m_httpResponseTotalSize); + } else if (gst_structure_has_name(structure, "adaptive-streaming-statistics")) { + if (WEBKIT_IS_WEB_SRC(m_source.get()) && !webkitGstCheckVersion(1, 12, 0)) { + if (const char* uri = gst_structure_get_string(structure, "uri")) + m_hasTaintedOrigin = webKitSrcWouldTaintOrigin(WEBKIT_WEB_SRC_CAST(m_source.get()), SecurityOrigin::create(URL(URL(), uri))); + } } else if (gst_structure_has_name(structure, "GstCacheDownloadComplete")) { GST_INFO_OBJECT(pipeline(), "Stream is fully downloaded, stopping monitoring downloading progress."); m_fillTimer.stop(); @@ -2721,26 +2740,31 @@ void MediaPlayerPrivateGStreamer::create g_signal_connect(GST_BIN_CAST(m_pipeline.get()), "deep-element-added", G_CALLBACK(+[](GstBin*, GstBin* subBin, GstElement* element, MediaPlayerPrivateGStreamer* player) { GUniquePtr<char> binName(gst_element_get_name(GST_ELEMENT_CAST(subBin))); GUniquePtr<char> elementName(gst_element_get_name(element)); - auto elementClass = makeString(gst_element_get_metadata(element, GST_ELEMENT_METADATA_KLASS)); - auto classifiers = elementClass.split('/'); - - // Collect processing time metrics for video decoders and converters. - if ((classifiers.contains("Converter"_s) || classifiers.contains("Decoder"_s)) && classifiers.contains("Video"_s) && !classifiers.contains("Parser")) - webkitGstTraceProcessingTimeForElement(element); - - if (classifiers.contains("Decoder"_s) && classifiers.contains("Video"_s)) { - player->configureVideoDecoder(element); - return; - } if (g_str_has_prefix(elementName.get(), "downloadbuffer")) { player->configureDownloadBuffer(element); return; } - // This will set the multiqueue size to the default value. - if (g_str_has_prefix(elementName.get(), "uridecodebin")) + if (g_str_has_prefix(elementName.get(), "uridecodebin")) { + // This will set the multiqueue size to the default value. g_object_set(element, "buffer-size", 2 * MB, nullptr); + return; + } + + if (!g_str_has_prefix(binName.get(), "decodebin")) + return; + + if (g_str_has_prefix(elementName.get(), "v4l2")) + player->m_videoDecoderPlatform = GstVideoDecoderPlatform::Video4Linux; + else if (g_str_has_prefix(elementName.get(), "imxvpudec")) + player->m_videoDecoderPlatform = GstVideoDecoderPlatform::ImxVPU; + else if (g_str_has_prefix(elementName.get(), "omx")) + player->m_videoDecoderPlatform = GstVideoDecoderPlatform::OpenMAX; + +#if USE(TEXTURE_MAPPER_GL) + player->updateTextureMapperFlags(); +#endif }), this); g_signal_connect_swapped(m_pipeline.get(), "source-setup", G_CALLBACK(sourceSetupCallback), this); @@ -2784,27 +2808,6 @@ void MediaPlayerPrivateGStreamer::create }), this); } -void MediaPlayerPrivateGStreamer::configureVideoDecoder(GstElement* decoder) -{ - GUniquePtr<char> name(gst_element_get_name(decoder)); - if (g_str_has_prefix(name.get(), "v4l2")) - m_videoDecoderPlatform = GstVideoDecoderPlatform::Video4Linux; - else if (g_str_has_prefix(name.get(), "imxvpudec")) - m_videoDecoderPlatform = GstVideoDecoderPlatform::ImxVPU; - else if (g_str_has_prefix(name.get(), "omx")) - m_videoDecoderPlatform = GstVideoDecoderPlatform::OpenMAX; - else if (g_str_has_prefix(name.get(), "avdec")) { - // Set the decoder maximum number of threads to a low, fixed value, not depending on the - // platform. This also helps with processing metrics gathering. When using the default value - // the decoder introduces artificial processing latency reflecting the maximum number of threads. - g_object_set(decoder, "max-threads", 2, nullptr); - } - -#if USE(TEXTURE_MAPPER_GL) - updateTextureMapperFlags(); -#endif -} - bool MediaPlayerPrivateGStreamer::didPassCORSAccessCheck() const { if (WEBKIT_IS_WEB_SRC(m_source.get())) @@ -2916,8 +2919,6 @@ void MediaPlayerPrivateGStreamer::pushTe if (!GST_IS_SAMPLE(m_sample.get())) return; - ++m_sampleCount; - auto internalCompositingOperation = [this](TextureMapperPlatformLayerProxyGL& proxy, std::unique_ptr<GstVideoFrameHolder>&& frameHolder) { std::unique_ptr<TextureMapperPlatformLayerBuffer> layerBuffer; if (frameHolder->hasMappedTextures()) { @@ -3222,7 +3223,7 @@ void MediaPlayerPrivateGStreamer::flushC { Locker sampleLocker { m_sampleMutex }; - if (m_sample && gst_sample_get_buffer(m_sample.get())) { + if (m_sample) { // Allocate a new copy of the sample which has to be released. The copy is necessary so that // the video dimensions can still be fetched and also for canvas rendering. The release is // necessary because the sample might have been allocated by a hardware decoder and memory @@ -3793,31 +3794,6 @@ WTFLogChannel& MediaPlayerPrivateGStream } #endif -std::optional<VideoFrameMetadata> MediaPlayerPrivateGStreamer::videoFrameMetadata() -{ - if (m_sampleCount == m_lastVideoFrameMetadataSampleCount) - return { }; - - m_lastVideoFrameMetadataSampleCount = m_sampleCount; - - Locker sampleLocker { m_sampleMutex }; - if (!GST_IS_SAMPLE(m_sample.get())) - return { }; - - auto* buffer = gst_sample_get_buffer(m_sample.get()); - auto metadata = webkitGstBufferGetVideoFrameMetadata(buffer); - auto size = naturalSize(); - metadata.width = size.width(); - metadata.height = size.height(); - metadata.presentedFrames = m_sampleCount; - - // FIXME: presentationTime and expectedDisplayTime might not always have the same value, we should try getting more precise values. - metadata.presentationTime = MonotonicTime::now().secondsSinceEpoch().seconds(); - metadata.expectedDisplayTime = metadata.presentationTime; - - return metadata; -} - } #endif // USE(GSTREAMER) diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h --- webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h 2022-03-22 13:18:04.345943367 -0500 @@ -53,6 +53,16 @@ typedef struct _GstMpegtsSection GstMpeg #if USE(LIBEPOXY) // Include the <epoxy/gl.h> header before <gst/gl/gl.h>. #include <epoxy/gl.h> + +// Workaround build issue with RPi userland GLESv2 headers and libepoxy <https://webkit.org/b/185639> +#if !GST_CHECK_VERSION(1, 14, 0) +#include <gst/gl/gstglconfig.h> +#if defined(GST_GL_HAVE_WINDOW_DISPMANX) && GST_GL_HAVE_WINDOW_DISPMANX +#define __gl2_h_ +#undef GST_GL_HAVE_GLSYNC +#define GST_GL_HAVE_GLSYNC 1 +#endif +#endif // !GST_CHECK_VERSION(1, 14, 0) #endif // USE(LIBEPOXY) #define GST_USE_UNSTABLE_API @@ -466,8 +476,6 @@ private: void configureDownloadBuffer(GstElement*); static void downloadBufferFileCreatedCallback(MediaPlayerPrivateGStreamer*); - void configureVideoDecoder(GstElement*); - void setPlaybinURL(const URL& urlString); void updateTracks(const GRefPtr<GstStreamCollection>&); @@ -563,9 +571,6 @@ private: DataMutex<TaskAtMediaTimeScheduler> m_TaskAtMediaTimeSchedulerDataMutex; private: - std::optional<VideoFrameMetadata> videoFrameMetadata() final; - uint64_t m_sampleCount { 0 }; - uint64_t m_lastVideoFrameMetadataSampleCount { 0 }; #if USE(WPE_VIDEO_PLANE_DISPLAY_DMABUF) GUniquePtr<struct wpe_video_plane_display_dmabuf_source> m_wpeVideoPlaneDisplayDmaBuf; #endif diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/MediaSampleGStreamer.cpp webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/MediaSampleGStreamer.cpp --- webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/MediaSampleGStreamer.cpp 2022-03-16 08:48:02.000000000 -0500 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/MediaSampleGStreamer.cpp 2022-03-22 14:08:37.241955857 -0500 @@ -24,7 +24,6 @@ #include "GStreamerCommon.h" #include "PixelBuffer.h" -#include "VideoFrameMetadataGStreamer.h" #include <JavaScriptCore/JSCInlines.h> #include <JavaScriptCore/TypedArrayInlines.h> #include <algorithm> @@ -33,7 +32,7 @@ namespace WebCore { -MediaSampleGStreamer::MediaSampleGStreamer(GRefPtr<GstSample>&& sample, const FloatSize& presentationSize, const AtomString& trackId, VideoRotation videoRotation, bool videoMirrored, std::optional<VideoSampleMetadata>&& metadata) +MediaSampleGStreamer::MediaSampleGStreamer(GRefPtr<GstSample>&& sample, const FloatSize& presentationSize, const AtomString& trackId, VideoRotation videoRotation, bool videoMirrored) : m_pts(MediaTime::zeroTime()) , m_dts(MediaTime::zeroTime()) , m_duration(MediaTime::zeroTime()) @@ -46,9 +45,6 @@ MediaSampleGStreamer::MediaSampleGStream GstBuffer* buffer = gst_sample_get_buffer(sample.get()); RELEASE_ASSERT(buffer); - if (metadata) - buffer = webkitGstBufferSetVideoSampleMetadata(buffer, WTFMove(metadata)); - m_sample = sample; initializeFromBuffer(); } @@ -79,7 +75,7 @@ Ref<MediaSampleGStreamer> MediaSampleGSt return adoptRef(*gstreamerMediaSample); } -Ref<MediaSampleGStreamer> MediaSampleGStreamer::createImageSample(PixelBuffer&& pixelBuffer, const IntSize& destinationSize, double frameRate, VideoRotation videoRotation, bool videoMirrored, std::optional<VideoSampleMetadata>&& metadata) +Ref<MediaSampleGStreamer> MediaSampleGStreamer::createImageSample(PixelBuffer&& pixelBuffer, const IntSize& destinationSize, double frameRate, VideoRotation videoRotation, bool videoMirrored) { ensureGStreamerInitialized(); @@ -98,9 +94,6 @@ Ref<MediaSampleGStreamer> MediaSampleGSt auto height = size.height(); gst_buffer_add_video_meta(buffer.get(), GST_VIDEO_FRAME_FLAG_NONE, GST_VIDEO_FORMAT_BGRA, width, height); - if (metadata) - webkitGstBufferSetVideoSampleMetadata(buffer.get(), *metadata); - int frameRateNumerator, frameRateDenominator; gst_util_double_to_fraction(frameRate, &frameRateNumerator, &frameRateDenominator); @@ -135,28 +128,33 @@ Ref<MediaSampleGStreamer> MediaSampleGSt void MediaSampleGStreamer::initializeFromBuffer() { + auto createMediaTime = + [](GstClockTime time) -> MediaTime { + return MediaTime(GST_TIME_AS_USECONDS(time), G_USEC_PER_SEC); + }; + const GstClockTime minimumDuration = 1000; // 1 us auto* buffer = gst_sample_get_buffer(m_sample.get()); RELEASE_ASSERT(buffer); if (GST_BUFFER_PTS_IS_VALID(buffer)) - m_pts = fromGstClockTime(GST_BUFFER_PTS(buffer)); + m_pts = createMediaTime(GST_BUFFER_PTS(buffer)); if (GST_BUFFER_DTS_IS_VALID(buffer) || GST_BUFFER_PTS_IS_VALID(buffer)) - m_dts = fromGstClockTime(GST_BUFFER_DTS_OR_PTS(buffer)); + m_dts = createMediaTime(GST_BUFFER_DTS_OR_PTS(buffer)); if (GST_BUFFER_DURATION_IS_VALID(buffer)) { // Sometimes (albeit rarely, so far seen only at the end of a track) // frames have very small durations, so small that may be under the // precision we are working with and be truncated to zero. // SourceBuffer algorithms are not expecting frames with zero-duration, // so let's use something very small instead in those fringe cases. - m_duration = fromGstClockTime(std::max(GST_BUFFER_DURATION(buffer), minimumDuration)); + m_duration = createMediaTime(std::max(GST_BUFFER_DURATION(buffer), minimumDuration)); } else { // Unfortunately, sometimes samples don't provide a duration. This can never happen in MP4 because of the way // the format is laid out, but it's pretty common in WebM. // The good part is that durations don't matter for playback, just for buffered ranges and coded frame deletion. // We want to pick something small enough to not cause unwanted frame deletion, but big enough to never be // mistaken for a rounding artifact. - m_duration = fromGstClockTime(16666667); // 1/60 seconds + m_duration = createMediaTime(16666667); // 1/60 seconds } m_size = gst_buffer_get_size(buffer); diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/MediaSampleGStreamer.h webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/MediaSampleGStreamer.h --- webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/MediaSampleGStreamer.h 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/MediaSampleGStreamer.h 2022-03-22 13:54:58.421632900 -0500 @@ -26,7 +26,6 @@ #include "FloatSize.h" #include "GStreamerCommon.h" #include "MediaSample.h" -#include "VideoSampleMetadata.h" #include <wtf/text/AtomString.h> namespace WebCore { @@ -35,9 +34,9 @@ class PixelBuffer; class MediaSampleGStreamer : public MediaSample { public: - static Ref<MediaSampleGStreamer> create(GRefPtr<GstSample>&& sample, const FloatSize& presentationSize, const AtomString& trackId, VideoRotation videoRotation = VideoRotation::None, bool videoMirrored = false, std::optional<VideoSampleMetadata>&& metadata = std::nullopt) + static Ref<MediaSampleGStreamer> create(GRefPtr<GstSample>&& sample, const FloatSize& presentationSize, const AtomString& trackId, VideoRotation videoRotation = VideoRotation::None, bool videoMirrored = false) { - return adoptRef(*new MediaSampleGStreamer(WTFMove(sample), presentationSize, trackId, videoRotation, videoMirrored, WTFMove(metadata))); + return adoptRef(*new MediaSampleGStreamer(WTFMove(sample), presentationSize, trackId, videoRotation, videoMirrored)); } static Ref<MediaSampleGStreamer> createWrappedSample(const GRefPtr<GstSample>& sample, VideoRotation videoRotation = VideoRotation::None) @@ -46,7 +45,7 @@ public: } static Ref<MediaSampleGStreamer> createFakeSample(GstCaps*, MediaTime pts, MediaTime dts, MediaTime duration, const FloatSize& presentationSize, const AtomString& trackId); - static Ref<MediaSampleGStreamer> createImageSample(PixelBuffer&&, const IntSize& destinationSize = { }, double frameRate = 1, VideoRotation videoRotation = VideoRotation::None, bool videoMirrored = false, std::optional<VideoSampleMetadata>&& metadata = std::nullopt); + static Ref<MediaSampleGStreamer> createImageSample(PixelBuffer&&, const IntSize& destinationSize = { }, double frameRate = 1, VideoRotation videoRotation = VideoRotation::None, bool videoMirrored = false); void extendToTheBeginning(); MediaTime presentationTime() const override { return m_pts; } @@ -70,7 +69,7 @@ public: bool videoMirrored() const override { return m_videoMirrored; } protected: - MediaSampleGStreamer(GRefPtr<GstSample>&&, const FloatSize& presentationSize, const AtomString& trackId, VideoRotation = VideoRotation::None, bool videoMirrored = false, std::optional<VideoSampleMetadata>&& = std::nullopt); + MediaSampleGStreamer(GRefPtr<GstSample>&&, const FloatSize& presentationSize, const AtomString& trackId, VideoRotation = VideoRotation::None, bool videoMirrored = false); MediaSampleGStreamer(const GRefPtr<GstSample>&, VideoRotation = VideoRotation::None); virtual ~MediaSampleGStreamer() = default; diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/PlatformDisplayGStreamer.cpp webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/PlatformDisplayGStreamer.cpp --- webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/PlatformDisplayGStreamer.cpp 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/PlatformDisplayGStreamer.cpp 2022-03-22 13:18:04.345943367 -0500 @@ -98,13 +98,21 @@ bool PlatformDisplay::tryEnsureGstGLCont if (!contextHandle) return false; - m_gstGLDisplay = adoptGRef(createGstGLDisplay(*this)); + bool shouldAdoptRef = webkitGstCheckVersion(1, 14, 0); + + if (shouldAdoptRef) + m_gstGLDisplay = adoptGRef(createGstGLDisplay(*this)); + else + m_gstGLDisplay = createGstGLDisplay(*this); if (!m_gstGLDisplay) return false; GstGLPlatform glPlatform = sharedContext->isEGLContext() ? GST_GL_PLATFORM_EGL : GST_GL_PLATFORM_GLX; - m_gstGLContext = adoptGRef(gst_gl_context_new_wrapped(m_gstGLDisplay.get(), reinterpret_cast<guintptr>(contextHandle), glPlatform, glAPI)); + if (shouldAdoptRef) + m_gstGLContext = adoptGRef(gst_gl_context_new_wrapped(m_gstGLDisplay.get(), reinterpret_cast<guintptr>(contextHandle), glPlatform, glAPI)); + else + m_gstGLContext = gst_gl_context_new_wrapped(m_gstGLDisplay.get(), reinterpret_cast<guintptr>(contextHandle), glPlatform, glAPI); // Activate and fill the GStreamer wrapped context with the Webkit's shared one. auto* previousActiveContext = GLContext::current(); diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/WebKitAudioSinkGStreamer.cpp webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/WebKitAudioSinkGStreamer.cpp --- webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/WebKitAudioSinkGStreamer.cpp 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/WebKitAudioSinkGStreamer.cpp 2022-03-22 13:18:04.345943367 -0500 @@ -256,7 +256,9 @@ static GstStateChangeReturn webKitAudioS auto* sink = WEBKIT_AUDIO_SINK(element); auto* priv = sink->priv; +#if GST_CHECK_VERSION(1, 14, 0) GST_DEBUG_OBJECT(sink, "Handling %s transition", gst_state_change_get_name(stateChange)); +#endif auto& mixer = GStreamerAudioMixer::singleton(); if (priv->interAudioSink && stateChange == GST_STATE_CHANGE_NULL_TO_READY) diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp --- webkitgtk-2.36.0.orig/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/graphics/gstreamer/WebKitWebSourceGStreamer.cpp 2022-03-22 13:18:04.345943367 -0500 @@ -467,8 +467,12 @@ static GstFlowReturn webKitWebSrcCreate( // 1) webKitWebSrcSetMediaPlayer() is called by MediaPlayerPrivateGStreamer by means of hooking playbin's // "source-setup" event. This doesn't work for additional WebKitWebSrc elements created by adaptivedemux. // - // 2) A GstContext query made here. - if (!members->player) { + // 2) A GstContext query made here. Because of a bug, this only works in GStreamer >= 1.12. + // + // As a compatibility workaround, the http: URI protocol is only registered for gst>=1.12; otherwise using + // webkit+http:, which is used by MediaPlayerPrivateGStreamer but not by adaptivedemux's additional source + // elements, therefore using souphttpsrc instead and not routing traffic through the NetworkProcess. + if (webkitGstCheckVersion(1, 12, 0) && !members->player) { members.runUnlocked([src, baseSrc]() { GRefPtr<GstQuery> query = adoptGRef(gst_query_new_context(WEBKIT_WEB_SRC_PLAYER_CONTEXT_TYPE_NAME)); if (gst_pad_peer_query(GST_BASE_SRC_PAD(baseSrc), query.get())) { @@ -868,9 +872,15 @@ static GstURIType webKitWebSrcUriGetType const gchar* const* webKitWebSrcGetProtocols(GType) { static const char* protocols[4]; - protocols[0] = "http"; - protocols[1] = "https"; - protocols[2] = "blob"; + if (webkitGstCheckVersion(1, 12, 0)) { + protocols[0] = "http"; + protocols[1] = "https"; + protocols[2] = "blob"; + } else { + protocols[0] = "webkit+http"; + protocols[1] = "webkit+https"; + protocols[2] = "webkit+blob"; + } protocols[3] = nullptr; return protocols; } @@ -878,6 +888,10 @@ const gchar* const* webKitWebSrcGetProto static URL convertPlaybinURI(const char* uriString) { URL url(URL(), uriString); + if (!webkitGstCheckVersion(1, 12, 0)) { + ASSERT(url.protocol().substring(0, 7) == "webkit+"); + url.setProtocol(url.protocol().substring(7).toString()); + } return url; } diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/GStreamer.cmake webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/GStreamer.cmake --- webkitgtk-2.36.0.orig/Source/WebCore/platform/GStreamer.cmake 2022-02-23 02:59:01.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/GStreamer.cmake 2022-03-22 13:18:04.345943367 -0500 @@ -24,7 +24,6 @@ if (ENABLE_VIDEO OR ENABLE_WEB_AUDIO) platform/graphics/gstreamer/TextCombinerPadGStreamer.cpp platform/graphics/gstreamer/TextSinkGStreamer.cpp platform/graphics/gstreamer/TrackPrivateBaseGStreamer.cpp - platform/graphics/gstreamer/VideoFrameMetadataGStreamer.cpp platform/graphics/gstreamer/VideoSinkGStreamer.cpp platform/graphics/gstreamer/VideoTrackPrivateGStreamer.cpp platform/graphics/gstreamer/WebKitAudioSinkGStreamer.cpp @@ -146,13 +145,17 @@ if (ENABLE_VIDEO) endif () if (ENABLE_MEDIA_STREAM OR ENABLE_WEB_RTC) - list(APPEND WebCore_SYSTEM_INCLUDE_DIRECTORIES - ${GSTREAMER_CODECPARSERS_INCLUDE_DIRS} - ) - if (NOT USE_GSTREAMER_FULL) - list(APPEND WebCore_LIBRARIES - ${GSTREAMER_CODECPARSERS_LIBRARIES} + if (PC_GSTREAMER_VERSION VERSION_LESS "1.10") + message(FATAL_ERROR "GStreamer 1.10 is needed for ENABLE_MEDIA_STREAM or ENABLE_WEB_RTC") + else () + list(APPEND WebCore_SYSTEM_INCLUDE_DIRECTORIES + ${GSTREAMER_CODECPARSERS_INCLUDE_DIRS} ) + if (NOT USE_GSTREAMER_FULL) + list(APPEND WebCore_LIBRARIES + ${GSTREAMER_CODECPARSERS_LIBRARIES} + ) + endif () endif () endif () endif () diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/mediastream/gstreamer/GStreamerCapturer.cpp webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/mediastream/gstreamer/GStreamerCapturer.cpp --- webkitgtk-2.36.0.orig/Source/WebCore/platform/mediastream/gstreamer/GStreamerCapturer.cpp 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/mediastream/gstreamer/GStreamerCapturer.cpp 2022-03-21 15:12:02.676022299 -0500 @@ -23,14 +23,11 @@ #include "config.h" #if ENABLE(VIDEO) && ENABLE(MEDIA_STREAM) && USE(GSTREAMER) - #include "GStreamerCapturer.h" -#include "VideoFrameMetadataGStreamer.h" #include <gst/app/gstappsink.h> #include <gst/app/gstappsrc.h> #include <mutex> -#include <wtf/MonotonicTime.h> GST_DEBUG_CATEGORY(webkit_capturer_debug); #define GST_CAT_DEFAULT webkit_capturer_debug @@ -102,20 +99,9 @@ GstElement* GStreamerCapturer::createSou if (GST_IS_APP_SRC(m_src.get())) g_object_set(m_src.get(), "is-live", true, "format", GST_FORMAT_TIME, nullptr); - auto srcPad = adoptGRef(gst_element_get_static_pad(m_src.get(), "src")); - if (m_deviceType == CaptureDevice::DeviceType::Camera) { - gst_pad_add_probe(srcPad.get(), static_cast<GstPadProbeType>(GST_PAD_PROBE_TYPE_PUSH | GST_PAD_PROBE_TYPE_BUFFER), [](GstPad*, GstPadProbeInfo* info, gpointer) -> GstPadProbeReturn { - VideoSampleMetadata metadata; - metadata.captureTime = MonotonicTime::now().secondsSinceEpoch(); - auto* buffer = GST_PAD_PROBE_INFO_BUFFER(info); - auto* modifiedBuffer = webkitGstBufferSetVideoSampleMetadata(buffer, metadata); - gst_buffer_replace(&buffer, modifiedBuffer); - return GST_PAD_PROBE_OK; - }, nullptr, nullptr); - } - if (m_deviceType == CaptureDevice::DeviceType::Screen) { - gst_pad_add_probe(srcPad.get(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, [](GstPad*, GstPadProbeInfo* info, void* userData) -> GstPadProbeReturn { + auto pad = adoptGRef(gst_element_get_static_pad(m_src.get(), "src")); + gst_pad_add_probe(pad.get(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, [](GstPad*, GstPadProbeInfo* info, void* userData) -> GstPadProbeReturn { auto* event = gst_pad_probe_info_get_event(info); if (GST_EVENT_TYPE(event) != GST_EVENT_CAPS) return GST_PAD_PROBE_OK; diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp --- webkitgtk-2.36.0.orig/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp 2022-03-21 15:12:02.676022299 -0500 @@ -31,7 +31,6 @@ #include "GStreamerCommon.h" #include "MediaSampleGStreamer.h" #include "MediaStreamPrivate.h" -#include "VideoFrameMetadataGStreamer.h" #include "VideoTrackPrivateMediaStream.h" #include <gst/app/gstappsrc.h> @@ -62,10 +61,8 @@ GRefPtr<GstTagList> mediaStreamTrackPriv gst_tag_list_add(tagList.get(), GST_TAG_MERGE_APPEND, WEBKIT_MEDIA_TRACK_TAG_KIND, static_cast<int>(VideoTrackPrivate::Kind::Main), nullptr); auto& settings = track->settings(); - if (settings.width()) - gst_tag_list_add(tagList.get(), GST_TAG_MERGE_APPEND, WEBKIT_MEDIA_TRACK_TAG_WIDTH, settings.width(), nullptr); - if (settings.height()) - gst_tag_list_add(tagList.get(), GST_TAG_MERGE_APPEND, WEBKIT_MEDIA_TRACK_TAG_HEIGHT, settings.height(), nullptr); + gst_tag_list_add(tagList.get(), GST_TAG_MERGE_APPEND, WEBKIT_MEDIA_TRACK_TAG_WIDTH, settings.width(), + WEBKIT_MEDIA_TRACK_TAG_HEIGHT, settings.height(), nullptr); } GST_DEBUG("Track tags: %" GST_PTR_FORMAT, tagList.get()); @@ -256,19 +253,19 @@ public: if (!m_parent) return; - auto sampleSize = sample.presentationSize(); - IntSize captureSize(sampleSize.width(), sampleSize.height()); + auto* gstSample = static_cast<MediaSampleGStreamer*>(&sample)->platformSample().sample.gstSample; + auto* caps = gst_sample_get_caps(gstSample); + GstVideoInfo info; + gst_video_info_from_caps(&info, caps); - auto settings = m_track.settings(); - m_configuredSize.setWidth(settings.width()); - m_configuredSize.setHeight(settings.height()); - - if (!m_configuredSize.width()) - m_configuredSize.setWidth(captureSize.width()); - if (!m_configuredSize.height()) - m_configuredSize.setHeight(captureSize.height()); + int width = GST_VIDEO_INFO_WIDTH(&info); + int height = GST_VIDEO_INFO_HEIGHT(&info); + if (m_lastKnownSize != IntSize(width, height)) { + m_lastKnownSize.setWidth(width); + m_lastKnownSize.setHeight(height); + updateBlackFrame(caps); + } - auto* mediaSample = static_cast<MediaSampleGStreamer*>(&sample); auto videoRotation = sample.videoRotation(); bool videoMirrored = sample.videoMirrored(); if (m_videoRotation != videoRotation || m_videoMirrored != videoMirrored) { @@ -281,12 +278,6 @@ public: gst_pad_push_event(pad.get(), gst_event_new_tag(gst_tag_list_new(GST_TAG_IMAGE_ORIENTATION, orientation.utf8().data(), nullptr))); } - auto* gstSample = mediaSample->platformSample().sample.gstSample; - if (!m_configuredSize.isEmpty() && m_lastKnownSize != m_configuredSize) { - m_lastKnownSize = m_configuredSize; - updateBlackFrame(gst_sample_get_caps(gstSample)); - } - if (m_track.enabled()) { GST_TRACE_OBJECT(m_src.get(), "Pushing video frame from enabled track"); pushSample(gstSample); @@ -331,12 +322,6 @@ private: void pushBlackFrame() { GST_TRACE_OBJECT(m_src.get(), "Pushing black video frame"); - VideoSampleMetadata metadata; - metadata.captureTime = MonotonicTime::now().secondsSinceEpoch(); - auto* buffer = webkitGstBufferSetVideoSampleMetadata(gst_sample_get_buffer(m_blackFrame.get()), metadata); - // TODO: Use gst_sample_set_buffer() after bumping GStreamer dependency to 1.16. - auto* caps = gst_sample_get_caps(m_blackFrame.get()); - m_blackFrame = adoptGRef(gst_sample_new(buffer, caps, nullptr, nullptr)); pushSample(m_blackFrame.get()); } @@ -350,7 +335,6 @@ private: bool m_isObserving { false }; RefPtr<AudioTrackPrivateMediaStream> m_audioTrack; RefPtr<VideoTrackPrivateMediaStream> m_videoTrack; - IntSize m_configuredSize; IntSize m_lastKnownSize; GRefPtr<GstSample> m_blackFrame; MediaSample::VideoRotation m_videoRotation { MediaSample::VideoRotation::None }; diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/mediastream/gstreamer/MockRealtimeVideoSourceGStreamer.cpp webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/mediastream/gstreamer/MockRealtimeVideoSourceGStreamer.cpp --- webkitgtk-2.36.0.orig/Source/WebCore/platform/mediastream/gstreamer/MockRealtimeVideoSourceGStreamer.cpp 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/mediastream/gstreamer/MockRealtimeVideoSourceGStreamer.cpp 2022-03-21 15:12:02.676022299 -0500 @@ -162,9 +162,7 @@ void MockRealtimeVideoSourceGStreamer::u if (!pixelBuffer) return; - std::optional<VideoSampleMetadata> metadata; - metadata->captureTime = MonotonicTime::now().secondsSinceEpoch(); - auto sample = MediaSampleGStreamer::createImageSample(WTFMove(*pixelBuffer), size(), frameRate(), sampleRotation(), false, WTFMove(metadata)); + auto sample = MediaSampleGStreamer::createImageSample(WTFMove(*pixelBuffer), size(), frameRate(), sampleRotation()); sample->offsetTimestampsBy(MediaTime::createWithDouble((elapsedTime() + 100_ms).seconds())); dispatchMediaSampleToObservers(sample.get(), { }); } diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.cpp webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.cpp --- webkitgtk-2.36.0.orig/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.cpp 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.cpp 2022-03-21 16:13:53.111610814 -0500 @@ -63,7 +63,7 @@ void RealtimeIncomingVideoSourceLibWebRT videoSampleAvailable(MediaSampleGStreamer::createWrappedSample(framebuffer->getSample(), static_cast<MediaSample::VideoRotation>(frame.rotation())), { }); } else { auto gstSample = convertLibWebRTCVideoFrameToGStreamerSample(frame); - auto metadata = std::make_optional(metadataFromVideoFrame(frame)); + auto sample = MediaSampleGStreamer::create(WTFMove(gstSample), { }, { }); videoSampleAvailable(MediaSampleGStreamer::create(WTFMove(gstSample), { }, { }, static_cast<MediaSample::VideoRotation>(frame.rotation()), false, WTFMove(metadata)), { }); } } diff -urp webkitgtk-2.36.0.orig/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.h webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.h --- webkitgtk-2.36.0.orig/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.h 2022-02-23 02:59:02.000000000 -0600 +++ webkitgtk-2.36.0.gstreamer/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.h 2022-03-21 15:12:02.676022299 -0500 @@ -45,6 +45,8 @@ private: // rtc::VideoSinkInterface void OnFrame(const webrtc::VideoFrame&) final; + void setCapsFromSettings(); + GRefPtr<GstCaps> m_caps; }; } // namespace WebCore diff -urp webkitgtk-2.36.0.orig/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml webkitgtk-2.36.0.gstreamer/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml --- webkitgtk-2.36.0.orig/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml 2022-03-16 08:48:02.000000000 -0500 +++ webkitgtk-2.36.0.gstreamer/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml 2022-03-21 15:12:02.672022277 -0500 @@ -1201,11 +1201,9 @@ RequestVideoFrameCallbackEnabled: default: false WebKit: "PLATFORM(COCOA) && HAVE(AVSAMPLEBUFFERVIDEOOUTPUT)" : true - "USE(GSTREAMER)": true default: false WebCore: "PLATFORM(COCOA) && HAVE(AVSAMPLEBUFFERVIDEOOUTPUT)" : true - "USE(GSTREAMER)": true default: false # FIXME: This is on by default in WebKit2. Perhaps we should consider turning it on for WebKitLegacy as well.
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor