From nobody Tue Apr 05 02:16:09 2022 X-Original-To: dev-commits-ports-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 9E24E1A962EC; Tue, 5 Apr 2022 02:16:09 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4KXWTj42Brz3tqJ; Tue, 5 Apr 2022 02:16:09 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1649124969; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=bu+AhEsnYU8b/iD1uvR+F4DUkUw2h0EtozPDw1VToxE=; b=GBsA/dHU07c3TCdPF2qX0hixWaVGkn1NyuU21fpYGI7boZ86x7tYLky2IFnMJh9881K71q SGOu1hXUudtJxULN1/fAEDJsv9XXk5RvKABwviCCNUXrXnSsJuKl4af3umKwv7q5xkFRAz W86w3nQ/wq17hhfesR51597XwTtiYdR8Cd0BHF3y19raVNFQ9Rf6PTr9jsIgdP4ftuda6C E3HvQsN8uvAGsebFviDIX/Facqzk6Sfi9pvkstVApXDYz8boZ5JUYC/Q+jvizF2lSVlJUv UOQX1Ps0RYjU8Qt+f7urEKZfNZvYvLia3DM8omPc8hqiXLE7jaAT7txl/a6nYA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 666C01DB3E; Tue, 5 Apr 2022 02:16:09 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 2352G99T019146; Tue, 5 Apr 2022 02:16:09 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 2352G9Fs019145; Tue, 5 Apr 2022 02:16:09 GMT (envelope-from git) Date: Tue, 5 Apr 2022 02:16:09 GMT Message-Id: <202204050216.2352G9Fs019145@gitrepo.freebsd.org> To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org From: Piotr Kubaj Subject: git: 5406ac7fadd4 - main - www/firefox: fix build on powerpc64le List-Id: Commit messages for all branches of the ports repository List-Archive: https://lists.freebsd.org/archives/dev-commits-ports-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-ports-all@freebsd.org X-BeenThere: dev-commits-ports-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: pkubaj X-Git-Repository: ports X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 5406ac7fadd46dcbffc8d36a2dea7158cf0dad89 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1649124969; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=bu+AhEsnYU8b/iD1uvR+F4DUkUw2h0EtozPDw1VToxE=; b=cZ66qznUovi5VCEpBuKRlZiUSg0ay5+6gZdv2r5TARK+E3INbEwri6XBDQzas7WfpPVErW YAIzbENDufjCV2T44yy9oxeo30HHjJJc3aA15CwjPvYwKIEENzBhRioDNdEXLUin3+t1bv u84J8/FD52KXkAL/YI51xPJ9B/28lZnVY2zTy8YOpS3fyMGvljGjIT+nMrCE9Ib2VLKgQN UTxhQ7BmSUA4n8L9BHEi7ZV9SuNxwpe3Qn/pQXwYKFkw0MNFGksddvM1lEpFwYC99pMnzK TEI3GNSHWo1BRsYXO60zKEOK/OjQ6YET4G0MEVPii8GaI6w4ohDNUAOhB1hglA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1649124969; a=rsa-sha256; cv=none; b=jugCLR+SanTFFMUNxxtQXPW2b6wc/64EcRW8/k5VFGXvovuyrVdENvjRlLpPZn+dI/NUVj J4wo2BkHtRi5AedqBmWxsDvCWoFuzJCulPAV4Mjhthuiauooi3RAuEq3dsQu2bri9R2FlC Z/F5ay3Fr+DXE9sWmqJFbzhoWwotR0yuBgSeZ2MkdSfsikHwItVOUTao0oje+IvV6ldT98 ZOBlcGgVuJhOEAglNgJ1ZEa1C5fzNnjq04O3vjHsybKsAObQBj25jGGz7Yt1ieTPlDLS8E M3ha+x4vQAn4qSzxzqhlTXUlIbKR5XzdsyTayPgq5cY9r8e/sPhKeIbpQ0Qn+w== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by pkubaj: URL: https://cgit.FreeBSD.org/ports/commit/?id=5406ac7fadd46dcbffc8d36a2dea7158cf0dad89 commit 5406ac7fadd46dcbffc8d36a2dea7158cf0dad89 Author: Piotr Kubaj AuthorDate: 2022-04-05 02:12:42 +0000 Commit: Piotr Kubaj CommitDate: 2022-04-05 02:12:42 +0000 www/firefox: fix build on powerpc64le ld: error: undefined hidden symbol: mozilla::VideoFramePool::~VideoFramePool() >>> referenced by Unified_cpp_ffmpeg_ffmpeg580.cpp >>> /wrkdirs/usr/ports/www/firefox/work/.build/toolkit/library/build/../../../dom/media/platforms/ffmpeg/ffmpeg58/Unified_cpp_ffmpeg_ffmpeg580.o:(mozilla::FFmpegVideoDecoder<58>::~FFmpegVideoDecoder()) >>> referenced by Unified_cpp_ffmpeg_ffmpeg580.cpp >>> /wrkdirs/usr/ports/www/firefox/work/.build/toolkit/library/build/../../../dom/media/platforms/ffmpeg/ffmpeg58/Unified_cpp_ffmpeg_ffmpeg580.o:(mozilla::FFmpegVideoDecoder<58>::DoDecode(mozilla::MediaRawData*, unsigned char*, int, bool*, nsTArray >&)) >>> referenced by Unified_cpp_ffmpeg_ffmpeg580.cpp >>> /wrkdirs/usr/ports/www/firefox/work/.build/toolkit/library/build/../../../dom/media/platforms/ffmpeg/ffmpeg58/Unified_cpp_ffmpeg_ffmpeg580.o:(mozilla::FFmpegVideoDecoder<58>::ProcessShutdown()) >>> referenced 4 more times ld: error: undefined hidden symbol: mozilla::VideoFramePool::ReleaseUnusedVAAPIFrames() >>> referenced by Unified_cpp_ffmpeg_ffmpeg580.cpp >>> /wrkdirs/usr/ports/www/firefox/work/.build/toolkit/library/build/../../../dom/media/platforms/ffmpeg/ffmpeg58/Unified_cpp_ffmpeg_ffmpeg580.o:(mozilla::FFmpegVideoDecoder<58>::DoDecode(mozilla::MediaRawData*, unsigned char*, int, bool*, nsTArray >&)) >>> referenced by Unified_cpp_ffmpeg_ffmpeg590.cpp >>> /wrkdirs/usr/ports/www/firefox/work/.build/toolkit/library/build/../../../dom/media/platforms/ffmpeg/ffmpeg59/Unified_cpp_ffmpeg_ffmpeg590.o:(mozilla::FFmpegVideoDecoder<59>::DoDecode(mozilla::MediaRawData*, unsigned char*, int, bool*, nsTArray >&)) ld: error: undefined hidden symbol: mozilla::VideoFramePool::VideoFramePool() >>> referenced by Unified_cpp_ffmpeg_ffmpeg580.cpp >>> /wrkdirs/usr/ports/www/firefox/work/.build/toolkit/library/build/../../../dom/media/platforms/ffmpeg/ffmpeg58/Unified_cpp_ffmpeg_ffmpeg580.o:(mozilla::FFmpegVideoDecoder<58>::DoDecode(mozilla::MediaRawData*, unsigned char*, int, bool*, nsTArray >&)) >>> referenced by Unified_cpp_ffmpeg_ffmpeg590.cpp >>> /wrkdirs/usr/ports/www/firefox/work/.build/toolkit/library/build/../../../dom/media/platforms/ffmpeg/ffmpeg59/Unified_cpp_ffmpeg_ffmpeg590.o:(mozilla::FFmpegVideoDecoder<59>::DoDecode(mozilla::MediaRawData*, unsigned char*, int, bool*, nsTArray >&)) ld: error: undefined hidden symbol: mozilla::VideoFramePool::GetVideoFrameSurface(_VADRMPRIMESurfaceDescriptor&, AVCodecContext*, AVFrame*, mozilla::FFmpegLibWrapper*) >>> referenced by Unified_cpp_ffmpeg_ffmpeg580.cpp >>> /wrkdirs/usr/ports/www/firefox/work/.build/toolkit/library/build/../../../dom/media/platforms/ffmpeg/ffmpeg58/Unified_cpp_ffmpeg_ffmpeg580.o:(mozilla::FFmpegVideoDecoder<58>::CreateImageVAAPI(long, long, long, nsTArray >&)) >>> referenced by Unified_cpp_ffmpeg_ffmpeg590.cpp >>> /wrkdirs/usr/ports/www/firefox/work/.build/toolkit/library/build/../../../dom/media/platforms/ffmpeg/ffmpeg59/Unified_cpp_ffmpeg_ffmpeg590.o:(mozilla::FFmpegVideoDecoder<59>::CreateImageVAAPI(long, long, long, nsTArray >&)) Upstream issue at https://bugzilla.mozilla.org/show_bug.cgi?id=1758610. A --- www/firefox/files/patch-bug1758610 | 365 +++++++++++++++++++++++++++++++++++++ 1 file changed, 365 insertions(+) diff --git a/www/firefox/files/patch-bug1758610 b/www/firefox/files/patch-bug1758610 new file mode 100644 index 000000000000..f83eb4ea2004 --- /dev/null +++ b/www/firefox/files/patch-bug1758610 @@ -0,0 +1,365 @@ +--- dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp.orig 2022-03-30 23:24:44 UTC ++++ dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp +@@ -814,7 +814,7 @@ MediaResult FFmpegVideoDecoder::DoDecode( + # ifdef MOZ_WAYLAND_USE_VAAPI + // Create VideoFramePool in case we need it. + if (!mVideoFramePool && mEnableHardwareDecoding) { +- mVideoFramePool = MakeUnique(); ++ mVideoFramePool = MakeUnique>(); + } + + // Release unused VA-API surfaces before avcodec_receive_frame() as +--- dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h.orig 2022-03-30 23:24:44 UTC ++++ dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h +@@ -16,6 +16,9 @@ + #if LIBAVCODEC_VERSION_MAJOR >= 57 && LIBAVUTIL_VERSION_MAJOR >= 56 + # include "mozilla/layers/TextureClient.h" + #endif ++#ifdef MOZ_WAYLAND_USE_VAAPI ++# include "FFmpegVideoFramePool.h" ++#endif + + struct _VADRMPRIMESurfaceDescriptor; + typedef struct _VADRMPRIMESurfaceDescriptor VADRMPRIMESurfaceDescriptor; +@@ -23,7 +26,6 @@ typedef struct _VADRMPRIMESurfaceDescriptor VADRMPRIME + namespace mozilla { + + class ImageBufferWrapper; +-class VideoFramePool; + + template + class FFmpegVideoDecoder : public FFmpegDataDecoder {}; +@@ -138,7 +140,7 @@ class FFmpegVideoDecoder + AVBufferRef* mVAAPIDeviceContext; + bool mEnableHardwareDecoding; + VADisplay mDisplay; +- UniquePtr mVideoFramePool; ++ UniquePtr> mVideoFramePool; + static nsTArray mAcceleratedFormats; + #endif + RefPtr mImageAllocator; +--- dom/media/platforms/ffmpeg/FFmpegVideoFramePool.cpp.orig 2022-03-31 01:24:44.000000000 +0200 ++++ dom/media/platforms/ffmpeg/FFmpegVideoFramePool.cpp 2022-04-05 00:06:31.002795000 +0200 +@@ -5,6 +5,7 @@ + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + + #include "FFmpegVideoFramePool.h" ++#include "PlatformDecoderModule.h" + #include "FFmpegLog.h" + #include "mozilla/widget/DMABufLibWrapper.h" + #include "libavutil/pixfmt.h" +@@ -15,14 +16,14 @@ + + namespace mozilla { + +-RefPtr VideoFrameSurfaceVAAPI::GetAsImage() { ++RefPtr VideoFrameSurface::GetAsImage() { + return new layers::DMABUFSurfaceImage(mSurface); + } + +-VideoFrameSurfaceVAAPI::VideoFrameSurfaceVAAPI(DMABufSurface* aSurface) ++VideoFrameSurface::VideoFrameSurface(DMABufSurface* aSurface) + : mSurface(aSurface), + mLib(nullptr), +- mAVHWFramesContext(nullptr), ++ mAVHWDeviceContext(nullptr), + mHWAVBuffer(nullptr) { + // Create global refcount object to track mSurface usage over + // gects rendering engine. We can't release it until it's used +@@ -30,22 +31,22 @@ + MOZ_ASSERT(mSurface); + MOZ_RELEASE_ASSERT(mSurface->GetAsDMABufSurfaceYUV()); + mSurface->GlobalRefCountCreate(); +- FFMPEG_LOG("VideoFrameSurfaceVAAPI: creating surface UID = %d", ++ FFMPEG_LOG("VideoFrameSurface: creating surface UID = %d", + mSurface->GetUID()); + } + +-void VideoFrameSurfaceVAAPI::LockVAAPIData(AVCodecContext* aAVCodecContext, +- AVFrame* aAVFrame, +- FFmpegLibWrapper* aLib) { +- FFMPEG_LOG("VideoFrameSurfaceVAAPI: VAAPI locking dmabuf surface UID = %d", ++void VideoFrameSurface::LockVAAPIData( ++ AVCodecContext* aAVCodecContext, AVFrame* aAVFrame, ++ FFmpegLibWrapper* aLib) { ++ FFMPEG_LOG("VideoFrameSurface: VAAPI locking dmabuf surface UID = %d", + mSurface->GetUID()); + mLib = aLib; +- mAVHWFramesContext = aLib->av_buffer_ref(aAVCodecContext->hw_frames_ctx); ++ mAVHWDeviceContext = aLib->av_buffer_ref(aAVCodecContext->hw_device_ctx); + mHWAVBuffer = aLib->av_buffer_ref(aAVFrame->buf[0]); + } + +-void VideoFrameSurfaceVAAPI::ReleaseVAAPIData(bool aForFrameRecycle) { +- FFMPEG_LOG("VideoFrameSurfaceVAAPI: VAAPI releasing dmabuf surface UID = %d", ++void VideoFrameSurface::ReleaseVAAPIData(bool aForFrameRecycle) { ++ FFMPEG_LOG("VideoFrameSurface: VAAPI releasing dmabuf surface UID = %d", + mSurface->GetUID()); + + // It's possible to unref GPU data while IsUsed() is still set. +@@ -56,7 +57,7 @@ + // is closed. + if (mLib) { + mLib->av_buffer_unref(&mHWAVBuffer); +- mLib->av_buffer_unref(&mAVHWFramesContext); ++ mLib->av_buffer_unref(&mAVHWDeviceContext); + } + + // If we want to recycle the frame, make sure it's not used +@@ -67,43 +68,44 @@ + } + } + +-VideoFrameSurfaceVAAPI::~VideoFrameSurfaceVAAPI() { +- FFMPEG_LOG("VideoFrameSurfaceVAAPI: deleting dmabuf surface UID = %d", ++VideoFrameSurface::~VideoFrameSurface() { ++ FFMPEG_LOG("VideoFrameSurface: deleting dmabuf surface UID = %d", + mSurface->GetUID()); + // We're about to quit, no need to recycle the frames. + ReleaseVAAPIData(/* aForFrameRecycle */ false); + } + +-VideoFramePool::VideoFramePool() : mSurfaceLock("VideoFramePoolSurfaceLock") {} ++VideoFramePool::VideoFramePool() ++ : mSurfaceLock("VideoFramePoolSurfaceLock") {} + +-VideoFramePool::~VideoFramePool() { ++VideoFramePool::~VideoFramePool() { + MutexAutoLock lock(mSurfaceLock); + mDMABufSurfaces.Clear(); + } + +-void VideoFramePool::ReleaseUnusedVAAPIFrames() { ++void VideoFramePool::ReleaseUnusedVAAPIFrames() { + MutexAutoLock lock(mSurfaceLock); + for (const auto& surface : mDMABufSurfaces) { +- auto* vaapiSurface = surface->AsVideoFrameSurfaceVAAPI(); +- if (!vaapiSurface->IsUsed()) { +- vaapiSurface->ReleaseVAAPIData(); ++ if (!surface->IsUsed()) { ++ surface->ReleaseVAAPIData(); + } + } + } + +-RefPtr VideoFramePool::GetFreeVideoFrameSurface() { ++RefPtr> ++VideoFramePool::GetFreeVideoFrameSurface() { + for (auto& surface : mDMABufSurfaces) { + if (surface->IsUsed()) { + continue; + } +- auto* vaapiSurface = surface->AsVideoFrameSurfaceVAAPI(); +- vaapiSurface->ReleaseVAAPIData(); ++ surface->ReleaseVAAPIData(); + return surface; + } + return nullptr; + } + +-RefPtr VideoFramePool::GetVideoFrameSurface( ++RefPtr> ++VideoFramePool::GetVideoFrameSurface( + VADRMPRIMESurfaceDescriptor& aVaDesc, AVCodecContext* aAVCodecContext, + AVFrame* aAVFrame, FFmpegLibWrapper* aLib) { + if (aVaDesc.fourcc != VA_FOURCC_NV12 && aVaDesc.fourcc != VA_FOURCC_YV12 && +@@ -113,7 +115,8 @@ + } + + MutexAutoLock lock(mSurfaceLock); +- RefPtr videoSurface = GetFreeVideoFrameSurface(); ++ RefPtr> videoSurface = ++ GetFreeVideoFrameSurface(); + if (!videoSurface) { + RefPtr surface = + DMABufSurfaceYUV::CreateYUVSurface(aVaDesc); +@@ -121,7 +124,8 @@ + return nullptr; + } + FFMPEG_LOG("Created new VA-API DMABufSurface UID = %d", surface->GetUID()); +- RefPtr surf = new VideoFrameSurfaceVAAPI(surface); ++ RefPtr> surf = ++ new VideoFrameSurface(surface); + if (!mTextureCreationWorks) { + mTextureCreationWorks = Some(surface->VerifyTextureCreation()); + } +@@ -138,11 +142,8 @@ + } + FFMPEG_LOG("Reusing VA-API DMABufSurface UID = %d", surface->GetUID()); + } +- +- auto* vaapiSurface = videoSurface->AsVideoFrameSurfaceVAAPI(); +- vaapiSurface->LockVAAPIData(aAVCodecContext, aAVFrame, aLib); +- vaapiSurface->MarkAsUsed(); +- ++ videoSurface->LockVAAPIData(aAVCodecContext, aAVFrame, aLib); ++ videoSurface->MarkAsUsed(); + return videoSurface; + } + +--- dom/media/platforms/ffmpeg/FFmpegVideoFramePool.h.orig 2022-03-31 01:24:44.000000000 +0200 ++++ dom/media/platforms/ffmpeg/FFmpegVideoFramePool.h 2022-04-05 00:23:32.421765000 +0200 +@@ -7,8 +7,9 @@ + #ifndef __FFmpegVideoFramePool_h__ + #define __FFmpegVideoFramePool_h__ + +-#include "FFmpegVideoDecoder.h" + #include "FFmpegLibWrapper.h" ++#include "FFmpegLibs.h" ++#include "FFmpegLog.h" + + #include "mozilla/layers/DMABUFSurfaceImage.h" + #include "mozilla/widget/DMABufLibWrapper.h" +@@ -16,43 +17,16 @@ + + namespace mozilla { + +-class VideoFramePool; +-class VideoFrameSurfaceVAAPI; +- +-class VideoFrameSurface { +- public: +- NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VideoFrameSurface) +- +- VideoFrameSurface() = default; +- +- virtual VideoFrameSurfaceVAAPI* AsVideoFrameSurfaceVAAPI() { return nullptr; } +- +- virtual void SetYUVColorSpace(gfx::YUVColorSpace aColorSpace) = 0; +- virtual void SetColorRange(gfx::ColorRange aColorRange) = 0; +- +- virtual RefPtr GetDMABufSurface() { return nullptr; }; +- virtual RefPtr GetAsImage() = 0; +- +- // Don't allow VideoFrameSurface plain copy as it leads to +- // unexpected DMABufSurface/HW buffer releases and we don't want to +- // deep copy them. +- VideoFrameSurface(const VideoFrameSurface&) = delete; +- const VideoFrameSurface& operator=(VideoFrameSurface const&) = delete; +- +- protected: +- virtual ~VideoFrameSurface(){}; +-}; +- +-// VideoFrameSurfaceVAAPI holds a reference to GPU data with a video frame. ++// VideoFrameSurface holds a reference to GPU data with a video frame. + // + // Actual GPU pixel data are stored at DMABufSurface and + // DMABufSurface is passed to gecko GL rendering pipeline via. + // DMABUFSurfaceImage. + // +-// VideoFrameSurfaceVAAPI can optionally hold VA-API ffmpeg related data to keep ++// VideoFrameSurface can optionally hold VA-API ffmpeg related data to keep + // GPU data locked untill we need them. + // +-// VideoFrameSurfaceVAAPI is used for both HW accelerated video decoding ++// VideoFrameSurface is used for both HW accelerated video decoding + // (VA-API) and ffmpeg SW decoding. + // + // VA-API scenario +@@ -72,13 +46,24 @@ + // Unfortunately there isn't any obvious way how to mark particular VASurface + // as used. The best we can do is to hold a reference to particular AVBuffer + // from decoded AVFrame and AVHWFramesContext which owns the AVBuffer. +-class VideoFrameSurfaceVAAPI final : public VideoFrameSurface { +- friend class VideoFramePool; ++template ++class VideoFrameSurface {}; ++template <> ++class VideoFrameSurface; + ++template ++class VideoFramePool {}; ++template <> ++class VideoFramePool; ++ ++template <> ++class VideoFrameSurface { ++ friend class VideoFramePool; ++ + public: +- explicit VideoFrameSurfaceVAAPI(DMABufSurface* aSurface); ++ NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VideoFrameSurface) + +- VideoFrameSurfaceVAAPI* AsVideoFrameSurfaceVAAPI() final { return this; } ++ explicit VideoFrameSurface(DMABufSurface* aSurface); + + void SetYUVColorSpace(mozilla::gfx::YUVColorSpace aColorSpace) { + mSurface->GetAsDMABufSurfaceYUV()->SetYUVColorSpace(aColorSpace); +@@ -93,6 +78,12 @@ + + RefPtr GetAsImage(); + ++ // Don't allow VideoFrameSurface plain copy as it leads to ++ // unexpected DMABufSurface/HW buffer releases and we don't want to ++ // deep copy them. ++ VideoFrameSurface(const VideoFrameSurface&) = delete; ++ const VideoFrameSurface& operator=(VideoFrameSurface const&) = delete; ++ + protected: + // Lock VAAPI related data + void LockVAAPIData(AVCodecContext* aAVCodecContext, AVFrame* aAVFrame, +@@ -107,32 +98,33 @@ + void MarkAsUsed() { mSurface->GlobalRefAdd(); } + + private: +- virtual ~VideoFrameSurfaceVAAPI(); ++ virtual ~VideoFrameSurface(); + + const RefPtr mSurface; + const FFmpegLibWrapper* mLib; +- AVBufferRef* mAVHWFramesContext; ++ AVBufferRef* mAVHWDeviceContext; + AVBufferRef* mHWAVBuffer; + }; + + // VideoFramePool class is thread-safe. +-class VideoFramePool final { ++template <> ++class VideoFramePool { + public: + VideoFramePool(); + ~VideoFramePool(); + +- RefPtr GetVideoFrameSurface( ++ RefPtr> GetVideoFrameSurface( + VADRMPRIMESurfaceDescriptor& aVaDesc, AVCodecContext* aAVCodecContext, + AVFrame* aAVFrame, FFmpegLibWrapper* aLib); + void ReleaseUnusedVAAPIFrames(); + + private: +- RefPtr GetFreeVideoFrameSurface(); ++ RefPtr> GetFreeVideoFrameSurface(); + + private: + // Protect mDMABufSurfaces pool access + Mutex mSurfaceLock; +- nsTArray> mDMABufSurfaces; ++ nsTArray>> mDMABufSurfaces; + // We may fail to create texture over DMABuf memory due to driver bugs so + // check that before we export first DMABuf video frame. + Maybe mTextureCreationWorks; +--- dom/media/platforms/ffmpeg/ffmpeg58/moz.build.orig 2022-03-30 23:24:44 UTC ++++ dom/media/platforms/ffmpeg/ffmpeg58/moz.build +@@ -30,6 +30,9 @@ if CONFIG['MOZ_WAYLAND']: + CXXFLAGS += CONFIG['MOZ_GTK3_CFLAGS'] + DEFINES['MOZ_WAYLAND_USE_VAAPI'] = 1 + USE_LIBS += ['mozva'] ++ UNIFIED_SOURCES += [ ++ '../FFmpegVideoFramePool.cpp', ++ ] + + include("/ipc/chromium/chromium-config.mozbuild") + +--- dom/media/platforms/ffmpeg/ffmpeg59/moz.build.orig 2022-03-30 23:24:44 UTC ++++ dom/media/platforms/ffmpeg/ffmpeg59/moz.build +@@ -30,6 +30,9 @@ if CONFIG["MOZ_WAYLAND"]: + CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"] + DEFINES["MOZ_WAYLAND_USE_VAAPI"] = 1 + USE_LIBS += ["mozva"] ++ UNIFIED_SOURCES += [ ++ "../FFmpegVideoFramePool.cpp", ++ ] + + include("/ipc/chromium/chromium-config.mozbuild") +