Primeira parte da estrutura de comando de controle macroblock

Os quatro primeiros membros de uma estrutura de comando de controle de macroblock genérico são sempre os mesmos. A tabela a seguir descreve os membros da primeira parte dessa estrutura.

Membro Descrição

wMBaddress

Especifica o endereço de macroblock do macroblock que está sendo processado no momento.

wMBtype

Especifica o tipo de macroblock que está sendo processado. Esse membro contém sinalizadores que indicam se a compensação de movimento é usada para prever o valor do macroblock e que tipo de dados de diferença residual são enviados.

dwMB_SNL

Contém os dois campos MBskipsFollowing (nos 8 bits superiores) e MBdataLocation (nos 24 bits inferiores).

MBskipsFollowing especifica o número de macroblocks ignorados a serem gerados após o macroblock atual.

MBdataLocation é um índice no buffer de dados de bloco de diferença residual IDCT, indicando o local dos dados de diferença residual para os blocos do macroblock atual.

wPatternCode

Indica se os dados de diferença residual são enviados para cada bloco no macroblock.

wMBaddress

O membro da estrutura wMBaddress especifica o endereço de macroblock do macroblock atual na ordem de varredura de varredura. A tabela a seguir mostra exemplos de endereços de macroblock.

Macroblock Endereço

canto superior esquerdo

Zero

canto superior direito

wPicWidthInMBminus1

inferior esquerdo

wPicHeightInMBminus1 x (wPicWidthInMBminus1+1)

inferior direito

(wPicHeightInMBminus1+1) x (wPicWidthInMBminus1+1) – 1

Os endereços wPicWidthInMBminus1 e wPicHeightInMBminus1 são membros da estrutura DXVA_PictureParameters .

wMBtype

O membro da estrutura wMBtype especifica o tipo de macroblock que está sendo processado. Esse membro contém um conjunto de bits que definem a maneira como os macroblocks e os vetores de movimento são processados. Os endereços bPic4MVallowed, bPicScanMethod, bPicBackwardPrediction, bPicStructure e bPicScanFixed são membros da estrutura DXVA_PictureParameters. O endereço bConfigHostInverseScan é membro da estrutura DXVA_ConfigPictureDecode .

Bits Descrição

15 a 12

MvertFieldSel_3 (bit 15, o mais significativo) por meio de MvertFieldSel_0 (bit 12)

Especifica a seleção de campo vertical para vetores de movimento correspondentes enviados posteriormente no comando de controle macroblock, conforme especificado nas tabelas a seguir. Para movimento baseado em quadro com uma estrutura de imagem de quadro (por exemplo, para H.261 e H.263), todos esses bits devem ser zero. Os bits em MvertFieldSel_0, MvertFieldSel_1, MvertFieldSel_2 e MvertFieldSel_3 correspondem aos bits motion_vertical_field_select[r][s] na Seção 6.3.17.2 do MPEG-2.

11

Bit Reservado. Deve ser zero.

10

HostResidDiff

Especifica se os blocos decodificados de diferença residual de domínio espacial são enviados ou se os coeficientes de transformação são enviados para IDCT fora do host para o macroblock atual. Deve ser zero se bConfigResidDiffHost for zero. Deve ser 1 se bConfigResidDiffAccelerator for zero.

9 e 8

MotionType

Especifica o tipo de movimento na imagem. Por exemplo, para movimento baseado em quadro com uma estrutura de imagem de quadro (como em H.261), o bit 9 deve ser 1 e o bit 8 deve ser zero.

O uso desses bits corresponde diretamente ao uso dos bits frame_motion_type ou field_motion_type na Seção 6.3.17.1 e tabelas 6-17 e 6-18 do padrão de vídeo MPEG-2 quando esses bits estiverem presentes em um bitstream MPEG-2. O uso desses bits é explicado posteriormente após esta tabela.

7 e 6

MBscanMethod

Especifica o método de verificação de macroblock. Isso deve ser igual a bPicScanMethod se bPicScanFixed for 1. Se HostResidDiff for 1, essa variável não terá significado e esses bits deverão ser definidos como zero.

Se bConfigHostInverseScan for zero, MBscanMethod deverá ser um dos seguintes valores:

  • O bit 6 é zero e o bit 7 é zero para verificação em ziguezague (MPEG-2 Figura 7-2)

  • O bit 6 é 1 e o bit 7 é zero para verificação vertical alternativa (FIGURA MPEG-2 7-3)

  • O bit 6 é zero e o bit 7 é 1 para verificação horizontal alternativa (H.263 Figura I.2 Parte a)

Se bConfigHostInverseScan for 1, MBscanMethod deverá ser igual ao seguinte valor:

  • O bit 6 é 1 e o bit 7 é 1 para verificação arbitrária com endereço coeficiente absoluto.

5

FieldResidual

Indica se os blocos de diferença residual usam uma estrutura IDCT de campo, conforme especificado em MPEG-2.

Esse sinalizador deverá ser 1 se bPicStructure for 1 ou 2. Esse sinalizador deverá ser zero quando usado para MPEG-2 se o sinalizador frame_pred_frame_DCT na sintaxe MPEG-2 for 1. Esse sinalizador deve ser igual ao elemento dct_type da sintaxe MPEG-2 quando usado para MPEG-2 se dct_type estiver presente para o macroblock.

4

H261LoopFilter

Especifica se o filtro de loop H.261 (Seção 3.2.3 de H.261) está ativo para a previsão de macroblock atual. O filtro de loop H.261 é um filtro separado de 1/4, 1/2, 1/4 aplicado horizontal e verticalmente a todos os seis blocos em um macroblock H.261, exceto em bordas de bloco em que um dos toques ficaria fora do bloco. Nesses casos, o filtro é alterado para ter coeficientes 0, 1, 0. A precisão aritmética completa é mantida com arredondamento para inteiros de 8 bits na saída do processo de filtro 2D (valores de meio inteiro ou mais altos sendo arredondados para cima).

3

Motion4MV

Indica que o movimento de encaminhamento usa um vetor de movimento distinto para cada um dos quatro blocos de luminância no macroblock, conforme usado nos Anexos H.263 F e J. Motion4MV deve ser zero se MotionForward for zero ou se bPic4MVallowed for zero.

2

MotionBackward

Essa variável é usada conforme especificado para o parâmetro macroblock_motion_backward correspondente em MPEG-2. Se o membro bPicBackwardPrediction da estrutura DXVA_PictureParameters for zero, MotionBackward deverá ser zero.

1

MotionForward

Essa variável é usada conforme especificado para o macroblock_motion_forward correspondente no MPEG-2. O uso desse bit é explicado ainda mais no texto após esta tabela.

0

IntraMacroblock

Indica que o macroblock é codificado como intra e que nenhum vetor de movimento é usado para o macroblock atual.

Essa variável corresponde à variável macroblock_intra em MPEG-2. O uso desse bit é explicado ainda mais no texto após esta tabela.

Quando os macroblocks são codificados preditivamente, eles têm valores de vetor de movimento associados. Os valores são gerados com base em se os macroblocks são usados para imagens codificadas em campo ou com código de quadro. É importante que qualquer implementação considere corretamente cada tipo de macroblock utilizado (especialmente para imagens estruturadas em campo ou movimento dual-prime).

As duas tabelas a seguir nesta seção indicam combinações válidas de IntraMacroblock, MotionForward, MotionBackward, MotionType, MvertFieldSel e MVector para imagens codificadas em quadro e codificadas em campo. O MVector contém os componentes horizontais e verticais de um vetor de movimento. As variáveis e sinalizadores restantes especificam a operação de vetor de movimento. Isso é determinado de acordo com o tipo de macroblock processado e se os macroblocks estão sendo usados para imagens codificadas em quadro ou codificadas em campo.

Os valores mostrados nas tabelas a seguir (nesta seção) ocorrem para as seguintes condições:

  • H261LoopFilter, Motion4MV e bPicOBMC são zero.

  • O sinalizador PicCurrentField é zero, a menos que bPicStructure seja 2 (campo inferior). Nesse caso, PicCurrentField é 1.

MVector é membro das estruturas DXVA_MBctrl_P_HostResidDiff_1 e DXVA_MBctrl_P_OffHostIDCT_1 . Os sinalizadores e variáveis IntraMacroblock, MotionForward, MotionBackward, MotionType, MvertFieldSel, H261LoopFilter e Motion4MV são campos de bits contidos no membro wMBtype das estruturas DXVA_MBctrl_P_HostResidDiff_1 e DXVA_MBctrl_P_OffHostIDCT_1. bPicOBMC é um membro da estrutura DXVA_PictureParameters . O sinalizador PicCurrentField é derivado do membro bPicStructure de DXVA_PictureParameters.

As seguintes considerações se aplicam ao revisar as seguintes tabelas nesta seção:

  • Em vários locais, o PMV de nome de variável MPEG-2 é usado para indicar o valor de um vetor de movimento. Essa notação é usada para distinguir entre a variável PMV , conforme definido em MPEG-2, que está em coordenadas de quadro e um vetor de movimento que pode estar em coordenadas de campo (em outras palavras, em resolução semi-vertical). Em todos os casos, PMV refere-se ao valor de PMV depois de ter sido atualizado pelo valor do vetor de movimento atual (conforme especificado no vídeo MPEG-2 Seção 7.6.3.1).

  • As definições de vector'[2][0] e vector'[3][0] são encontradas na Seção MPEG-2 7.6.3.6. A operação de deslocamento à esquerda-mostrada indica que o componente vertical é modificado para as coordenadas de quadro.

  • Em ambos os casos "sem movimento" (0,0,0), os parâmetros de macroblock emulam um macroblock de previsão de avanço (0,1,0) com um vetor de movimento com valor zero. (Consulte também a Seção MPEG-2 7.6.3.5.)

  • Os valores mostrados para MotionType em aspas simples são representações binárias (o primeiro número é para o bit 9 e o segundo é para o bit 8).

  • O operador de deslocamento esquerdo na primeira tabela aplica-se apenas ao segundo valor mostrado.

Imagens estruturadas em quadros

A tabela a seguir mostra as combinações válidas de configurações de elemento para imagens estruturadas em quadro (quando o membro bPicStructure da estrutura DXVA_PictureParameters é igual a 3).

IntraMacroblock, MotionForward, MotionBackward MotionType (o significado depende do tipo de imagem) MVector[0]MvertFieldSel_0 (1º, dir1) MVector[1]MvertFieldSel_1 (1º, dir2) MVector[2]MvertFieldSel_2 (2º, dir1) MVector[3]MvertFieldSel_3 (2º, dir2)

1,0,0 (intra)

'00' (intra)

-

-

-

-

-

-

-

-

0,0,0 (sem movimento)

'10' (sem movimento)

0

-

-

-

-

-

-

-

0,1,0

'10' (quadro MC)

PMV[0][0]

-

-

-

-

-

-

-

0,0,1

'10' (quadro MC)

-

-

PMV[0][1]

-

-

-

-

-

0,1,1

'10' (quadro MC)

PMV[0][0]

-

PMV[0][1]

-

-

-

-

-

0,1,0

'01' (campo MC)

PMV[0][0]

sel[0][0]

-

-

PMV[1][0]

sel[1][0]

-

-

0,0,1

'01' (campo MC)

-

-

PMV[0][1]

sel[0][1]

-

-

PMV[1][1]

sel[1][1]

0,1,1

'01' (campo MC)

PMV[0][0]

sel[0][0]

PMV[0][1]

sel[0][1]

PMV[1][0]

sel[1][0]

PMV[1][1]

sel[1][1]

0,1,0

'11' (dual-prime)

PMV[0][0]

0 (superior)

vector'[2][0][0],

vector'[2][0][1]<<1

1 (inferior)

PMV[0][0]

1

vector'[3][0][0],

vector'[3][0][1]<<1

0

Imagens estruturadas em campo

A tabela a seguir mostra as combinações válidas de configurações de elemento para imagens estruturadas em campo (quando o membro bPicStructure da estrutura DXVA_PictureParameters é igual a 1 ou 2).

IntraMacroblock, MotionForward, MotionBackward MotionType (o significado depende do tipo de imagem) MVector[0]MvertFieldSel_0 (1º, dir1) MVector[1]MvertFieldSel_1 (1º, dir2) MVector[2]MvertFieldSel_2 (2º, dir1) MVector[3]MvertFieldSel_3(2nd, dir2)

1,0,0 (intra)

'00' (intra)

-

-

-

-

-

-

-

-

0,0,0 (sem movimento)

'01' (sem movimento)

0

PicCurrentField

-

-

-

-

-

-

0,1,0

'01' (campo MC)

PMV[0][0]

sel[0][0]

-

-

-

-

-

-

0,0,1

'01' (campo MC)

-

-

PMV[0][1]

sel[0][1]

-

-

-

-

0,1,1

'01' (campo MC)

PMV[0][0]

sel[0][0]

PMV[0][1]

sel[0][1]

-

-

-

-

0,1,0

'10' (16x8 MC)

PMV[0][0]

sel[0][0]

-

-

PMV[1][0]

sel[1][0]

-

-

0,0,1

'10' (16x8 MC)

-

-

PMV[0][1]

sel[0][1]

-

-

PMV[1][1]

sel[1][1]

0,1,1

'10' (16x8 MC)

PMV[0][0]

sel[0][0]

PMV[0][1]

sel[0][1]

PMV[1][0]

sel[1][0]

PMV[1][1]

sel[1][1]

0,1,0

'11' (dual-prime)

PMV[0][0]

PicCurrentField

vector'[2][0]

PicCurrentField

-

-

-

-

Configurações de elemento válidas adicionais para imagens de campo e quadro

Os demais casos permitidos para imagens estruturadas em quadros e estruturadas em campo são os seguintes.

Valores Descrição

H261LoopFilter = 1

bPicOBMC = 0

Motion4MV = 0

Indica que um vetor de movimento de encaminhamento é enviado no MVector[0] e que o filtro de loop H.261 está ativo para a previsão de encaminhamento no macroblock.

MotionForward deve ser 1 nesse caso, e IntraMacroblock e MotionBackward devem ser zero.

bPicOBMC = 0

Motion4MV = 1

Indica que quatro vetores de movimento de encaminhamento são enviados no MVector[0] por meio do MVector[3]. MotionForward deve ser 1 nesse caso, e IntraMacroblock deve ser zero.

Se MotionBackward for 1, um quinto vetor de movimento será enviado para previsão anterior no MVector[4].

bPicOBMC = 1

Motion4MV = 0

Indica que 10 vetores de movimento de encaminhamento são enviados em MVector[0] por meio de MVector[9] para especificação do movimento OBMC e que os valores dos quatro primeiros vetores de movimento são todos iguais.

Se MotionBackward for 1, um décimo primeiro vetor de movimento será enviado para previsão anterior no MVector[10].

bPicOBMC = 1

Motion4MV = 1

Indica que 10 vetores de movimento de avanço são enviados em MVector[0] por meio de MVector[9] para especificação do movimento OBMC e que os valores dos quatro primeiros vetores de movimento podem ser diferentes uns dos outros.

Se MotionBackward for 1, um décimo primeiro vetor de movimento será enviado para previsão anterior no MVector[10].

Nota O operador médio é matematicamente idêntico ((s1+s2+1)>>1) para MPEG-1, filtragem de previsão de meia amostra MPEG-2, média bidirecional e combinação de paridade dupla e oposta. O operador de média bidirecional H.263 não adiciona o deslocamento de +1 antes do deslocamento para a direita. O membro bBidirectionalAveragingMode do DXVA_PictureParameters determina quais desses métodos são usados.