|
|
cd18e99 |
changeset: 544864:a8603f131703
|
|
|
cd18e99 |
tag: tip
|
|
|
cd18e99 |
parent: 544861:161920b70ae4
|
|
|
cd18e99 |
user: Martin Stransky <stransky@redhat.com>
|
|
|
cd18e99 |
date: Fri Jul 31 13:39:48 2020 +0200
|
|
|
cd18e99 |
files: dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
|
|
|
cd18e99 |
description:
|
|
|
cd18e99 |
Bug 1645671 [Linux/VA-API] Create DMABufSurfaceWrapper directly at nsTAttay and disable DMABufSurfaceWrapper class copy and assignment constructors, r?jya
|
|
|
cd18e99 |
|
|
|
cd18e99 |
When DMABufSurfaceWrapper is added to nsTArray, a temporary local DMABufSurfaceWrapper object is created. When the temporary
|
|
|
cd18e99 |
object is deleted after the adding, associated dmabuf data is released which leads to rendering artifact during VA-API video playback.
|
|
|
cd18e99 |
|
|
|
cd18e99 |
As a fix in this patch we create DMABufSurfaceWrapper 'in-place' at nsTAttay.
|
|
|
cd18e99 |
We also disable DMABufSurfaceWrapper class copy and assignment constructors to avoid similar potential issues.
|
|
|
cd18e99 |
|
|
|
cd18e99 |
Differential Revision: https://phabricator.services.mozilla.com/D85152
|
|
|
cd18e99 |
|
|
|
cd18e99 |
|
|
|
578d7e2 |
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
|
|
578d7e2 |
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
|
|
578d7e2 |
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.cpp
|
|
|
cd18e99 |
@@ -777,17 +777,17 @@ MediaResult FFmpegVideoDecoder
|
|
|
578d7e2 |
RESULT_DETAIL("Unable to get DMABufSurfaceYUV"));
|
|
|
578d7e2 |
}
|
|
|
cd18e99 |
|
|
|
578d7e2 |
# ifdef MOZ_LOGGING
|
|
|
578d7e2 |
static int uid = 0;
|
|
|
578d7e2 |
surface->SetUID(++uid);
|
|
|
578d7e2 |
FFMPEG_LOG("Created new DMABufSurface UID = %d", uid);
|
|
|
578d7e2 |
# endif
|
|
|
578d7e2 |
- mDMABufSurfaces.AppendElement(DMABufSurfaceWrapper(surface, mLib));
|
|
|
cd18e99 |
+ mDMABufSurfaces.EmplaceBack(surface, mLib);
|
|
|
cd18e99 |
surfaceWrapper = &(mDMABufSurfaces[mDMABufSurfaces.Length() - 1]);
|
|
|
578d7e2 |
} else {
|
|
|
cd18e99 |
surface = surfaceWrapper->GetDMABufSurface();
|
|
|
578d7e2 |
bool ret;
|
|
|
578d7e2 |
|
|
|
578d7e2 |
if (mVAAPIDeviceContext) {
|
|
|
cd18e99 |
ret = surface->UpdateYUVData(vaDesc);
|
|
|
cd18e99 |
} else {
|
|
|
cd18e99 |
diff --git a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
|
|
|
cd18e99 |
--- a/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
|
|
|
cd18e99 |
+++ b/dom/media/platforms/ffmpeg/FFmpegVideoDecoder.h
|
|
|
cd18e99 |
@@ -70,16 +70,22 @@ class DMABufSurfaceWrapper final {
|
|
|
cd18e99 |
// Check if DMABufSurface is used by any gecko rendering process
|
|
|
cd18e99 |
// (WebRender or GL compositor) or by DMABUFSurfaceImage/VideoData.
|
|
|
cd18e99 |
bool IsUsed() const { return mSurface->IsGlobalRefSet(); }
|
|
|
578d7e2 |
|
|
|
cd18e99 |
RefPtr<DMABufSurfaceYUV> GetDMABufSurface() const {
|
|
|
cd18e99 |
return mSurface->GetAsDMABufSurfaceYUV();
|
|
|
578d7e2 |
}
|
|
|
578d7e2 |
|
|
|
cd18e99 |
+ // Don't allow DMABufSurfaceWrapper plain copy as it leads to
|
|
|
cd18e99 |
+ // enexpected DMABufSurface/HW buffer releases and we don't want to
|
|
|
cd18e99 |
+ // deep copy them.
|
|
|
cd18e99 |
+ DMABufSurfaceWrapper(const DMABufSurfaceWrapper&) = delete;
|
|
|
cd18e99 |
+ const DMABufSurfaceWrapper& operator=(DMABufSurfaceWrapper const&) = delete;
|
|
|
cd18e99 |
+
|
|
|
cd18e99 |
private:
|
|
|
cd18e99 |
const RefPtr<DMABufSurface> mSurface;
|
|
|
cd18e99 |
const FFmpegLibWrapper* mLib;
|
|
|
cd18e99 |
AVBufferRef* mAVHWFramesContext;
|
|
|
cd18e99 |
AVBufferRef* mHWAVBuffer;
|
|
|
cd18e99 |
};
|
|
|
cd18e99 |
#endif
|
|
|
cd18e99 |
|
|
|
578d7e2 |
|