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

説明

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

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

使用

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

  1. GraphEdit を起動します。

  2. MPEG-2 トランスポートソースを挿入します。 MPEG 2 カムコーダーおよび D-VHS デバイスは、ビデオキャプチャソースカテゴリの "Microsoft AV/C Tape サブユニットデバイス" として表示されます。

  3. MPEG 2 デマルチプレクサーフィルターにソースフィルターを Connect します。

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

  5. [Demux] プロパティページを使用して、PID 0x00 を出力ピンにマップします。 コンテンツの種類を "MPEG2 PSI セクション" に設定します。

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

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

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

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

  9. [ オーディオ pid ] エディットボックスにオーディオ pid 番号を入力し、[ video pid ] エディットボックスにビデオ pid 番号を入力します。

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

注意

[PSI パーサー] プロパティページは、テストを簡単にするために用意されており、MPEG 2 デマルチプレクサーを構成するサンプルコードを提供します。 アプリケーションでは、を使用しないことをお勧めします。 アプリケーションでは、demux をプログラムで構成する必要があります。

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

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

// 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 デマルチプレクサーの使用」を参照してください。

PSI パーサーフィルターをグラフに追加し、demux の出力ピンに接続します。 IMpeg2PsiParserインターフェイスの PSI パーサーに対してクエリを実行します。 次に、グラフを実行し、EC _ プログラム変更イベントを待機し _ ます。これにより、新しい PAT または PMT セクションが通知されます。 このイベントは、PSI パーサーフィルターによって定義されたカスタムイベントです。 EC _ プログラム変更イベントを受け取った場合は _ 、 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 デマルチプレクサーの新しい出力ピンを構成できます。 これには、元のソースに関する知識が必要な場合があります。 たとえば、ISO/IEC 13818-1 では、"ユーザープライベート" として "0x80 ~ 0xFF" というストリームの種類が定義されていますが、MPEG-2 に基づくその他の標準では、これらの型に他の意味が割り当てられる場合があります。

MPEG 2 デマルチプレクサーは、グラフの実行中に新しい pin と新しい PID マッピングを作成できますが、グラフを停止してピンを接続する必要があります。

サンプルをダウンロードしています

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

このサンプルは次のパスにインストールされています: [ SDK Root ] \ Samples \ マルチメディア \ DirectShow \ フィルター \ psiparser。

DirectShowSamples

IMpeg2PsiParser インターフェイス