Paso 3A. Implementar el método CheckInputType
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
Este es el paso 3A del tutorial Escritura de filtros de transformación.
Se llama al método CTransformFilter::CheckInputType cuando el filtro ascendente propone un tipo de medio al filtro de transformación. Este método toma un puntero a un objeto CMediaType , que es un contenedor fino para la estructura AM_MEDIA_TYPE . En este método, debe examinar todos los campos pertinentes de la estructura de AM_MEDIA_TYPE , incluidos los campos del bloque de formato. Puede usar los métodos de descriptor de acceso definidos en CMediaType o hacer referencia a los miembros de la estructura directamente. Si algún campo no es válido, devuelva VFW_E_TYPE_NOT_ACCEPTED. Si todo el tipo de medio es válido, devuelva S_OK.
Por ejemplo, en el filtro del codificador RLE, el tipo de entrada debe ser vídeo RGB sin comprimir de 8 o 4 bits. No hay ninguna razón para admitir otros formatos de entrada, como RGB de 16 o 24 bits, ya que el filtro tendría que convertirlos a una profundidad de bits inferior y DirectShow ya proporciona un filtro convertidor de espacio de colores para ese propósito. En el ejemplo siguiente se supone que el codificador admite vídeo de 8 bits, pero no vídeo de 4 bits:
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;
}
En este ejemplo, el método comprueba primero el tipo principal y el subtipo. A continuación, comprueba el tipo de formato para asegurarse de que el bloque de formato es una estructura VIDEOINFOHEADER . El filtro también podría admitir VIDEOINFOHEADER2, pero en este caso no habría ninguna ventaja real. La estructura VIDEOINFOHEADER2 agrega compatibilidad con el entrelazado y los píxeles no cuadrados, que probablemente no sean relevantes en vídeo de 8 bits.
Si el tipo de formato es correcto, el ejemplo comprueba los miembros biBitCount y biCompression de la estructura VIDEOINFOHEADER , para comprobar que el formato es RGB sin comprimir de 8 bits. Como se muestra en este ejemplo, debe coerce el
pbFormat
puntero a la estructura correcta, en función del tipo de formato. Compruebe siempre el GUID de tipo de formato (formattype) y el tamaño del bloque de formato (cbFormat) antes de convertir el puntero.
En el ejemplo también se comprueba que el número de entradas de paleta es compatible con la profundidad de bits y el bloque de formato es lo suficientemente grande como para contener las entradas de la paleta. Si toda esta información es correcta, el método devuelve S_OK.
Siguiente: Paso 3B. Implemente el método GetMediaType.
Temas relacionados