ストリームの変更
DVD ストリームの形式はいつでも変更される場合があります。 たとえば、オーディオ ストリームの形式は、再生中に AC3 と LPCM の間で変更できます。
ストリーム内の各データ サンプルには、 KSSTREAM_HEADER 構造体が追加されています。 この構造体には、OptionsFlags メンバーが含まれています。
次のいずれかのフラグを含むヘッダーに関連付けられているデータ サンプルには、null データ パケットまたは有効なデータが含まれている場合と含まれていない場合があります。
DVD 再生では、KSSTREAM_HEADER OptionsFlags メンバーの次の値が重要です。
KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY
KSSTREAM_HEADER_OPTIONSF_DATADISCONTINUITY ビットは、その直後のサンプルが、前のサンプルとは異なるデータのソース (または場所/位置) に属していることを示します。 これは、前のサンプルを使用して進行中の処理を完了する必要があることを示します。 このビットは、多くの場合、前のフレームの途中に入ってくるため、デコーダーは前のフレームを破棄し、新しいデータで処理を開始する必要があることを示します。
KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY
KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY ビットは、このサンプルの直後にデータに時間差があることを示します。 たとえば、DVD ストリームに 1 つの I フレームとしてエンコードされた静止フレームが含まれている場合、デコーダーは KSSTREAM_HEADER_OPTIONSF_TIMEDISCONTINUITY フラグを含む最後のサンプルとともに、I フレームのすべてのデータを受信します。 これは、デコーダーが 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 フラグが表示されないことがあります。
ストリームでサポートされているデータ形式を正しく公開するには、次の 2 つの手順が必要です。
ストリームの SRB_GET_STREAM_INFO ハンドラーは、NumberOfFormatArrayEntries ポインターの配列を指す StreamFormatsArray ポインターを設定する必要があります。各ポインターは有効なフォーマット ブロックを指します。
SRB_GET_DATA_INTER Standard Edition CTION ハンドラーは、提案された形式に対応するフォーマット ブロックを指定されたバッファーにコピーする必要があります。
また、ビデオ形式の変更では、ビデオ形式が変更されたことを示すために、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 です。