Etapa 3A. Implementar o método CheckInputType
[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in 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 Audio/Video Capture in 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 3A do tutorial Escrevendo filtros de transformação.
O método CTransformFilter::CheckInputType é chamado quando o filtro upstream propõe um tipo de mídia para o filtro de transformação. Esse método usa um ponteiro para um objeto CMediaType , que é um wrapper fino para a estrutura AM_MEDIA_TYPE . Nesse método, você deve examinar todos os campos relevantes da estrutura AM_MEDIA_TYPE , incluindo os campos no bloco de formato. Você pode usar os métodos de acessador definidos em CMediaType ou referenciar os membros da estrutura diretamente. Se qualquer campo não for válido, retorne VFW_E_TYPE_NOT_ACCEPTED. Se todo o tipo de mídia for válido, retorne S_OK.
Por exemplo, no filtro do codificador RLE, o tipo de entrada deve ser um vídeo RGB descompactado de 8 ou 4 bits. Não há motivo para dar suporte a outros formatos de entrada, como RGB de 16 ou 24 bits, porque o filtro teria que convertê-los em uma profundidade de bits mais baixa e o DirectShow já fornece um filtro conversor de espaço de cor para essa finalidade. O exemplo a seguir pressupõe que o codificador dá suporte a vídeo de 8 bits, mas não a 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;
}
Neste exemplo, o método primeiro verifica o tipo principal e o subtipo. Em seguida, ele verifica o tipo de formato para verificar se o bloco de formato é uma estrutura VIDEOINFOHEADER . O filtro também poderia dar suporte a VIDEOINFOHEADER2, mas nesse caso não haveria nenhum benefício real. A estrutura VIDEOINFOHEADER2 adiciona suporte para interlacing e pixels não quadrados, que provavelmente não serão relevantes no vídeo de 8 bits.
Se o tipo de formato estiver correto, o exemplo verificará os membros biBitCount e biCompression da estrutura VIDEOINFOHEADER para verificar se o formato é RGB descompactado de 8 bits. Como mostra este exemplo, você deve coagir o
pbFormat
ponteiro para a estrutura correta, com base no tipo de formato. Sempre marcar o tipo de formato GUID (formattype) e o tamanho do bloco de formato (cbFormat) antes de converter o ponteiro.
O exemplo também verifica se o número de entradas de paleta é compatível com a profundidade do bit e o bloco de formato é grande o suficiente para conter as entradas da paleta. Se todas essas informações estiverem corretas, o método retornará S_OK.
Próximo: Etapa 3B. Implemente o método GetMediaType.
Tópicos relacionados