Streamänderungen
Das Format eines DVD-Streams kann sich jederzeit ändern. Beispielsweise kann sich das Audiostreamformat während der Wiedergabe zwischen AC3 und LPCM ändern.
Jedes Datenbeispiel im Stream enthält eine KSSTREAM_HEADER Struktur, die an ihn angefügt wird. Diese Struktur enthält ein OptionsFlags-Element .
Das Datenbeispiel, das einem Header zugeordnet ist, der eines der folgenden Flags enthält, kann ein NULL-Datenpaket oder gültige Daten enthalten.
Die folgenden Werte des KSSTREAM_HEADER OptionsFlags-Members sind für die DVD-Wiedergabe wichtig:
KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY
Das KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY Bit gibt an, dass das unmittelbar folgende Beispiel zu einer anderen Quelle (oder Position/Position) von Daten gehört als das vorherige Beispiel. Dies gibt an, dass die Verarbeitung, die im vorherigen Beispiel ausgeführt wurde, abgeschlossen sein muss. Dieses Bit befindet sich häufig in der Mitte eines vorherigen Frames, was bedeutet, dass der Decoder den vorherigen Frame verwerfen und mit der Verarbeitung mit den neuen Daten beginnen sollte.
KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY
Das KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY Bit gibt an, dass es unmittelbar nach diesem Beispiel zu einer Zeitlücke in den Daten kommt. Wenn der DVD-Stream z. B. einen Standbild enthält, der als einzelner I-Frame codiert ist, empfängt der Decoder alle Daten für den I-Frame, wobei das letzte Beispiel das flag KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY enthält. Dies gibt an, dass der Decoder den I-Frame sofort decodieren und nicht auf B-Frame-Daten warten soll.
KSSTREAM_HEADER_OPTIONSF_TYPECHANGED
Das KSSTREAM_HEADER_OPTIONSF_TYPECHANGED Bit gibt an, dass das mit dem Header verbundene Beispiel ein neuer KSDATAFORMAT-Block für den Stream ist. Dies ermöglicht das dynamische Ändern von Datentypen. Ein Beispiel wäre der Wechsel von Video von 4x3 auf 16x9 oder der Wechsel von Audio von AC3 zu PCM. Der Decoder sollte alle erforderlichen Änderungen für den neuen Formatblock nur vornehmen, wenn alle Daten vor dem Paket mit dem neuen Formatblock verarbeitet wurden.
Wenn eine Streamformatänderung auftritt, empfängt der Minidriver ein Datenpaket mit dem KSSTREAM_HEADER_OPTIONSF_TYPECHANGED Bit, das im OptionsFlags-Element der KSSTREAM_HEADER Struktur des Datenpakets festgelegt ist.
Der Minidriver wird möglicherweise nie das flag KSSTREAM_HEADER_OPTIONSF_TYPECHANGED angezeigt, wenn er die vom Audiostream unterstützten Datenformate nicht ordnungsgemäß verfügbar macht.
Das ordnungsgemäße Verfügbarmachen der von einem Stream unterstützten Datenformate umfasst zwei Schritte:
Der SRB_GET_STREAM_INFO-Handler für den Stream muss festlegen, dass der StreamFormatsArray-Zeiger auf ein Array von NumberOfFormatArrayEntries-Zeigern zeigt, die jeweils auf einen gültigen Formatblock verweisen.
Der SRB_GET_DATA_INTERSECTION-Handler muss den Formatblock entsprechend dem vorgeschlagenen Format in den bereitgestellten Puffer kopieren.
Eine Videoformatänderung muss auch KSSTREAM-Ereignisse an die Videoportverbindung signalisieren, um anzugeben, dass sich das Videoformat geändert hat. Ein Minidriver sollte zu diesem Zweck StreamClassStreamNotification(SignalMultipleStreamEvents, pMyHwDevExt-pMyStreamObject>, &MY_KSEVENTSETID_VPNOTIFY, KSEVENT_VPNOTIFY_FORMATCHANGE) verwenden.
Wenn sich ein Parameter des Videoformats ändert, z. B. das Pixelseitenverhältnis, empfängt der Decoder einen Formatblock. Der Decoder sollte dem Videoport signalisieren, um die Videoportverbindung neu auszuhandeln. Der Decoder ruft StreamClassStreamNotification mit dem Parameter SignalMultipleStreamEvents auf.
Der Minidriver des DVD-Decoders muss angeben, dass die Unterstützung für dieses Ereignis im HW_STREAM_INFORMATION Eintrag für den VideoPort-Stream bereitgestellt wird. Die Ereignissatz-ID für das Videoportereignis ist KSEVENTSETID_VPNotify , und die Ereignis-ID ist KSEVENT_VPNOTIFY_FORMATCHANGE.