Поделиться через


Потоковая передача изменений

Формат 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, если он неправильно предоставляет форматы данных, поддерживаемые его аудиопотоком.

Правильное предоставление форматов данных, поддерживаемых потоком, состоит из двух этапов.

  1. Обработчик SRB_GET_STREAM_INFO для потока должен задать указатель StreamFormatsArray , указывающий на массив указателей NumberOfFormatArrayEntries , каждый из которых указывает на допустимый блок формата.

  2. Обработчик 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.