Partilhar via


Retângulos de origem e destino em renderizadores de vídeo

[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.]

Há três tamanhos encontrados nas estruturas de formato VIDEOINFO, VIDEOINFOHEADER e VIDEOINFOHEADER2 de tipos de mídia de vídeo. Este artigo explica o que eles são e como eles funcionam.

Primeiro, há um tamanho no membro bmiHeader dessas estruturas. O membro bmiHeader é uma estrutura BITMAPINFOHEADER com seus próprios membros de largura e altura, bmiHeader.biWidth e bmiHeader.biHeight.

Em segundo lugar, há um retângulo no membro rcSource dessas estruturas; e, por fim, há um retângulo no membro rcTarget dessas estruturas.

Suponha que você tenha dois filtros, A e B, e que esses filtros estejam conectados uns aos outros (A à esquerda ou upstream e B à direita ou downstream) 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 do vídeo de entrada determinado pelo rcSource e alongar esse vídeo para preencher a parte rcTarget do buffer. A parte do vídeo de entrada a ser usada baseia-se em como o 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 usará 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 esteja conectado ao filtro B com o tipo de mídia a seguir.

  • (biWidth, biHeight): 320, 240
  • rcSource: (0, 0, 0, 0)
  • rcTarget: (0, 0, 0, 0)

Isso significa que o filtro A ampliará o vídeo recebido por 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 esteja recebendo dados de vídeo 160 x 120 e que ele esteja conectado ao filtro B com o tipo de mídia a seguir.

  • (biWidth, biHeight): 320, 240
  • rcSource: (0, 0, 160, 240)
  • rcTarget: (0, 0, 0, 0)

O membro 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 levará 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 preenchendo o buffer de saída 320 x 240.

Agora, suponha que o filtro A chame CBaseAllocator::GetBuffer e que o exemplo de mídia retornado tenha 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 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 o exemplo 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) não ao novo tipo de mídia (640, 480), portanto , rcSource especifica que o canto superior esquerdo (25%) do vídeo de entrada deve ser usado. Essa parte do vídeo de entrada é colocada no canto superior esquerdo (80, 60) pixels do buffer de saída 640 x 480, conforme especificado por rcTarget de (0, 0, 80, 60). Como o filtro A está recebendo 160 x 120 vídeos, o canto superior esquerdo do vídeo de entrada é uma peça (80, 60), o mesmo tamanho do bitmap de saída e nenhum alongamento é necessário.

O filtro A não colocará nenhum dado nos outros pixels do buffer de saída e deixará esses bits inalterados. O membro rcSource é limitado pelo biWidth e biHeight do tipo de mídia conectada original entre os filtros A e B e rcTarget é limitado pelo novo biWidth e biHeight do exemplo de mídia. No exemplo anterior, rcSource não pôde sair dos limites de (0, 0, 320, 240) e rcTarget não pôde sair dos limites de (0, 0, 640, 480).