Etapa 3B. Implementar o método GetMediaType
[O recurso associado a esta página, DirectShow, é um recurso herdado. Ele foi substituído por MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo na Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Captura de Áudio/Vídeo no Media Foundation em vez de DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]
Esta é a etapa 3B do tutorial Escrevendo Filtros de Transformação.
Observação
Esta etapa não é necessária para filtros derivados de CTransInPlaceFilter.
O método CTransformFilter::GetMediaType retorna um dos tipos de saída preferenciais do filtro, referenciados pelo número de índice. Esse método nunca é chamado, a menos que o pin de entrada do filtro já esteja conectado. Portanto, você pode usar o tipo de mídia da conexão upstream para determinar os tipos de saída preferenciais.
Um codificador normalmente oferece um único tipo preferencial, representando o formato de destino. Os decodificadores geralmente dão suporte a um intervalo de formatos de saída e os oferecem em ordem de qualidade ou eficiência decrescente. Por exemplo, a lista pode ser UYVY, Y211, RGB-24, RGB-565, RGB-555 e RGB-8, nessa ordem. Os filtros de efeito podem exigir uma correspondência exata entre o formato de saída e o formato de entrada.
O exemplo a seguir retorna um único tipo de saída, que é construído modificando o tipo de entrada para especificar a compactação 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;
}
Neste exemplo, o método chama IPin::ConnectionMediaType para obter o tipo de entrada do pin de entrada. Em seguida, ele altera alguns dos campos para indicar o formato de compactação, da seguinte maneira:
- Ele atribui um novo GUID de subtipo, que é construído a partir do código FOURCC 'MRLE', usando a classe FOURCCMap .
- Ele chama o método CMediaType::SetVariableSize , que define o sinalizador bFixedSizeSamples como FALSE e o membro lSampleSize como zero, indicando amostras de tamanho variável.
- Ele chama o método CMediaType::SetTemporalCompression com o valor FALSE, indicando que cada quadro é um quadro-chave. (Esse campo é somente informativo, para que você possa ignorá-lo com segurança.)
- Ele define o campo biCompression como BI_RLE8.
- Ele define o campo biSizeImage para o tamanho da imagem.
Próximo: Etapa 3C. Implemente o Método CheckTransform.
Tópicos relacionados