次の方法で共有


PSI ストリームに demux を使う

MPEG-2 demux フィルタを使って MPEG-2 トランスポート ストリームから PSI 情報を取得するには、demux に次のメディア タイプを持つ出力ピンを作成する。

  • メジャー タイプ : KSDATAFORMAT_TYPE_MPEG2_SECTIONS
  • サブタイプ : MEDIASUBTYPE_None
  • フォーマット タイプ : GUID_NULL

次に、MEDIA_MPEG2_PSI フラグを使って IMPEG2PIDMap::MapPID を呼び出す。

その後、出力ピンの IMPEG2PIDMap::MapPID メソッドを、PID とフラグ MEDIA_MPEG2_PSI と共に呼び出す。

// IMpeg2Demultiplexer の DEMUX フィルタを問い合わせる。
IMpeg2Demultiplexer *pDemux = NULL;
hr = pFilter->QueryInterface(IID_IMpeg2Demultiplexer, (void**)&pDemux);
if (SUCCEEDED(hr))
{
    // メディア タイプを定義する。
    AM_MEDIA_TYPE mt;
    ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
    mt.majortype = KSDATAFORMAT_TYPE_MPEG2_SECTIONS;
    mt.subtype = MEDIASUBTYPE_None;

    // 新しい出力ピンを作成する。
    IPin *pPin;
    hr = pDemux->CreateOutputPin(&mt, L"PSI Pin", &pPin);
    if (SUCCEEDED(hr))
    {
        // PID をマップする。
        IMPEG2PIDMap *pPidMap = NULL;
        hr = pPin->QueryInterface(IID_IMPEG2PIDMap, (void**)&pPidMap);
        if (SUCCEEDED(hr))
        {
            ULONG Pid[] = { 0x00 }; // 任意の PID をマップする。
            ULONG cPid = 1;
            hr = pPidMap->MapPID(cPid, Pid, MEDIA_MPEG2_PSI);
            pPidMap->Release();
        }
        pPin->Release();
    }
    pDemux->Release();
}

完全な PSI セクションがそれぞれ 1 つのメディア サンプルで送信される。テーブル セクションに関連付けられた PID 番号を取得するには、メディア サンプルに対して IMediaSample2::GetProperties を呼び出す。PID は、AM_SAMPLE2_PROPERTIES 構造体の dwTypeSpecificFlags フラグにおける下位 13 ビットに設定される。同じ出力ピンに複数の PSI PID をマップする場合、この値が役立つ。

参照