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