diff --git a/dom/base/nsDOMWindowUtils.cpp b/dom/base/nsDOMWindowUtils.cpp index 1ccc05d606e2..4be903be5e20 100644 --- a/dom/base/nsDOMWindowUtils.cpp +++ b/dom/base/nsDOMWindowUtils.cpp @@ -2340,7 +2340,7 @@ nsDOMWindowUtils::GetSupportsHardwareH264Decoding(JS::MutableHandle a LayerManager *mgr = widget->GetLayerManager(); NS_ENSURE_STATE(mgr); RefPtr promise = - MP4Decoder::IsVideoAccelerated(mgr->GetCompositorBackendType(), parentObject); + MP4Decoder::IsVideoAccelerated(mgr->AsShadowForwarder(), parentObject); NS_ENSURE_STATE(promise); aPromise.setObject(*promise->PromiseObj()); #else diff --git a/dom/media/MediaFormatReader.cpp b/dom/media/MediaFormatReader.cpp index a4578f7c6fbf..feef8cecc9ca 100644 --- a/dom/media/MediaFormatReader.cpp +++ b/dom/media/MediaFormatReader.cpp @@ -19,6 +19,7 @@ #include "mozilla/SharedThreadPool.h" #include "VideoUtils.h" #include "VideoFrameContainer.h" +#include "mozilla/layers/ShadowLayers.h" #include @@ -56,8 +57,7 @@ TrackTypeToStr(TrackInfo::TrackType aTrack) MediaFormatReader::MediaFormatReader(AbstractMediaDecoder* aDecoder, MediaDataDemuxer* aDemuxer, - VideoFrameContainer* aVideoFrameContainer, - layers::LayersBackend aLayersBackend) + VideoFrameContainer* aVideoFrameContainer) : MediaDecoderReader(aDecoder) , mAudio(this, MediaData::AUDIO_DATA, Preferences::GetUint("media.audio-max-decode-error", 3)) @@ -67,7 +67,6 @@ MediaFormatReader::MediaFormatReader(AbstractMediaDecoder* aDecoder, , mDemuxerInitDone(false) , mLastReportedNumDecodedFrames(0) , mPreviousDecodedKeyframeTime_us(sNoPreviousDecodedKeyframe) - , mLayersBackendType(aLayersBackend) , mInitDone(false) , mTrackDemuxersMayBlock(false) , mDemuxOnly(false) @@ -160,7 +159,7 @@ MediaFormatReader::InitLayersBackendType() nsContentUtils::LayerManagerForDocument(element->OwnerDoc()); NS_ENSURE_TRUE_VOID(layerManager); - mLayersBackendType = layerManager->GetCompositorBackendType(); + mKnowsCompositor = layerManager->AsShadowForwarder(); } nsresult @@ -417,7 +416,7 @@ MediaFormatReader::EnsureDecoderCreated(TrackType aTrack) mVideo.mInfo ? *mVideo.mInfo->GetAsVideoInfo() : mInfo.mVideo, decoder.mTaskQueue, decoder.mCallback.get(), - mLayersBackendType, + mKnowsCompositor, GetImageContainer(), mCrashHelper, decoder.mIsBlankDecode diff --git a/dom/media/MediaFormatReader.h b/dom/media/MediaFormatReader.h index cfa113155730..e42b8bc11528 100644 --- a/dom/media/MediaFormatReader.h +++ b/dom/media/MediaFormatReader.h @@ -28,8 +28,7 @@ class MediaFormatReader final : public MediaDecoderReader public: MediaFormatReader(AbstractMediaDecoder* aDecoder, MediaDataDemuxer* aDemuxer, - VideoFrameContainer* aVideoFrameContainer = nullptr, - layers::LayersBackend aLayersBackend = layers::LayersBackend::LAYERS_NONE); + VideoFrameContainer* aVideoFrameContainer = nullptr); virtual ~MediaFormatReader(); @@ -522,7 +521,7 @@ private: // Default mLastDecodedKeyframeTime_us value, must be bigger than anything. static const int64_t sNoPreviousDecodedKeyframe = INT64_MAX; - layers::LayersBackend mLayersBackendType; + RefPtr mKnowsCompositor; // Metadata objects // True if we've read the streams' metadata. diff --git a/dom/media/fmp4/MP4Decoder.cpp b/dom/media/fmp4/MP4Decoder.cpp index d609d5cc3a1d..4e54f96e6329 100644 --- a/dom/media/fmp4/MP4Decoder.cpp +++ b/dom/media/fmp4/MP4Decoder.cpp @@ -215,7 +215,7 @@ static const uint8_t sTestH264ExtraData[] = { }; static already_AddRefed -CreateTestH264Decoder(layers::LayersBackend aBackend, +CreateTestH264Decoder(layers::KnowsCompositor* aKnowsCompositor, VideoInfo& aConfig, TaskQueue* aTaskQueue) { @@ -229,13 +229,13 @@ CreateTestH264Decoder(layers::LayersBackend aBackend, MOZ_ARRAY_LENGTH(sTestH264ExtraData)); RefPtr platform = new PDMFactory(); - RefPtr decoder(platform->CreateDecoder({ aConfig, aTaskQueue, aBackend })); + RefPtr decoder(platform->CreateDecoder({ aConfig, aTaskQueue, aKnowsCompositor })); return decoder.forget(); } /* static */ already_AddRefed -MP4Decoder::IsVideoAccelerated(layers::LayersBackend aBackend, nsIGlobalObject* aParent) +MP4Decoder::IsVideoAccelerated(layers::KnowsCompositor* aKnowsCompositor, nsIGlobalObject* aParent) { MOZ_ASSERT(NS_IsMainThread()); @@ -250,7 +250,7 @@ MP4Decoder::IsVideoAccelerated(layers::LayersBackend aBackend, nsIGlobalObject* RefPtr taskQueue = new TaskQueue(GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER)); VideoInfo config; - RefPtr decoder(CreateTestH264Decoder(aBackend, config, taskQueue)); + RefPtr decoder(CreateTestH264Decoder(aKnowsCompositor, config, taskQueue)); if (!decoder) { taskQueue->BeginShutdown(); taskQueue->AwaitShutdownAndIdle(); diff --git a/dom/media/fmp4/MP4Decoder.h b/dom/media/fmp4/MP4Decoder.h index e421bf566855..7ce3a41c6719 100644 --- a/dom/media/fmp4/MP4Decoder.h +++ b/dom/media/fmp4/MP4Decoder.h @@ -9,6 +9,7 @@ #include "MediaDecoder.h" #include "MediaFormatReader.h" #include "mozilla/dom/Promise.h" +#include "mozilla/layers/KnowsCompositor.h" namespace mozilla { @@ -47,7 +48,7 @@ public: static bool IsEnabled(); static already_AddRefed - IsVideoAccelerated(layers::LayersBackend aBackend, nsIGlobalObject* aParent); + IsVideoAccelerated(layers::KnowsCompositor* aKnowsCompositor, nsIGlobalObject* aParent); void GetMozDebugReaderData(nsAString& aString) override; diff --git a/dom/media/ipc/PVideoDecoder.ipdl b/dom/media/ipc/PVideoDecoder.ipdl index d4b35e2c757e..cc2b803b2fe8 100644 --- a/dom/media/ipc/PVideoDecoder.ipdl +++ b/dom/media/ipc/PVideoDecoder.ipdl @@ -9,6 +9,7 @@ include protocol PVideoDecoderManager; include LayersSurfaces; using VideoInfo from "MediaInfo.h"; using mozilla::layers::LayersBackend from "mozilla/layers/LayersTypes.h"; +using struct mozilla::layers::TextureFactoryIdentifier from "mozilla/layers/CompositorTypes.h"; namespace mozilla { namespace dom { @@ -46,7 +47,7 @@ async protocol PVideoDecoder { manager PVideoDecoderManager; parent: - async Init(VideoInfo info, LayersBackend backend); + async Init(VideoInfo info, TextureFactoryIdentifier identifier); async Input(MediaRawDataIPDL data); diff --git a/dom/media/ipc/RemoteVideoDecoder.cpp b/dom/media/ipc/RemoteVideoDecoder.cpp index 7f9e76d918be..7317a1800707 100644 --- a/dom/media/ipc/RemoteVideoDecoder.cpp +++ b/dom/media/ipc/RemoteVideoDecoder.cpp @@ -147,15 +147,19 @@ RemoteDecoderModule::DecoderNeedsConversion(const TrackInfo& aConfig) const already_AddRefed RemoteDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams) { + if (!aParams.mKnowsCompositor) { + return nullptr; + } + MediaDataDecoderCallback* callback = aParams.mCallback; MOZ_ASSERT(callback->OnReaderTaskQueue()); RefPtr object = new RemoteVideoDecoder(callback); VideoInfo info = aParams.VideoConfig(); - layers::LayersBackend backend = aParams.mLayersBackend; - VideoDecoderManagerChild::GetManagerThread()->Dispatch(NS_NewRunnableFunction([object, callback, info, backend]() { - object->mActor->InitIPDL(callback, info, backend); + RefPtr knowsCompositor = aParams.mKnowsCompositor; + VideoDecoderManagerChild::GetManagerThread()->Dispatch(NS_NewRunnableFunction([=]() { + object->mActor->InitIPDL(callback, info, knowsCompositor); }), NS_DISPATCH_NORMAL); return object.forget(); diff --git a/dom/media/ipc/VideoDecoderChild.cpp b/dom/media/ipc/VideoDecoderChild.cpp index 90e138af12b7..f8a90650c514 100644 --- a/dom/media/ipc/VideoDecoderChild.cpp +++ b/dom/media/ipc/VideoDecoderChild.cpp @@ -21,7 +21,6 @@ using namespace gfx; VideoDecoderChild::VideoDecoderChild() : mThread(VideoDecoderManagerChild::GetManagerThread()) - , mLayersBackend(layers::LayersBackend::LAYERS_NONE) , mCanSend(true) , mInitialized(false) , mIsHardwareAccelerated(false) @@ -116,13 +115,13 @@ VideoDecoderChild::ActorDestroy(ActorDestroyReason aWhy) void VideoDecoderChild::InitIPDL(MediaDataDecoderCallback* aCallback, const VideoInfo& aVideoInfo, - layers::LayersBackend aLayersBackend) + layers::KnowsCompositor* aKnowsCompositor) { VideoDecoderManagerChild::GetSingleton()->SendPVideoDecoderConstructor(this); mIPDLSelfRef = this; mCallback = aCallback; mVideoInfo = aVideoInfo; - mLayersBackend = aLayersBackend; + mKnowsCompositor = aKnowsCompositor; } void @@ -145,7 +144,7 @@ RefPtr VideoDecoderChild::Init() { AssertOnManagerThread(); - if (!mCanSend || !SendInit(mVideoInfo, mLayersBackend)) { + if (!mCanSend || !SendInit(mVideoInfo, mKnowsCompositor->GetTextureFactoryIdentifier())) { return MediaDataDecoder::InitPromise::CreateAndReject( NS_ERROR_DOM_MEDIA_FATAL_ERR, __func__); } diff --git a/dom/media/ipc/VideoDecoderChild.h b/dom/media/ipc/VideoDecoderChild.h index eaa5edd325e0..ee04802d538c 100644 --- a/dom/media/ipc/VideoDecoderChild.h +++ b/dom/media/ipc/VideoDecoderChild.h @@ -45,7 +45,7 @@ public: MOZ_IS_CLASS_INIT void InitIPDL(MediaDataDecoderCallback* aCallback, const VideoInfo& aVideoInfo, - layers::LayersBackend aLayersBackend); + layers::KnowsCompositor* aKnowsCompositor); void DestroyIPDL(); // Called from IPDL when our actor has been destroyed @@ -64,7 +64,7 @@ private: MozPromiseHolder mInitPromise; VideoInfo mVideoInfo; - layers::LayersBackend mLayersBackend; + RefPtr mKnowsCompositor; nsCString mHardwareAcceleratedReason; bool mCanSend; bool mInitialized; diff --git a/dom/media/ipc/VideoDecoderParent.cpp b/dom/media/ipc/VideoDecoderParent.cpp index 694eb3947f54..14f7d1f36f4f 100644 --- a/dom/media/ipc/VideoDecoderParent.cpp +++ b/dom/media/ipc/VideoDecoderParent.cpp @@ -24,12 +24,30 @@ using namespace ipc; using namespace layers; using namespace gfx; +class KnowsCompositorVideo : public layers::KnowsCompositor +{ +public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(KnowsCompositorVideo, override) + + layers::TextureForwarder* GetTextureForwarder() override + { + return VideoBridgeChild::GetSingleton(); + } + layers::LayersIPCActor* GetLayersIPCActor() override + { + return VideoBridgeChild::GetSingleton(); + } +private: + virtual ~KnowsCompositorVideo() {} +}; + VideoDecoderParent::VideoDecoderParent(VideoDecoderManagerParent* aParent, TaskQueue* aManagerTaskQueue, TaskQueue* aDecodeTaskQueue) : mParent(aParent) , mManagerTaskQueue(aManagerTaskQueue) , mDecodeTaskQueue(aDecodeTaskQueue) + , mKnowsCompositor(new KnowsCompositorVideo) , mDestroyed(false) { MOZ_COUNT_CTOR(VideoDecoderParent); @@ -54,12 +72,14 @@ VideoDecoderParent::Destroy() } bool -VideoDecoderParent::RecvInit(const VideoInfo& aInfo, const layers::LayersBackend& aBackend) +VideoDecoderParent::RecvInit(const VideoInfo& aInfo, const layers::TextureFactoryIdentifier& aIdentifier) { + mKnowsCompositor->IdentifyTextureHost(aIdentifier); + CreateDecoderParams params(aInfo); params.mTaskQueue = mDecodeTaskQueue; params.mCallback = this; - params.mLayersBackend = aBackend; + params.mKnowsCompositor = mKnowsCompositor; params.mImageContainer = new layers::ImageContainer(); #ifdef XP_WIN @@ -164,8 +184,9 @@ VideoDecoderParent::Output(MediaData* aData) { MOZ_ASSERT(mDecodeTaskQueue->IsCurrentThreadIn()); RefPtr self = this; + RefPtr knowsCompositor = mKnowsCompositor; RefPtr data = aData; - mManagerTaskQueue->Dispatch(NS_NewRunnableFunction([self, data]() { + mManagerTaskQueue->Dispatch(NS_NewRunnableFunction([self, knowsCompositor, data]() { if (self->mDestroyed) { return; } @@ -175,16 +196,14 @@ VideoDecoderParent::Output(MediaData* aData) MOZ_ASSERT(video->mImage, "Decoded video must output a layer::Image to be used with VideoDecoderParent"); - RefPtr texture = video->mImage->GetTextureClient(VideoBridgeChild::GetSingleton()); + RefPtr texture = video->mImage->GetTextureClient(knowsCompositor); if (!texture) { - texture = - ImageClient::CreateTextureClientForImage(video->mImage, - VideoBridgeChild::GetSingleton()); + texture = ImageClient::CreateTextureClientForImage(video->mImage, knowsCompositor); } if (texture && !texture->IsAddedToCompositableClient()) { - texture->InitIPDLActor(VideoBridgeChild::GetSingleton()); + texture->InitIPDLActor(knowsCompositor); texture->SetAddedToCompositableClient(); } diff --git a/dom/media/ipc/VideoDecoderParent.h b/dom/media/ipc/VideoDecoderParent.h index 762542449fe8..ea99d0a100d4 100644 --- a/dom/media/ipc/VideoDecoderParent.h +++ b/dom/media/ipc/VideoDecoderParent.h @@ -8,6 +8,7 @@ #include "mozilla/RefPtr.h" #include "mozilla/dom/PVideoDecoderParent.h" +#include "mozilla/layers/TextureForwarder.h" #include "VideoDecoderManagerParent.h" #include "MediaData.h" #include "ImageContainer.h" @@ -15,6 +16,8 @@ namespace mozilla { namespace dom { +class KnowsCompositorVideo; + class VideoDecoderParent final : public PVideoDecoderParent, public MediaDataDecoderCallback { @@ -30,7 +33,7 @@ public: void Destroy(); // PVideoDecoderParent - bool RecvInit(const VideoInfo& aVideoInfo, const layers::LayersBackend& aBackend) override; + bool RecvInit(const VideoInfo& aVideoInfo, const layers::TextureFactoryIdentifier& aIdentifier) override; bool RecvInput(const MediaRawDataIPDL& aData) override; bool RecvFlush() override; bool RecvDrain() override; @@ -54,6 +57,7 @@ private: RefPtr mManagerTaskQueue; RefPtr mDecodeTaskQueue; RefPtr mDecoder; + RefPtr mKnowsCompositor; // Can only be accessed from the manager thread bool mDestroyed; diff --git a/dom/media/platforms/PlatformDecoderModule.h b/dom/media/platforms/PlatformDecoderModule.h index 0f3877204c3c..4ca385f4625b 100644 --- a/dom/media/platforms/PlatformDecoderModule.h +++ b/dom/media/platforms/PlatformDecoderModule.h @@ -10,6 +10,7 @@ #include "MediaDecoderReader.h" #include "mozilla/MozPromise.h" #include "mozilla/layers/LayersTypes.h" +#include "mozilla/layers/KnowsCompositor.h" #include "nsTArray.h" #include "mozilla/RefPtr.h" #include "GMPService.h" @@ -58,12 +59,20 @@ struct CreateDecoderParams { return *mConfig.GetAsAudioInfo(); } + layers::LayersBackend GetLayersBackend() const + { + if (mKnowsCompositor) { + return mKnowsCompositor->GetCompositorBackendType(); + } + return layers::LayersBackend::LAYERS_NONE; + } + const TrackInfo& mConfig; TaskQueue* mTaskQueue = nullptr; MediaDataDecoderCallback* mCallback = nullptr; DecoderDoctorDiagnostics* mDiagnostics = nullptr; layers::ImageContainer* mImageContainer = nullptr; - layers::LayersBackend mLayersBackend = layers::LayersBackend::LAYERS_NONE; + RefPtr mKnowsCompositor; RefPtr mCrashHelper; bool mUseBlankDecoder = false; @@ -72,9 +81,9 @@ private: void Set(MediaDataDecoderCallback* aCallback) { mCallback = aCallback; } void Set(DecoderDoctorDiagnostics* aDiagnostics) { mDiagnostics = aDiagnostics; } void Set(layers::ImageContainer* aImageContainer) { mImageContainer = aImageContainer; } - void Set(layers::LayersBackend aLayersBackend) { mLayersBackend = aLayersBackend; } void Set(GMPCrashHelper* aCrashHelper) { mCrashHelper = aCrashHelper; } void Set(bool aUseBlankDecoder) { mUseBlankDecoder = aUseBlankDecoder; } + void Set(layers::KnowsCompositor* aKnowsCompositor) { mKnowsCompositor = aKnowsCompositor; } template void Set(T1&& a1, T2&& a2, Ts&&... args) { diff --git a/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp b/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp index acc4cc9fb975..69260b501b5f 100644 --- a/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp +++ b/dom/media/platforms/agnostic/gmp/GMPVideoDecoder.cpp @@ -115,7 +115,7 @@ GMPVideoDecoderParams::GMPVideoDecoderParams(const CreateDecoderParams& aParams) , mCallback(nullptr) , mAdapter(nullptr) , mImageContainer(aParams.mImageContainer) - , mLayersBackend(aParams.mLayersBackend) + , mLayersBackend(aParams.GetLayersBackend()) , mCrashHelper(aParams.mCrashHelper) {} diff --git a/dom/media/platforms/wmf/DXVA2Manager.cpp b/dom/media/platforms/wmf/DXVA2Manager.cpp index 2c4bb57863f2..7148be3dcc5c 100644 --- a/dom/media/platforms/wmf/DXVA2Manager.cpp +++ b/dom/media/platforms/wmf/DXVA2Manager.cpp @@ -13,7 +13,7 @@ #include "mozilla/gfx/DeviceManagerDx.h" #include "mozilla/layers/D3D11ShareHandleImage.h" #include "mozilla/layers/ImageBridgeChild.h" -#include "mozilla/layers/VideoBridgeChild.h" +#include "mozilla/layers/TextureForwarder.h" #include "mozilla/Telemetry.h" #include "MediaTelemetryConstants.h" #include "mfapi.h" @@ -91,7 +91,8 @@ public: D3D9DXVA2Manager(); virtual ~D3D9DXVA2Manager(); - HRESULT Init(nsACString& aFailureReason); + HRESULT Init(layers::KnowsCompositor* aKnowsCompositor, + nsACString& aFailureReason); IUnknown* GetDXVADeviceManager() override; @@ -262,7 +263,8 @@ D3D9DXVA2Manager::GetDXVADeviceManager() } HRESULT -D3D9DXVA2Manager::Init(nsACString& aFailureReason) +D3D9DXVA2Manager::Init(layers::KnowsCompositor* aKnowsCompositor, + nsACString& aFailureReason) { MOZ_ASSERT(NS_IsMainThread()); @@ -430,10 +432,12 @@ D3D9DXVA2Manager::Init(nsACString& aFailureReason) mSyncSurface = syncSurf; if (layers::ImageBridgeChild::GetSingleton()) { + // There's no proper KnowsCompositor for ImageBridge currently (and it + // implements the interface), so just use that if it's available. mTextureClientAllocator = new D3D9RecycleAllocator(layers::ImageBridgeChild::GetSingleton().get(), mDevice); } else { - mTextureClientAllocator = new D3D9RecycleAllocator(layers::VideoBridgeChild::GetSingleton(), + mTextureClientAllocator = new D3D9RecycleAllocator(aKnowsCompositor, mDevice); } mTextureClientAllocator->SetMaxPoolSize(5); @@ -491,7 +495,8 @@ static uint32_t sDXVAVideosCount = 0; /* static */ DXVA2Manager* -DXVA2Manager::CreateD3D9DXVA(nsACString& aFailureReason) +DXVA2Manager::CreateD3D9DXVA(layers::KnowsCompositor* aKnowsCompositor, + nsACString& aFailureReason) { MOZ_ASSERT(NS_IsMainThread()); HRESULT hr; @@ -510,7 +515,7 @@ DXVA2Manager::CreateD3D9DXVA(nsACString& aFailureReason) } nsAutoPtr d3d9Manager(new D3D9DXVA2Manager()); - hr = d3d9Manager->Init(aFailureReason); + hr = d3d9Manager->Init(aKnowsCompositor, aFailureReason); if (SUCCEEDED(hr)) { return d3d9Manager.forget(); } @@ -525,7 +530,8 @@ public: D3D11DXVA2Manager(); virtual ~D3D11DXVA2Manager(); - HRESULT Init(nsACString& aFailureReason); + HRESULT Init(layers::KnowsCompositor* aKnowsCompositor, + nsACString& aFailureReason); IUnknown* GetDXVADeviceManager() override; @@ -633,7 +639,8 @@ D3D11DXVA2Manager::GetDXVADeviceManager() } HRESULT -D3D11DXVA2Manager::Init(nsACString& aFailureReason) +D3D11DXVA2Manager::Init(layers::KnowsCompositor* aKnowsCompositor, + nsACString& aFailureReason) { HRESULT hr; @@ -764,10 +771,12 @@ D3D11DXVA2Manager::Init(nsACString& aFailureReason) NS_ENSURE_TRUE(SUCCEEDED(hr), hr); if (layers::ImageBridgeChild::GetSingleton()) { + // There's no proper KnowsCompositor for ImageBridge currently (and it + // implements the interface), so just use that if it's available. mTextureClientAllocator = new D3D11RecycleAllocator(layers::ImageBridgeChild::GetSingleton().get(), mDevice); } else { - mTextureClientAllocator = new D3D11RecycleAllocator(layers::VideoBridgeChild::GetSingleton(), + mTextureClientAllocator = new D3D11RecycleAllocator(aKnowsCompositor, mDevice); } mTextureClientAllocator->SetMaxPoolSize(5); @@ -910,7 +919,8 @@ D3D11DXVA2Manager::ConfigureForSize(uint32_t aWidth, uint32_t aHeight) /* static */ DXVA2Manager* -DXVA2Manager::CreateD3D11DXVA(nsACString& aFailureReason) +DXVA2Manager::CreateD3D11DXVA(layers::KnowsCompositor* aKnowsCompositor, + nsACString& aFailureReason) { // DXVA processing takes up a lot of GPU resources, so limit the number of // videos we use DXVA with at any one time. @@ -926,7 +936,7 @@ DXVA2Manager::CreateD3D11DXVA(nsACString& aFailureReason) } nsAutoPtr manager(new D3D11DXVA2Manager()); - HRESULT hr = manager->Init(aFailureReason); + HRESULT hr = manager->Init(aKnowsCompositor, aFailureReason); NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr); return manager.forget(); diff --git a/dom/media/platforms/wmf/DXVA2Manager.h b/dom/media/platforms/wmf/DXVA2Manager.h index 75a17444a258..0bdc02dd40e4 100644 --- a/dom/media/platforms/wmf/DXVA2Manager.h +++ b/dom/media/platforms/wmf/DXVA2Manager.h @@ -16,6 +16,7 @@ namespace mozilla { namespace layers { class Image; class ImageContainer; +class KnowsCompositor; } class DXVA2Manager { @@ -23,8 +24,8 @@ public: // Creates and initializes a DXVA2Manager. We can use DXVA2 via either // D3D9Ex or D3D11. - static DXVA2Manager* CreateD3D9DXVA(nsACString& aFailureReason); - static DXVA2Manager* CreateD3D11DXVA(nsACString& aFailureReason); + static DXVA2Manager* CreateD3D9DXVA(layers::KnowsCompositor* aKnowsCompositor, nsACString& aFailureReason); + static DXVA2Manager* CreateD3D11DXVA(layers::KnowsCompositor* aKnowsCompositor, nsACString& aFailureReason); // Returns a pointer to the D3D device manager responsible for managing the // device we're using for hardware accelerated video decoding. If we're using diff --git a/dom/media/platforms/wmf/WMFDecoderModule.cpp b/dom/media/platforms/wmf/WMFDecoderModule.cpp index 7cf787f4cf3a..040b63614dee 100644 --- a/dom/media/platforms/wmf/WMFDecoderModule.cpp +++ b/dom/media/platforms/wmf/WMFDecoderModule.cpp @@ -85,7 +85,7 @@ WMFDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams) { nsAutoPtr manager( new WMFVideoMFTManager(aParams.VideoConfig(), - aParams.mLayersBackend, + aParams.mKnowsCompositor, aParams.mImageContainer, sDXVAEnabled)); diff --git a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp index 81592eb16295..7339b09903b9 100644 --- a/dom/media/platforms/wmf/WMFVideoMFTManager.cpp +++ b/dom/media/platforms/wmf/WMFVideoMFTManager.cpp @@ -76,18 +76,27 @@ const CLSID CLSID_WebmMfVp9Dec = }; namespace mozilla { + +LayersBackend +GetCompositorBackendType(layers::KnowsCompositor* aKnowsCompositor) +{ + if (aKnowsCompositor) { + return aKnowsCompositor->GetCompositorBackendType(); + } + return LayersBackend::LAYERS_NONE; +} WMFVideoMFTManager::WMFVideoMFTManager( const VideoInfo& aConfig, - mozilla::layers::LayersBackend aLayersBackend, - mozilla::layers::ImageContainer* aImageContainer, + layers::KnowsCompositor* aKnowsCompositor, + layers::ImageContainer* aImageContainer, bool aDXVAEnabled) : mVideoInfo(aConfig) , mVideoStride(0) , mImageSize(aConfig.mImage) , mImageContainer(aImageContainer) , mDXVAEnabled(aDXVAEnabled) - , mLayersBackend(aLayersBackend) + , mKnowsCompositor(aKnowsCompositor) , mNullOutputCount(0) , mGotValidOutputAfterNullOutput(false) , mGotExcessiveNullOutput(false) @@ -303,8 +312,11 @@ FindD3D9BlacklistedDLL() { class CreateDXVAManagerEvent : public Runnable { public: - CreateDXVAManagerEvent(LayersBackend aBackend, nsCString& aFailureReason) + CreateDXVAManagerEvent(LayersBackend aBackend, + layers::KnowsCompositor* aKnowsCompositor, + nsCString& aFailureReason) : mBackend(aBackend) + , mKnowsCompositor(aKnowsCompositor) , mFailureReason(aFailureReason) {} @@ -321,7 +333,7 @@ public: failureReason->AppendPrintf("D3D11 blacklisted with DLL %s", blacklistedDLL.get()); } else { - mDXVA2Manager = DXVA2Manager::CreateD3D11DXVA(*failureReason); + mDXVA2Manager = DXVA2Manager::CreateD3D11DXVA(mKnowsCompositor, *failureReason); if (mDXVA2Manager) { return NS_OK; } @@ -337,14 +349,15 @@ public: mFailureReason.AppendPrintf("D3D9 blacklisted with DLL %s", blacklistedDLL.get()); } else { - mDXVA2Manager = DXVA2Manager::CreateD3D9DXVA(*failureReason); + mDXVA2Manager = DXVA2Manager::CreateD3D9DXVA(mKnowsCompositor, *failureReason); // Make sure we include the messages from both attempts (if applicable). mFailureReason.Append(secondFailureReason); } return NS_OK; } nsAutoPtr mDXVA2Manager; - LayersBackend mBackend; + layers::LayersBackend mBackend; + KnowsCompositor* mKnowsCompositor; nsACString& mFailureReason; }; @@ -359,8 +372,9 @@ WMFVideoMFTManager::InitializeDXVA(bool aForceD3D9) return false; } MOZ_ASSERT(!mDXVA2Manager); - if (mLayersBackend != LayersBackend::LAYERS_D3D9 && - mLayersBackend != LayersBackend::LAYERS_D3D11) { + LayersBackend backend = GetCompositorBackendType(mKnowsCompositor); + if (backend != LayersBackend::LAYERS_D3D9 && + backend != LayersBackend::LAYERS_D3D11) { mDXVAFailureReason.AssignLiteral("Unsupported layers backend"); return false; } @@ -368,7 +382,8 @@ WMFVideoMFTManager::InitializeDXVA(bool aForceD3D9) // The DXVA manager must be created on the main thread. RefPtr event = new CreateDXVAManagerEvent(aForceD3D9 ? LayersBackend::LAYERS_D3D9 - : mLayersBackend, + : backend, + mKnowsCompositor, mDXVAFailureReason); if (NS_IsMainThread()) { @@ -751,8 +766,9 @@ WMFVideoMFTManager::CreateBasicVideoFrame(IMFSample* aSample, NS_ENSURE_TRUE(duration.IsValid(), E_FAIL); nsIntRect pictureRegion = mVideoInfo.ScaledImageRect(videoWidth, videoHeight); - if (mLayersBackend != LayersBackend::LAYERS_D3D9 && - mLayersBackend != LayersBackend::LAYERS_D3D11) { + LayersBackend backend = GetCompositorBackendType(mKnowsCompositor); + if (backend != LayersBackend::LAYERS_D3D9 && + backend != LayersBackend::LAYERS_D3D11) { RefPtr v = VideoData::CreateAndCopyData(mVideoInfo, mImageContainer, diff --git a/dom/media/platforms/wmf/WMFVideoMFTManager.h b/dom/media/platforms/wmf/WMFVideoMFTManager.h index 8e8455e58f73..b8dfa63365d6 100644 --- a/dom/media/platforms/wmf/WMFVideoMFTManager.h +++ b/dom/media/platforms/wmf/WMFVideoMFTManager.h @@ -21,8 +21,8 @@ class DXVA2Manager; class WMFVideoMFTManager : public MFTManager { public: WMFVideoMFTManager(const VideoInfo& aConfig, - mozilla::layers::LayersBackend aLayersBackend, - mozilla::layers::ImageContainer* aImageContainer, + layers::KnowsCompositor* aKnowsCompositor, + layers::ImageContainer* aImageContainer, bool aDXVAEnabled); ~WMFVideoMFTManager(); @@ -88,6 +88,7 @@ private: nsIntSize mImageSize; RefPtr mImageContainer; + RefPtr mKnowsCompositor; nsAutoPtr mDXVA2Manager; RefPtr mLastInput; @@ -97,7 +98,6 @@ private: int64_t mSamplesCount = 0; bool mDXVAEnabled; - const layers::LayersBackend mLayersBackend; bool mUseHwAccel; nsCString mDXVAFailureReason; diff --git a/dom/media/platforms/wrappers/H264Converter.cpp b/dom/media/platforms/wrappers/H264Converter.cpp index dac2566138e1..71ecb286a476 100644 --- a/dom/media/platforms/wrappers/H264Converter.cpp +++ b/dom/media/platforms/wrappers/H264Converter.cpp @@ -19,7 +19,7 @@ H264Converter::H264Converter(PlatformDecoderModule* aPDM, const CreateDecoderParams& aParams) : mPDM(aPDM) , mCurrentConfig(aParams.VideoConfig()) - , mLayersBackend(aParams.mLayersBackend) + , mKnowsCompositor(aParams.mKnowsCompositor) , mImageContainer(aParams.mImageContainer) , mTaskQueue(aParams.mTaskQueue) , mCallback(aParams.mCallback) @@ -194,7 +194,7 @@ H264Converter::CreateDecoder(DecoderDoctorDiagnostics* aDiagnostics) mCallback, aDiagnostics, mImageContainer, - mLayersBackend, + mKnowsCompositor, mGMPCrashHelper }); diff --git a/dom/media/platforms/wrappers/H264Converter.h b/dom/media/platforms/wrappers/H264Converter.h index bda2fb0480de..6905b1c746e3 100644 --- a/dom/media/platforms/wrappers/H264Converter.h +++ b/dom/media/platforms/wrappers/H264Converter.h @@ -56,7 +56,7 @@ private: RefPtr mPDM; VideoInfo mCurrentConfig; - layers::LayersBackend mLayersBackend; + RefPtr mKnowsCompositor; RefPtr mImageContainer; const RefPtr mTaskQueue; nsTArray> mMediaRawSamples; diff --git a/gfx/layers/ipc/VideoBridgeChild.h b/gfx/layers/ipc/VideoBridgeChild.h index 2aaaa8db5c57..cec1ea872fbd 100644 --- a/gfx/layers/ipc/VideoBridgeChild.h +++ b/gfx/layers/ipc/VideoBridgeChild.h @@ -15,14 +15,10 @@ namespace layers { class VideoBridgeChild final : public PVideoBridgeChild , public TextureForwarder - , public KnowsCompositor { public: NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VideoBridgeChild, override); - TextureForwarder* GetTextureForwarder() override { return this; } - LayersIPCActor* GetLayersIPCActor() override { return this; } - static void Startup(); static void Shutdown();