Interlacing de vídeo
Este tópico descreve como fontes de mídia e decodificadores devem lidar com conteúdo de vídeo entrelaçado.
Para decodificar e renderizar o vídeo entrelaçado corretamente, as seguintes informações são necessárias:
Progressivo ou entrelaçado. Um fluxo de vídeo pode conter quadros progressivos, quadros entrelaçados ou uma mistura de ambos.
Domínio de campo. A dominância de campo descreve qual campo aparece primeiro, o campo superior ou o campo inferior.
Repita o primeiro campo. Esse sinalizador é usado no pulldown 3:2, quando o quadro é progressivo, mas o fluxo é entrelaçado. Nesse contexto, o primeiro campo pode ser o campo superior ou inferior.
Campos intercalados ou campo único. Um exemplo pode conter um único campo ou dois campos intercalados. Se um exemplo contiver um único campo, a altura da amostra será metade da altura do quadro, pois o exemplo contém apenas metade das linhas de verificação de um quadro. Campos intercalados são recomendados, a menos que as características do conteúdo de origem determinem o contrário.
Qualquer uma dessas características pode mudar de um exemplo para o outro. No entanto, os componentes de vídeo precisam saber algo sobre o conteúdo geral antes do início do streaming. Por exemplo, se o vídeo estiver entrelaçado, o EVR (renderizador de vídeo avançado) precisará reservar memória de vídeo para a desinterlação. Se o vídeo for quadros totalmente progressivos, por outro lado, o EVR poderá otimizar o pipeline de renderização. Adicionar uma etapa de desinterlação ao pipeline aumenta a latência de renderização.
Informações sobre interlacing são armazenadas em dois locais:
Informações gerais sobre a interlacção em um fluxo são colocadas no tipo de mídia. Para obter mais informações sobre tipos de mídia, consulte tipos de mídia.
As informações que podem ser alteradas com cada exemplo são colocadas no exemplo como um atributo. Para obter mais informações sobre exemplos, consulte Exemplos de Mídia.
Informações de entrelaçamento no tipo de mídia
O atributo MF_MT_INTERLACE_MODE no tipo de mídia descreve como o fluxo como um todo é entrelaçado. O valor desse atributo é um membro da enumeração MFVideoInterlaceMode. Um tipo de mídia de vídeo sempre deve ter esse atributo.
- Se o fluxo contiver apenas quadros progressivos, sem quadros entrelaçados, use MFVideoInterlace_Progressive.
- Se o fluxo contiver apenas quadros entrelaçados e cada exemplo contiver dois campos intercalados, use MFVideoInterlace_FieldInterleavedUpperFirst ou MFVideoInterlace_FieldInterleavedLowerFirst.
- Se o fluxo contiver apenas quadros entrelaçados e cada exemplo contiver um único campo, use MFVideoInterlace_FieldSingleUpper ou MFVideoInterlace_FieldSingleLower. Se os campos alternarem entre superior e inferior, não importa quais desses dois valores serão usados. Se o formato contiver apenas campos superiores ou apenas campos inferiores, defina o valor que corresponde ao conteúdo.
- Se o fluxo contiver uma combinação de quadros entrelaçados e progressivos ou se o domínio do campo mudar, defina o tipo de mídia como MFVideoInterlace_MixedInterlaceOrProgressive. Use atributos de exemplo para descrever cada quadro.
A tabela a seguir resume esse atributo.
MF_MT_INTERLACE_MODE | Entrelaçado? | Amostras | Primeiro campo |
---|---|---|---|
MFVideoInterlace_Progressive | Não | Quadro progressivo | Não aplicável |
MFVideoInterlace_FieldInterleavedUpperFirst | Sim | Campos intercalados | Primeiro superior |
MFVideoInterlace_FieldInterleavedLowerFirst | Sim | Campos intercalados | Primeiro, mais baixo |
MFVideoInterlace_FieldSingleUpper | Sim | Campo único | Primeiro superior |
MFVideoInterlace_FieldSingleLower | Sim | Campo único | Primeiro, mais baixo |
MFVideoInterlace_MixedInterlaceOrProgressive | Pode variar | Campos intercalados ou quadros progressivos | Pode variar |
Campos intercalados e campos únicos não podem ser misturados. Alternar de um para outro requer uma alteração de tipo de mídia.
Sinalizadores de entrelaçamento em exemplos
As informações que podem ser alteradas de um exemplo para o outro são indicadas usando atributos de exemplo. Use a interfaceIMFSample para obter ou definir esses atributos.
Todos os atributos de interlacção listados nesta seção têm valores boolianos. Efetivamente, cada um desses atributos pode ter três valores: VERDADEIRO, FALSE ou não definido. Se um atributo não for definido, o valor será obtido do tipo de mídia. Se um atributo for definido, o valor substituirá o tipo de mídia. Algumas combinações de sinalizadores e tipos de mídia não são válidas.
Atributo | Descrição |
---|---|
MFSampleExtension_Interlaced | Se VERDADEIRO, o quadro será entrelaçado. Se FALSE, o quadro será progressivo. Defina esse atributo em cada exemplo se o tipo de mídia for MFVideoInterlace_MixedInterlaceOrProgressive. |
MFSampleExtension_BottomFieldFirst | O significado desse sinalizador depende se os exemplos contêm campos intercalados ou campos únicos.
|
MFSampleExtension_RepeatFirstField | Se TRUE, o primeiro campo será repetido. Se false ou não definido, o primeiro campo não será repetido. |
MFSampleExtension_SingleField | Se TRUE, o exemplo conterá um único campo. Se FALSE, o exemplo conterá campos intercalados. |
A tabela a seguir mostra quais sinalizadores são necessários, opcionais ou proibidos, com base no tipo de mídia.
Tipo de mídia | Sinalizador entrelaçado | Sinalizador BottomFieldFirst | Sinalizador RepeatFirstField | Sinalizador SingleField |
---|---|---|---|---|
Progressivo | Opcional; se definido, deve ser FALSE. | Não definir. | Não definir. | Não definir. |
Campos intercalados | Opcional; se definido, deve ser VERDADEIRO. | Opcional; se definido, deve corresponder ao tipo de mídia. | Não definir. | Opcional; se definido, deve ser FALSE. |
Campos únicos | Opcional; se definido, deve ser VERDADEIRO. | Necessário. | Não definir. | Definido como TRUE. |
Misturado | Necessário. | Necessário. | Necessário. | Opcional; se definido, deve ser FALSE. |
Nos casos em que o atributo é opcional, o tipo de mídia já define as informações. É válido definir o atributo como correspondente, mas não é necessário.
Por exemplo, se o tipo de mídia for MFVideoInterlace_Progressive, isso implicará que todos os quadros no fluxo serão progressivos. Portanto, você pode definir o atributo MFSampleExtension_Interlaced como FALSE ou deixar o atributo não definido.
Recomendações
Esta seção contém recomendações para vários tipos de conteúdo.
- O vídeo é todo quadros progressivos.
Defina o tipo de mídia como MFVideoInterlace_Progressive.
Não defina o atributo MFSampleExtension_Interlaced ou defina-o como FALSE em cada quadro.
Não defina os atributos MFSampleExtension_BottomFieldFirst, MFSampleExtension_RepeatFirstFieldou MFSampleExtension_SingleField.
- O vídeo é todos campos entrelaçados com o mesmo domínio de campo. Os exemplos contêm campos intercalados.
Defina o tipo de mídia como MFVideoInterlace_FieldInterleavedUpperFirst ou MFVideoInterlace_FieldInterleavedLowerFirst.
Não defina o atributo MFSampleExtension_Interlaced ou defina-o como TRUE em cada quadro.
Não defina o atributo MFSampleExtension_BottomFieldFirst ou defina o valor em cada quadro para corresponder ao tipo de mídia.
Não defina o atributo MFSampleExtension_RepeatFirstField ou defina-o como FALSE em cada quadro.
Não defina o atributo MFSampleExtension_SingleField ou defina-o como FALSE em cada quadro.
- O vídeo contém uma mistura de quadros entrelaçados e progressivos, com campos repetidos e domínio de campo variável (por exemplo, vídeo de DVD).
Defina o tipo de mídia como MFVideoInterlace_MixedInterlaceOrProgressive.
Em cada quadro, defina os atributos MFSampleExtension_Interlaced, MFSampleExtension_BottomFieldFirste MFSampleExtension_RepeatFirstField.
Não defina o atributo MFSampleExtension_SingleField ou defina-o como FALSE em cada quadro.
- O vídeo é entrelaçado e os exemplos contêm campos únicos.
Defina o tipo de mídia como MFVideoInterlace_FieldSingleUpper ou MFVideoInterlace_FieldSingleLower.
Em cada quadro, defina o atributo MFSampleExtension_BottomFieldFirst.
Não defina o atributo MFSampleExtension_Interlaced ou defina-o como TRUE em cada quadro.
Não defina o atributo MFSampleExtension_RepeatFirstField ou defina-o como FALSE em cada quadro.
Não defina o atributo MFSampleExtension_SingleField ou defina-o como TRUE em cada quadro.
A maioria do conteúdo de vídeo se enquadra em uma dessas categorias.
Mapeamentos mpeg-2
Para conteúdo MPEG-2, use os mapeamentos a seguir para converter os sinalizadores MPEG-2 em atributos de exemplo do Media Foundation.
picture_structure
Valor | Atributo de exemplo |
---|---|
moldura | MFSampleExtension_SingleField = FALSE |
top_field |
MFSampleExtension_SingleField = verdadeiro MFSampleExtension_BottomFieldFirst = FALSE |
bottom_field |
MFSampleExtension_SingleField = verdadeiro MFSampleExtension_BottomFieldFirst = VERDADEIRO |
progressive_frame
Valor | Atributo de exemplo |
---|---|
0 | MFSampleExtension_Interlaced = VERDADEIRO |
1 | MFSampleExtension_Interlaced = FALSE |
top_field_first
Valor | Atributo de exemplo |
---|---|
0 | MFSampleExtension_BottomFieldFirst = VERDADEIRO |
1 | MFSampleExtension_BottomFieldFirst = FALSE |
repeat_first_field
Valor | Atributo de exemplo |
---|---|
0 | MFSampleExtension_RepeatFirstField = falso |
1 | MFSampleExtension_RepeatFirstField = verdadeiro |
Exemplos de Single-Field
Se o tipo de mídia for MFVideoInterlace_FieldSingleUpper ou MFVideoInterlace_FieldSingleLower, isso significa que cada exemplo contém um único campo. No entanto, o tipo de mídia descreve todo o quadro. Portanto, cada buffer contém apenas metade do número de linhas de campo fornecidas no tipo de mídia. Por exemplo, se o tipo de mídia descreve o vídeo como 720 × 480, cada campo contém 240 linhas de verificação e, portanto, cada buffer contém apenas 240 linhas de pixels. Se você escrever um componente que aceita tipos de mídia com exemplos de campo único, deverá levar esse fato em conta ao acessar os dados no buffer.
A mesma regra se aplica à abertura geométrica (atributoMF_MT_GEOMETRIC_APERTURE) e à abertura de exibição mínima (MF_MT_MINIMUM_DISPLAY_APERTURE atributo). Essas regiões são especificadas em termos do quadro inteiro, não dos campos individuais.
Mapeamentos do DirectShow
No DirectShow, as informações de interlacção por exemplo estão contidas no dwTypeSpecificFlags membro da estrutura AM_SAMPLE2_PROPERTIES. A tabela a seguir mostra os atributos equivalentes para o Media Foundation.
Sinalizador de exemplo do DirectShow | Atributo de exemplo do Media Foundation |
---|---|
AM_VIDEO_FLAG_INTERLEAVED_FRAME | MFSampleExtension_SingleField = FALSE . |
AM_VIDEO_FLAG_FIELD1 |
MFSampleExtension_Interlaced = VERDADEIRO. MFSampleExtension_SingleField = VERDADEIRO. MFSampleExtension_BottomFieldFirst = falso. |
AM_VIDEO_FLAG_FIELD2 |
MFSampleExtension_Interlaced = VERDADEIRO. MFSampleExtension_SingleField = VERDADEIRO. MFSampleExtension_BottomFieldFirst = VERDADEIRO. |
AM_VIDEO_FLAG_WEAVE | MFSampleExtension_Interlaced = falso. (Esse sinalizador indica que o driver não deve desinterlacear os dois campos.) |
AM_VIDEO_FLAG_FIELD1FIRST | MFSampleExtension_BottomFieldFirst = falso. Se o conteúdo estiver entrelaçado e o sinalizador de AM_VIDEO_FLAG_FIELD1FIRST não estiver presente, defina esse atributo como VERDADEIRO. |
AM_VIDEO_FLAG_REPEAT_FIELD | MFSampleExtension_RepeatFirstField = VERDADEIRO. Se o sinalizador de AM_VIDEO_FLAG_REPEAT_FIELD não estiver presente, defina esse atributo como false. |
Se o exemplo directShow não contiver sinalizadores de exemplo, use o valor de dwInterlaceFlags da estrutura VIDEOINFOHEADER2:
Sinalizador de entrelaçamento do DirectShow | Atributo de exemplo do Media Foundation |
---|---|
AMINTERLACE_IsInterlaced | MFSampleExtension_Interlaced = VERDADEIRO. |
AMINTERLACE_1FieldPerSample | MFSampleExtension_SingleField = VERDADEIRO. |
AMINTERLACE_Field1First | MFSampleExtension_BottomFieldFirst = falso. |
Tópicos relacionados