Transformações de pré-processamento do decodificador MPEG
[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.]
Letterbox e PanScan
A imagem 4x3 pode ser formada preenchendo a parte superior e inferior da imagem (conhecida como imagem de Caixa de Correio) ou extraindo uma parte 4x3 da imagem (conhecida como imagem PanScan). Os menus e os fluxos de subpictura são sobrepostos sobre a imagem de vídeo final. As imagens de proporção 16x9 são armazenadas em um formato anórmórfico 4x3. Estender a taxa de proporção anórfica 4x3 720x480 vídeo de origem para uma taxa de proporção de 16x9 forma a imagem de aspecto original 16x9.
Abaixo está uma descrição de como exibir corretamente cada um dos modos e seus destaques:
- Widescreen: O vídeo de origem se estendeu para a maior área 16x9 da janela de saída. Os destaques são relativos ao interior da área 16x9. As barras pretas devem ser adicionadas à parte superior e inferior ou às laterais para manter uma área 16x9.
- Verificação panorâmica: No vídeo 16x9, use o deslocamento horizontal fornecido no fluxo MPEG2 para extrair uma subwindow 4x3. Coloque a subwindow 4x3 na maior área 4x3 da janela do cliente de saída. As coordenadas do realce são relativas à janela de saída 4x3 e não têm relação com o vídeo de origem 16x9. Barras pretas devem ser adicionadas à parte superior e inferior ou aos lados para manter uma área 4x3.
- Letterbox: Compute a maior área 4x3 da janela de saída. Barras pretas devem ser adicionadas à parte superior e inferior ou aos lados para manter uma área 4x3. O vídeo anamórfico de origem 4x3 (representando uma imagem 16x9) é colocado na maior subwindow 16x9 dentro da área 4x3. Barras pretas devem ser adicionadas à parte superior e inferior da subwindow para manter uma área 16x9. As coordenadas do realce são relativas à área 4x3 e não têm relação com o vídeo de origem 16x9. É possível que um disco especifique um realce que esteja fora da área 16x9 (mas ainda na janela 4x3). Para vídeo 4x3, o vídeo é colocado na maior área de saída 4x3 da janela do cliente de saída. Barras pretas devem ser adicionadas à parte superior e inferior ou aos lados para manter uma área 4x3.
Pré-processamento mpeg com o Navegador de DVD e VMR
Atualmente, o decodificador é passado um tipo de mídia FORMAT_MPEG2_VIDEO (cujo bloco de formato aponta para uma estrutura MPEG2VIDEOINFO ). Nos pinos de saída, o decodificador produz um tipo de mídia FORMAT_VideoInfo2, cujo bloco de formato aponta para uma estrutura VIDEOINFOHEADER2 . O campo dwReserved da estrutura foi renomeado para sinalizadores dwControls .
O membro dwControlFlags agora conterá os novos bits.
Rótulo | Valor |
---|---|
AMCONTROL_USED | 0x00000001 |
AMCONTROL_PAD_TO_4x3 | 0x00000002 |
AMCONTROL_PAD_TO_16x9 | 0x00000004 |
AMCONTROL_USED é usado para testar se esses novos sinalizadores têm suporte. Um filtro de origem deve definir o sinalizador AMCONTROL_USED e ver se QueryAccept(MediaType) é bem-sucedido no pino downstream. Se for rejeitado, os sinalizadores AMCONTROL não poderão ser usados e dwReserved1 deverá ser definido como 0.
AMCONTROL_PAD_TO_4x3 indica que a imagem deve ser preenchida e exibida em uma área 4x3.
AMCONTROL_PAD_TO_16x9 indica que a imagem deve ser preenchida e exibida em uma área de 16 x 9.
O decodificador deve copiar ou processar os bits cegamente. Se o decodificador executar o próprio letterboxing, ele deverá alterar a taxa de proporção do pixel, preencher a imagem e remover os bits AMCONTROL_* correspondentes.
O MPEG2VIDEOINFO.dwFlags agora contém três sinalizadores para controlar como o conteúdo deve ser exibido:
AMMPEG2_DoPanScan (0x00000001)
: se esse sinalizador for definido, o decodificador de vídeo MPEG-2 deverá cortar a imagem de saída com base em vetores de verificação panorâmica no picture_display_extension e alterar a taxa de proporção da imagem para 4x3. A VMR não deve receber um exemplo 16x9 com esse sinalizador. Uma implementação simples pode alterar o retângulo de origem para indicar uma região de origem de 540 larguras com uma borda esquerda igual ao deslocamento de exibição no picture_display_extension.AMMPEG2_LetterboxAnalogOut (0x00000020)
: quando um decodificador de hardware exibe esse fluxo para uma saída de vídeo (geralmente um conector SVIDEO no cartão), ele deve aplicar as regras para exibir um exemplo 16x9 em uma tela 4x3.Um decodificador de software (ou um decodificador de hardware que produz a saída enviada para a VMR) tem duas opções ao processar imagens:
- Ignore esse sinalizador e passe o conteúdo videoInfoHeader2 para a VMR (o sinalizador AMCONTROL_PAD_TO_4x3 já será definido pelo Navegador de DVD no exemplo). A VMR encontrará um exemplo de vídeo 16x9 com o sinalizador AMCONTROL_PAD_TO_4x3 definido e um fluxo de subpictura 4x3. O aplicativo deve definir os retângulos de destino normalizados de saída dos dois fluxos para ter a mesma largura.
- Converta o fluxo anmórfico em uma imagem 4x3 preenchendo a parte superior e inferior da imagem e definindo a taxa de proporção da imagem como 4x3 (consulte Letterbox acima) e removendo o bit AMCONTROL_PAD_TO_4x3 do VIDEOINFOHEADER2.
Os decodificadores DirectXVA que combinam os fluxos de vídeo e subpicture terão que processar esse sinalizador. Se o hardware não puder dimensionar a subpictura combinada, o decodificador deverá produzir um fluxo de subpictura separado para a VMR se misturar com o vídeo.
AMMPEG2_WidescreenAnalogOut (0x00000200)
: quando um decodificador de hardware exibe esse fluxo para uma saída de vídeo (geralmente um conector SVIDEO no cartão), ele deve assumir uma exibição 16x9 (anórfica).Um decodificador de software (ou um decodificador de hardware que produz a saída enviada para a VMR) tem duas opções ao processar uma imagem anamórfica:
- Ignore esse sinalizador e copie o conteúdo de VideoInfoHeader2 para a VMR. A VMR armazenará 4x3 imagens como 16x9 se elas tiverem o AMCONTROL_PAD_TO_16x9 definido.
- Preegue a imagem de saída a uma imagem de 16 x 9 e remova o AMCONTROL_PAD_TO_16x9 bit.
A maioria dos decodificadores deve usar GetMediaType para detectar uma alteração de mídia no pino de entrada e copiar o conteúdo VIDEOINFOHEADER2 (contido no MPEG2INFOHEADER) para o pino de saída. Eles provavelmente processarão apenas o bit PanScan.
O código de exemplo a seguir mostra como copiar o conteúdo VIDEOINFOHEADER2 de um pino de entrada para um pino de saída.
#include <dvdmedia.h>
HRESULT CopyMPeg2ToVideoInfoHeader2(CMediaSample* pInSample, CMediaSample* pOutSample)
{
HRESULT hr = S_OK;
// Check for a media type on the input sample.
AM_MEDIA_TYPE* pInType;
if (pInSample->GetMediaType(&pInType) == S_OK)
{
// Make sure it's an MPEG2 Video format.
if ((pInType->formattype == FORMAT_MPEG2_VIDEO) &&
(pInType->cbFormat >= sizeof(MPEG2VIDEOINFO)))
{
hr = S_OK; // Initialize hr for the CMediaType constructor.
CMediaType outType(*pInType, &hr);
if (FAILED(hr))
{
DeleteMediaType( pInType );
return hr;
}
// Set the format type GUID.
outType.SetFormatType(&FORMAT_VideoInfo2);
// Truncate the format block to include just the VIDEOINFOHEADER part.
MPEG2VIDEOINFO *pMPeg2Header = (MPEG2VIDEOINFO*)pInType->pbFormat;
BYTE *pVIH = (BYTE*)&pMPeg2Header->hdr;
hr = (outType.SetFormat(pVIH, sizeof(VIDEOINFOHEADER2)) ? S_OK : E_OUTOFMEMORY);
if (SUCCEEDED(hr))
{
hr = pOutSample->SetMediaType(&outType);
}
}
else
{
ASSERT(FALSE); // Not a MPEG2 header.
hr = VFW_E_INVALIDMEDIATYPE;
}
DeleteMediaType( pInType );
}
return hr;
}