CBaseRenderer 類別
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
類別 CBaseRenderer
是實作轉譯器篩選的基類。 它支援一個輸入針腳,由 CRendererInputPin 類別實作。 若要使用此類別,請宣告繼承 的 CBaseRenderer
衍生類別。 衍生類別至少必須實作下列方法,這些方法會在基類中宣告為純虛擬:
- CBaseRenderer::CheckMediaType:接受或拒絕建議的媒體類型。 篩選準則會在針腳連接程式期間呼叫這個方法。
- CBaseRenderer::D oRenderSample:轉譯範例。 篩選會針對執行時接收的每個範例呼叫這個方法。
基類會處理狀態變更和同步處理問題。 它也會排程範例進行轉譯,但不會實作任何品質控制措施。 基類也會宣告數個「處理常式」方法。 這些是篩選準則在串流進程中特定點呼叫的方法。 它們不會在基類中執行任何動作,但衍生類別可以覆寫它們。 在下清單格中,它們列在 [公用方法:處理常式] 標題之下。
CBaseRenderer::OnReceiveFirstSample處理常式值得特別提及。 如果篩選在篩選暫停時收到範例,則篩選準則會呼叫此方法。 如果圖形從停止切換為暫停,或是在暫停時搜尋圖表,就會發生這種情況。 視訊轉譯器通常會使用範例來顯示仍然的畫面。 當篩選從暫停切換為執行時,它會將相同的範例傳送至 CBaseRenderer::D oRenderSample 方法,作為資料流程中的第一個範例。
類別 CBaseRenderer
會透過CRendererPosPassThru物件公開IMediaSeeking和IMediaPosition介面。 它會將所有搜尋要求傳遞至下一個篩選上游。
排程
當上游篩選呼叫輸入針腳的 IMemInputPin::Receive 方法以傳遞範例時,針腳會將此呼叫傳遞至篩選的 CBaseRenderer::Receive 方法。 篩選準則會卸載樣本、立即轉譯,或排程它進行轉譯。
如果樣本沒有時間戳記,或者沒有可用的參考時鐘,篩選會立即轉譯樣本。 否則,篩選準則會呼叫 CBaseRenderer::ShouldDrawSampleNow 方法來判斷要執行的動作。 根據預設,此範例會根據其時間戳記進行排程。 衍生類別可以覆寫 ShouldDrawSampleNow 以支援品質控制。
若要排程範例,篩選準則會呼叫 IReferenceClock::AdviseTime 方法,以建立建議要求。 Receive方法接著會封鎖直到排程的時間,或直到篩選變更狀態為止。 封鎖可防止上游篩選準則傳遞更多樣本,直到目前的樣本轉譯為止。
當上游篩選呼叫 IPin::EndOfStream 方法以發出資料流程結尾的訊號時,篩選準則會將 EC_COMPLETE 事件傳送至篩選圖形管理員。 篩選準則會等候目前樣本的停止時間,再傳送事件。
受保護的成員變數 | Description |
---|---|
m_bAbort | 指出是否要停止轉譯並拒絕進一步樣本的旗標。 |
m_bEOS | 指出是否已達到資料流程結束的旗標。 |
m_bEOSDelivered | 旗標,指出篩選是否已張貼EC_COMPLETE事件。 |
m_bInReceive | 指出篩選準則是否正在處理 接收 呼叫的旗標。 |
m_bRepaintStatus | 啟用或停用重新繪製事件的旗標。 |
m_bStreaming | 指出篩選是否正在串流資料的旗標。 |
m_dwAdvise | 排程轉譯之計時器事件的識別碼。 |
m_EndOfStreamTimer | 計時器事件識別碼,用於排程EC_COMPLETE通知。 |
m_evComplete | 狀態轉換完成時發出訊號的事件。 |
m_InterfaceLock | 篩選狀態鎖定。 |
m_ObjectCreationLock | 鎖定以保護在篩選內建立物件。 |
m_pInputPin | 篩選輸入針腳的指標。 |
m_pMediaSample | 目前媒體範例的指標。 |
m_pPosition | 協助程式物件,以傳遞上游的搜尋命令。 |
m_pQSink | 接收品質控制訊息之物件的指標。 |
m_RendererLock | 串流鎖定。 |
m_RenderEvent | 用來排程轉譯的事件。 |
m_SignalTime | 停止目前範例的時間。 |
m_ThreadSignal | 用來釋放串流執行緒的事件。 |
公用方法 | Description |
CancelNotification | 取消排程轉譯的計時器事件。 虛擬。 |
CBaseRenderer | 建構函式方法。 |
~CBaseRenderer | 解構函式方法。 |
GetMediaPositionInterface | 擷取篩選準則的 IMediaPosition 和 IMediaSeeking 介面指標。 虛擬。 |
GetPin | 擷取針腳。 虛擬。 |
GetPinCount | 擷取針腳數目。 虛擬。 |
GetSampleTimes | 從範例擷取時間戳記。 虛擬。 |
OnDisplayChange | 將 EC_DISPLAY_CHANGED 事件張貼至篩選圖表管理員。 |
PrepareReceive | 準備呈現範例。 虛擬。 |
接收 | 接收資料流程中的下一個媒體範例。 虛擬。 |
轉譯 | 轉譯範例。 虛擬。 |
ScheduleSample | 排程用於轉譯的範例。 虛擬。 |
SendNotifyWindow | 通知視訊視窗控制碼的上游篩選。 |
SendRepaint | 將重新繪製事件傳送至篩選圖形管理員。 |
SetMediaType | 設定針腳的媒體類型時呼叫。 虛擬。 |
SignalTimerFired | 清除用來排程轉譯的計時器識別碼。 |
SourceThreadCanWait | 保留或釋放串流執行緒。 虛擬。 |
WaitForReceiveToComplete | 等候 CBaseRenderer::Receive 方法完成。 |
WaitForRenderTime | 等候目前範例的簡報時間。 虛擬。 |
公用方法:存取子方法 | Description |
ClearPendingSample | 釋放目前的範例。 虛擬。 |
GetCurrentSample | 擷取目前的範例。 虛擬。 |
GetRealState | 擷取篩選狀態。 |
GetRenderEvent | 擷取排程轉譯的事件。 |
HaveCurrentSample | 判斷篩選準則是否有範例。 虛擬。 |
IsEndOfStream | 查詢是否收到資料流程結束通知。 |
IsEndOfStreamDelivered | 查詢是否已將EC_COMPLETE事件傳遞至篩選圖形管理員。 |
IsStreaming | 查詢篩選準則是否為串流資料。 |
SetAbortSignal | 設定旗標,指出是否要停止轉譯並拒絕進一步的樣本。 |
SetRepaintStatus | 啟用或停用重新繪製事件。 |
公用方法:State-Change方法 | Description |
使用中 | 當狀態切換為暫停或執行時呼叫。 虛擬。 |
BeginFlush | 開始排清作業。 虛擬。 |
BreakConnect | 從連接釋放輸入針腳。 虛擬。 |
CheckReady | 查詢狀態轉換是否完成。 |
CompleteConnect | 完成與另一個針腳的輸入針腳連線。 虛擬。 |
CompleteStateChange | 判斷是否完成轉換至暫停狀態。 虛擬。 |
EndFlush | 結束排清作業。 虛擬。 |
非使用中 | 當狀態切換為已停止時呼叫。 虛擬。 |
NotReady | 表示狀態轉換尚未完成。 |
就緒 | 表示狀態轉換已完成。 |
StartStreaming | 當篩選切換至執行中狀態時,起始串流。 虛擬。 |
StopStreaming | 當篩選參數離開執行中狀態時,停止串流。 虛擬。 |
公用方法:資料流程結束方法 | Description |
EndOfStream | 通知輸入針腳收到資料流程結束通知的篩選。 虛擬。 |
NotifyEndOfStream | 將 EC_COMPLETE 事件張貼至篩選圖形管理員。 |
ResetEndOfStream | 重設資料流程結尾旗標。 |
ResetEndOfStreamTimer | 取消排程EC_COMPLETE通知的計時器。 虛擬。 |
SendEndOfStream | 如果已達到資料流程結尾,請排程篩選圖形管理員的EC_COMPLETE事件。 虛擬。 |
TimerCallback | 資料流程結束計時器事件的回呼方法。 |
公用方法:處理常式 | Description |
OnReceiveFirstSample | 當篩選在暫停時收到範例時呼叫。 虛擬。 |
OnRenderEnd | 在轉譯範例之後呼叫。 虛擬。 |
OnRenderStart | 轉譯即將啟動時呼叫。 虛擬。 |
OnStartStreaming | 當篩選開始串流時呼叫。 虛擬。 |
OnStopStreaming | 當篩選準則停止串流時呼叫。 虛擬。 |
OnWaitEnd | 當篩選完成等候範例的簡報時間時呼叫。 虛擬。 |
OnWaitStart | 當篩選準則開始等候範例的簡報時間時呼叫。 虛擬。 |
PrepareRender | 在篩選轉譯範例之前呼叫。 虛擬。 |
ShouldDrawSampleNow | 決定如何排程範例以進行轉譯。 虛擬。 |
純虛擬方法 | Description |
CheckMediaType | 判斷篩選準則是否接受特定媒體類型。 |
DoRenderSample | 轉譯範例。 |
IMediaFilter 方法 | Description |
GetState | 擷取篩選 (執行、停止或暫停) 的狀態。 |
暫停 | 暫停篩選。 |
執行 | 執行篩選。 |
停止 | 停止篩選。 |
IBaseFilter 方法 | Description |
FindPin | 擷取具有指定識別碼的針腳。 |
規格需求
需求 | 值 |
---|---|
標頭 |
|
程式庫 |
|