Compartilhar via


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.

Escrevendo filtros do DirectShow