2011-11-17 105 views
0

我有一個Custom DirectShow Video Renderer Filter它有一些擴展功能,比覆蓋圖像Microsoft's Video Renderer Filter。我知道我可以用Transform Filter做同樣的事情,但我選擇了這種方式。我也相信,我會面對同樣的問題,我將在下面描述一個Transform Filter自定義DirectShow視頻渲染器過濾器 - 動態分辨率更改

當我使用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之後,我無法再獲取CheckMediaTypeSetMediaType事件。我可以嘗試從源代碼篩選器(它也是我的代碼)觸發它們,但由於Microsoft's Video Renderer能夠自動調整StartStreaming的大小,因此我希望具有相同的功能。

問題:

  1. 我應該如何觸發流開始後CheckMediaType/SetMediaType電話?其實SetMediaType對我來說是重要的。或者有另一種方式來查詢當前的流分辨率?
  2. 我是否需要在DoRenderSample中連續檢查可能的視頻尺寸變化?

回答

1

CheckMediaTypeSetMediaType並不完全是「事件」,它們不是自己動手,所以你不能觸發它們。你打算改變決議嗎?你自己像VMR那樣延伸步伐嗎?或者接受上游過濾器更改分辨率?

本MSDN部分涵蓋了詳細信息:Dynamic Format Changes

+0

是的,我們想要的只是改變分辨率,而不是像YUV-> RGB等其他媒體類型的改變。我們想要完全像VMR那樣做。順便說一下,我們的類是從CBaseVideoRenderer擴展而來的,它是從使用CRendererInputPin作爲朋友類的CBaseRenderer擴展而來的。我是否應該使用自定義Pin來重寫QueryAccept並獲取這些分辨率更改? –

+0

那你到底想要支持什麼?像VMR那樣擴展步幅,或者像VMR那樣處理上游過濾器所要求的格式變化呢? –

+0

我正在嘗試處理格式更改。 –