Microsoft DirectX 8.0

MPEG-2 デマルチプレクサ

MPEG-2 デマルチプレクサ (Demux) は プッシュモードで出力される MPEG-2 トランスポートと番組ストリームを操作する。(ファイル再生シナリオのような、プルモードで出力される MPEG-2 番組ストリームをについては、MPEG-2 スプリッタ フィルタを使用する。) トランスポート ストリーム上で操作するとき、Demux は トランスポート スリーム モード にあると言われる。番組ストリーム上で操作するとき、Demux は 番組ストリーム モード にあると言われる。トランスポート ストリーム モードでは、デマルチプレキシングは 1 つ以上のパケット ID (PID) の出力ピンへのマッピングをベースにしている。番組ストリーム モードでは、このマッピングは 1 つのストリーム ID と 1 つの出力ピン間となる。ある PID あるいは ストリーム ID がある出力ピンにマップされないと、Demux は破棄するだけである。

Demux は パス スルー モード でも操作できる。たとえば、アプリケーションはすべての PID を 1 つの出力ピンにマッピングし、PID パケットのストリームを作成できる、それはファイルにも書き込めるし、再度ブロードキャストにもできるし、別の方法で処理することもできる。パケットの再マルチプレキシングはパス スルー モードでは実行できない、出力ストリームは素直な MPEG-2 トランスポート ストリームではない。エラーのあるパケットはフィルタで出力できない。

次の図は Demux がトランスポート ストリーム モードのときの可能なデータ フローを示す。

トランスポート ストリーム モードでの Demux

フィルタを構成する

Demux が最初にインスタンス化されフィルタ グラフに追加されると、入力ピンを 1 つ持ち出力ピンは持たない。デジタル TV 放送をレンダリングし、Microsoft® Broadcast Driver Architecture (BDA) をベースにしているフィルタ グラフでは、BDA ネットワーク プロバイダ フィルタは Demux 上の出力ピンを作成し、ピンに PID をマッピングする責任がある。他のフィルタグラフでは、ピンが作成されストリーム ID (番組ストリーム モード) か PID (トランスポート ストリーム モード) を各ピンにマッピングするとき、ピンのメディア タイプを設定することによって出力ピンの作成と構成をすることはアプリケーションの責任である。

Demux は、どのタイプのストリームをフィルタが期待しているかを示すトリガー イベントが発生した後で、自分自身を内部的に各トランスポート ストリームあるいは番組ストリームに対して構成する。通常トリガー イベントは最初に出力ピンが構成されたときに起こる。たとえば、番組ストリーム モードでは、アプリケーションはフィルタの IMpeg2Demultiplexer::CreateOutputPin メソッドを使って新しい出力ピンを作成する。このメソッドは IPin インターフェイスポインタを作成されたピンに返す。アプリケーションは次に QueryInterface を呼び出す際に、このポインタを使って IMPEG2StreamIDMap インターフェイスを取得する。このときに Demux は番組ストリーム モードに自分自身を構成する、なぜなら IMPEG2StreamIDMap は番組ストリームを指定しているからである。アプリケーションが最初の出力ピンでQueryInterface を呼び出し、IMPEG2PIDMap インターフェイスを要求したとき、同じプロセスがトランスポート モードで起きる。もう 1 つ別のトリガー イベントは Demux の入力ピンが接続されたときである、接続メディア タイプは入力ストリームが番組ストリームかトランスポート ストリームかを Dexmu に示す。

Demux は Run 状態になり得る前に構成されなければならない。Demux があるストリーム タイプで自分自身を 1 度構成すると別のストリーム タイプで再構成することはできない。Demux を番組ストリーム モードとトランスポート ストリーム モードで切り替えるには、新しくフィルタをインスタンス化して始めなおさなければならない。

番組ストリーム モードでピンを構成する

前のセクションで説明したように、出力ピンを作成した後で、アプリケーションは IMPEG2StreamIDMap インターフェイスに対してそのピンをクエリする。アプリケーションは次に IMPEG2StreamIDMap::MapStreamId メソッドを呼び出し、そのピンと指定した基本ストリームを組み合わせ、サブストリーム フィルタリングが要求されているかどうかを知らせる。MPEG-2 (トランスポート ストリームではなく) 番組ストリームではオーディオ基本ストリームは複数のサブストリームに将来分割されるかもしれない。これはプライベート複数オーディオ トラックで起こることが多い。アプリケーションは必要なサブストリーム フィルタリング情報と共にピンを提供する責任があるので、ピンはどのサブストリームをオーディオ デコーダに渡すかを知っている。詳細は IMPEG2StreamIDMap::MapStreamID ページを参照すること。

トランスポート ストリーム モードでピンを構成する

フィルタ グラフに BDA Network Provider フィルタがあるなら、このフィルタは自動的にすべての必要な 出力ファイルを Demux 上に作成し、各ピンに PID をマップする。オーディオとビデオのストリームでは、一般的には各ピンに 1 つの PID がある。番組サービス情報 (PSI) ストリームでは、いくつかの PID が トランスポート情報フィルタ (TIF) に接続する出力ピンにマッピングされる場合がある。BDA ネットワーク プロバイダ はシーンの裏側で TIF と共に動作し、PSI ストリームの様々な表の PID を取得し、それに従って Demux の出力ピンを構成する。BDA をベースとしないカスタム フィルタを通してトランスポート ストリームを提供しているなら、フィルタかアプリケーションのいずれかがこの作業をしなければならない。

Clock Behavior

Demux は IReferenceClock インターフェイスを実装することにより、フィルタグラフの参照クロックとして機能する。トランスポート ストリームと共に、このクロックは最後にマップされたオーディオあるいはビデオ ストリームに対応する PCR ストリームに従属する。これ以外に PCR が存在しても、それらはトラックされるが、使用されない。番組ストリームと共に、Demux はそのクロックを SCR ストリームに従属させる。クロックの PCR や SCR ストリームへの従属によって、ダウンストリーム バッファのオーバーフローやアンダーフローの状態を避けることができる、そうしないとローカル システム クロックとストリーム クロック間の違いによってオーバーフローやアンダーフローが起こる。

Demux はダウンストリーム フィルタに対して単調増加するプレゼンテーション時間を保証する。これはたとえば次のようなことを意味する、トランスポート ストリームが主番組とは違うクロックで作成されたコマーシャルのようなセグメントを含んでいても、Demux はプレゼンテーション時間スタンプを調整し、ダウンストリーム デコーダとレンダラから不連続さを隠す。

フィルタ インターフェイス IMpeg2DemultiplexerIBaseFilterIReferenceClockISpecifyPropertyPages
入力ピン メディア タイプ MEDIATYPE_Stream、MEDIASUBTYPE_MPEG2_TRANSPORT、Format_None
MEDIATYPE_Stream、MEDIASUBTYPE_MPEG2_PROGRAM、Format_None
入力ピン インターフェイス IPin
出力ピン メディア タイプ オーディオとビデオの基本ストリームはオーディオとビデオのメジャータイプを持たなければならない。Demux はメディア サブタイプに無制限を設定する。
出力ピン インターフェイス IMPEG2StreamIDMapIMPEG2PIDMapIPin
フィルタ CLSID CLSID_MPEG2Demultiplexer
プロパティ ページ CLSID ISpecifyPropertyPages インターフェイスを使ってプロパティ ページにアクセスする。
実行モジュール mpg2splt.ax
メリット MERIT_NORMAL
カテゴリ CLSID_LegacyAmFilterCategory