Потоковая передача изменений
Формат DVD-потока может измениться в любое время. Например, формат аудиопотока может изменяться между AC3 и LPCM во время воспроизведения.
Каждый образец данных в потоке содержит KSSTREAM_HEADER структуру, добавленную к нему. Эта структура содержит элемент OptionsFlags .
Пример данных, связанный с заголовком, который содержит один из следующих флагов, может содержать или не содержать пакет данных null или допустимые данные.
Для воспроизведения DVD важны следующие значения элемента OptionsFlags KSSTREAM_HEADER:
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. Декодер должен вносить все необходимые изменения для нового блока формата только в том случае, если были обработаны все данные до пакета с новым блоком формата.
При изменении формата потока мини-диск получает пакет данных с KSSTREAM_HEADER_OPTIONSF_TYPECHANGED битом, заданным в элементе OptionsFlags структуры KSSTREAM_HEADER пакета данных.
Мини-диск может никогда не увидеть флаг KSSTREAM_HEADER_OPTIONSF_TYPECHANGED, если он неправильно предоставляет форматы данных, поддерживаемые его аудиопотоком.
Правильное предоставление форматов данных, поддерживаемых потоком, состоит из двух этапов.
Обработчик SRB_GET_STREAM_INFO для потока должен задать указатель StreamFormatsArray , указывающий на массив указателей NumberOfFormatArrayEntries , каждый из которых указывает на допустимый блок формата.
Обработчик SRB_GET_DATA_INTERSECTION должен скопировать блок формата, соответствующий предлагаемому формату, в предоставленный буфер.
Изменение формата видео также должно сигнализировать о событиях KSSTREAM для подключения к видеопорту, чтобы указать, что формат видео изменился. Для этой цели мини-диск должен использовать StreamClassStreamNotification(SignalMultipleStreamEvents, pMyHwDevExt-pMyStreamObject>, &MY_KSEVENTSETID_VPNOTIFY, KSEVENT_VPNOTIFY_FORMATCHANGE).
При изменении какого-то параметра видеоформата, например пропорции пикселей, декодер получает блок формата. Декодер должен сообщить видеопорту о повторном согласовании подключения к видеопорту. Декодер вызывает StreamClassStreamNotification с параметром SignalMultipleStreamEvents.
Мини-диск для декодера DVD должен указать, что для этого события предоставляется поддержка в записи HW_STREAM_INFORMATION для потока VideoPort. Идентификатор набора событий для события видеопорта KSEVENTSETID_VPNotify , а идентификатор события — KSEVENT_VPNOTIFY_FORMATCHANGE.