Bug 1300682 - Part 5: Use KnowsCompositor to initialize decoders and create one for VideoDecoderParent to use. r=nical,jya

This commit is contained in:
Matt Woodrow 2016-10-07 21:13:33 +13:00
Родитель 40e5335ced
Коммит a36eef926a
21 изменённых файлов: 130 добавлений и 72 удалений

Просмотреть файл

@ -2340,7 +2340,7 @@ nsDOMWindowUtils::GetSupportsHardwareH264Decoding(JS::MutableHandle<JS::Value> a
LayerManager *mgr = widget->GetLayerManager();
NS_ENSURE_STATE(mgr);
RefPtr<Promise> promise =
MP4Decoder::IsVideoAccelerated(mgr->GetCompositorBackendType(), parentObject);
MP4Decoder::IsVideoAccelerated(mgr->AsShadowForwarder(), parentObject);
NS_ENSURE_STATE(promise);
aPromise.setObject(*promise->PromiseObj());
#else

Просмотреть файл

@ -19,6 +19,7 @@
#include "mozilla/SharedThreadPool.h"
#include "VideoUtils.h"
#include "VideoFrameContainer.h"
#include "mozilla/layers/ShadowLayers.h"
#include <algorithm>
@ -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

Просмотреть файл

@ -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<layers::KnowsCompositor> mKnowsCompositor;
// Metadata objects
// True if we've read the streams' metadata.

Просмотреть файл

@ -215,7 +215,7 @@ static const uint8_t sTestH264ExtraData[] = {
};
static already_AddRefed<MediaDataDecoder>
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<PDMFactory> platform = new PDMFactory();
RefPtr<MediaDataDecoder> decoder(platform->CreateDecoder({ aConfig, aTaskQueue, aBackend }));
RefPtr<MediaDataDecoder> decoder(platform->CreateDecoder({ aConfig, aTaskQueue, aKnowsCompositor }));
return decoder.forget();
}
/* static */ already_AddRefed<dom::Promise>
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> taskQueue =
new TaskQueue(GetMediaThreadPool(MediaThreadType::PLATFORM_DECODER));
VideoInfo config;
RefPtr<MediaDataDecoder> decoder(CreateTestH264Decoder(aBackend, config, taskQueue));
RefPtr<MediaDataDecoder> decoder(CreateTestH264Decoder(aKnowsCompositor, config, taskQueue));
if (!decoder) {
taskQueue->BeginShutdown();
taskQueue->AwaitShutdownAndIdle();

Просмотреть файл

@ -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<dom::Promise>
IsVideoAccelerated(layers::LayersBackend aBackend, nsIGlobalObject* aParent);
IsVideoAccelerated(layers::KnowsCompositor* aKnowsCompositor, nsIGlobalObject* aParent);
void GetMozDebugReaderData(nsAString& aString) override;

Просмотреть файл

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

Просмотреть файл

@ -147,15 +147,19 @@ RemoteDecoderModule::DecoderNeedsConversion(const TrackInfo& aConfig) const
already_AddRefed<MediaDataDecoder>
RemoteDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams)
{
if (!aParams.mKnowsCompositor) {
return nullptr;
}
MediaDataDecoderCallback* callback = aParams.mCallback;
MOZ_ASSERT(callback->OnReaderTaskQueue());
RefPtr<RemoteVideoDecoder> 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<layers::KnowsCompositor> knowsCompositor = aParams.mKnowsCompositor;
VideoDecoderManagerChild::GetManagerThread()->Dispatch(NS_NewRunnableFunction([=]() {
object->mActor->InitIPDL(callback, info, knowsCompositor);
}), NS_DISPATCH_NORMAL);
return object.forget();

Просмотреть файл

@ -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<MediaDataDecoder::InitPromise>
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__);
}

Просмотреть файл

@ -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<MediaDataDecoder::InitPromise> mInitPromise;
VideoInfo mVideoInfo;
layers::LayersBackend mLayersBackend;
RefPtr<layers::KnowsCompositor> mKnowsCompositor;
nsCString mHardwareAcceleratedReason;
bool mCanSend;
bool mInitialized;

Просмотреть файл

@ -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<VideoDecoderParent> self = this;
RefPtr<KnowsCompositor> knowsCompositor = mKnowsCompositor;
RefPtr<MediaData> 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<TextureClient> texture = video->mImage->GetTextureClient(VideoBridgeChild::GetSingleton());
RefPtr<TextureClient> 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();
}

Просмотреть файл

@ -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<TaskQueue> mManagerTaskQueue;
RefPtr<TaskQueue> mDecodeTaskQueue;
RefPtr<MediaDataDecoder> mDecoder;
RefPtr<KnowsCompositorVideo> mKnowsCompositor;
// Can only be accessed from the manager thread
bool mDestroyed;

Просмотреть файл

@ -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<layers::KnowsCompositor> mKnowsCompositor;
RefPtr<GMPCrashHelper> 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 <typename T1, typename T2, typename... Ts>
void Set(T1&& a1, T2&& a2, Ts&&... args)
{

Просмотреть файл

@ -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)
{}

Просмотреть файл

@ -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<D3D9DXVA2Manager> 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<D3D11DXVA2Manager> manager(new D3D11DXVA2Manager());
HRESULT hr = manager->Init(aFailureReason);
HRESULT hr = manager->Init(aKnowsCompositor, aFailureReason);
NS_ENSURE_TRUE(SUCCEEDED(hr), nullptr);
return manager.forget();

Просмотреть файл

@ -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

Просмотреть файл

@ -85,7 +85,7 @@ WMFDecoderModule::CreateVideoDecoder(const CreateDecoderParams& aParams)
{
nsAutoPtr<WMFVideoMFTManager> manager(
new WMFVideoMFTManager(aParams.VideoConfig(),
aParams.mLayersBackend,
aParams.mKnowsCompositor,
aParams.mImageContainer,
sDXVAEnabled));

Просмотреть файл

@ -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<DXVA2Manager> 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<CreateDXVAManagerEvent> 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<VideoData> v =
VideoData::CreateAndCopyData(mVideoInfo,
mImageContainer,

Просмотреть файл

@ -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<layers::ImageContainer> mImageContainer;
RefPtr<layers::KnowsCompositor> mKnowsCompositor;
nsAutoPtr<DXVA2Manager> mDXVA2Manager;
RefPtr<IMFSample> mLastInput;
@ -97,7 +98,6 @@ private:
int64_t mSamplesCount = 0;
bool mDXVAEnabled;
const layers::LayersBackend mLayersBackend;
bool mUseHwAccel;
nsCString mDXVAFailureReason;

Просмотреть файл

@ -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
});

Просмотреть файл

@ -56,7 +56,7 @@ private:
RefPtr<PlatformDecoderModule> mPDM;
VideoInfo mCurrentConfig;
layers::LayersBackend mLayersBackend;
RefPtr<layers::KnowsCompositor> mKnowsCompositor;
RefPtr<layers::ImageContainer> mImageContainer;
const RefPtr<TaskQueue> mTaskQueue;
nsTArray<RefPtr<MediaRawData>> mMediaRawSamples;

Просмотреть файл

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