Share via


QueryAccept (下游)

[與此頁面 相關的功能 DirectShow是舊版功能。 它已被 MediaPlayerIMFMediaEngineMedia Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayerIMFMediaEngine音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議盡可能重寫使用舊版 API 的現有程式碼,以使用新的 API。]

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

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

  2. 如果步驟 1 的傳回值S_OK,釘選會將媒體類型附加至下一個範例。 若要這樣做,請先呼叫 IMemAllocator::GetBuffer 來取得 B (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 呼叫下游,然後將媒體類型附加至輸出範例,並讓下游篩選準則處理格式變更。