Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEnginee Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda vivamente que o novo código utilize 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 Writing Transform Filters.
Observação
Esta etapa não é necessária para filtros que derivam de CTransInPlaceFilter.
O método CTransformFilter::GetMediaType retorna um dos tipos de saída preferidos do filtro, referenciado pelo número de índice. Esse método nunca é chamado, a menos que o pino 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 preferidos.
Um codificador normalmente oferece um único tipo preferido, representando o formato de destino. Os descodificadores suportam geralmente uma gama de formatos de saída e oferecem-nos por ordem de prioridade, considerando a qualidade ou a 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 compressã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 para FALSE e o membro lSampleSize para zero, indicando amostras de tamanho variável.
- Ele invoca o método CMediaType::SetTemporalCompression com o valor FALSE, indicando que cada quadro é uma imagem-chave. (Este campo é apenas informativo, então você pode 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