DXVA2_VideoDesc構造体 (dxva2api.h)

DXVA デコーダー デバイスまたはビデオ プロセッサ デバイスのビデオ ストリームについて説明します。

構文

typedef struct _DXVA2_VideoDesc {
  UINT                 SampleWidth;
  UINT                 SampleHeight;
  DXVA2_ExtendedFormat SampleFormat;
  D3DFORMAT            Format;
  DXVA2_Frequency      InputSampleFreq;
  DXVA2_Frequency      OutputFrameFreq;
  UINT                 UABProtectionLevel;
  UINT                 Reserved;
} DXVA2_VideoDesc;

メンバー

SampleWidth

ビデオ フレームの幅 (ピクセル単位)。

SampleHeight

ビデオ フレームの高さ (ピクセル単位)。

SampleFormat

DXVA2_ExtendedFormat構造として指定されたビデオ形式に関する追加の詳細。

Format

D3DFORMAT 値または FOURCC コードとして指定されたサーフェス形式。 FOURCC コードは、 D3DFORMAT マクロまたは MAKEFOURCC マクロを 使用して構築できます。

InputSampleFreq

DXVA2_Frequency構造として指定された入力ビデオ ストリームのフレーム レート。

OutputFrameFreq

DXVA2_Frequency構造として指定された出力ビデオのフレーム レート。

UABProtectionLevel

ユーザーがアクセス可能なバス (UAB) が存在する場合に必要なデータ保護のレベル。 TRUE の場合、UAB が存在する場合はビデオを保護する必要があります。 FALSE の場合、ビデオを保護する必要はありません。

Reserved

予約済み。 ゼロを指定してください。

解説

InputSampleFreq メンバーは、ビデオ レンダラーによって受信されたデコードされたビデオ ストリームのフレーム レートを提供します。 OutputFrameFreq メンバーは、インターレース解除後に表示されるビデオのフレーム レートを指定します。 入力ビデオがインターレースされ、サンプルにインターリーブ フィールドが含まれている場合、出力フレーム レートは入力フレーム レートの 2 倍になります。 入力ビデオがプログレッシブであるか、単一のフィールドが含まれている場合、出力フレーム レートは入力フレーム レートと同じです。

フレーム レートがわかっている場合、デコーダーは InputSampleFreqOutputFrameFreq の値を設定する必要があります。 それ以外の場合は、これらのメンバーを 0/0 に設定して、不明なフレーム レートを示します。

次のコードは、 IMFMediaType インターフェイスを使用して表される Media Foundation メディアの種類を 、DXVA2_VideoDesc 構造体に変換します。

// Fills in the DXVA2_ExtendedFormat structure.
void GetDXVA2ExtendedFormatFromMFMediaType(
    IMFMediaType *pType, 
    DXVA2_ExtendedFormat *pFormat
)
{
    // Get the interlace mode.
    MFVideoInterlaceMode interlace = 
        (MFVideoInterlaceMode)MFGetAttributeUINT32(
            pType, MF_MT_INTERLACE_MODE, MFVideoInterlace_Unknown
         );

    // The values for interlace mode translate directly, except for mixed 
    // interlace or progressive mode.

    if (interlace == MFVideoInterlace_MixedInterlaceOrProgressive)
    {
        // Default to interleaved fields.
        pFormat->SampleFormat = DXVA2_SampleFieldInterleavedEvenFirst;
    }
    else
    {
        pFormat->SampleFormat = (UINT)interlace;
    }

    // The remaining values translate directly.
    
    // Use the "no-fail" attribute functions and default to "unknown."
    
    pFormat->VideoChromaSubsampling = MFGetAttributeUINT32(
        pType, MF_MT_VIDEO_CHROMA_SITING, MFVideoChromaSubsampling_Unknown);

    pFormat->NominalRange = MFGetAttributeUINT32(
        pType, MF_MT_VIDEO_NOMINAL_RANGE, MFNominalRange_Unknown);

    pFormat->VideoTransferMatrix = MFGetAttributeUINT32(
        pType, MF_MT_YUV_MATRIX, MFVideoTransferMatrix_Unknown);

    pFormat->VideoLighting = MFGetAttributeUINT32(
        pType, MF_MT_VIDEO_LIGHTING, MFVideoLighting_Unknown);

    pFormat->VideoPrimaries = MFGetAttributeUINT32(
        pType, MF_MT_VIDEO_PRIMARIES, MFVideoPrimaries_Unknown);

    pFormat->VideoTransferFunction = MFGetAttributeUINT32(
        pType, MF_MT_TRANSFER_FUNCTION, MFVideoTransFunc_Unknown);

}


HRESULT ConvertMFTypeToDXVAType(IMFMediaType *pType, DXVA2_VideoDesc *pDesc)
{
    ZeroMemory(pDesc, sizeof(*pDesc));

    GUID                    subtype = GUID_NULL;
    UINT32                  width = 0;
    UINT32                  height = 0;
    UINT32                  fpsNumerator = 0;
    UINT32                  fpsDenominator = 0;

    // The D3D format is the first DWORD of the subtype GUID.
    HRESULT hr = pType->GetGUID(MF_MT_SUBTYPE, &subtype);
    if (FAILED(hr))
    {
        goto done;
    }

    pDesc->Format = (D3DFORMAT)subtype.Data1;

    // Frame size.
    hr = MFGetAttributeSize(pType, MF_MT_FRAME_SIZE, &width, &height);
    if (FAILED(hr))
    {
        goto done;
    }

    pDesc->SampleWidth = width;
    pDesc->SampleHeight = height;

    // Frame rate.
    hr = MFGetAttributeRatio(pType, MF_MT_FRAME_RATE, &fpsNumerator, &fpsDenominator);
    if (FAILED(hr))
    {
        goto done;
    }

    pDesc->InputSampleFreq.Numerator = fpsNumerator;
    pDesc->InputSampleFreq.Denominator = fpsDenominator;

    // Extended format information.
    GetDXVA2ExtendedFormatFromMFMediaType(pType, &pDesc->SampleFormat);

    // For progressive or single-field types, the output frequency is the same as
    // the input frequency. For interleaved-field types, the output frequency is
    // twice the input frequency.  
    pDesc->OutputFrameFreq = pDesc->InputSampleFreq;

    if ((pDesc->SampleFormat.SampleFormat == DXVA2_SampleFieldInterleavedEvenFirst) ||
        (pDesc->SampleFormat.SampleFormat == DXVA2_SampleFieldInterleavedOddFirst))
    {
        pDesc->OutputFrameFreq.Numerator *= 2;
    }

done:
    return hr;
}

要件

   
サポートされている最小のクライアント Windows Vista [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows Server 2008 [デスクトップ アプリのみ]
Header dxva2api.h

関連項目

IMFMediaType

Media Foundation Structures