Автоматический 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. Также в книге " Видео демистифицировано" Китом Джеком есть все детали о преобразованиях цветового пространства.

Другие вопросы по тегам