Tipos de mídia de vídeo não compactados
Este tópico descreve como criar um tipo de mídia que descreve um formato de vídeo descompactado. Para obter mais informações sobre tipos de mídia em geral, consulte Sobre tipos de mídia.
Para criar um tipo de vídeo não compactado completo, defina os atributos a seguir no ponteiro da interface IMFMediaType .
Atributo | Descrição |
---|---|
MF_MT_MAJOR_TYPE | Tipo principal. Defina como MFMediaType_Video. |
MF_MT_SUBTYPE | Subtipo. Consulte GUIDs de subtipo de vídeo. |
MF_MT_DEFAULT_STRIDE | Avanço da superfície. O passo a passo é o número de bytes necessários para ir de uma linha de pixels para a próxima. Defina esse atributo se o passo em bytes não for o mesmo que a largura do vídeo em bytes. Caso contrário, você pode omitir esse atributo. |
MF_MT_FRAME_RATE | Taxa de quadros. |
MF_MT_FRAME_SIZE | Tamanho do quadro. |
MF_MT_INTERLACE_MODE | Modo de interlacagem. |
MF_MT_ALL_SAMPLES_INDEPENDENT | Especifica se cada amostra é independente. Defina como TRUE para formatos descompactados. |
MF_MT_PIXEL_ASPECT_RATIO | Taxa de proporção de pixel. |
Além disso, defina os atributos a seguir se você souber os valores corretos. (Caso contrário, omita esses atributos.)
Atributo | Descrição |
---|---|
MF_MT_VIDEO_PRIMARIES | Primárias de cores. |
MF_MT_TRANSFER_FUNCTION | Função de transferência. |
MF_MT_YUV_MATRIX | Matriz de transferência. |
MF_MT_VIDEO_CHROMA_SITING | Chroma sentado. |
MF_MT_VIDEO_NOMINAL_RANGE | Intervalo nominal. |
Para obter mais informações, consulte Informações de cor estendidas. Por exemplo, se você criar um tipo de mídia que descreva um padrão de vídeo e o padrão definir o chroma siting, adicione essas informações ao tipo de mídia. Isso ajuda a preservar a fidelidade de cores em todo o pipeline.
As funções a seguir podem ser úteis ao criar um tipo de mídia de vídeo.
Função | Descrição |
---|---|
MFAverageTimePerFrameToFrameRate | Calcula a taxa de quadros, dada a duração média do quadro. |
MFCalculateImageSize | Calcula o tamanho da imagem para um formato de vídeo não compactado. |
MFFrameRateToAverageTimePerFrame | Calcula a duração média de um quadro de vídeo, dada a taxa de quadros. |
MFGetStrideForBitmapInfoHeader | Retorna o passo mínimo da superfície para um formato de vídeo. Para obter mais informações, consulte Image Stride. |
MFInitVideoFormat | Inicializa uma estrutura MFVIDEOFORMAT para alguns formatos de vídeo padrão, como televisão NTSC. Em seguida, você pode usar a estrutura para inicializar um tipo de mídia. |
MFIsFormatYUV | Consulta se um formato de vídeo é um formato YUV. |
Exemplos
Este exemplo mostra uma função que preenche as informações mais comuns para um formato de vídeo não compactado. A função retorna um ponteiro de interface IMFMediaType . Em seguida, você pode adicionar atributos adicionais ao tipo de mídia conforme necessário.
HRESULT CreateUncompressedVideoType(
DWORD fccFormat, // FOURCC or D3DFORMAT value.
UINT32 width,
UINT32 height,
MFVideoInterlaceMode interlaceMode,
const MFRatio& frameRate,
const MFRatio& par,
IMFMediaType **ppType
)
{
if (ppType == NULL)
{
return E_POINTER;
}
GUID subtype = MFVideoFormat_Base;
LONG lStride = 0;
UINT cbImage = 0;
IMFMediaType *pType = NULL;
// Set the subtype GUID from the FOURCC or D3DFORMAT value.
subtype.Data1 = fccFormat;
HRESULT hr = MFCreateMediaType(&pType);
if (FAILED(hr))
{
goto done;
}
hr = pType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);
if (FAILED(hr))
{
goto done;
}
hr = pType->SetGUID(MF_MT_SUBTYPE, subtype);
if (FAILED(hr))
{
goto done;
}
hr = pType->SetUINT32(MF_MT_INTERLACE_MODE, interlaceMode);
if (FAILED(hr))
{
goto done;
}
hr = MFSetAttributeSize(pType, MF_MT_FRAME_SIZE, width, height);
if (FAILED(hr))
{
goto done;
}
// Calculate the default stride value.
hr = pType->SetUINT32(MF_MT_DEFAULT_STRIDE, UINT32(lStride));
if (FAILED(hr))
{
goto done;
}
// Calculate the image size in bytes.
hr = MFCalculateImageSize(subtype, width, height, &cbImage);
if (FAILED(hr))
{
goto done;
}
hr = pType->SetUINT32(MF_MT_SAMPLE_SIZE, cbImage);
if (FAILED(hr))
{
goto done;
}
hr = pType->SetUINT32(MF_MT_FIXED_SIZE_SAMPLES, TRUE);
if (FAILED(hr))
{
goto done;
}
hr = pType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
if (FAILED(hr))
{
goto done;
}
// Frame rate
hr = MFSetAttributeRatio(pType, MF_MT_FRAME_RATE, frameRate.Numerator,
frameRate.Denominator);
if (FAILED(hr))
{
goto done;
}
// Pixel aspect ratio
hr = MFSetAttributeRatio(pType, MF_MT_PIXEL_ASPECT_RATIO, par.Numerator,
par.Denominator);
if (FAILED(hr))
{
goto done;
}
// Return the pointer to the caller.
*ppType = pType;
(*ppType)->AddRef();
done:
SafeRelease(&pType);
return hr;
}
O próximo exemplo usa um formato de vídeo codificado como entrada e cria um tipo de vídeo não compactado correspondente. Esse tipo seria adequado para definir em um codificador ou decodificador, por exemplo.
HRESULT ConvertVideoTypeToUncompressedType(
IMFMediaType *pType, // Pointer to an encoded video type.
const GUID& subtype, // Uncompressed subtype (eg, RGB-32, AYUV)
IMFMediaType **ppType // Receives a matching uncompressed video type.
)
{
IMFMediaType *pTypeUncomp = NULL;
HRESULT hr = S_OK;
GUID majortype = { 0 };
MFRatio par = { 0 };
hr = pType->GetMajorType(&majortype);
if (majortype != MFMediaType_Video)
{
return MF_E_INVALIDMEDIATYPE;
}
// Create a new media type and copy over all of the items.
// This ensures that extended color information is retained.
if (SUCCEEDED(hr))
{
hr = MFCreateMediaType(&pTypeUncomp);
}
if (SUCCEEDED(hr))
{
hr = pType->CopyAllItems(pTypeUncomp);
}
// Set the subtype.
if (SUCCEEDED(hr))
{
hr = pTypeUncomp->SetGUID(MF_MT_SUBTYPE, subtype);
}
// Uncompressed means all samples are independent.
if (SUCCEEDED(hr))
{
hr = pTypeUncomp->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
}
// Fix up PAR if not set on the original type.
if (SUCCEEDED(hr))
{
hr = MFGetAttributeRatio(
pTypeUncomp,
MF_MT_PIXEL_ASPECT_RATIO,
(UINT32*)&par.Numerator,
(UINT32*)&par.Denominator
);
// Default to square pixels.
if (FAILED(hr))
{
hr = MFSetAttributeRatio(
pTypeUncomp,
MF_MT_PIXEL_ASPECT_RATIO,
1, 1
);
}
}
if (SUCCEEDED(hr))
{
*ppType = pTypeUncomp;
(*ppType)->AddRef();
}
SafeRelease(&pTypeUncomp);
return hr;
}
Tópicos relacionados