Bug 881954 - Only initialize DXVA when we're decoding video. r=padenot

This commit is contained in:
Chris Pearce 2013-06-14 09:07:28 +12:00
Родитель c8d412570d
Коммит 77c4771d6e
2 изменённых файлов: 30 добавлений и 3 удалений

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

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