Я написал собственный фильтр DirectShow, который считывает изображения и выводит их как RGB.В настоящее время это работает нормально.
Я хочу добавить опцию вывода в YUV.У меня все еще есть некоторые проблемы на этапе переговоров.IMO объяснения конкретных функций DirectShow просто ужасны, особенно для исходных фильтров.
Насколько я понимаю, я предлагаю, какие типы носителей я поддерживаю с помощью GetMediaType ().После этого, когда выбран определенный тип, CheckMediaType () проверяет согласованный тип мультимедиа.
С этой логикой я обновил GetMediaType (), чтобы возвращать тип мультимедиа YUV.Я не смог найти примеры того, как создать медиа-тип yuv, и в итоге использовал пример push-source RGB с некоторыми изменениями.
HRESULT CreateYUVVideoType(CMediaType *pMediaType, long Width, long Height, double Fps)
{
if (Width < 0)
{
return E_INVALIDARG;
}
FreeMediaType(*pMediaType);
VIDEOINFO *pvi = (VIDEOINFO*)pMediaType->AllocFormatBuffer(sizeof(VIDEOINFO));
if (pvi == 0)
{
return(E_OUTOFMEMORY);
}
ZeroMemory(pvi, sizeof(VIDEOINFO));
pvi->AvgTimePerFrame = Fps2FrameLength(Fps);
BITMAPINFOHEADER *pBmi = &(pvi->bmiHeader);
pBmi->biSize = sizeof(BITMAPINFOHEADER);
pBmi->biWidth = Width;
pBmi->biHeight = Height;
pBmi->biPlanes = 1;
pBmi->biBitCount = 16;
pBmi->biCompression = MAKEFOURCC('Y','U','Y','2');
pMediaType->SetSubtype(&MEDIASUBTYPE_YUY2);
pvi->bmiHeader.biSizeImage = DIBSIZE(pvi->bmiHeader);
pMediaType->SetType(&MEDIATYPE_Video);
pMediaType->SetFormatType(&FORMAT_VideoInfo);
pMediaType->SetTemporalCompression(FALSE);
pMediaType->SetSampleSize(pvi->bmiHeader.biSizeImage);
return S_OK;
}
1) Это правильный способ создания YUV (4: 2: 2) тип носителя?
2) Кроме того, когда я отображаю вывод, он соединяет VMR с декомпрессором AVI между ними?Почему?
3) Нужно ли переопределять какие-либо другие функции, кроме GetMediaType
и CheckMediaType
, для поддержки нескольких типов выходных носителей?
Спасибо