Tipos de medios de vídeo sin comprimir
En este tema se describe cómo crear un tipo de medio que describa un formato de vídeo sin comprimir. Para obtener más información sobre los tipos de medios generalmente, vea Acerca de los tipos de medios.
Para crear un tipo de vídeo completo sin comprimir, establezca los siguientes atributos en el puntero de interfaz IMFMediaType .
Atributo | Descripción |
---|---|
MF_MT_MAJOR_TYPE | Tipo principal. Establézcalo en MFMediaType_Video. |
MF_MT_SUBTYPE | Subtipo. Consulte GUID de subtipo de vídeo. |
MF_MT_DEFAULT_STRIDE | Paso de superficie. El intervalo es el número de bytes necesarios para pasar de una fila de píxeles a la siguiente. Establezca este atributo si el intervalo en bytes no es el mismo que el ancho del vídeo en bytes. De lo contrario, puede omitir este atributo. |
MF_MT_FRAME_RATE | Velocidad de fotogramas. |
MF_MT_FRAME_SIZE | Tamaño del marco. |
MF_MT_INTERLACE_MODE | Modo de entrelazado. |
MF_MT_ALL_SAMPLES_INDEPENDENT | Especifica si cada ejemplo es independiente. Establézcalo en TRUE para formatos sin comprimir. |
MF_MT_PIXEL_ASPECT_RATIO | Relación de aspecto de píxeles. |
Además, establezca los siguientes atributos si conoce los valores correctos. (De lo contrario, omita estos atributos).
Atributo | Descripción |
---|---|
MF_MT_VIDEO_PRIMARIES | Colores principales. |
MF_MT_TRANSFER_FUNCTION | Función transfer. |
MF_MT_YUV_MATRIX | Matriz de transferencia. |
MF_MT_VIDEO_CHROMA_SITING | Sición cromática. |
MF_MT_VIDEO_NOMINAL_RANGE | Rango nominal. |
Para obtener más información, vea Información de color extendida. Por ejemplo, si crea un tipo de medio que describe un estándar de vídeo y el estándar define el siting cromático, agregue esta información al tipo de medio. Esto ayuda a conservar la fidelidad del color en toda la canalización.
Las siguientes funciones pueden ser útiles al crear un tipo de medio de vídeo.
Función | Descripción |
---|---|
MFAverageTimePerFrameToFrameRate | Calcula la velocidad de fotogramas, dada la duración media del fotograma. |
MFCalculateImageSize | Calcula el tamaño de la imagen para un formato de vídeo sin comprimir. |
MFFrameRateToAverageTimePerFrame | Calcula la duración media de un fotograma de vídeo, dada la velocidad de fotogramas. |
MFGetStrideForBitmapInfoHeader | Devuelve el intervalo de superficie mínimo para un formato de vídeo. Para obtener más información, consulte Image Stride. |
MFInitVideoFormat | Inicializa una estructura MFVIDEOFORMAT para algunos formatos de vídeo estándar, como la televisión NTSC. A continuación, puede usar la estructura para inicializar un tipo de medio. |
MFIsFormatYUV | Consulta si un formato de vídeo es un formato YUV. |
Ejemplos
En este ejemplo se muestra una función que rellena la información más común para un formato de vídeo sin comprimir. La función devuelve un puntero de interfaz IMFMediaType . A continuación, puede agregar atributos adicionales al tipo de medio según sea necesario.
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;
}
En el ejemplo siguiente se toma un formato de vídeo codificado como entrada y se crea un tipo de vídeo sin comprimir coincidente. Este tipo sería adecuado para establecer en un codificador o descodificador, por ejemplo.
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;
}
Temas relacionados