268ae0028c
The content of this branch was automatically imported from Fedora ELN with the following as its source: https://src.fedoraproject.org/rpms/firefox#c8daf71be4963daab37d810024e0a6e7f04cf2dd
68 lines
2.9 KiB
Diff
68 lines
2.9 KiB
Diff
changeset: 544864:a8603f131703
|
|
tag: tip
|
|
parent: 544861:161920b70ae4
|
|
user: Martin Stransky <stransky@redhat.com>
|
|
date: Fri Jul 31 13:39:48 2020 +0200
|
|
files: dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
|
|
description:
|
|
Bug 1645671 [Linux/VA-API] Create DMABufSurfaceWrapper directly at nsTAttay and disable DMABufSurfaceWrapper class copy and assignment constructors, r?jya
|
|
|
|
When DMABufSurfaceWrapper is added to nsTArray, a temporary local DMABufSurfaceWrapper object is created. When the temporary
|
|
object is deleted after the adding, associated dmabuf data is released which leads to rendering artifact during VA-API video playback.
|
|
|
|
As a fix in this patch we create DMABufSurfaceWrapper 'in-place' at nsTAttay.
|
|
We also disable DMABufSurfaceWrapper class copy and assignment constructors to avoid similar potential issues.
|
|
|
|
Differential Revision: https://phabricator.services.mozilla.com/D85152
|
|
|
|
|
|
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
|
|
@@ -777,17 +777,17 @@ MediaResult FFmpegVideoDecoder<LIBAV_VER
|
|
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));
|
|
+ mDMABufSurfaces.EmplaceBack(surface, mLib);
|
|
surfaceWrapper = &(mDMABufSurfaces[mDMABufSurfaces.Length() - 1]);
|
|
} else {
|
|
surface = surfaceWrapper->GetDMABufSurface();
|
|
bool ret;
|
|
|
|
if (mVAAPIDeviceContext) {
|
|
ret = surface->UpdateYUVData(vaDesc);
|
|
} else {
|
|
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
|
|
@@ -70,16 +70,22 @@ class DMABufSurfaceWrapper final {
|
|
// Check if DMABufSurface is used by any gecko rendering process
|
|
// (WebRender or GL compositor) or by DMABUFSurfaceImage/VideoData.
|
|
bool IsUsed() const { return mSurface->IsGlobalRefSet(); }
|
|
|
|
RefPtr<DMABufSurfaceYUV> GetDMABufSurface() const {
|
|
return mSurface->GetAsDMABufSurfaceYUV();
|
|
}
|
|
|
|
+ // Don't allow DMABufSurfaceWrapper plain copy as it leads to
|
|
+ // enexpected DMABufSurface/HW buffer releases and we don't want to
|
|
+ // deep copy them.
|
|
+ DMABufSurfaceWrapper(const DMABufSurfaceWrapper&) = delete;
|
|
+ const DMABufSurfaceWrapper& operator=(DMABufSurfaceWrapper const&) = delete;
|
|
+
|
|
private:
|
|
const RefPtr<DMABufSurface> mSurface;
|
|
const FFmpegLibWrapper* mLib;
|
|
AVBufferRef* mAVHWFramesContext;
|
|
AVBufferRef* mHWAVBuffer;
|
|
};
|
|
#endif
|
|
|
|
|