Имеем: Фильтр (Декодер) собственного сочинения, построенный на основе CVideoTransformFilter, при этом:
const AMOVIESETUP_PIN psudPins[] = {
{
L"Input", // String pin name
FALSE, // Is it rendered
FALSE, // Is it an output
FALSE, // Allowed none
FALSE, // Allowed many
&CLSID_NULL, // Connects to filter
L"Output", // Connects to pin
1, // Number of types
// The pin details
{
&MEDIATYPE_Video,
&MEDIASUBTYPE_ADV1 // Нестандартный формат (ADV601/611)
}
},
{
L"Output", // String pin name
FALSE, // Is it rendered
TRUE, // Is it an output
FALSE, // Allowed none
FALSE, // Allowed many
&CLSID_NULL, // Connects to filter
L"Input", // Connects to pin
1, // Number of types
// The pin details
{
&MEDIATYPE_Video, // Major type
&MEDIASUBTYPE_UYVY // Minor type
},
} };
const AMOVIESETUP_FILTER sudFilter =
{
&CLSID_ADV1CODEC, // Filter CLSID
L"ADV1 Codec”, // Filter name
MERIT_NORMAL, // Its merit
2, // Number of pins
psudPins // Pin details
};
Регистрирую через regsvr32 – Ok
Смотрю в GraphEdit’е – фильтр появился в разделе DirectShow Filters – Ok
Через «Render Media File» загружаю AVI файл в соответствующем формате – появляется следующий граф:
[ Файл.avi] -> [AVI Splitter] -> [ADV1 Codec ] -> [ Video Renderer ]
Жму Play, а в ответ тишина… (декодер ошибок не выдает)
Ставлю между декодером и Рендерером AVI Decompressor (я же не просто так тип выходного пина обозначил как UYVY [16bit/360x288] !?) – Все пучком! Видео без проблем проигрывается…
В проигрывателях (WMP и т.п) та же фигня, пока носом не ткнешь, показывать не будут…
Теперь вопрос: Что необходимо добавить (уточнить) в декодере (или где?), чтобы Граф фильтров выстраивался корректно?
Обычно выходной формат фильтра выдают в функции GetMediaType, которую вызывает downstream filter. В твоем случае похоже рендер либо так и не знает в каком формате ты ему выдаешь данные, либо ты пытаешься цепляться на обычный VideoRenderer, который для соединения требует RGB формата. По науке декодеры должны поддерживать RGB, для того чтобы между ним и рендером не вставали всякие AVI decompressor'ы или Overlay Mixer'ы.
Здравствуйте, Sergey A. Sablin, Вы писали:
SAS>Обычно выходной формат фильтра выдают в функции GetMediaType, которую вызывает downstream filter. В твоем случае похоже рендер либо так и не знает в каком формате ты ему выдаешь данные, либо ты пытаешься цепляться на обычный VideoRenderer, который для соединения требует RGB формата. По науке декодеры должны поддерживать RGB, для того чтобы между ним и рендером не вставали всякие AVI decompressor'ы или Overlay Mixer'ы.
В GetMediaType все замечательно, "Собака порылась" в CheckTransform — я не достаточно строго проверял параметры "выхода"
Что касается RGB, особой острой необходмости в этом я не увидел, так как все равно
преобразование 4:2:2 -> 4:4:4 -> RGB возможно только после декодирования исходных данных. Так зачем изобретать велосипед? на производительности это не сказывается.
Здравствуйте, xsilver, Вы писали:
X>Здравствуйте, Sergey A. Sablin, Вы писали:
SAS>>Обычно выходной формат фильтра выдают в функции GetMediaType, которую вызывает downstream filter. В твоем случае похоже рендер либо так и не знает в каком формате ты ему выдаешь данные, либо ты пытаешься цепляться на обычный VideoRenderer, который для соединения требует RGB формата. По науке декодеры должны поддерживать RGB, для того чтобы между ним и рендером не вставали всякие AVI decompressor'ы или Overlay Mixer'ы.
X>В GetMediaType все замечательно, "Собака порылась" в CheckTransform — я не достаточно строго проверял параметры "выхода"
X>Что касается RGB, особой острой необходмости в этом я не увидел, так как все равно X>преобразование 4:2:2 -> 4:4:4 -> RGB возможно только после декодирования исходных данных. Так зачем изобретать велосипед? на производительности это не сказывается.
Если ты хочешь сказать, что какой-нибудь AVI decompressor или Overlay Mixer делает YUV->RGB преобразование быстрее чем ты сможешь сделать в декодере, спешу тебя разочаровать — они это делают гораздо медленнее + ко всему прочему из AVI decompressor вываливаеться в большинстве случаев RGB565 — что не может не сказаться на выходном качестве.