處理資料
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
剖析媒體資料
如果您的篩選會剖析媒體資料,請勿信任標頭或其他內容中自我描述的資料。 例如,請勿信任出現在 AVI RIFF 區塊或 MPEG 封包中的大小值。 這類錯誤的常見範例包括:
- 讀取 N 個位元組的資料,其中 N 的值來自內容,而不會針對緩衝區的實際大小檢查 N 。
- 跳到緩衝區內的位元組位移,而不需要確認位移落在緩衝區內。
另一個常見的錯誤類別涉及驗證內容中找到的格式描述。 例如:
- BITMAPINFOHEADER結構後面可以接著色彩資料表。 BITMAPINFO結構定義為BITMAPINFOHEADER結構,後面接著組成色彩資料表的RGBQUAD值陣列。 陣列的大小取決於 biClrUsed的值。 請勿先檢查配置給 BITMAPINFO 結構的緩衝區大小,就不要將色彩資料表複製到 BITMAPINFO 中。
- 在 STRUCTUREATEX結構中,可能會有附加至 結構的額外格式資訊。 cbSize成員會指定額外資訊的大小。
在針腳連接期間,篩選準則應該確認所有格式結構都格式正確,且包含合理的值。 如果沒有,請拒絕連線。 在驗證格式結構的程式碼中,特別小心算術溢位。 例如,在 BITMAPINFOHEADER中,寬度和高度是 32 位 長 值,但影像大小 (是兩個) 乘積的函式,只是 DWORD 值。
如果來源的格式資料大於您配置的緩衝區,請勿截斷來源資料,以便將其複製到您的緩衝區。 這樣做可以建立結構,其隱含大小大於其實際大小。 例如,點陣圖標頭可能會指定不再存在的調色盤資料表。 相反地,請重新配置緩衝區,或只是失敗連線。
串流期間的錯誤
當圖表執行時,如果您的篩選收到格式不正確的內容,則應該終止串流。 執行下列動作:
- 從 Receive傳回錯誤碼。
- 在下游篩選上呼叫 IPin::EndOfStream 。
- 呼叫 CBaseFilter::NotifyEvent 以張貼 EC_ERRORABORT 事件。
格式變更
有數種機制可供篩選準則變更中間資料流程格式。 其中每一個步驟都牽涉到一個以上的步驟,這可建立誤接受的可能性。 如果您的篩選取得動態格式變更的要求,則它必須拒絕要求,否則在抵達時接受新的格式。 同樣地,除非其他篩選準則同意,否則絕對不要切換格式。 如需詳細資訊,請參閱 動態格式變更。