數據流變更
DVD 數據流的格式可能會隨時變更。 例如,音訊數據流格式可以在播放期間變更 AC3 和 LPCM。
數據流中的每個數據範例都包含附加KSSTREAM_HEADER結構。 這個結構包含 OptionsFlags 成員。
與包含下列其中一個旗標之標頭相關聯的數據範例,可能包含 Null 數據封包或有效數據。
KSSTREAM_HEADER OptionsFlags 成員的下列值對於 DVD 播放很重要:
KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY
KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY位表示緊接在它之後的樣本屬於與先前範例不同的來源 (或位置/位置) 。 這表示任何使用先前範例進行中的處理都必須完成。 這個位通常位於上一個畫面的中間,因此表示譯碼器應該捨棄前一個框架並開始處理新的數據。
KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY
KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY位表示此範例緊接在數據中會有時間間隔。 例如,如果 DVD 數據流包含編碼為單一 I 框架的仍然畫面,譯碼器會接收 I 框架的所有數據,而最後一個範例包含KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY旗標。 這表示譯碼器應該立即譯碼 I 框架,而不會等候 B 框架數據。
KSSTREAM_HEADER_OPTIONSF_TYPECHANGED
KSSTREAM_HEADER_OPTIONSF_TYPECHANGED位表示與標頭連接的範例將會是數據流的新 KSDATAFORMAT 區塊。 這可讓您動態變更數據類型。 例如,將視訊從 4x3 變更為 16x9,或將音訊從 AC3 變更為 PCM。 譯碼器應該只有在處理具有新格式區塊之封包之前的所有數據時,才會對新格式區塊進行所有必要的變更。
發生數據流格式變更時,minidriver 會收到數據封包,並在數據封包KSSTREAM_HEADER結構的 OptionsFlags 成員中設定KSSTREAM_HEADER_OPTIONSF_TYPECHANGED位。
如果迷你驅動程式無法正確公開其音訊數據流所支持的數據格式,則永遠不會看到KSSTREAM_HEADER_OPTIONSF_TYPECHANGED旗標。
正確公開資料流支援的數據格式包含兩個步驟:
數據流的SRB_GET_STREAM_INFO處理程式必須設定 StreamFormatsArray 指標,以指向 NumberOfFormatArrayEntries 指標的陣列,每個指標都指向有效的格式區塊。
SRB_GET_DATA_INTERSECTION處理程式必須將對應至建議格式的格式區塊複製到提供的緩衝區。
視訊格式變更也必須向視訊埠連線發出 KSSTREAM 事件的訊號,以指出影片格式已變更。 minidriver 應該使用 StreamClassStreamNotification (SignalMultipleStreamEvents、pMyHwDevExt-pMyStreamObject>、&MY_KSEVENTSETID_VPNOTIFY,KSEVENT_VPNOTIFY_FORMATCHANGE) 此用途。
當視訊格式的某些參數變更時,例如像素外觀比例,譯碼器會收到格式區塊。 譯碼器應該發出視訊埠的訊號,以重新交涉視訊埠連線。 譯碼器會使用 SignalMultipleStreamEvents 參數呼叫 StreamClassStreamNotification。
DVD 譯碼器 minidriver 必須在 VideoPort 數據流 的HW_STREAM_INFORMATION 專案中,提供此事件的支援。 視訊埠事件的事件集標識碼 KSEVENTSETID_VPNotify ,且事件標識碼 KSEVENT_VPNOTIFY_FORMATCHANGE。