PSI パーサー フィルターのサンプル

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayerIMFMediaEngine、および Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

説明

PSI パーサー フィルターは、MPEG-2 トランスポート ストリームからプログラム固有情報 (PSI) を受信し、プログラム関連付けテーブル (PAT) とプログラム マップ テーブル (PMT) からプログラム情報を抽出します。 この情報により、アプリケーションで MPEG-2 Demultiplexer を構成できます。 フィルターでは、PSI 情報を取得するためのカスタム インターフェイス IMpeg2PsiParser がサポートされています。

このフィルターは、IEEE 1394 MPEG-2 ビデオカメラや D-VHS デバイスなどの MPEG-2 デバイス用に設計されています。 詳細については、「 MSTape ドライバー 」を参照してください。 デジタル テレビ放送ソースでは、TIF フィルターを使用してプログラム情報を取得する必要があります。

使用方法

GraphEdit では、次のように PSI パーサー フィルターをテストできます。

  1. GraphEdit を起動します。

  2. MPEG-2 トランスポート ソースを挿入します。 MPEG-2 ビデオカメラと D-VHS デバイスは、[ビデオ キャプチャ ソース] カテゴリに "Microsoft AV/C テープ サブユニット デバイス" と表示されます。

  3. ソース フィルターを MPEG-2 Demultiplexer フィルターに接続します。

  4. demux のプロパティ ページを使用して、"MPEG-2 PSI" メディアタイプの出力ピンを作成します。 このピンは PAT セクションと PMT セクションを提供します。

  5. 出力ピンに PID 0x00をマップするには、demux プロパティ ページを使用します。 コンテンツ タイプを "MPEG2 PSI セクション" に設定します。

  6. 次の図に示すように、demux 出力ピンを PSI パーサーに接続します。

    psi パーサー フィルター グラフ

  7. PSI データを PSI パーサー フィルターにフィードするために、グラフを実行します。 フィルターは PAT セクションをデコードすると、PMT セクションを受け取るように、PMT PID を demux の同じ出力ピンに自動的にマップします。

  8. PSI パーサー のプロパティ ページを使用して、プログラム番号を選択します。 プロパティ ページの基本ストリームリストには、選択したプログラムの各基本ストリームに関連付けられている PID とストリームの種類が表示されます。 プロパティ ページは、ISO/IEC 13818-1 で定義されているストリームの種類を認識するように設計されています。

  9. [オーディオ PID] 編集ボックスにオーディオ PID 番号を入力し、[ビデオ PID ] 編集ボックスに ビデオ PID 番号を入力します。

  10. [ プログラムの表示 ] ボタンをクリックします。 PSI パーサーは、プログラム ストリーム情報と一致するように demux の出力ピンを構成し、ピンをレンダリングします。

注意

PSI パーサーのプロパティ ページは、テストを容易にし、MPEG-2 Demultiplexer を構成するサンプル コードを提供するために用意されています。 アプリケーションで使用することはお勧めしません。 アプリケーションでは、プログラムで demux を構成する必要があります。

 

アプリケーションで PSI パーサー フィルターを使用するには、まず、MPEG-2 ソースから MPEG-2 demux にフィルター グラフを作成します。 正確なグラフ構成はソースによって異なるため、この手順のコードはここには表示されません。

次に、PSI データの demux に出力ピンを作成します。 次のコードに示すように、PAT セクション用に予約されている PID 0x00をこのピンにマップします。

// Set the media type to MPEG-2 table sections.
AM_MEDIA_TYPE mt;
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
mt.majortype = KSDATAFORMAT_TYPE_MPEG2_SECTIONS;

// Create the pin.
IPin *pPsiPin;
hr = pDemux->CreateOutputPin(&mt, L"PSI", &pPsiPin);
if (SUCCEEDED(hr))
{
    // Map to PID 0.
    ULONG Pid = 0x00;
    hr = pPid->MapPID(1, &Pid, MEDIA_MPEG2_PSI);
}

詳細については、「 MPEG-2 Demultiplexer の使用」を参照してください。

PSI パーサー フィルターをグラフに追加し、demux の出力ピンに接続します。 IMpeg2PsiParser インターフェイスの PSI パーサーに対してクエリを実行します。 グラフを実行し、新しい PAT または PMT セクションを通知するEC_PROGRAM_CHANGED イベントを待機します。 このイベントは、PSI パーサー フィルターによって定義されるカスタム イベントです。 EC_PROGRAM_CHANGED イベントを受信すると、 IMpeg2PsiParser メソッドを呼び出すことで、使用可能な PSI 情報を取得できます。 このセクションでは、最も頻繁に必要になる方法について説明します。

プログラムの数を取得するには、 IMpeg2PsiParser::GetCountOfPrograms メソッドを 使用します。

int NumProgs = 0;
hr = pPsi->GetCountOfPrograms(&NumProgs);

特定のプログラムのプログラム番号を取得するには、 IMpeg2PsiParser::GetRecordProgramNumber メソッドを使用します。

WORD ProgNum = 0;
for (int i = 0; i < NumProgs; i++)
{
    hr = pPsi->GetRecordProgramNumber(i, &ProgNum);
    ...
}

プログラム番号は、個々のプログラムの PMT 項目を取得するために使用されます。 プログラム内の基本ストリームの数を取得するには、 GetCountOfElementaryStreams メソッドを 使用します。

WORD cElemStreams = 0;
hr = pPsi->GetCountOfElementaryStreams(ProgNum, &cElemStreams);

基本ストリームごとに、 IMpeg2PsiParser::GetRecordElementaryPid メソッドは PID を返し、 IMpeg2PsiParser::GetRecordStreamType メソッドはストリームの種類を返します。

BYTE ESType = 0;
WORD ESPid = 0;
for (WORD j = 0; j < cElemStreams; j++)
{
    hr = pPsi->GetRecordElementaryPid(ProgNum, j, &ESPid);
    hr = pPsi->GetRecordStreamType(ProgNum, j, &ESType);
}

PID とストリームの種類を使用すると、MPEG-2 Demultiplexer で新しい出力ピンを構成できます。 これには、元のソースに関する知識が必要な場合があります。 たとえば、ISO/IEC 13818-1 では、0xFFを介して0x80ストリームの種類が "ユーザー プライベート" として定義されていますが、MPEG-2 に基づく他の標準では、これらの型に他の意味が割り当てられる場合があります。

MPEG-2 Demultiplexer では、グラフの実行中に新しいピンと新しい PID マッピングを作成できますが、ピンを接続するにはグラフを停止する必要があります。

サンプルのダウンロード

DirectShow SDK サンプルをダウンロードするには、最新バージョンの Windows SDK をインストールします。

このサンプルは、[ SDK Root]\Samples\Multimedia\DirectShow\Filters\PSIParser のパスの下にインストールされます。

DirectShow のサンプル

IMpeg2PsiParser インターフェイス