зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1300682 - Part 5: Use KnowsCompositor to initialize decoders and create one for VideoDecoderParent to use. r=nical,jya
This commit is contained in:
Родитель
40e5335ced
Коммит
a36eef926a
|
@ -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();
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче