Автоматический YUV -> RGB в DirectShow для пользовательского декодера
После нескольких часов поиска в сети я очень отчаянно пытался найти решение для этого. У меня есть и работает OGG Theora декодер в DirectShow, который выводит цветовые модели YV12 и YUY2.
Теперь я хочу сделать фильтр манипулирования пикселями RGB для этого вывода и обработать его в видеорендере. Согласно этому и этому, это должно быть действительно легко и прозрачно, но это не так.
Например, я реализовал в CheckInputType()
эта проверка:
if( IsEqualGUID(*mtIn->Type(), MEDIATYPE_Video )
&& IsEqualGUID(*mtIn->Subtype(), MEDIASUBTYPE_RGB565 ) )
{
return S_OK;
}
и я ожидаю, что он вставит MSYUV между Theora и моим декодером и сделает всю работу за меня (то есть преобразует его в RGB). Проблема в том, что я получаю ошибку каждый раз (в приложении GraphEdit). И я на 100% уверен, что это YV12 в качестве ввода (проверено в отладчике). Единственное объяснение, которое я мог придумать, - это упоминание декомпрессора AVI, но никакой дополнительной информации об этом нет.
- Означает ли это, что я должен использовать контейнер AVI, если я хочу получить эту автоматическую функциональность?
- Странно то, что он работает, например, для видео WMV (с выходом YUV), только у этого OGG-декодера есть проблема с ним. Так что, вероятно, вопрос в том, что пропустил этот декодер OGG?
Жаль, что фильтр MSYUV не работает как преобразователь цветового пространства, то есть видимый и непосредственно используемый в GraphEdit...
Я ценю любой намек на это, программируя собственный конвертер YV12 -> RGB, который я выбрал в качестве последнего средства.
1 ответ
В Directshow нет встроенного преобразователя цветового пространства YUV в RGG. Причина того, что файлы WMV работают для вас, заключается в том, что фильтр декодера WMV будет выплевывать данные RGB или YUV в зависимости от типа фильтра, к которому вы его подключаете.
Лучшее, что вы можете здесь сделать, - это самостоятельно написать фильтр преобразователя цветового пространства или просто преобразовать данные YUV после того, как вы их получите.
http://fourcc.org/ имеет хорошую статью о преобразовании из YUV в RGB. Также в книге " Видео демистифицировано" Китом Джеком есть все детали о преобразованиях цветового пространства.