From 578d7e2950295a65e77c819a91c306246b12938b Mon Sep 17 00:00:00 2001 From: Martin Stransky Date: Thu, 30 Jul 2020 10:48:57 +0200 Subject: Added VA-API fix for mozbz#1645671 --- mozilla-1645671.patch | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 mozilla-1645671.patch (limited to 'mozilla-1645671.patch') diff --git a/mozilla-1645671.patch b/mozilla-1645671.patch new file mode 100644 index 0000000..8e9e31e --- /dev/null +++ b/mozilla-1645671.patch @@ -0,0 +1,94 @@ +diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h +--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h ++++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h +@@ -156,7 +156,7 @@ + MediaDataDecoder::DecodedData& aResults); + + void ReleaseUnusedVAAPIFrames(); +- DMABufSurfaceWrapper* GetUnusedDMABufSurfaceWrapper(); ++ int GetUnusedDMABufSurfaceWrapperIndex(); + void ReleaseDMABufSurfaces(); + #endif + +@@ -174,7 +174,7 @@ + const bool mDisableHardwareDecoding; + VADisplay mDisplay; + bool mUseDMABufSurfaces; +- nsTArray mDMABufSurfaces; ++ nsTArray> mDMABufSurfaces; + #endif + RefPtr mImageAllocator; + RefPtr mImageContainer; +diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp +--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp ++++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp +@@ -698,21 +698,20 @@ + void FFmpegVideoDecoder::ReleaseUnusedVAAPIFrames() { + int len = mDMABufSurfaces.Length(); + for (int i = 0; i < len; i++) { +- if (!mDMABufSurfaces[i].IsUsed()) { +- mDMABufSurfaces[i].ReleaseVAAPIData(); ++ if (!mDMABufSurfaces[i]->IsUsed()) { ++ mDMABufSurfaces[i]->ReleaseVAAPIData(); + } + } + } + +-DMABufSurfaceWrapper* +-FFmpegVideoDecoder::GetUnusedDMABufSurfaceWrapper() { ++int FFmpegVideoDecoder::GetUnusedDMABufSurfaceWrapperIndex() { + int len = mDMABufSurfaces.Length(); + for (int i = 0; i < len; i++) { +- if (!mDMABufSurfaces[i].IsUsed()) { +- return &(mDMABufSurfaces[i]); ++ if (!mDMABufSurfaces[i]->IsUsed()) { ++ return i; + } + } +- return nullptr; ++ return -1; + } + + void FFmpegVideoDecoder::ReleaseDMABufSurfaces() { +@@ -763,8 +762,8 @@ + + RefPtr surface; + +- DMABufSurfaceWrapper* surfaceWrapper = GetUnusedDMABufSurfaceWrapper(); +- if (!surfaceWrapper) { ++ int surfaceWrapperIndex = GetUnusedDMABufSurfaceWrapperIndex(); ++ if (surfaceWrapperIndex < 0) { + if (mVAAPIDeviceContext) { + surface = DMABufSurfaceYUV::CreateYUVSurface(vaDesc); + } else { +@@ -776,16 +775,16 @@ + return MediaResult(NS_ERROR_OUT_OF_MEMORY, + RESULT_DETAIL("Unable to get DMABufSurfaceYUV")); + } +- + # ifdef MOZ_LOGGING + static int uid = 0; + surface->SetUID(++uid); + FFMPEG_LOG("Created new DMABufSurface UID = %d", uid); + # endif +- mDMABufSurfaces.AppendElement(DMABufSurfaceWrapper(surface, mLib)); +- surfaceWrapper = &(mDMABufSurfaces[mDMABufSurfaces.Length() - 1]); ++ mDMABufSurfaces.AppendElement( ++ MakeUnique(surface, mLib)); ++ surfaceWrapperIndex = mDMABufSurfaces.Length() - 1; + } else { +- surface = surfaceWrapper->GetDMABufSurface(); ++ surface = mDMABufSurfaces[surfaceWrapperIndex]->GetDMABufSurface(); + bool ret; + + if (mVAAPIDeviceContext) { +@@ -803,7 +802,7 @@ + } + + if (mVAAPIDeviceContext) { +- surfaceWrapper->LockVAAPIData(mCodecContext, mFrame); ++ mDMABufSurfaces[surfaceWrapperIndex]->LockVAAPIData(mCodecContext, mFrame); + } + + surface->SetYUVColorSpace(GetFrameColorSpace()); + -- cgit