зеркало из https://github.com/mozilla/gecko-dev.git
Bug 881954 - Only initialize DXVA when we're decoding video. r=padenot
This commit is contained in:
Родитель
c8d412570d
Коммит
77c4771d6e
|
@ -168,6 +168,10 @@ D3D9DXVA2Manager::CopyToImage(IMFSample* aSample,
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Count of the number of DXVAManager's we've created. This is also the
|
||||||
|
// number of videos we're decoding with DXVA. Use on main thread only.
|
||||||
|
static uint32_t sDXVAVideosCount = 0;
|
||||||
|
|
||||||
/* static */
|
/* static */
|
||||||
DXVA2Manager*
|
DXVA2Manager*
|
||||||
DXVA2Manager::Create()
|
DXVA2Manager::Create()
|
||||||
|
@ -175,6 +179,14 @@ DXVA2Manager::Create()
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
|
// DXVA processing takes up a lot of GPU resources, so limit the number of
|
||||||
|
// videos we use DXVA with at any one time.
|
||||||
|
const uint32_t dxvaLimit =
|
||||||
|
Preferences::GetInt("media.windows-media-foundation.max-dxva-videos", 8);
|
||||||
|
if (sDXVAVideosCount == dxvaLimit) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
nsAutoPtr<D3D9DXVA2Manager> d3d9Manager(new D3D9DXVA2Manager());
|
nsAutoPtr<D3D9DXVA2Manager> d3d9Manager(new D3D9DXVA2Manager());
|
||||||
hr = d3d9Manager->Init();
|
hr = d3d9Manager->Init();
|
||||||
if (SUCCEEDED(hr)) {
|
if (SUCCEEDED(hr)) {
|
||||||
|
@ -189,11 +201,13 @@ DXVA2Manager::DXVA2Manager()
|
||||||
: mLock("DXVA2Manager")
|
: mLock("DXVA2Manager")
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
++sDXVAVideosCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
DXVA2Manager::~DXVA2Manager()
|
DXVA2Manager::~DXVA2Manager()
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
--sDXVAVideosCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|
|
@ -120,9 +120,18 @@ WMFReader::InitializeDXVA()
|
||||||
}
|
}
|
||||||
|
|
||||||
mDXVA2Manager = DXVA2Manager::Create();
|
mDXVA2Manager = DXVA2Manager::Create();
|
||||||
NS_ENSURE_TRUE(mDXVA2Manager, false);
|
|
||||||
|
|
||||||
return true;
|
return mDXVA2Manager != nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
IsVideoContentType(const nsCString& aContentType)
|
||||||
|
{
|
||||||
|
NS_NAMED_LITERAL_CSTRING(video, "video");
|
||||||
|
if (FindInReadable(video, aContentType)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsresult
|
nsresult
|
||||||
|
@ -145,7 +154,11 @@ WMFReader::Init(MediaDecoderReader* aCloneDonor)
|
||||||
rv = mByteStream->Init();
|
rv = mByteStream->Init();
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
|
|
||||||
mUseHwAccel = InitializeDXVA();
|
if (IsVideoContentType(mDecoder->GetResource()->GetContentType())) {
|
||||||
|
mUseHwAccel = InitializeDXVA();
|
||||||
|
} else {
|
||||||
|
mUseHwAccel = false;
|
||||||
|
}
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче