Tipi di supporti video non compressi
In questo argomento viene descritto come creare un tipo di supporto che descrive un formato video non compresso. Per altre informazioni sui tipi di supporti in genere, vedere Informazioni sui tipi di supporti.
Per creare un tipo di video non compresso completo, impostare gli attributi seguenti sul puntatore all'interfaccia IMFMediaType .
Attributo | Descrizione |
---|---|
MF_MT_MAJOR_TYPE | Tipo principale. Impostare su MFMediaType_Video. |
MF_MT_SUBTYPE | Sottotipo. Vedere GUID sottotipo video. |
MF_MT_DEFAULT_STRIDE | Stride superficiale. Lo stride è il numero di byte necessari per passare da una riga di pixel alla successiva. Impostare questo attributo se lo stride in byte non corrisponde alla larghezza del video in byte. In caso contrario, è possibile omettere questo attributo. |
MF_MT_FRAME_RATE | Frequenza dei fotogrammi. |
MF_MT_FRAME_SIZE | Dimensioni cornice. |
MF_MT_INTERLACE_MODE | Modalità interlacciatura. |
MF_MT_ALL_SAMPLES_INDEPENDENT | Specifica se ogni esempio è indipendente. Impostare su TRUE per i formati non compressi. |
MF_MT_PIXEL_ASPECT_RATIO | Proporzioni pixel. |
Inoltre, impostare gli attributi seguenti se si conoscono i valori corretti. In caso contrario, omettere questi attributi.
Attributo | Descrizione |
---|---|
MF_MT_VIDEO_PRIMARIES | Primarie a colori. |
MF_MT_TRANSFER_FUNCTION | Funzione di trasferimento. |
MF_MT_YUV_MATRIX | Matrice di trasferimento. |
MF_MT_VIDEO_CHROMA_SITING | Cromatico. |
MF_MT_VIDEO_NOMINAL_RANGE | Intervallo nominale. |
Per altre informazioni, vedere Extended Color Information.For more information, see Extended Color Information. Ad esempio, se si crea un tipo di supporto che descrive uno standard video e lo standard definisce il siting cromatico, aggiungere queste informazioni al tipo di supporto. In questo modo è possibile mantenere la fedeltà dei colori in tutta la pipeline.
Le funzioni seguenti possono essere utili durante la creazione di un tipo di supporto video.
Funzione | Descrizione |
---|---|
MFAverageTimePerFrameToFrameRate | Calcola la frequenza dei fotogrammi, in base alla durata media del fotogramma. |
MFCalculateImageSize | Calcola le dimensioni dell'immagine per un formato video non compresso. |
MFFrameRateToAverageTimePerFrame | Calcola la durata media di un fotogramma video, in base alla frequenza dei fotogrammi. |
MFGetStrideForBitmapInfoHeader | Restituisce lo stride minimo della superficie per un formato video. Per altre informazioni, vedere Image Stride. |
MFInitVideoFormat | Inizializza una struttura MFVIDEOFORMAT per alcuni formati video standard, ad esempio la televisione NTSC. È quindi possibile usare la struttura per inizializzare un tipo di supporto. |
MFIsFormatYUV | Esegue una query se un formato video è un formato YUV. |
Esempio
Questo esempio mostra una funzione che inserisce le informazioni più comuni per un formato video non compresso. La funzione restituisce un puntatore all'interfaccia IMFMediaType . È quindi possibile aggiungere altri attributi al tipo di supporto in base alle esigenze.
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;
}
L'esempio seguente accetta un formato video codificato come input e crea un tipo di video non compresso corrispondente. Questo tipo può essere impostato su un codificatore o un decodificatore, ad esempio.
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;
}
Argomenti correlati