共用方式為


QueryAccept (下游)

[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 Windows 10 和 Windows 11 進行優化。 Microsoft強烈建議新程式代碼盡可能在媒體 基礎中使用 MediaPlayerIMFMediaEngine 音訊/視訊擷取,而不是 DirectShow。 Microsoft建議使用舊版 API 的現有程式代碼,盡可能改寫成使用新的 API。]

此機制可讓輸出釘選向其下游對等提出新的格式。 新的格式不一定需要較大的緩衝區大小。 輸出釘選會執行下列動作:

  1. 呼叫 IPin::QueryAcceptIPinConnection::D ynamicQueryAccept 下游針腳,以確認另一個 pin 是否可以接受新的媒體類型(請參閱圖例,步驟 A)。

  2. 如果步驟 1 的傳回值S_OK,則針腳會將媒體類型附加至下一個範例。 若要這樣做,請先呼叫 IMemAllocator::GetBuffer 以取得範例 (B)。 然後它會呼叫 IMediaSample::SetMediaType,將媒體類型附加至該範例 (C)。 藉由將媒體類型附加至範例,篩選會指出格式已變更,從該範例開始。

  3. 針腳會傳遞範例 (D)。

  4. 當下游篩選收到範例時,它會呼叫 IMediaSample::GetMediaType 擷取新的媒體類型。

    queryaccept (下游)

所有針腳都支援 QueryAccept 方法。 不過,這個方法有點模棱兩可,因為傳回值S_OK不一定保證您可以在圖形使用中時變更格式。 某些篩選可能會傳回S_OK,但如果圖形為使用中,則拒絕變更。 DynamicQueryAccept 方法,由某些輸入針腳支援,明確定義S_OK,表示針腳在作用中時可以變更格式。 如果輸入針腳支援 IPinConnection 介面,您應該呼叫 dynamicQueryAccept ,而不是 QueryAccept

在大部分情況下,此機制不允許大幅變更格式,例如變更位深度。 其中一種情況是影片譯碼器切換調色盤時。 格式的基本詳細數據保持不變,例如影像維度和位深度,但新的媒體類型有一組不同的調色盤專案。

實作注意事項

在 DirectShow 基類中,CBasePin::QueryAccept 呼叫 CheckMediaType 方法,這個方法也會在初始針腳連接期間呼叫。 在轉換篩選的情況下,輸入針腳的 CheckMediaType 方法應該一律檢查輸出針腳是否已連接,如果是的話,輸入媒體類型是否與輸出媒體類型相容。 因此,此實作對 QueryAccept而言可能有效。 如果沒有,您應該覆寫 QueryAccept,以執行所需的任何其他檢查。 此外,請注意,CTransformFilter 類別會將此邏輯封裝 在 checkInputTypeCheckTransform 方法內。 另一方面,CTransInPlaceFilter 類別一律會在下一個上游或下游篩選上呼叫 QueryAccept

CBaseInputPin::Receive 方法會檢查傳入範例上的媒體類型,如果有的話,CheckMediaType呼叫 。 不過,它不會更新釘選的 m_mt 成員,其會保存目前的媒體類型。 當您的篩選程式處理範例時,您應該檢查媒體類型的範例。 如果有新的類型,您可能需要將它儲存在釘選上 SetMediaType,或直接設定 m_mt 的值。 另一方面,CVideoTransformFilter 類別是針對視訊轉換篩選所設計,它會在變更時儲存媒體類型。 如需詳細資訊,請參閱 DirectShow 基類連結庫中 CVideoTransformFilter::Receive 的原始程式碼。

在某些情況下,您可能只傳遞 QueryAccept 呼叫下游,然後將媒體類型附加至輸出範例,讓下游篩選條件處理格式變更。