Пользовательский фильтр DirectShow Video Renderer — динамическое изменение разрешения

У меня есть Custom DirectShow Video Renderer Filter, который имеет некоторые расширенные функции по сравнению с Microsoft's Video Renderer Filter, такие как наложенные изображения. Я знаю, что мог бы сделать то же самое с Transform Filter, но я выбрал именно этот путь. Я также считаю, что столкнусь с той же проблемой с Transform Filter, о которой я расскажу ниже.

Когда я использую Microsoft's Video Renderer Filter, он способен автоматически изменять размеры окна и буфера при запуске/изменении потока. Мой фильтр способен делать то же самое, за исключением того, что я не могу получать события после запуска потока. Я считаю, что могу как-то запросить, но я не знаю, как.

Текущий конвейер событий показан ниже.

On Pin Connect
--------------
CreateInstance  
Video Renderer Class Constructor
CheckMediaType  
SetMediaType    
-> Width: 100, Height: 100  
CheckMediaType  
CheckMediaType  
CheckMediaType  
SetMediaType
-> Width: 100, Height: 100  

On Play
-------
StartStreaming
DoRenderSample
...
...
...
DoRenderSample

On Stop
-------
Video Renderer Class Destructor

Размер окна по умолчанию, установленный моим исходным фильтром, составляет 100x100. Я могу получить это на контактном соединении дважды. Но после StartStreaming я не могу снова получить события CheckMediaType и SetMediaType. Я мог бы попытаться вызвать их из исходного фильтра (это тоже мой код), но, поскольку Microsoft's Video Renderer способен автоматически изменять размер StartStreaming, я хотел иметь ту же функцию.

Вопросы:

  1. Как я должен инициировать вызовы CheckMediaType / SetMediaType после начала потоковой передачи? На самом деле SetMediaType для меня важнее. Или есть другой способ запросить текущее разрешение потока?
  2. Нужно ли постоянно проверять возможные изменения размера видео в DoRenderSample?

person Emir Akaydın    schedule 17.11.2011    source источник


Ответы (1)


CheckMediaType и SetMediaType не совсем "события", они не возникают сами по себе, поэтому вы не можете их инициировать. Вы собираетесь менять разрешение? Самостоятельно увеличивать шаг, как это делает VMR? Или принять изменения разрешения от вышестоящего фильтра?

В этом разделе MSDN описаны следующие подробности: Изменения формата.

person Roman R.    schedule 17.11.2011
comment
Да, все, что мы хотим, это изменить разрешение, а не другие изменения типа мультимедиа, такие как YUV->RGB и т. д. Мы хотим сделать то же самое, что и VMR. Кстати, наш класс расширен от CBaseVideoRenderer и расширен от CBaseRenderer, который использует CRendererInputPin в качестве дружественного класса. Должен ли я использовать собственный PIN-код, чтобы переопределить QueryAccept и получить эти изменения разрешения? - person Emir Akaydın; 17.11.2011
comment
Так что именно вы хотите поддержать? Расширить шаг, как это делает VMR, или обрабатывать изменения формата, запрошенные вышестоящим фильтром, как это делает VMR? - person Roman R.; 18.11.2011
comment
Они инициируются восходящим фильтром, поэтому вы должны установить точку останова на IPin::ReceiveConnection, IPin::QueryAccept и IPinConnection::DynamicQueryAccept (если применимо). Затем проверьте, где выполнение достигает при изменении разрешения, и пройдитесь по базовому классу, чтобы увидеть, отклоняет ли он запрос, прежде чем получить его там, где вы ожидаете в CheckMediaType. - person Roman R.; 18.11.2011
comment
Собственно, я и сам это читал. Но одна из моих проблем заключается в том, что я использую CBaseVideoRenderer, и у него уже есть PIN-код по умолчанию. И этот Pin (CRendererInputPin) является дружественным классом своего базового класса. Раньше я пытался переопределить QueryAccept, но потерпел неудачу. Должен ли я использовать что-то сырое, например CBaseFilter, и создавать все поверх него самостоятельно (включая вывод) или можно написать виртуальные методы класса Pin с помощью CBaseVideoRenderer? Я пробовал это раньше, но не работал. - person Emir Akaydın; 18.11.2011
comment
Мне удалось переопределить как IPin::ReceiveConnection, так и IPin::QueryAccept, но ни один из них не вызывается. Я все еще занимаюсь этим, но пока не могу решить. - person Emir Akaydın; 18.11.2011
comment
Наконец мне удалось создать собственный пин. Моя проблема еще не полностью решена, но ваш ответ правильный. Спасибо. :) - person Emir Akaydın; 18.11.2011