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