QueryAccept (下游)
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayer、IMFMediaEngine 和 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]
此機制可讓輸出釘選向其下游對等提出新的格式。 新的格式不一定需要較大的緩衝區大小。 輸出釘選會執行下列動作:
呼叫 IPin::QueryAccept 或 IPinConnection::D ynamicQueryAccept 下游針腳,以確認另一個 pin 是否可以接受新的媒體類型(請參閱圖例,步驟 A)。
如果步驟 1 的傳回值S_OK,則針腳會將媒體類型附加至下一個範例。 若要這樣做,請先呼叫 IMemAllocator::GetBuffer 以取得範例 (B)。 然後它會呼叫 IMediaSample::SetMediaType,將媒體類型附加至該範例 (C)。 藉由將媒體類型附加至範例,篩選會指出格式已變更,從該範例開始。
針腳會傳遞範例 (D)。
當下游篩選收到範例時,它會呼叫 IMediaSample::GetMediaType 擷取新的媒體類型。
所有針腳都支援 QueryAccept
方法。 不過,這個方法有點模棱兩可,因為傳回值S_OK不一定保證您可以在圖形使用中時變更格式。 某些篩選可能會傳回S_OK,但如果圖形為使用中,則拒絕變更。
DynamicQueryAccept 方法,由某些輸入針腳支援,明確定義S_OK,表示針腳在作用中時可以變更格式。 如果輸入針腳支援 IPinConnection 介面,您應該呼叫 dynamicQueryAccept ,而不是 QueryAccept
。
在大部分情況下,此機制不允許大幅變更格式,例如變更位深度。 其中一種情況是影片譯碼器切換調色盤時。 格式的基本詳細數據保持不變,例如影像維度和位深度,但新的媒體類型有一組不同的調色盤專案。
實作注意事項
在 DirectShow 基類中,CBasePin::QueryAccept 呼叫 CheckMediaType 方法,這個方法也會在初始針腳連接期間呼叫。 在轉換篩選的情況下,輸入針腳的 CheckMediaType 方法應該一律檢查輸出針腳是否已連接,如果是的話,輸入媒體類型是否與輸出媒體類型相容。 因此,此實作對 QueryAccept
而言可能有效。 如果沒有,您應該覆寫 QueryAccept
,以執行所需的任何其他檢查。 此外,請注意,CTransformFilter 類別會將此邏輯封裝 在 checkInputType 和 CheckTransform 方法內。 另一方面,CTransInPlaceFilter 類別一律會在下一個上游或下游篩選上呼叫 QueryAccept
。
CBaseInputPin::Receive 方法會檢查傳入範例上的媒體類型,如果有的話,CheckMediaType呼叫 。 不過,它不會更新釘選的 m_mt 成員,其會保存目前的媒體類型。 當您的篩選程式處理範例時,您應該檢查媒體類型的範例。 如果有新的類型,您可能需要將它儲存在釘選上 SetMediaType,或直接設定 m_mt 的值。 另一方面,CVideoTransformFilter 類別是針對視訊轉換篩選所設計,它會在變更時儲存媒體類型。 如需詳細資訊,請參閱 DirectShow 基類連結庫中 CVideoTransformFilter::Receive 的原始程式碼。
在某些情況下,您可能只傳遞 QueryAccept
呼叫下游,然後將媒體類型附加至輸出範例,讓下游篩選條件處理格式變更。