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.]
Existem três tamanhos encontrados no VIDEOINFO, VIDEOINFOHEADER e estruturas de formato VIDEOINFOHEADER2 de tipos de mídia de vídeo. Este artigo explica o que são e como funcionam.
Primeiro, há um tamanho no bmiHeader membro dessas estruturas. O membro bmiHeader é uma estruturaBITMAPINFOHEADER com seus próprios membros de largura e altura, bmiHeader.biWidth e bmiHeader.biHeight.
Em segundo lugar, há um retângulo no rcSource membro dessas estruturas; e, por último, há um retângulo no rcTarget membro dessas estruturas.
Suponha que você tenha dois filtros, A e B, e que esses filtros estejam conectados um ao outro (A à esquerda, ou a montante, e B à direita, ou a jusante) com um determinado tipo de mídia de vídeo.
Os buffers que passam entre os filtros A e B têm o tamanho (bmiHeader.biWidth, bmiHeader.biHeight). O filtro A deve pegar uma parte de seu vídeo de entrada determinada por rcSource e esticar esse vídeo para preencher a rcTarget parte do buffer. A parte do vídeo de entrada a ser usada é baseada em como rcSource se compara ao tamanho (biWidth, biHeight) do tipo de mídia que filtra A e B originalmente conectados. Se rcSource estiver vazio, o filtro A usa todo o vídeo de entrada. Se rcTarget estiver vazio, o filtro A preencherá todo o buffer de saída.
Por exemplo, suponha que o filtro A esteja recebendo dados de vídeo de 160 x 120 pixels. Suponha também que o filtro A está conectado ao filtro B com o seguinte tipo de mídia.
- (biWidth, biHeight): 320, 240
- rcSource: (0, 0, 0, 0)
- rcTarget: (0, 0, 0, 0)
Isso significa que o filtro A estenderá o vídeo que recebe em 2 nas direções x e y e preencherá um buffer de saída de 320 x 240.
Como outro exemplo, suponha que o filtro A está recebendo dados de vídeo 160 x 120 e que ele está conectado ao filtro B com o seguinte tipo de mídia.
- (biWidth, biHeight): 320, 240
- rcSource: (0, 0, 160, 240)
- rcTarget: (0, 0, 0, 0)
O membro do rcSource é relativo ao tamanho do buffer conectado de 320, 240. Como o rcSource especificado (0, 0, 160, 240) é a metade esquerda do buffer, o filtro A pegará a metade esquerda do vídeo de entrada, ou a parte (0, 0, 80, 120) e estenderá o vídeo para um tamanho de (320, 240) (por 4 na direção x e por 2 na direção y) e preencherá o buffer de saída de 320 x 240.
Agora suponha que o filtro A chama CBaseAllocator::GetBuffere a amostra de mídia retornada tem um tipo de mídia anexado a ele, significando que o filtro B deseja que o filtro A forneça um tamanho ou tipo de vídeo diferente do que ele tem fornecido anteriormente. Suponha que o novo tipo de mídia seja:
- (biWidth, biHeight): 640, 480
- rcSource: (0, 0, 160, 120)
- rcTarget: (0, 0, 80, 60)
Isso significa que a amostra de mídia tem um buffer de 640 x 480 de tamanho. O membro rcSource é relativo ao tipo de mídia conectado original (320, 240) e não ao novo tipo de mídia de (640, 480), portanto, rcSource especifica que o canto superior esquerdo (25%) do vídeo de entrada deve ser usado. Esta parte do vídeo de entrada é colocada no canto superior esquerdo (80, 60) pixels do buffer de saída 640 x 480, conforme especificado pelo rcTarget de (0, 0, 80, 60). Como o filtro A está recebendo vídeo de 160 x 120, o canto superior esquerdo do vídeo de entrada é uma peça (80, 60), do mesmo tamanho do bitmap de saída, e nenhum alongamento é necessário.
O filtro A não colocará dados nos outros pixels do buffer de saída e deixará esses bits intocados. O membro do rcSource é limitado pelo biWidth e biHeight do tipo de mídia conectado original entre os filtros A e B, e rcTarget é limitado pelo novo biWidth e biHeight da amostra de mídia. No exemplo anterior, rcSource não podia sair dos limites de (0, 0, 320, 240) e rcTarget não podia sair dos limites de (0, 0, 640, 480).