Написал Transform фильтр. Протестил через GraphEdit — работает. Поставил высокий приоритет merrit_preffered. После этого действия к штатным проигрывателям (Winamp, Windows Madia Player, PoverDVD) он не прицепляется (а очень бы хотелось), но в GraphEdit их появляется последовательно туева хуча (Filter000->Filter001->...->Filter00n). Т.е. приоритет у фильтра действительно высокий, но не отписана функция JoinFilterGraph(Так кажется).
Свой проигрыватель писать не вариант.
ВОПРОС: Как подключить фильтр к этим (или другим распостроненным ) проигрывателям?????
Детально что есть:
Рабочее "мясо" фильтра(Transform)
Работает вход/выход VideoMediaType Image24RGBSubType
Нет функций AddToRoot и JoinFilterGraph
Что нужно сделать, чтобы получить желаемое
Если сложно объяснить. Можете хотя бы выслать пример Transform фильтра такого, который сам подключается к "штатным" проигрывателям, можно без Transform части.
Возможно ли это в принципе для WinAMP, PowerDVD, Windows Madia Player? Есть ли другие распостраненные проигрыватели, к которым можно подключиться?
Здравствуйте, Аноним, Вы писали:
А>Если сложно объяснить. Можете хотя бы выслать пример Transform фильтра такого, который сам подключается к "штатным" проигрывателям, можно без Transform части.
Выслать исходники не вышлю, но сам факт существования таких фильтров обеспечу %) Например —
http://alparysoft.ru/products.php?cid=7 — DirectShow фильтр
А>Возможно ли это в принципе для WinAMP, PowerDVD, Windows Madia Player? Есть ли другие распостраненные проигрыватели, к которым можно подключиться?
Есть. Все которые используют Intelligent Connect, а таких я видел больше, чем тех, котороые его не используют.
А>Все-таки может кто-нибудь знает "сносный" по качеству/популярности проигрыватель использующий intellect connect?
Ну... Windows Media Player %)
А по существу. Необходимо, каким-либо образом в проверять что за фильтр стоит перед твоим. Сделать это можно различными путями, например в CheckInputType проверять неиспользуемые поля BITMAPINFOHEADER'а,
CheckInputType(const CMediaType *mtIn)
{
const VIDEOINFOHEADER *pvi
= reinterpret_cast<const VIDEOINFOHEADER *>(mtIn->Format());
if (pvi->bmiHeader.biXPelsPerMeter == <your unique value> && pvi->bmiHeader.biXPelsPerMeter == <your unique value>)
return VFW_E_TYPE_NOT_ACCEPTED;
.....
}
которые твой же фильтр заполняет в GetMediaType. Если не пересечёшься с другим фильтром использующим такой же <your unique value> то будет работать %)
Но скажем прямо, метод не лишён недостатков.
Более надёжным способом было бы переопределить класс для входного пина и перегрузить метод Connect, в котором проверять к какому фильтру принадлежит пин, с которым собираемся коннектиться через QueryPinInfo. А дальше уже пробовать определить что это за фильтр. Можно использовать св-ва самого COM'а, т.е. если у нас есть один интерфейс, то мы сможем получить и другой интерфейс этого же объекта через QueryInterface, а уж какой интерфейс выискивать, я надеюсь, сам догадаешься... например свой собственный %)