diff --git a/community/firefox/0001-Bug-1831691-Use-the-vendored-glean_parser-for-all-of.patch b/community/firefox/0001-Bug-1831691-Use-the-vendored-glean_parser-for-all-of.patch new file mode 100644 index 00000000000..cfc8dfecbea --- /dev/null +++ b/community/firefox/0001-Bug-1831691-Use-the-vendored-glean_parser-for-all-of.patch @@ -0,0 +1,41 @@ +Patch-Source: https://github.com/archlinux/svntogit-packages/blob/f1173939c033b642ea4c2b5c53fa9b881d0545f5/trunk/0001-Bug-1831691-Use-the-vendored-glean_parser-for-all-of.patch +-- +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: ahochheiden +Date: Sat, 6 May 2023 21:07:09 +0000 +Subject: [PATCH] Bug 1831691 - Use the vendored 'glean_parser' for all of + `mach` r=firefox-build-system-reviewers,glandium + +Differential Revision: https://phabricator.services.mozilla.com/D177340 +--- + python/sites/build.txt | 1 - + python/sites/mach.txt | 1 + + python/sites/python-test.txt | 1 - + 3 files changed, 1 insertion(+), 2 deletions(-) + +diff --git a/python/sites/build.txt b/python/sites/build.txt +index b43f7680d200..4e6f6c51d9ad 100644 +--- a/python/sites/build.txt ++++ b/python/sites/build.txt +@@ -1,2 +1 @@ +-vendored:third_party/python/glean_parser + pth:third_party/python/vsdownload +diff --git a/python/sites/mach.txt b/python/sites/mach.txt +index b9fafd0b9c59..a18691184312 100644 +--- a/python/sites/mach.txt ++++ b/python/sites/mach.txt +@@ -78,6 +78,7 @@ vendored:third_party/python/esprima + vendored:third_party/python/fluent.migrate + vendored:third_party/python/fluent.syntax + vendored:third_party/python/giturlparse ++vendored:third_party/python/glean_parser + vendored:third_party/python/gyp/pylib + vendored:third_party/python/idna + vendored:third_party/python/importlib_metadata +diff --git a/python/sites/python-test.txt b/python/sites/python-test.txt +index 48cdcd2b8f48..74889365a22b 100644 +--- a/python/sites/python-test.txt ++++ b/python/sites/python-test.txt +@@ -1,2 +1 @@ +-vendored:third_party/python/glean_parser + pypi:pytest==7.0.1 diff --git a/community/firefox/APKBUILD b/community/firefox/APKBUILD index 113c054d8b6..16a8b42fe54 100644 --- a/community/firefox/APKBUILD +++ b/community/firefox/APKBUILD @@ -3,9 +3,9 @@ # Contributor: Rasmus Thomsen # Maintainer: psykose pkgname=firefox -pkgver=112.0.2 -_releasedate=2023-04-25 -pkgrel=1 +pkgver=113.0 +_releasedate=2023-05-09 +pkgrel=0 pkgdesc="Firefox web browser" url="https://www.firefox.com/" # s390x blocked by lld @@ -67,6 +67,7 @@ makedepends=" zip " source="$pkgname-$pkgver.tar.xz::https://ftp.mozilla.org/pub/firefox/releases/$pkgver/source/firefox-$pkgver.source.tar.xz + 0001-Bug-1831691-Use-the-vendored-glean_parser-for-all-of.patch avoid-redefinition.patch disable-moz-stackwalk.patch fix-fortify-system-wrappers.patch @@ -74,13 +75,12 @@ source="$pkgname-$pkgver.tar.xz::https://ftp.mozilla.org/pub/firefox/releases/$p fix-rust-target.patch fix-webrtc-glibcisms.patch no-ccache-stats.patch + python-deps.patch rust-lto-thin.patch riscv64-no-lto.patch sandbox-fork.patch sandbox-largefile.patch sandbox-sched_setscheduler.patch - webrtc.patch - zstandard.patch stab.h @@ -712,7 +712,8 @@ package() { } sha512sums=" -2cd7adeb6c9a39ad4c5366982e0e58382d7f205e6f2cee02b8ec2867034d1c0c884eeeb870a35db35cba60fa9c84aea73f8c77cfd9f36b5146dde06464aaabd1 firefox-112.0.2.tar.xz +96b0f0774083270f4fcce06085b177ced25ba05da7291d777f1da1d5bbad30721bc6363b76e06ccb64fc092778c8326a426a8bfdfa3cbaafd4f1169b924744a5 firefox-113.0.tar.xz +028a723d749b9b0a924a13de3e33ff84829bfab872cf6e41293fe11b7e8f640b5ca45d1323597ac7c9bb093ffcee4c72a83ca9210f6bdd22e12ea5d67ef3d3f3 0001-Bug-1831691-Use-the-vendored-glean_parser-for-all-of.patch b1cb2db3122634f66d2bae7066e76f2dcd455c464e021db4de3b0a08314df95cb667846081682db549dd2af8a00831cabe44a2420c66cdfb5e3b5fa7e6bd21d3 avoid-redefinition.patch 454ea3263cabce099accbdc47aaf83be26a19f8b5a4568c01a7ef0384601cf8315efd86cd917f9c8bf419c2c845db89a905f3ff9a8eb0c8e41042e93aa96a85c disable-moz-stackwalk.patch 2f4f15974d52de4bb273b62a332d13620945d284bbc6fe6bd0a1f58ff7388443bc1d3bf9c82cc31a8527aad92b0cd3a1bc41d0af5e1800e0dcbd7033e58ffd71 fix-fortify-system-wrappers.patch @@ -720,13 +721,12 @@ d3a54897089eda9fdfe4b25ade1cb2c01c4b31fa9bf0e0ddbb0bbe674072ec5d36a6e52f791a8cbc cd68b89e29e5f6379fbd5679db27b9a5ef70ea65e51c0d0a8137e1f1fd210e35a8cfb047798e9549bc7275606d7ec5c8d8af1335d29da4699db7acd8bc7ff556 fix-rust-target.patch 305c874fdea3096e9c4c6aa6520ac64bb1c347c4b59db8360096646593fe684c3b5377874d91cecd33d56d1410b4714fbdea2b514923723ecbeff79d51265d9b fix-webrtc-glibcisms.patch c0437a6753f3f350968fa12d250efdfe1bea77baf0e4c06b072b5cc9e78c774dbf4506bc536337030d349fb3ba4460097b75b0c7c5b8fb2d39d8b0a392948936 no-ccache-stats.patch +ff3618223bba2d7b877a16451256e67d973c5f4e24027cb5a7da4c0a6f6a028a1eb51d3cbcddae71bca584a4c13cb485950b86022ea26d4e25ae3fdf3ce5d910 python-deps.patch 9f433c8051d05efb8b119e0b67b97951837aca6a8c5671646714a24023be11a9d63fa7c4e56a6c7f3911c9d8406b06cd95926de1a82925d02197dfd55daf5642 rust-lto-thin.patch b12dbff6513ac8c231d91c257a9accecc034d9ea9c31d99ca0454334ccf80fe7b50d6a356182dc46a9f25064366ea9a177f463cb2544b1cf5368ee6bd71bc095 riscv64-no-lto.patch 2518f2fc75b5db30058e0735f47d60fdf1e7adfaeee4b33fb2afb1bd9a616ce943fd88f4404d0802d4083703f4acf1d5ad42377218d025bc768807fbaf7e1609 sandbox-fork.patch b7d0a6126bdf6c0569f80aabf5b37ed2c7a35712eb8a0404a2d85381552f5555d4f97d213ea26cec6a45dc2785f22439376ed5f8e78b4fd664ef0223307b333e sandbox-largefile.patch 94433c5ffdbe579c456d95c5f053f61fcbab2f652fa90bc69dcc27d9a1507a8e5c677adeadae9a7a75cc9a55184c1040737f4dfd10b279c088ef016561e6f135 sandbox-sched_setscheduler.patch -4d711fb68512138656f4702802aee2c6a89ebc0892dd0a5dcf9a7fbef0d96f41fcb2907409d586499fc9254a0c690210e22a6e4638f1bcf6c8a1e2cb5137a6fb webrtc.patch -54e37035bf86a5ead9092714af1a7bc7c1c86751133cd3937b59e700a8b17a244694812b83d16f8bca28333d157b273f7496611d17ccd09268ed0ef346a8cb6b zstandard.patch 0b3f1e4b9fdc868e4738b5c81fd6c6128ce8885b260affcb9a65ff9d164d7232626ce1291aaea70132b3e3124f5e13fef4d39326b8e7173e362a823722a85127 stab.h 333b9df0c8a7693601245dac13522c9e90632f490b2fe1b852bf85fbd033c111a82fec3cfc302cfdea62d591c51042ae69c2c33a5668afacca11ea1f215188bc firefox.desktop 9869ef092609af4caed6aa27f3de6ac49b91ef993ccbfd8a2080465def442d3b02745fbe3c71d362f07c3075d46f388a023c0ad8ebb5f6ffd37e601d997b74f7 distribution.ini diff --git a/community/firefox/zstandard.patch b/community/firefox/python-deps.patch similarity index 53% rename from community/firefox/zstandard.patch rename to community/firefox/python-deps.patch index 4f4eb1a82bd..940be639c93 100644 --- a/community/firefox/zstandard.patch +++ b/community/firefox/python-deps.patch @@ -1,9 +1,9 @@ -fix build with newer versions --- a/python/sites/mach.txt +++ b/python/sites/mach.txt -@@ -141,4 +141,4 @@ +@@ -134,4 +134,4 @@ # We aren't (yet) able to pin packages in automation, so we have to # support down to the oldest locally-installed version (5.4.2). - pypi-optional:psutil>=5.4.2,<=5.9.4:telemetry will be missing some data +-pypi-optional:psutil>=5.4.2,<=5.9.4:telemetry will be missing some data ++pypi-optional:psutil>=5.4.2,<=5.10.0:telemetry will be missing some data -pypi-optional:zstandard>=0.11.1,<=0.19.0:zstd archives will not be possible to extract -+pypi-optional:zstandard>=0.11.1:zstd archives will not be possible to extract ++pypi-optional:zstandard>=0.11.1,<=0.24.0:zstd archives will not be possible to extract diff --git a/community/firefox/webrtc.patch b/community/firefox/webrtc.patch deleted file mode 100644 index d5302feb57a..00000000000 --- a/community/firefox/webrtc.patch +++ /dev/null @@ -1,507 +0,0 @@ -Patch-Source: https://src.fedoraproject.org/rpms/firefox/blob/d5f2b2028f09d610ce0c3e70f85eb5baea4e9037/f/libwebrtc-pipewire-capturer-import-dmabuf-directly-into-desktop-frame.patch --- -From d9faa73cbbc186d7dd0dbfce0589012a0bed9f17 Mon Sep 17 00:00:00 2001 -From: Jan Grulich -Date: Fri, 17 Mar 2023 10:58:10 +0100 -Subject: [PATCH] PipeWire capturer: import DMABufs directly into desktop frame - -Originally DMABufs were imported into a temporary buffer followed by a -copy operation into the desktop frame itself. This is not needed as we -can import them directly into desktop frames and avoid this overhead. - -Also drop support for MemPtr buffers as both Mutter and KWin don't seem -to support them and they are going to be too slow anyway. - -Testing with latest Chromium, I could see two processes with usage around 20% and 40% without this change going down to 10% and 20% with -this change applied. - -Bug: webrtc:13429 -Bug: chrome:1378258 -Change-Id: Ice3292528ff56300931c8638f8e03d4883d5e331 -Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/297501 -Reviewed-by: Alexander Cooper -Commit-Queue: Jan Grulich -Cr-Commit-Position: refs/heads/main@{#39594} ---- - -diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc -index 5bbd5d7aba..b529077c6d 100644 ---- a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc -+++ b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.cc -@@ -101,11 +101,23 @@ typedef void (*glDeleteTextures_func)(GLsizei n, const GLuint* textures); - typedef void (*glGenTextures_func)(GLsizei n, GLuint* textures); - typedef GLenum (*glGetError_func)(void); - typedef const GLubyte* (*glGetString_func)(GLenum name); --typedef void (*glGetTexImage_func)(GLenum target, -- GLint level, -- GLenum format, -- GLenum type, -- void* pixels); -+typedef void (*glReadPixels_func)(GLint x, -+ GLint y, -+ GLsizei width, -+ GLsizei height, -+ GLenum format, -+ GLenum type, -+ void* data); -+typedef void (*glGenFramebuffers_func)(GLsizei n, GLuint* ids); -+typedef void (*glDeleteFramebuffers_func)(GLsizei n, -+ const GLuint* framebuffers); -+typedef void (*glBindFramebuffer_func)(GLenum target, GLuint framebuffer); -+typedef void (*glFramebufferTexture2D_func)(GLenum target, -+ GLenum attachment, -+ GLenum textarget, -+ GLuint texture, -+ GLint level); -+typedef GLenum (*glCheckFramebufferStatus_func)(GLenum target); - typedef void (*glTexParameteri_func)(GLenum target, GLenum pname, GLint param); - typedef void* (*glXGetProcAddressARB_func)(const char*); - -@@ -118,7 +130,12 @@ glDeleteTextures_func GlDeleteTextures = nullptr; - glGenTextures_func GlGenTextures = nullptr; - glGetError_func GlGetError = nullptr; - glGetString_func GlGetString = nullptr; --glGetTexImage_func GlGetTexImage = nullptr; -+glReadPixels_func GlReadPixels = nullptr; -+glGenFramebuffers_func GlGenFramebuffers = nullptr; -+glDeleteFramebuffers_func GlDeleteFramebuffers = nullptr; -+glBindFramebuffer_func GlBindFramebuffer = nullptr; -+glFramebufferTexture2D_func GlFramebufferTexture2D = nullptr; -+glCheckFramebufferStatus_func GlCheckFramebufferStatus = nullptr; - glTexParameteri_func GlTexParameteri = nullptr; - glXGetProcAddressARB_func GlXGetProcAddressARB = nullptr; - -@@ -279,12 +296,26 @@ static bool LoadGL() { - (glDeleteTextures_func)GlXGetProcAddressARB("glDeleteTextures"); - GlGenTextures = (glGenTextures_func)GlXGetProcAddressARB("glGenTextures"); - GlGetError = (glGetError_func)GlXGetProcAddressARB("glGetError"); -- GlGetTexImage = (glGetTexImage_func)GlXGetProcAddressARB("glGetTexImage"); -+ GlReadPixels = (glReadPixels_func)GlXGetProcAddressARB("glReadPixels"); -+ GlGenFramebuffers = -+ (glGenFramebuffers_func)GlXGetProcAddressARB("glGenFramebuffers"); -+ GlDeleteFramebuffers = -+ (glDeleteFramebuffers_func)GlXGetProcAddressARB("glDeleteFramebuffers"); -+ GlBindFramebuffer = -+ (glBindFramebuffer_func)GlXGetProcAddressARB("glBindFramebuffer"); -+ GlFramebufferTexture2D = (glFramebufferTexture2D_func)GlXGetProcAddressARB( -+ "glFramebufferTexture2D"); -+ GlCheckFramebufferStatus = -+ (glCheckFramebufferStatus_func)GlXGetProcAddressARB( -+ "glCheckFramebufferStatus"); -+ - GlTexParameteri = - (glTexParameteri_func)GlXGetProcAddressARB("glTexParameteri"); - - return GlBindTexture && GlDeleteTextures && GlGenTextures && GlGetError && -- GlGetTexImage && GlTexParameteri; -+ GlReadPixels && GlGenFramebuffers && GlDeleteFramebuffers && -+ GlBindFramebuffer && GlFramebufferTexture2D && -+ GlCheckFramebufferStatus && GlTexParameteri; - } - - return false; -@@ -435,6 +466,14 @@ EglDmaBuf::~EglDmaBuf() { - EglTerminate(egl_.display); - } - -+ if (fbo_) { -+ GlDeleteFramebuffers(1, &fbo_); -+ } -+ -+ if (texture_) { -+ GlDeleteTextures(1, &texture_); -+ } -+ - // BUG: crbug.com/1290566 - // Closing libEGL.so.1 when using NVidia drivers causes a crash - // when EglGetPlatformDisplayEXT() is used, at least this one is enough -@@ -466,20 +505,20 @@ bool EglDmaBuf::GetClientExtensions(EGLDisplay dpy, EGLint name) { - } - - RTC_NO_SANITIZE("cfi-icall") --std::unique_ptr EglDmaBuf::ImageFromDmaBuf( -- const DesktopSize& size, -- uint32_t format, -- const std::vector& plane_datas, -- uint64_t modifier) { -- std::unique_ptr src; -- -+bool EglDmaBuf::ImageFromDmaBuf(const DesktopSize& size, -+ uint32_t format, -+ const std::vector& plane_datas, -+ uint64_t modifier, -+ const DesktopVector& offset, -+ const DesktopSize& buffer_size, -+ uint8_t* data) { - if (!egl_initialized_) { -- return src; -+ return false; - } - - if (plane_datas.size() <= 0) { - RTC_LOG(LS_ERROR) << "Failed to process buffer: invalid number of planes"; -- return src; -+ return false; - } - - EGLint attribs[47]; -@@ -568,20 +607,32 @@ std::unique_ptr EglDmaBuf::ImageFromDmaBuf( - if (image == EGL_NO_IMAGE) { - RTC_LOG(LS_ERROR) << "Failed to record frame: Error creating EGLImage - " - << FormatEGLError(EglGetError()); -- return src; -+ return false; - } - - // create GL 2D texture for framebuffer -- GLuint texture; -- GlGenTextures(1, &texture); -- GlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); -- GlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); -- GlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -- GlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -- GlBindTexture(GL_TEXTURE_2D, texture); -+ if (!texture_) { -+ GlGenTextures(1, &texture_); -+ GlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); -+ GlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); -+ GlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -+ GlTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -+ } -+ GlBindTexture(GL_TEXTURE_2D, texture_); - GlEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image); - -- src = std::make_unique(plane_datas[0].stride * size.height()); -+ if (!fbo_) { -+ GlGenFramebuffers(1, &fbo_); -+ } -+ -+ GlBindFramebuffer(GL_FRAMEBUFFER, fbo_); -+ GlFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, -+ texture_, 0); -+ if (GlCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { -+ RTC_LOG(LS_ERROR) << "Failed to bind DMA buf framebuffer"; -+ EglDestroyImageKHR(egl_.display, image); -+ return false; -+ } - - GLenum gl_format = GL_BGRA; - switch (format) { -@@ -598,17 +649,18 @@ std::unique_ptr EglDmaBuf::ImageFromDmaBuf( - gl_format = GL_BGRA; - break; - } -- GlGetTexImage(GL_TEXTURE_2D, 0, gl_format, GL_UNSIGNED_BYTE, src.get()); - -- if (GlGetError()) { -+ GlReadPixels(offset.x(), offset.y(), buffer_size.width(), -+ buffer_size.height(), gl_format, GL_UNSIGNED_BYTE, data); -+ -+ const GLenum error = GlGetError(); -+ if (error) { - RTC_LOG(LS_ERROR) << "Failed to get image from DMA buffer."; -- return src; - } - -- GlDeleteTextures(1, &texture); - EglDestroyImageKHR(egl_.display, image); - -- return src; -+ return !error; - } - - RTC_NO_SANITIZE("cfi-icall") -diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.h b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.h -index f1d96b2f80..22a8f5ab52 100644 ---- a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.h -+++ b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/egl_dmabuf.h -@@ -41,11 +41,15 @@ class EglDmaBuf { - EglDmaBuf(); - ~EglDmaBuf(); - -- std::unique_ptr ImageFromDmaBuf( -- const DesktopSize& size, -- uint32_t format, -- const std::vector& plane_datas, -- uint64_t modifiers); -+ // Returns whether the image was successfully imported from -+ // given DmaBuf and its parameters -+ bool ImageFromDmaBuf(const DesktopSize& size, -+ uint32_t format, -+ const std::vector& plane_datas, -+ uint64_t modifiers, -+ const DesktopVector& offset, -+ const DesktopSize& buffer_size, -+ uint8_t* data); - std::vector QueryDmaBufModifiers(uint32_t format); - - bool IsEglInitialized() const { return egl_initialized_; } -@@ -58,6 +62,8 @@ class EglDmaBuf { - int32_t drm_fd_ = -1; // for GBM buffer mmap - gbm_device* gbm_device_ = nullptr; // for passed GBM buffer retrieval - -+ GLuint fbo_ = 0; -+ GLuint texture_ = 0; - EGLStruct egl_; - - absl::optional GetRenderNode(); -diff --git a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc -index 0ca75d00fc..a8879764c7 100644 ---- a/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc -+++ b/third_party/libwebrtc/modules/desktop_capture/linux/wayland/shared_screencast_stream.cc -@@ -149,6 +149,12 @@ class SharedScreenCastStreamPrivate { - struct spa_video_info_raw spa_video_format_; - - void ProcessBuffer(pw_buffer* buffer); -+ bool ProcessMemFDBuffer(pw_buffer* buffer, -+ DesktopFrame& frame, -+ const DesktopVector& offset); -+ bool ProcessDMABuffer(pw_buffer* buffer, -+ DesktopFrame& frame, -+ const DesktopVector& offset); - void ConvertRGBxToBGRx(uint8_t* frame, uint32_t size); - - // PipeWire callbacks -@@ -268,9 +274,8 @@ void SharedScreenCastStreamPrivate::OnStreamParamChanged( - std::vector params; - const int buffer_types = - has_modifier || (that->pw_server_version_ >= kDmaBufMinVersion) -- ? (1 << SPA_DATA_DmaBuf) | (1 << SPA_DATA_MemFd) | -- (1 << SPA_DATA_MemPtr) -- : (1 << SPA_DATA_MemFd) | (1 << SPA_DATA_MemPtr); -+ ? (1 << SPA_DATA_DmaBuf) | (1 << SPA_DATA_MemFd) -+ : (1 << SPA_DATA_MemFd); - - params.push_back(reinterpret_cast(spa_pod_builder_add_object( - &builder, SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers, -@@ -605,9 +610,6 @@ DesktopVector SharedScreenCastStreamPrivate::CaptureCursorPosition() { - RTC_NO_SANITIZE("cfi-icall") - void SharedScreenCastStreamPrivate::ProcessBuffer(pw_buffer* buffer) { - spa_buffer* spa_buffer = buffer->buffer; -- ScopedBuf map; -- std::unique_ptr src_unique_ptr; -- uint8_t* src = nullptr; - - // Try to update the mouse cursor first, because it can be the only - // information carried by the buffer -@@ -641,76 +643,6 @@ void SharedScreenCastStreamPrivate::ProcessBuffer(pw_buffer* buffer) { - return; - } - -- if (spa_buffer->datas[0].type == SPA_DATA_MemFd) { -- map.initialize( -- static_cast( -- mmap(nullptr, -- spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset, -- PROT_READ, MAP_PRIVATE, spa_buffer->datas[0].fd, 0)), -- spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset, -- spa_buffer->datas[0].fd); -- -- if (!map) { -- RTC_LOG(LS_ERROR) << "Failed to mmap the memory: " -- << std::strerror(errno); -- return; -- } -- -- src = SPA_MEMBER(map.get(), spa_buffer->datas[0].mapoffset, uint8_t); -- } else if (spa_buffer->datas[0].type == SPA_DATA_DmaBuf) { -- const uint n_planes = spa_buffer->n_datas; -- -- if (!n_planes) { -- return; -- } -- -- std::vector plane_datas; -- for (uint32_t i = 0; i < n_planes; ++i) { -- EglDmaBuf::PlaneData data = { -- static_cast(spa_buffer->datas[i].fd), -- static_cast(spa_buffer->datas[i].chunk->stride), -- static_cast(spa_buffer->datas[i].chunk->offset)}; -- plane_datas.push_back(data); -- } -- -- // When importing DMA-BUFs, we use the stride (number of bytes from one row -- // of pixels in the buffer) provided by PipeWire. The stride from PipeWire -- // is given by the graphics driver and some drivers might add some -- // additional padding for memory layout optimizations so not everytime the -- // stride is equal to BYTES_PER_PIXEL x WIDTH. This is fine, because during -- // the import we will use OpenGL and same graphics driver so it will be able -- // to work with the stride it provided, but later on when we work with -- // images we get from DMA-BUFs we will need to update the stride to be equal -- // to BYTES_PER_PIXEL x WIDTH as that's the size of the DesktopFrame we -- // allocate for each captured frame. -- src_unique_ptr = egl_dmabuf_->ImageFromDmaBuf( -- stream_size_, spa_video_format_.format, plane_datas, modifier_); -- if (src_unique_ptr) { -- src = src_unique_ptr.get(); -- } else { -- RTC_LOG(LS_ERROR) << "Dropping DMA-BUF modifier: " << modifier_ -- << " and trying to renegotiate stream parameters"; -- -- if (pw_server_version_ >= kDropSingleModifierMinVersion) { -- modifiers_.erase( -- std::remove(modifiers_.begin(), modifiers_.end(), modifier_), -- modifiers_.end()); -- } else { -- modifiers_.clear(); -- } -- -- pw_loop_signal_event(pw_thread_loop_get_loop(pw_main_loop_), -- renegotiate_); -- return; -- } -- } else if (spa_buffer->datas[0].type == SPA_DATA_MemPtr) { -- src = static_cast(spa_buffer->datas[0].data); -- } -- -- if (!src) { -- return; -- } -- - // Use SPA_META_VideoCrop metadata to get the frame size. KDE and GNOME do - // handle screen/window sharing differently. KDE/KWin doesn't use - // SPA_META_VideoCrop metadata and when sharing a window, it always sets -@@ -763,8 +695,8 @@ void SharedScreenCastStreamPrivate::ProcessBuffer(pw_buffer* buffer) { - } - - // Get the position of the video crop within the stream. Just double-check -- // that the position doesn't exceed the size of the stream itself. NOTE: -- // Currently it looks there is no implementation using this. -+ // that the position doesn't exceed the size of the stream itself. -+ // NOTE: Currently it looks there is no implementation using this. - uint32_t y_offset = - videocrop_metadata_use && - (videocrop_metadata->region.position.y + frame_size_.height() <= -@@ -777,22 +709,7 @@ void SharedScreenCastStreamPrivate::ProcessBuffer(pw_buffer* buffer) { - stream_size_.width()) - ? videocrop_metadata->region.position.x - : 0; -- -- const uint32_t stream_stride = kBytesPerPixel * stream_size_.width(); -- uint32_t buffer_stride = spa_buffer->datas[0].chunk->stride; -- uint32_t src_stride = buffer_stride; -- -- if (spa_buffer->datas[0].type == SPA_DATA_DmaBuf && -- buffer_stride > stream_stride) { -- // When DMA-BUFs are used, sometimes spa_buffer->stride we get might -- // contain additional padding, but after we import the buffer, the stride -- // we used is no longer relevant and we should just calculate it based on -- // the stream width. For more context see https://crbug.com/1333304. -- src_stride = stream_stride; -- } -- -- uint8_t* updated_src = -- src + (src_stride * y_offset) + (kBytesPerPixel * x_offset); -+ DesktopVector offset = DesktopVector(x_offset, y_offset); - - webrtc::MutexLock lock(&queue_lock_); - -@@ -813,9 +730,17 @@ void SharedScreenCastStreamPrivate::ProcessBuffer(pw_buffer* buffer) { - queue_.ReplaceCurrentFrame(SharedDesktopFrame::Wrap(std::move(frame))); - } - -- queue_.current_frame()->CopyPixelsFrom( -- updated_src, (src_stride - (kBytesPerPixel * x_offset)), -- DesktopRect::MakeWH(frame_size_.width(), frame_size_.height())); -+ bool bufferProcessed = false; -+ if (spa_buffer->datas[0].type == SPA_DATA_MemFd) { -+ bufferProcessed = -+ ProcessMemFDBuffer(buffer, *queue_.current_frame(), offset); -+ } else if (spa_buffer->datas[0].type == SPA_DATA_DmaBuf) { -+ bufferProcessed = ProcessDMABuffer(buffer, *queue_.current_frame(), offset); -+ } -+ -+ if (!bufferProcessed) { -+ return; -+ } - - if (spa_video_format_.format == SPA_VIDEO_FORMAT_RGBx || - spa_video_format_.format == SPA_VIDEO_FORMAT_RGBA) { -@@ -832,6 +757,87 @@ void SharedScreenCastStreamPrivate::ProcessBuffer(pw_buffer* buffer) { - DesktopRect::MakeSize(queue_.current_frame()->size())); - } - -+RTC_NO_SANITIZE("cfi-icall") -+bool SharedScreenCastStreamPrivate::ProcessMemFDBuffer( -+ pw_buffer* buffer, -+ DesktopFrame& frame, -+ const DesktopVector& offset) { -+ spa_buffer* spa_buffer = buffer->buffer; -+ ScopedBuf map; -+ uint8_t* src = nullptr; -+ -+ map.initialize( -+ static_cast( -+ mmap(nullptr, -+ spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset, -+ PROT_READ, MAP_PRIVATE, spa_buffer->datas[0].fd, 0)), -+ spa_buffer->datas[0].maxsize + spa_buffer->datas[0].mapoffset, -+ spa_buffer->datas[0].fd); -+ -+ if (!map) { -+ RTC_LOG(LS_ERROR) << "Failed to mmap the memory: " << std::strerror(errno); -+ return false; -+ } -+ -+ src = SPA_MEMBER(map.get(), spa_buffer->datas[0].mapoffset, uint8_t); -+ -+ uint32_t buffer_stride = spa_buffer->datas[0].chunk->stride; -+ uint32_t src_stride = buffer_stride; -+ -+ uint8_t* updated_src = -+ src + (src_stride * offset.y()) + (kBytesPerPixel * offset.x()); -+ -+ frame.CopyPixelsFrom( -+ updated_src, (src_stride - (kBytesPerPixel * offset.x())), -+ DesktopRect::MakeWH(frame.size().width(), frame.size().height())); -+ -+ return true; -+} -+ -+RTC_NO_SANITIZE("cfi-icall") -+bool SharedScreenCastStreamPrivate::ProcessDMABuffer( -+ pw_buffer* buffer, -+ DesktopFrame& frame, -+ const DesktopVector& offset) { -+ spa_buffer* spa_buffer = buffer->buffer; -+ -+ const uint n_planes = spa_buffer->n_datas; -+ -+ if (!n_planes) { -+ return false; -+ } -+ -+ std::vector plane_datas; -+ for (uint32_t i = 0; i < n_planes; ++i) { -+ EglDmaBuf::PlaneData data = { -+ static_cast(spa_buffer->datas[i].fd), -+ static_cast(spa_buffer->datas[i].chunk->stride), -+ static_cast(spa_buffer->datas[i].chunk->offset)}; -+ plane_datas.push_back(data); -+ } -+ -+ const bool imported = egl_dmabuf_->ImageFromDmaBuf( -+ stream_size_, spa_video_format_.format, plane_datas, modifier_, offset, -+ frame.size(), frame.data()); -+ if (!imported) { -+ RTC_LOG(LS_ERROR) << "Dropping DMA-BUF modifier: " << modifier_ -+ << " and trying to renegotiate stream parameters"; -+ -+ if (pw_server_version_ >= kDropSingleModifierMinVersion) { -+ modifiers_.erase( -+ std::remove(modifiers_.begin(), modifiers_.end(), modifier_), -+ modifiers_.end()); -+ } else { -+ modifiers_.clear(); -+ } -+ -+ pw_loop_signal_event(pw_thread_loop_get_loop(pw_main_loop_), renegotiate_); -+ return false; -+ } -+ -+ return true; -+} -+ - void SharedScreenCastStreamPrivate::ConvertRGBxToBGRx(uint8_t* frame, - uint32_t size) { - for (uint32_t i = 0; i < size; i += 4) {