Paso 3B. Implementación del método GetMediaType
[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 3B del tutorial Escritura de filtros de transformación.
Nota:
Este paso no es necesario para los filtros que derivan de CTransInPlaceFilter.
El método CTransformFilter::GetMediaType devuelve uno de los tipos de salida preferidos del filtro, al que hace referencia el número de índice. Este método nunca se llama a menos que el pin de entrada del filtro ya esté conectado. Por lo tanto, puede usar el tipo de medio de la conexión ascendente para determinar los tipos de salida preferidos.
Normalmente, un codificador ofrece un tipo preferido único, que representa el formato de destino. Por lo general, los descodificadores admiten una gama de formatos de salida y los ofrecen en orden descendente de calidad o eficiencia. Por ejemplo, la lista podría ser UYVY, Y211, RGB-24, RGB-565, RGB-555 y RGB-8, en ese orden. Los filtros de efecto pueden requerir una coincidencia exacta entre el formato de salida y el formato de entrada.
En el ejemplo siguiente se devuelve un único tipo de salida, que se construye modificando el tipo de entrada para especificar la compresión RLE8:
HRESULT CRleFilter::GetMediaType(int iPosition, CMediaType *pMediaType)
{
ASSERT(m_pInput->IsConnected());
if (iPosition < 0)
{
return E_INVALIDARG;
}
if (iPosition == 0)
{
HRESULT hr = m_pInput->ConnectionMediaType(pMediaType);
if (FAILED(hr))
{
return hr;
}
FOURCCMap fccMap = FCC('MRLE');
pMediaType->subtype = static_cast<GUID>(fccMap);
pMediaType->SetVariableSize();
pMediaType->SetTemporalCompression(FALSE);
ASSERT(pMediaType->formattype == FORMAT_VideoInfo);
VIDEOINFOHEADER *pVih =
reinterpret_cast<VIDEOINFOHEADER*>(pMediaType->pbFormat);
pVih->bmiHeader.biCompression = BI_RLE8;
pVih->bmiHeader.biSizeImage = DIBSIZE(pVih->bmiHeader);
return S_OK;
}
// else
return VFW_S_NO_MORE_ITEMS;
}
En este ejemplo, el método llama a IPin::ConnectionMediaType para obtener el tipo de entrada del pin de entrada. A continuación, cambia algunos de los campos para indicar el formato de compresión, como se indica a continuación:
- Asigna un nuevo GUID de subtipo, que se construye a partir del código FOURCC "MRLE", mediante la clase FOURCCMap .
- Llama al método CMediaType::SetVariableSize , que establece la marca bFixedSizeSamples en FALSE y el miembro lSampleSize en cero, lo que indica muestras de tamaño variable.
- Llama al método CMediaType::SetTemporalCompression con el valor FALSE, lo que indica que cada fotograma es un fotograma clave. (Este campo solo es informativo, por lo que podría omitirlo de forma segura).
- Establece el campo biCompression en BI_RLE8.
- Establece el campo biSizeImage en el tamaño de la imagen.
Siguiente: Paso 3C. Implemente el método CheckTransform.
Temas relacionados