Самозагружающийся DirectShow фильтр
От: Petrov_SE  
Дата: 18.04.05 09:23
Оценка:
Здравствуйте!
Есть проблема: нужно написать DirectShow фильтр, который бы загружался автоматически при построении графа.
Прецеденты есть — DivXG400. Он, в режиме "force" подключается к любому графу построенному через RenderFile.
При этом он не подключён ни к одному другому фильтру, а просто лежит рядом с ними.
Кто знает, как это реализовать, откликнитесь!
Re: Самозагружающийся DirectShow фильтр
От: LioLick  
Дата: 18.04.05 10:15
Оценка:
Здравствуйте, Petrov_SE, Вы писали:

P_S>Здравствуйте!

P_S>Есть проблема: нужно написать DirectShow фильтр, который бы загружался автоматически при построении графа.
P_S>Прецеденты есть — DivXG400. Он, в режиме "force" подключается к любому графу построенному через RenderFile.
P_S>При этом он не подключён ни к одному другому фильтру, а просто лежит рядом с ними.
P_S>Кто знает, как это реализовать, откликнитесь!

Через Merit полагаю
главное не переборщить
GL!
Re[2]: Самозагружающийся DirectShow фильтр
От: Petrov_SE  
Дата: 18.04.05 12:22
Оценка:
Через Merit не получается.
я ставил 0xffff... и не помогает.
Построитель цепляет фильтр, но т.к. тот не хочет коннектиться к пинам, то выгружает его из графа.
Тут что-то ещё должно быть...
Re: Самозагружающийся DirectShow фильтр
От: Денис Майдыковский Россия http://www.maydyk.com
Дата: 19.04.05 04:43
Оценка:
Здравствуйте, Petrov_SE, Вы писали:

P_S>Здравствуйте!

P_S>Есть проблема: нужно написать DirectShow фильтр, который бы загружался автоматически при построении графа.

Нужно выставить соответсвующий Merit. Я когда-то игрался с подобной функциональностью, но мои фильтры выстраивались в цепочку по 5-7 штук (интересно почему цикл всё-таки останавливался?) и я забросил это дело. Теперь я понимаю что надо было проверять все upstream фильтры на принадлежность к "своему" классу и не соеденяться если "выше по течению" (upstream) обнаружен такой-же.

P_S>При этом он не подключён ни к одному другому фильтру, а просто лежит рядом с ними.


А зачем тогда он нужен?
Re[2]: Самозагружающийся DirectShow фильтр
От: Petrov_SE  
Дата: 19.04.05 12:32
Оценка:
Чтобы следить за другими фильтрами.
Что-то с у меня меритом не выходит.
Какие пины должны быть у фильтра?
Если я ставлю MUDIATYPE_Null, то мой фильтр лепится к другим, а затем к самому себе.
Лепиться к себе я ему запретил, но как чтобы он к другим не клеился?
Re[3]: Самозагружающийся DirectShow фильтр
От: Денис Майдыковский Россия http://www.maydyk.com
Дата: 19.04.05 19:27
Оценка:
Здравствуйте, Petrov_SE, Вы писали:

P_S>Чтобы следить за другими фильтрами.




P_S>Что-то с у меня меритом не выходит.

P_S>Какие пины должны быть у фильтра?

Обычные, входной и выходной. Принимай на вход всё что тебе дают, а в Preffered указывай {MEDIATYPE_NULL, MEDIASUBTYPE_NULL}. Если один из пинов уже соеденён, то в другом выдавай такой-же медиатип как в соеденённом.

P_S>Если я ставлю MUDIATYPE_Null, то мой фильтр лепится к другим, а затем к самому себе.

Что значит "к самому себе"? Выход фильтра на его-же вход соеденяется или создаётся новый экземпляр, который соеденяется в церочку с предыдущим?

P_S>Лепиться к себе я ему запретил, но как чтобы он к другим не клеился?


Попробуй поступить так.
1) Запретить соеденятся с фильтрами того-же класса. Это как я понял ты уже сделал. Можно вообще ни к ченму не коннектиться если в графе уже присутвует такой фильтр.
2) Дождаться пока оба пина фильтра окажуться соеденёнными. После установления второго соеденения отсоеденить оба пина твоего фильра, запомнть "оппозитные" пины и соеденить их друг с друголм напрямую.

Вот результат. RenderFile думает что соеденил твой фильтр. Фильтр отсоеденил сам себя, а RenderFile об этом ничего не знает. Твой фильтр лежит в графе. Теперь уже этот фильтр может отвергать любое соеденение.
Re[4]: Самозагружающийся DirectShow фильтр
От: Аноним  
Дата: 20.04.05 01:54
Оценка:
Здравствуйте, Денис Майдыковский, Вы писали:

ДМ>Здравствуйте, Petrov_SE, Вы писали:


P_S>>Чтобы следить за другими фильтрами.


ДМ>


P_S>>Что-то с у меня меритом не выходит.

P_S>>Какие пины должны быть у фильтра?

ДМ>Обычные, входной и выходной. Принимай на вход всё что тебе дают, а в Preffered указывай {MEDIATYPE_NULL, MEDIASUBTYPE_NULL}. Если один из пинов уже соеденён, то в другом выдавай такой-же медиатип как в соеденённом.


P_S>>Если я ставлю MUDIATYPE_Null, то мой фильтр лепится к другим, а затем к самому себе.

ДМ>Что значит "к самому себе"? Выход фильтра на его-же вход соеденяется или создаётся новый экземпляр, который соеденяется в церочку с предыдущим?

P_S>>Лепиться к себе я ему запретил, но как чтобы он к другим не клеился?


ДМ>Попробуй поступить так.

ДМ>1) Запретить соеденятся с фильтрами того-же класса. Это как я понял ты уже сделал. Можно вообще ни к ченму не коннектиться если в графе уже присутвует такой фильтр.
ДМ>2) Дождаться пока оба пина фильтра окажуться соеденёнными. После установления второго соеденения отсоеденить оба пина твоего фильра, запомнть "оппозитные" пины и соеденить их друг с друголм напрямую.

ДМ>Вот результат. RenderFile думает что соеденил твой фильтр. Фильтр отсоеденил сам себя, а RenderFile об этом ничего не знает. Твой фильтр лежит в графе. Теперь уже этот фильтр может отвергать любое соеденение.
Re[3]: Самозагружающийся DirectShow фильтр
От: Аноним  
Дата: 20.04.05 01:55
Оценка:
Здравствуйте, Petrov_SE, Вы писали:

P_S>Через Merit не получается.

P_S>я ставил 0xffff... и не помогает.
P_S>Построитель цепляет фильтр, но т.к. тот не хочет коннектиться к пинам, то выгружает его из графа.
P_S>Тут что-то ещё должно быть.. :mansafsdfasdiac: .
asdfasdf
asdf
asd
f
asd
fasdfasdfasdfasdfsdafsadfsadf
Re[5]: Самозагружающийся DirectShow фильтр
От: Аноним  
Дата: 20.04.05 01:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Денис Майдыковский, Вы писали:


ДМ>>Здравствуйте, Petrov_SE, Вы писали:


P_S>>>Чтобы следить за другими фильтрами.


ДМ>>


P_S>>>Что-то с у меня меритом не выходит.

P_S>>>Какие пины должны быть у фильтра?

ДМ>>Обычные, входной и выходной. Принимай на вход всё что тебе дают, а в Preffered указывай {MEDIATYPE_NULL, MEDIASUBTYPE_NULL}. Если один из пинов уже соеденён, то в другом выдавай такой-же медиатип как в соеденённом.


P_S>>>Если я ставлю MUDIATYPE_Null, то мой фильтр лепится к другим, а затем к самому себе.

ДМ>>Что значит "к самому себе"? Выход фильтра на его-же вход соеденяется или создаётся новый экземпляр, который соеденяется в церочку с предыдущим?
sadfsadfasdfsadfasdf

P_S>>>Лепиться к себе я ему запретил, но как чтобы он к другим не клеился?


ДМ>>Попробуй поступить так.

ДМ>>1) Запретить соеденятся с фильтрами того-же класса. Это как я понял ты уже сделал. Можно вообще ни к ченму не коннектиться если в графе уже присутвует такой фильтр.
ДМ>>2) Дождаться пока оба пина фильтра ока жуться соеденёнными. После установления второго соеденения отсоеденить оба пина твоего фильра, запомнть "оппозитные" пины и соеденить их друг с друголм напрямую.

ДМ>>Вот результат. RenderFile думает что соеденил твой фильтр. Фильтр отсоеденил сам себя, а RenderFile об этом ничего не знает. Твой фильтр лежит в графе. Теперь уже этот фильтр может отвергать любое соеденение.
Re: Самозагружающийся DirectShow фильтр
От: LioLick  
Дата: 20.04.05 06:03
Оценка:
Здравствуйте, Petrov_SE, Вы писали:

P_S>Здравствуйте!

P_S>Есть проблема: нужно написать DirectShow фильтр, который бы загружался автоматически при построении графа.
P_S>Прецеденты есть — DivXG400. Он, в режиме "force" подключается к любому графу построенному через RenderFile.
P_S>При этом он не подключён ни к одному другому фильтру, а просто лежит рядом с ними.
P_S>Кто знает, как это реализовать, откликнитесь!

Кстати говоря: для расширения контроля над графом в DirectShow есть механизм "Plug-in Distributors", который позволяет расширить функционал граф билдера и получить контроль над ним.
Подробнее см. IDistributorNotify
GL!
Re[4]: Самозагружающийся DirectShow фильтр
От: Petrov_SE  
Дата: 20.04.05 14:10
Оценка:
Привет!
Есть всё-таки умные люди.
Обязательно так попробую, спасибо!
Re[5]: Самозагружающийся DirectShow фильтр
От: Petrov_SE  
Дата: 21.04.05 13:15
Оценка:
Попробовал.
Почти всё получилось, но есть один ламерский вопрос.

Мой фильтр подключился и получил два пина pIn и pOut.
Кроме того к ним подключены два внешних пина:
pOutExt->pIn и pOut->pInExt.

Как мне грамотно рассоединить указанные пары и корректно соединить pOutExt->pInExt.
Видимо я тупой, но у мне "то лапы ломит, то хвост отваливается".

Заранее огромное спасибо.
Re[6]: Самозагружающийся DirectShow фильтр
От: Денис Майдыковский Россия http://www.maydyk.com
Дата: 21.04.05 15:26
Оценка:
Здравствуйте, Petrov_SE, Вы писали:

P_S>Мой фильтр подключился и получил два пина pIn и pOut.

P_S>Кроме того к ним подключены два внешних пина:
P_S>pOutExt->pIn и pOut->pInExt.

P_S>Как мне грамотно рассоединить указанные пары и корректно соединить pOutExt->pInExt.

P_S>Видимо я тупой, но у мне "то лапы ломит, то хвост отваливается".

// Отсоеденяеи все 4 пина
m_pGraph->Disconnect(pOutExt);
m_pGraph->Disconnect(pIn);
m_pGraph->Disconnect(pOut);
m_pGraph->Disconnect(pInExt);

// Соеденяем внешгие пины мкжду собой
m_pGraph->ConnectDirect(pInExt, pOutExt, NULL);


Переменная m_pGraph -- член базвого класса CBaseFilter
Re[7]: Самозагружающийся DirectShow фильтр
От: Petrov_SE  
Дата: 21.04.05 19:40
Оценка:
Спасибо, завтра попробую.
Кстати, а есть разница: сделаю-ли я Disconnect() через интерфейс пина или интерфейс графа?
И, соответственно, Connect через граф или из одного пина с указанием интерфейса другого?
Re[8]: Самозагружающийся DirectShow фильтр
От: Денис Майдыковский Россия http://www.maydyk.com
Дата: 22.04.05 05:20
Оценка:
Здравствуйте, Petrov_SE, Вы писали:

P_S>Кстати, а есть разница: сделаю-ли я Disconnect() через интерфейс пина или интерфейс графа?

P_S>И, соответственно, Connect через граф или из одного пина с указанием интерфейса другого?

Надо всё делать только через граф. Так написано в документации! Методы пинов м фильтров слишком низкоуровневые и возможно граф запоминает какие-то промежуточные данные.
Re[9]: Самозагружающийся DirectShow фильтр
От: Petrov_SE  
Дата: 22.04.05 17:24
Оценка:
Всё заработало!
Но возникла ещё проблема. Раз уж я дорвался до гуру, то не могу не спросить.
Если тот пин, который конектится мне на вход содержит много медиатайпов, то как все эти тайпы переправить на выход.
А то у меня переправляется только первый и граф строится не такой, как если бы моего фильтра не было.
Спасибо за содействие.
Re[10]: Самозагружающийся DirectShow фильтр
От: Денис Майдыковский Россия http://www.maydyk.com
Дата: 22.04.05 19:57
Оценка:
Здравствуйте, Petrov_SE, Вы писали:

P_S>Если тот пин, который конектится мне на вход содержит много медиатайпов, то как все эти тайпы переправить на выход.

P_S>А то у меня переправляется только первый и граф строится не такой, как если бы моего фильтра не было.

Это уже сложнее. Придётся переопределять функцию ReceiveConnection() входного пина, запоминать все предлагаемые медатипы, выводить их на выходном пине, пересоеднять входной пин... И то вряд-ли это заработает как вам надо. Может быть лучше попробовать решить задачу обходным путём?
Re[11]: Самозагружающийся DirectShow фильтр
От: Petrov_SE  
Дата: 23.04.05 10:07
Оценка:
Было бы здорово, но обходного пути я не знаю (пока).
То, что я написал с Вашей помощью работает в 90% случаев, по этому займусь переопределением ReceiveConnection
Спасибо за содействие.
Re[11]: Самозагружающийся DirectShow фильтр
От: Petrov_SE  
Дата: 25.04.05 04:49
Оценка:
Ура!
Всё оказалось гораздо проще.
Я спросил интерфейс IEnumMediaTypes у пина, который подключён к моему входу.
Тем самым мне удалось перечислить все медиатайпы предыдущего фильтра.
Затем я их переправил на свой выходной пин и получился граф, как если бы моего фильтра не было.
Спасибо всем, кто откликнулся и помог.

P.S.
Наблюдая за чужими примерами, я пришёл к выводу, что эта задача имеет ещё одно, более простое решение.
Но это уже другая тема.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.