Пользовательский фильтр захвата DirectShow - вывод YUV - PullRequest
3 голосов
/ 06 октября 2011

Я написал собственный фильтр 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, для поддержки нескольких типов выходных носителей?

Спасибо

1 Ответ

0 голосов
/ 31 июля 2018

Установите его также в функции GetStreamCaps

...