プレゼンテーション記述子

プレゼンテーションは、一般的なプレゼンテーション時間を共有する関連メディア ストリームのセットです。 たとえば、プレゼンテーションは映画のオーディオ ストリームとビデオ ストリームで構成される場合があります。 プレゼンテーション記述子は、特定のプレゼンテーションの説明を含むオブジェクトです。 プレゼンテーション記述子は、メディア ソースと一部のメディア シンクを構成するために使用されます。

各プレゼンテーション記述子には、1 つ以上の ストリーム記述子の一覧が含まれています。 プレゼンテーションのストリームについて説明します。 ストリームは選択または選択解除できます。 選択したストリームのみがデータを生成します。 選択されていないストリームはアクティブではなく、データは生成されません。 各ストリーム記述子には 、ストリームのメディアの種類を変更したり、ストリームの現在のメディアの種類を取得したりするために使用されるメディアの種類ハンドラーがあります。 (メディアの種類の詳細については、「メディアの 種類」を参照してください)。

次の表は、これらの各オブジェクトが公開する主なインターフェイスを示しています。

Object インターフェイス
プレゼンテーション記述子 IMFPresentationDescriptor
ストリーム記述子 IMFStreamDescriptor
メディア型ハンドラー IMFMediaTypeHandler

 

メディア ソース プレゼンテーション

すべてのメディア ソースには、ソースの既定の構成を記述するプレゼンテーション記述子が用意されています。 既定の構成では、少なくとも 1 つのストリームが選択され、選択されたすべてのストリームにメディアの種類があります。 プレゼンテーション記述子を取得するには、 IMFMediaSource::CreatePresentationDescriptor を呼び出します。 メソッドは IMFPresentationDescriptor ポインターを 返します。

ソースのプレゼンテーション記述子を変更して、別のストリーム セットを選択できます。 メディア ソースが停止しない限り、プレゼンテーション記述子を変更しないでください。 変更は、 IMFMediaSource::Start を呼び出してソースを開始するときに適用されます。

ストリームの数を取得するには、 IMFPresentationDescriptor::GetStreamDescriptorCount を呼び出します。 ストリームのストリーム記述子を取得するには、 IMFPresentationDescriptor::GetStreamDescriptorByIndex を 呼び出し、ストリームのインデックスを渡します。 ストリームは 0 からインデックスが作成されます。 GetStreamDescriptorByIndex メソッドは、IMFStreamDescriptor ポインターを返します。 また、ストリームが選択されているかどうかを示すブール型 (Boolean) のフラグも返します。 ストリームが選択されている場合、メディア ソースはそのストリームのデータを生成します。 それ以外の場合、ソースはそのストリームのデータを生成しません。 ストリームを選択するには、ストリームのインデックスを指定して IMFPresentationDescriptor::SelectStream を呼び出します。 ストリームの選択を解除するには、 IMFPresentationDescriptor::D eselectStream を呼び出します。

次のコードは、メディア ソースからプレゼンテーション記述子を取得し、ストリームを列挙する方法を示しています。

HRESULT hr = S_OK;
DWORD cStreams = 0;
BOOL  fSelected = FALSE;

IMFPresentationDescriptor *pPresentation = NULL;
IMFStreamDescriptor *pStreamDesc = NULL;

hr = pSource->CreatePresentationDescriptor(&pPresentation);

if (SUCCEEDED(hr))
{
    hr = pPresentation->GetStreamDescriptorCount(&cStreams);
}

if (SUCCEEDED(hr))
{
    for (DWORD iStream = 0; iStream < cStreams; iStream++)
    {
        hr = pPresentation->GetStreamDescriptorByIndex(
            iStream, &fSelected, &pStreamDesc);

        if (FAILED(hr))
        {
            break;
        }

        /*  Use the stream descriptor. (Not shown.) */

        SAFE_RELEASE(pStreamDesc);
    }
}
SAFE_RELEASE(pPresentation);
SAFE_RELEASE(pStreamDesc);

メディアの種類ハンドラー

ストリームのメディアの種類を変更したり、ストリームの現在のメディアの種類を取得したりするには、ストリーム記述子のメディアの種類ハンドラーを使用します。 IMFStreamDescriptor::GetMediaTypeHandler を呼び出して、メディアの種類ハンドラーを取得します。 このメソッドは、 IMFMediaTypeHandler ポインターを 返します。

オーディオやビデオなど、ストリーム内のデータの種類を知りたい場合は、 IMFMediaTypeHandler::GetMajorType を呼び出します。 このメソッドは、メジャー メディアの種類の GUID を返します。 たとえば、再生アプリケーションは通常、オーディオ ストリームをオーディオ レンダラーに接続し、ビデオ ストリームをビデオ レンダラーに接続します。 メディア セッションまたはトポロジ ローダーを使用してトポロジを構築する場合は、必要な唯一の形式情報がメジャーの種類 GUID である可能性があります。

アプリケーションで現在の形式に関する詳細情報が必要な場合は、 IMFMediaTypeHandler::GetCurrentMediaType を呼び出します。 このメソッドは、メディアの種類の IMFMediaType インターフェイスへのポインターを返します。 このインターフェイスを使用して、形式の詳細を取得します。

メディアの種類ハンドラーには、ストリームでサポートされているメディアの種類の一覧も含まれています。 リストのサイズを取得するには、 IMFMediaTypeHandler::GetMediaTypeCount を呼び出します。 一覧からメディアの種類を取得するには、メディアの種類のインデックスを使用 して IMFMediaTypeHandler::GetMediaTypeByIndex を呼び出します。 メディアの種類は、ユーザー設定のおおよその順序で返されます。 たとえば、オーディオ形式の場合は、サンプル レートが低い方が高いサンプル レートが推奨されます。 ただし、順序を管理する明確なルールはないため、単にガイドラインとして扱う必要があります。

サポートされている型の一覧に、ストリームでサポートされるすべてのメディアの種類が含まれているとは限りません。 特定のメディアの種類がサポートされているかどうかをテストするには、 IMFMediaTypeHandler::IsMediaTypeSupported を呼び出します。 メディアの種類を設定するには、 IMFMediaTypeHandler::SetCurrentMediaType を呼び出します。 メソッドが成功した場合、ストリームには、指定された形式に準拠するデータが含まれます。 SetCurrentMediaType メソッドは、優先する型の一覧を変更しません。

次のコードは、メディアの種類ハンドラーを取得し、優先するメディアの種類を列挙し、メディアの種類を設定する方法を示しています。 この例では、メディアの種類を選択するために、アプリケーションにここに示されていないアルゴリズムがあることを前提としています。 詳細は、アプリケーションによって大きく異なります。

HRESULT hr = S_OK;
DWORD cTypes = 0;
BOOL  bTypeOK = FALSE;

IMFMediaTypeHandler *pHandler = NULL;
IMFMediaType *pMediaType = NULL;

hr = pStreamDesc->GetMediaTypeHandler(&pHandler);

if (SUCCEEDED(hr))
{
    hr = pHandler->GetMediaTypeCount(&cTypes);
}

if (SUCCEEDED(hr))
{
    for (DWORD iType = 0; iType < cTypes; iType++)
    {   
        hr = pHandler->GetMediaTypeByIndex(iType, &pMediaType);

        if (FAILED(hr))
        {
            break;
        }

        /* Examine the media type. (Not shown.)  */

        /* If this media type is acceptable, set the media type. */

        if (bTypeOK)
        {
            hr = pHandler->SetCurrentMediaType(pMediaType);
            break;
        }

        SAFE_RELEASE(pMediaType);
    }
}    

SAFE_RELEASE(pMediaType);
SAFE_RELEASE(pHandler);

メディア ソース

Media Foundation Platform API