blob: d5cf8b6506177e5365806656e3c7f3cde08df443 [file]
// Copyright (c) 2010 The WebM project authors. All Rights Reserved.
//
// Use of this source code is governed by a BSD-style license
// that can be found in the LICENSE file in the root of the source
// tree. An additional intellectual property rights grant can be found
// in the file PATENTS. All contributing project authors may
// be found in the AUTHORS file in the root of the source tree.
#include "cfactory.h"
#include "comreg.h"
#include "webmtypes.h"
#include <mfapi.h>
#include <cassert>
#include <comdef.h>
#include <uuids.h>
HMODULE g_hModule;
static ULONG s_cLock;
namespace WebmMfVp8DecLib
{
HRESULT CreateDecoder(
IClassFactory*,
IUnknown*,
const IID&,
void**);
} //end namespace WebmMfVp8DecLib
static CFactory s_handler_factory(&s_cLock, &WebmMfVp8DecLib::CreateDecoder);
BOOL APIENTRY DllMain(
HINSTANCE hModule,
DWORD dwReason,
LPVOID)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
{
g_hModule = hModule;
break;
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
default:
break;
}
return TRUE;
}
STDAPI DllCanUnloadNow()
{
return s_cLock ? S_FALSE : S_OK;
}
STDAPI DllGetClassObject(
const CLSID& clsid,
const IID& iid,
void** ppv)
{
if (clsid == WebmTypes::CLSID_WebmMfVp8Dec)
return s_handler_factory.QueryInterface(iid, ppv);
return CLASS_E_CLASSNOTAVAILABLE;
}
STDAPI DllUnregisterServer()
{
HRESULT hr = MFTUnregister(WebmTypes::CLSID_WebmMfVp8Dec);
//assert(SUCCEEDED(hr)); //TODO: dump this it fails
hr = ComReg::UnRegisterCoclass(WebmTypes::CLSID_WebmMfVp8Dec);
return hr;
}
STDAPI DllRegisterServer()
{
HRESULT hr = DllUnregisterServer();
assert(SUCCEEDED(hr));
std::wstring filename_;
hr = ComReg::ComRegGetModuleFileName(g_hModule, filename_);
assert(SUCCEEDED(hr));
assert(!filename_.empty());
const wchar_t* const filename = filename_.c_str();
#if _DEBUG
const wchar_t friendly_name[] = L"WebM MF VP8 Decoder Transform (Debug)";
#else
const wchar_t friendly_name[] = L"WebM MF VP8 Decoder Transform";
#endif
hr = ComReg::RegisterCoclass(
WebmTypes::CLSID_WebmMfVp8Dec,
friendly_name,
filename,
L"Webm.MfVp8Dec", //TODO: do we really need ProgIDs?
L"Webm.MfVp8Dec.1",
false, //not insertable
false, //not a control
ComReg::kBoth, //DShow filters must support "both"
GUID_NULL, //typelib
0, //no version specified
0); //no toolbox bitmap
if (FAILED(hr))
return hr;
enum { cInputTypes = 1 };
MFT_REGISTER_TYPE_INFO pInputTypes[cInputTypes] =
{
{ MFMediaType_Video, WebmTypes::MEDIASUBTYPE_VP80 }
};
enum { cOutputTypes = 3 };
MFT_REGISTER_TYPE_INFO pOutputTypes[cOutputTypes] =
{
{ MFMediaType_Video, MFVideoFormat_NV12 },
{ MFMediaType_Video, MFVideoFormat_YV12 },
{ MFMediaType_Video, MFVideoFormat_IYUV }
};
wchar_t* const friendly_name_ = const_cast<wchar_t*>(friendly_name);
hr = MFTRegister(
WebmTypes::CLSID_WebmMfVp8Dec,
MFT_CATEGORY_VIDEO_DECODER,
friendly_name_,
MFT_ENUM_FLAG_SYNCMFT, //TODO: for now, just support sync
cInputTypes,
pInputTypes,
cOutputTypes,
pOutputTypes,
0); //no attributes
return hr;
}