コンポーネント
MPEG-2 のコンテキストでは、コンポーネントは番組内の基本ストリームを意味する。たとえば、1 つの番組にビデオ ストリームが 1 つ、オーディオ ストリームが 2 つ、データ ストリームが 1 つある場合がある。
コンポーネントは IComponent インターフェイスによって表される。各コンポーネントにはタイプが関連付けられていて、そのタイプは IComponentType インターフェイスによって表される。コンポーネント タイプはコンポーネントを記述し、ストリームのメディア タイプを含む場合がある。IComponent インターフェイスは、指定されたコンポーネントをアクティブまたは非アクティブにするためにも使用される。たとえば、番組に 2 つのオーディオ ストリームがある場合 (たとえば英語とスペイン語)、通常は一度に 1 つのストリームだけがアクティブになる。
各チューニング要求はコンポーネントのリストを持つ。実際のコンポーネントがまだ特定されていないために、このリストは、最初は空の場合がある。ネットワーク プロバイダが番組に合わせてチューニングを実行した後、トランスポート情報フィルタ (TIF) は PSI テーブルを受信し始め、一部のコンポーネント情報を設定できるようになる。
注 コンポーネントとコンポーネント タイプはアナログ ネットワーク タイプには使わない。
チューニング要求からコンポーネント リストを取得するには、ITuneRequest::get_Components メソッドを呼び出す。このメソッドは IComponents インターフェイスへのポインタを返す。次に、IComponents::EnumComponents を呼び出す。このメソッドは、IEnumComponents インターフェイスへのポインタを返す。このインターフェイスを使ってコレクションを列挙する。
CComPtr<IComponents> pComponents;
hr = pTuneRequest->get_Components(&pComponents);
if (SUCCEEDED(hr) && (pComponents != NULL))
{
CComPtr<IEnumComponents> pEnum;
hr = pComps->EnumComponents(&pEnum);
if (SUCCEEDED(hr))
{
CComPtr<IComponent> pComponent;
ULONG cFetched;
while (S_OK == pEnum->Next(1, &pComponent, &cFetched))
{
// pComponent には次のコンポーネントへのポインタが格納されている。
}
pComponent.Release();
}
}
チューニング要求がネットワーク プロバイダに送信され、データがフィルタ グラフを通して移動し始めた後、ネットワーク プロバイダ フィルタの ITuner::get_TuneRequest メソッドを呼び出して、更新されたチューニング要求を取得できる。返された ITuneRequest ポインタを使用して、更新されたコンポーネント情報を確認する。アクティブなコンポーネント、非アクティブなコンポーネントを変更するには、コンポーネント リストを更新してチューニング要求を再送信する。IComponent::put_Status メソッドを使ってコンポーネントのアクティブ/非アクティブ状態を変更する。
デフォルト優先コンポーネント タイプ
チューニング空間は優先コンポーネント タイプのリストを持つ場合がある。その場合、ネットワーク プロバイダはそのリストを使って、MPEG-2 デマルチプレクサ フィルタの出力ピンを構成する。そうでない場合、ネットワーク プロバイダはデフォルトの出力ピンのセットを作成する。
ピン | 説明 |
ピン 1 | PSI テーブル。このピンは BDA MPEG-2 トランスポート情報フィルタ (TIF) に接続する。 |
ピン 2 | ビデオ |
ピン 3 | オーディオ |
ピン 4 | データ |
ピン 5 | PSI テーブル。このピンは MPEG-2 セクションおよびテーブル フィルタに接続する。 |
チューニング空間の優先コンポーネント タイプをオーバーライドするには、以下を実行する。
- 「チューニング空間」の説明に従って、SystemTuningSpaces コレクションからチューニング空間を取得する。
- 新しい ComponentTypes コレクション オブジェクトを作成する。
- 適切なタイプの 1 つまたは複数のコンポーネント タイプ オブジェクトを作成する。MPEG-2 ストリームについては、MPEG2ComponentType オブジェクトを使用する。
- 各コンポーネント タイプに目的のプロパティを設定する。少なくとも、IComponentType::put_Category メソッドを呼び出してカテゴリ (オーディオ、ビデオなど) を設定する。
- IComponents::Add を呼び出して各コンポーネントをコレクションに追加する。
- ITuningSpace::put_DefaultPreferredComponentTypes にコンポーネント タイプ コレクションへのポインタを指定して呼び出す。
- チューニング空間を SystemTuningSpaces コレクションに格納し直して、変更を永続化する。ITuningSpaceContainer::put_Item メソッドにチューニング空間オブジェクトへのポインタを指定して呼び出す。
以下のコードは、これらの手順を示す。
CComPtr <ITuningSpace> pTuningSpace; // チューニング空間へのポインタ。
// SystemTuningSpaces コレクションを使ってチューニング空間を取得する
// (表示されない)。
// 新規のコンポーネント タイプ コレクション オブジェクトを作成する。
CComPtr<IComponentTypes> pTypes;
hr = pTypes.CoCreateInstance(CLSID_ComponentTypes);
// 新規の MPEG-2 コンポーネント タイプを作成する。
CComPtr<IMpeg2ComponentType> pType;
hr = pType.CoCreateInstance(CLSID_MPEG2ComponentType);
// カテゴリを設定する。
hr = pType->put_Category(CategoryVideo);
// 新規のタイプをコレクションに追加する。
CComVariant var; // コレクションへのインデックスを受け取る。
hr = pTypes->Add(pType, &var);
// (すべてのコンポーネント タイプ分繰り返す)
// コンポーネント タイプ コレクションを、チューニング空間の
// 既定のタイプの一覧として設定する。
hr = pTuningSpace->put_DefaultPreferredComponentTypes(pTypes);
デフォルトのコンポーネント タイプを設定する理由の 1 つは、オーディオ ストリームに使用する優先言語を設定することである。そのためには、コンポーネント タイプの ILanguageComponentType::put_LangID メソッドを呼び出す。