流更改

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。 仅当已处理具有新格式块的数据包之前的所有数据时,解码器才应对新格式块进行所有必要的更改。

发生流格式更改时,微型驱动程序接收数据包,该数据包的KSSTREAM_HEADER结构的 OptionsFlags 成员中设置了KSSTREAM_HEADER_OPTIONSF_TYPECHANGED位。

如果微型驱动程序未正确公开其音频流支持的数据格式,则它可能永远不会看到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) 。

当视频格式的某些参数(例如像素纵横比)发生更改时,解码器将收到格式块。 解码器应向视频端口发出信号,以重新协商视频端口连接。 解码器使用参数 SignalMultipleStreamEvents 调用 StreamClassStreamNotification

DVD 解码器微型驱动程序必须在 VideoPort 流的 HW_STREAM_INFORMATION 条目中指示为此事件提供支持。 视频端口事件的事件集 ID 为KSEVENTSETID_VPNotify ,事件 ID 为KSEVENT_VPNOTIFY_FORMATCHANGE