Assegnazione di formati di input
Dopo aver identificato il formato di input corrispondente ai dati, è possibile impostarlo per l'uso da parte del writer chiamando IWMWriter::SetInputProps.
Per i flussi video, è necessario impostare le dimensioni dei fotogrammi negli esempi di input. Il codice di esempio seguente illustra come configurare e impostare un input video. Usa la funzione FindInputFormat definita nella sezione To Enumerate Input Formats per ottenere il formato di input per il video RGB a 24 bit. Per altre informazioni sull'uso di questo codice, vedere Uso degli esempi di codice.
HRESULT ConfigureVideoInput(IWMWriter* pWriter,
DWORD dwInput,
GUID guidSubType,
LONG lFrameWidth,
LONG lFrameHeight)
{
DWORD cbSize = 0;
LONG lStride = 0;
IWMInputMediaProps* pProps = NULL;
WM_MEDIA_TYPE* pType = NULL;
WMVIDEOINFOHEADER* pVidHdr = NULL;
BITMAPINFOHEADER* pbmi = NULL;
// Get the base input format for the required subtype.
HRESULT hr = FindInputFormat(pWriter, dwInput, guidSubType, &pProps);
if (FAILED(hr))
{
goto Exit;
}
// Get the size of the media type structure.
hr = pProps->GetMediaType(NULL, &cbSize);
if (FAILED(hr))
{
goto Exit;
}
// Allocate memory for the media type structure.
pType = (WM_MEDIA_TYPE*) new (std::nothrow) BYTE[cbSize];
if (pType == NULL)
{
hr = E_OUTOFMEMORY;
goto Exit;
}
// Get the media type structure.
hr = pProps->GetMediaType(pType, &cbSize);
if (FAILED(hr))
{
goto Exit;
}
// Adjust the format to match your source images.
// First set pointers to the video structures.
pVidHdr = (WMVIDEOINFOHEADER*) pType->pbFormat;
pbmi = &(pVidHdr->bmiHeader);
pbmi->biWidth = lFrameWidth;
pbmi->biHeight = lFrameHeight;
// Stride = (width * bytes/pixel), rounded to the next DWORD boundary.
lStride = (lFrameWidth * (pbmi->biBitCount / 8) + 3) & ~3;
// Image size = stride * height.
pbmi->biSizeImage = lFrameHeight * lStride;
// Apply the adjusted type to the video input.
hr = pProps->SetMediaType(pType);
if (FAILED(hr))
{
goto Exit;
}
hr = pWriter->SetInputProps(dwInput, pProps);
Exit:
delete [] pType;
SAFE_RELEASE(pProps);
return hr;
}
Argomenti correlati