Доброго всем дня!
Я вот недельку уже пытаюсь написать код что бы тот просматривал установленые в системе кодеки, а также проверял наличие кодека для АВИшки.
Как я понял FourCC кодека для AVI хранится прямо в нем же по смещению 0xBC.. Это без проблем. Список установленых кодеков я узнаю используя интерфейс IID_ICreateDevEnum компонента CLSID_SystemDeviceEnum,
потом вызываю метод CreateClassEnumerator(CLSID_VideoCompressorCategory, &pEnumCat, 0), а потом в цикле перебираю все
while(pEnumCat->Next(1, &pMoniker, &cFetched) == S_OK)
{
IPropertyBag *pPropBag;
pMoniker->BindToStorage(0, 0, IID_IPropertyBag, (void **)&pPropBag);
VARIANT varName;
varName.vt = VT_BSTR;
hrp = pPropBag->Read(L"FriendlyName", &varName, 0);
//........................................
Но это я получаю имя кодека.. В разделе реестра я могу прочитать только CLISD и FilterData... И тут начинаются вопросы с каким типом нужно считывать FilterData?
Как узнать path dll в которой этот компонент храниться...
И самое важное как узнать FourCC кодека??!!!
Буду благодарен даже за маленький намек..
Здравствуйте, MishaB
IMoniker::BindToObject -> IBaseFilter -> IBaseFilter::EnumPins -> IPin ->IPin::EnumMediaTypes -> ...
Пример:
http://cvs.sourceforge.net/viewcvs.py/virtualvcr/max/CFilterList.cpp.
ДМ>Вместо "FriendlyName" поставить "FccHandler". Но при этом нужно учесть, что у DirectShow кодеков (например DV или Indeo) FOURCC отсутствует.
Хочу поблагодарить ответивших... Как раз с помошью IBaseFilter я узнаю FCC кодеков DirectShow, а уже "FccHandler" остальных. Все классно работает!
А где кстати можно нормально почитать DirectShow. Так как книги которые я вижу в продаже по DirectX ориентированы на игрушки..
Кстати как было неприятно узнать.. У меня в цикле сначала захватываются кодеки DirectShow, поэтому когда я сразу попытался написать hrp = pPropBag->Read(L"FccHandler", &varName, 0), то получал ошибку... А ведь просто нужно было поставить условие проверки

и тогда бы я пропустил их, а на остальных бы програма отработала!!!!!... Програмист сам себе враг!