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());