Поделиться через


структура 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

Формат Surface, указанный в виде значения D3DFORMAT или кода FOURCC. Код FOURCC можно создать с помощью макросов D3DFORMAT или MAKEFOURCC .

InputSampleFreq

Частота кадров входного видеопотока, указанная в качестве DXVA2_Frequency структуры.

OutputFrameFreq

Частота кадров выходного видео, указанная в качестве DXVA2_Frequency структуры.

UABProtectionLevel

Уровень защиты данных, необходимый при наличии доступной пользователю шины (UAB). Если задано значение TRUE, видео должно быть защищено при наличии UAB. Если задано значение FALSE, защита видео не требуется.

Reserved

Зарезервировано. Должен равняться нулю.

Комментарии

Элемент InputSampleFreq предоставляет частоту кадров декодированного видеопотока, полученную отрисовщиком видео. Элемент OutputFrameFreq задает частоту кадров видео, которое отображается после деинтерлейки. Если входное видео чередуется и примеры содержат поля с чередованием, частота выходных кадров в два раза превышает частоту входных кадров. Если входное видео является прогрессивным или содержит одиночные поля, частота выходных кадров совпадает с частотой входных кадров.

Декодеры должны задавать значения InputSampleFreq и OutputFrameFreq, если частота кадров известна. В противном случае задайте для этих элементов значение 0/0, чтобы указать неизвестную частоту кадров.

Примеры

Следующий код преобразует тип мультимедиа Media Foundation, представленный с помощью интерфейса IMFMediaType , в структуру 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 [только классические приложения]
Верхняя часть dxva2api.h

См. также раздел

IMFMediaType

Структуры Media Foundation