blob: f60a033ff568ec091ecd69dae019e8e5d357d2b3 [file] [log] [blame]
// 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 <strmif.h>
#include "cfactory.hpp"
#include "comreg.hpp"
#include <cassert>
#include <comdef.h>
#include <uuids.h>
#include "graphutil.hpp"
#include "webmtypes.hpp"
#include "vorbistypes.hpp"
HMODULE g_hModule;
static ULONG s_cLock;
namespace WebmVorbisEncoderLib
{
HRESULT CreateInstance(
IClassFactory*,
IUnknown*,
const IID&,
void**);
} //end namespace WebmVorbisEncoderLib
static CFactory s_factory(&s_cLock, &WebmVorbisEncoderLib::CreateInstance);
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_WebmVorbisEncoder)
return s_factory.QueryInterface(iid, ppv);
return CLASS_E_CLASSNOTAVAILABLE;
}
STDAPI DllUnregisterServer()
{
const GraphUtil::IFilterMapper2Ptr pMapper(CLSID_FilterMapper2);
assert(bool(pMapper));
HRESULT hr = pMapper->UnregisterFilter(
//&CLSID_LegacyAmFilterCategory,
&CLSID_AudioCompressorCategory,
0,
WebmTypes::CLSID_WebmVorbisEncoder);
assert(SUCCEEDED(hr)); //TODO
hr = ComReg::UnRegisterCoclass(WebmTypes::CLSID_WebmVorbisEncoder);
assert(SUCCEEDED(hr)); //TODO
return S_OK; //TODO
}
STDAPI DllRegisterServer()
{
std::wstring filename_;
HRESULT 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 friendlyname[] = L"WebM Vorbis Encoder Filter (Debug)";
#else
const wchar_t friendlyname[] = L"WebM Vorbis Encoder Filter";
#endif
hr = DllUnregisterServer();
assert(SUCCEEDED(hr));
hr = ComReg::RegisterCoclass(
WebmTypes::CLSID_WebmVorbisEncoder,
friendlyname,
filename,
L"Webm.VorbisEncoder",
L"Webm.VorbisEncoder.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
assert(SUCCEEDED(hr));
const GraphUtil::IFilterMapper2Ptr pMapper(CLSID_FilterMapper2);
assert(bool(pMapper));
enum { cPins = 2 };
#if 1
REGFILTERPINS pins[cPins];
REGFILTERPINS& inpin = pins[0];
enum { nInpinMediaTypes = 1 };
const REGPINTYPES inpinMediaTypes[nInpinMediaTypes] =
{
{ &MEDIATYPE_Audio, &MEDIASUBTYPE_IEEE_FLOAT }
};
inpin.strName = 0; //obsolete
inpin.bRendered = FALSE; //TODO: ?
inpin.bOutput = FALSE;
inpin.bZero = FALSE;
inpin.bMany = FALSE;
inpin.clsConnectsToFilter = 0; //obsolete
inpin.strConnectsToPin = 0; //obsolete
inpin.nMediaTypes = nInpinMediaTypes;
inpin.lpMediaType = inpinMediaTypes;
REGFILTERPINS& outpin = pins[1];
enum { nOutpinMediaTypes = 1 };
const REGPINTYPES outpinMediaTypes[nOutpinMediaTypes] =
{
{ &MEDIATYPE_Audio, &VorbisTypes::MEDIASUBTYPE_Vorbis2 }
};
outpin.strName = 0; //obsolete
outpin.bRendered = FALSE; //always FALSE for outpins
outpin.bOutput = TRUE;
outpin.bZero = FALSE;
outpin.bMany = FALSE;
outpin.clsConnectsToFilter = 0; //obsolete
outpin.strConnectsToPin = 0; //obsolete
outpin.nMediaTypes = nOutpinMediaTypes;
outpin.lpMediaType = outpinMediaTypes;
//pin setup complete
REGFILTER2 filter;
filter.dwVersion = 1;
filter.dwMerit = MERIT_DO_NOT_USE;
filter.cPins = cPins;
filter.rgPins = pins;
#else
REGFILTERPINS2 pins[cPins];
REGFILTERPINS2& inpin = pins[0];
enum { nInpinMediaTypes = 1 };
const REGPINTYPES inpinMediaTypes[nInpinMediaTypes] =
{
{ &MEDIATYPE_Audio, &MEDIASUBTYPE_IEEE_FLOAT }
};
inpin.dwFlags = 0;
inpin.cInstances = 1;
inpin.nMediaTypes = nInpinMediaTypes;
inpin.lpMediaType = inpinMediaTypes;
inpin.nMediums = 0;
inpin.lpMedium = 0;
inpin.clsPinCategory = 0;
REGFILTERPINS2& outpin = pins[1];
enum { nOutpinMediaTypes = 1 };
const REGPINTYPES outpinMediaTypes[nOutpinMediaTypes] =
{
{ &MEDIATYPE_Audio, &VorbisTypes::MEDIASUBTYPE_Vorbis2 }
};
outpin.dwFlags = REG_PINFLAG_B_OUTPUT;
outpin.cInstances = 1;
outpin.nMediaTypes = nOutpinMediaTypes;
outpin.lpMediaType = outpinMediaTypes;
outpin.nMediums = 0;
outpin.lpMedium = 0;
outpin.clsPinCategory = 0;
//pin setup complete
REGFILTER2 filter;
filter.dwVersion = 2;
filter.dwMerit = MERIT_DO_NOT_USE;
filter.cPins2 = cPins;
filter.rgPins2 = pins;
#endif
hr = pMapper->RegisterFilter(
WebmTypes::CLSID_WebmVorbisEncoder,
friendlyname,
0,
&CLSID_AudioCompressorCategory,
//&CLSID_LegacyAmFilterCategory,
0,
&filter);
return hr;
}