Passaggio 3A. Implementare il metodo CheckInputType
[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, FMMediaEngine e Audio/Video Capture in Media Foundation anziché DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.
Questo è il passaggio 3A dell'esercitazione Scrittura di filtri di trasformazione.
Il metodo CTransformFilter::CheckInputType viene chiamato quando il filtro upstream propone un tipo di supporto al filtro di trasformazione. Questo metodo accetta un puntatore a un oggetto CMediaType , che è un wrapper sottile per la struttura AM_MEDIA_TYPE . In questo metodo è necessario esaminare ogni campo pertinente della struttura AM_MEDIA_TYPE , inclusi i campi nel blocco di formato. È possibile usare i metodi di accesso definiti in CMediaType o fare riferimento direttamente ai membri della struttura. Se un campo non è valido, restituire VFW_E_TYPE_NOT_ACCEPTED. Se l'intero tipo di supporto è valido, restituire S_OK.
Ad esempio, nel filtro codificatore RLE il tipo di input deve essere video RGB a 8 bit o a 4 bit. Non esiste alcun motivo per supportare altri formati di input, ad esempio RGB a 16 o 24 bit, perché il filtro deve convertirli in una profondità di bit inferiore e DirectShow fornisce già un filtro Color Space Converter per tale scopo. Nell'esempio seguente si presuppone che il codificatore supporti video a 8 bit, ma non video a 4 bit:
HRESULT CRleFilter::CheckInputType(const CMediaType *mtIn)
{
if ((mtIn->majortype != MEDIATYPE_Video) ||
(mtIn->subtype != MEDIASUBTYPE_RGB8) ||
(mtIn->formattype != FORMAT_VideoInfo) ||
(mtIn->cbFormat < sizeof(VIDEOINFOHEADER)))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
VIDEOINFOHEADER *pVih =
reinterpret_cast<VIDEOINFOHEADER*>(mtIn->pbFormat);
if ((pVih->bmiHeader.biBitCount != 8) ||
(pVih->bmiHeader.biCompression != BI_RGB))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
// Check the palette table.
if (pVih->bmiHeader.biClrUsed > PALETTE_ENTRIES(pVih))
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
DWORD cbPalette = pVih->bmiHeader.biClrUsed * sizeof(RGBQUAD);
if (mtIn->cbFormat < sizeof(VIDEOINFOHEADER) + cbPalette)
{
return VFW_E_TYPE_NOT_ACCEPTED;
}
// Everything is good.
return S_OK;
}
In questo esempio il metodo controlla prima il tipo principale e il sottotipo. Controlla quindi il tipo di formato, per assicurarsi che il blocco di formato sia una struttura VIDEOINFOHEADER . Il filtro potrebbe anche supportare VIDEOINFOHEADER2, ma in questo caso non vi sarebbe alcun vantaggio reale. La struttura VIDEOINFOHEADER2 aggiunge il supporto per l'interlacciamento e i pixel non quadrati, che non sono probabilmente rilevanti nel video a 8 bit.
Se il tipo di formato è corretto, nell'esempio vengono verificati i membri biBitCount e biCompression della struttura VIDEOINFOHEADER , per verificare che il formato sia senza compressione RGB a 8 bit. Come illustrato in questo esempio, è necessario coercere il
pbFormat
puntatore alla struttura corretta, in base al tipo di formato. Controllare sempre il GUID di formato (formattype) e le dimensioni del blocco di formato (cbFormat) prima di eseguire il cast del puntatore.
L'esempio verifica inoltre che il numero di voci del tavolozza sia compatibile con la profondità bit e il blocco di formato sia abbastanza grande per contenere le voci del tavolozza. Se tutte queste informazioni sono corrette, il metodo restituisce S_OK.
Avanti: Passaggio 3B. Implementare il metodo GetMediaType.
Argomenti correlati