Codificador de Entropia Segundo o Perfil Baseline do padrão H.264/AVC de Compressão de Vídeo João A. Vortmann 1, Thaísa L. Silva 2, Fabiane K. Rediess 1, José L. Güntzel 1,2, Sérgio Bampi 2, Luciano V. Agostini 1,2 1 Grupo de Arquiteturas e Circuitos Integrados (GACI) Universidade Federal de Pelotas (UFPel) Caixa Postal 354 CEP 96010-900 Pelotas/RS Brasil 2 Grupo de Microeletrônica (GME) Universidade Federal do Rio Grande do Sul (UFRGS) {jvortmann_ifm, thleal, frediess_ifm, guntzel, agostini}@ufpel.edu.br, {bampi, agostini, guntzel}@inf.ufrgs.br Abstract. This paper presents the design of a hardware architecture for the Entropy Encoder of H.264/AVC video compression standard according to the Baseline Profile. This paper presents the architectural design of Exp-Golomb and CAVLC encoders, which were described in VHDL and synthesized to a Xilinx FPGA. From synthesis it was possible to verify that both designs present interesting results: 10.2 and 117.62 million samples per second for the throughputs, respectively. The entropy encoder is currently being designed through the integration of these two main blocks and preliminary results indicate that the obtained solution will be able to process HDTV frames in real time. Resumo. Este artigo apresenta o desenvolvimento de uma arquitetura de hardware para o Codificador de Entropia no perfil Baseline do padrão H.264/AVC de compressão de vídeo. São apresentados os projetos dos codificadores Exp-Golomb e CAVLC., os quais foram descritos em VHDL e sintetizados para um FPGA Xilinx. A partir da síntese foi possível verificar que ambos apresentam resultados interessantes, atingindo throughput de 10.2 e 117,62 milhões de amostras por segundo, respectivamente. O codificador de entropia está sendo desenvolvido através da integração destes blocos e estimativas indicam que esta solução será capaz de processar quadros HDTV em tempo real. 1. Introdução O padrão H.264/AVC é o mais novo padrão de compressão de vídeo [ITU 2005]. Este padrão tem por objetivo dobrar a taxa de compressão em relação aos padrões anteriores. Tal objetivo é obtido através de um considerável incremento na complexidade computacional nas operações do codificador. Devido a esta alta complexidade, codificadores implementados em software e rodando em processadores fabricados em tecnologia estado-da-arte não são capazes de atingir desempenho suficiente quando se necessita alta resolução e/ou tempo real. Nesse caso uma implementação em hardware do codificador se faz necessária. Este trabalho apresenta um projeto arquitetural do bloco de codificação de entropia para o padrão H.264/AVC de compressão de vídeo. Esta solução está de acordo com o Perfil Baseline [ITU 2005] do padrão. O codificador de entropia é composto por dois blocos principais: o codificador Exp-Golomb (Exponencial Golomb) e o codificador de tamanho variável adaptativo ao contexto (CAVLC - Context Adaptative Variable Length Coder). Ambos os blocos foram descritos em VHDL, mapeados para um FPGA da Xilinx [XILINX 2006] e
validados por meio de simulações. Atualmente a integração de tais blocos está sendo finalizada. 2. Codificador de Entropia Segundo o Perfil Baseline O padrão H.264/AVC é dividido em diferentes perfis. Cada perfil suporta uma gama particular de ferramentas de codificação. A primeira versão do padrão H.264/AVC, aprovada em 2003, define três diferentes perfis: Baseline (adotado nesse trabalho), Main e Extended. O perfil Baseline é direcionado a aplicações como vídeo-telefonia, videoconferência e vídeo sem fio. Tal perfil suporta codificação intra e inter quadro (usando somente slices tipo I e P) e uma codificação de entropia com códigos de comprimento de palavra variável adaptativos ao contexto (CAVLC) [Richardson 2003]. O codificador de entropia utiliza duas ferramentas principais para atingir uma alta taxa de compressão: a codificação Exp-Golomb e a codificação CAVLC [Richardson 2003], como apresentado na Figura 1. A codificação de entropia no padrão H.264/AVC é organizada como segue [Richardson 2003]: em níveis hierárquicos superiores (quadros, etc.); os elementos sintáticos são codificados usando códigos binários de tamanho fixo ou de tamanho variável. A partir do nível de slices ou abaixo (macroblocos, blocos, etc.); os elementos sintáticos são codificados usando códigos de tamanho variável (VLC) [Salomon 2000]. A informação residual (coeficientes quantizados) é codificada usando CAVLC [Richardson 2003], enquanto que para as outras unidades é usado a codificação Exp-Golomb [Salomon 2000]. Figura 1. Diagrama de blocos do codificador de entropia segundo o perfil baseline 2.1 Codificação Exp-Golomb Os códigos Exp-Golomb possuem tamanho variável e uma construção regular. Um número inteiro e positivo N é codificado usando a estrutura presente em (1) [Richardson 2003]: [ M zeros ] [ 1 ] [ INFO ] Código = (1) Na equação (1), M representa o número de zeros que precede o primeiro bit de valor '1' no código. O valor de M é dado pela equação (2): M = log 2 ( CodeNum + 1) (2) Na equação (2) CodeNum indica o número do código a ser codificado. Códigos com uma alta probabilidade de ocorrência possuem um CodeNum menor e, conseqüentemente, uma palavra de código menor. INFO na equação (1) possui M bits de comprimento e contém a informação codificada. O valor de INFO provém da equação (3). INFO M = CodeNum + 1 2 (3) O primeiro código Exp-Golomb não possui os campos M e INFO, sendo representado apenas pelo valor '1'. O padrão H.264/AVC define que, para cada elemento sintático k a ser codificado, há uma regra que mapeia o valor de k para um valor inteiro, não negativo, seu CodeNum. Existem quatro possibilidades de mapeamento, dependendo do tipo de elemento a ser codificado: ue(v), se(v), me(v) e te(v) [ITU 2005].
2.2 Codificação CAVLC A codificação CAVLC é usada para codificar os resíduos provenientes do bloco de quantização [Richardson 2003]. Tais valores devem ser previamente ordenados em ziguezague [Richardson 2003]. A codificação CAVLC produz códigos de tamanho variável dependentes do contexto, ou seja, dependem do estágio do algoritmo de codificação e dos valores já codificados. A codificação CAVLC foi projetada para explorar determinadas características dos blocos quantizados a fim de obter uma melhor codificação. O bloco de coeficientes quantizados apresenta, geralmente, uma distribuição esparsa. Logo, a codificação CAVLC utiliza RLE (Run Length Encoding) [Salomon 2000] para representar seqüências de zeros de forma compacta. Os coeficientes não zero de mais alta ordem, após o mapeamento em ziguezague, são comumente seqüências de ±1. Assim, a codificação CAVLC representa os sinais destes coeficientes (Trailing Ones) de forma reduzida. A quantidade de coeficientes não zero presente em blocos vizinhos é relacionada. Os valores dos coeficientes são codificados utilizando diferentes tabelas cuja escolha ocorre em função da quantidade de coeficientes não zero dos blocos vizinhos. A magnitude dos coeficientes não zeros tende a ser maior para os coeficientes de mais baixa ordem e menor para os de mais alta ordem. Assim, a codificação CAVLC tira vantagem desta característica adaptando a escolha das tabelas VLC a serem usadas considerando a magnitude dos coeficientes recentemente codificados. A codificação CAVLC pode ser dividida nas seguintes operações: codificação da quantidade de coeficientes não zero (TotalCoeff) e Trailing Ones, codificação dos sinais de cada Trailing One, codificação dos níveis, magnitudes dos coeficientes não zero restantes (coeficientes não zero excetuando Trailing Ones), codificação do total de zeros anteriores ao coeficiente não zero de mais alta ordem, codificação do total de zeros anteriores a cada coeficiente (RunBefore). 3. Arquitetura para o Codificador Exp-Golomb A arquitetura para o codificador Exp-Golomb foi projetada através da implementação de uma máquina de estados finitos conectada a duas memórias ROM, como apresentado na Figura 2. Tal máquina de estados gera o código de saída (output) a partir do elemento sintático (sint. elem) e do modo de mapeamento selecionado (mode): ue(v), se(v), me(v) e te(v). Figura 2. Diagrama de blocos do codificador Exp-Golomb Quando o modo selecionado é ue(v), se(v) ou te(v), a saída é gerada a partir dos CodeNums calculados. Quando do modo me(v) a saída provém do acesso à memória. O sinal val_out indica quando um determinado valor na saída é válido. A máquina de estados apresentada na Figura 2 é detalhada na Figura 3. Seu funcionamento ocorre da seguinte forma: durante o estado 0, a partir do modo de mapeamento, o valor de CodeNum é calculado, o qual contém um código binário correspondente.
Figura 3. Máquina de estados finitos do codificador Exp-Golomb O modo ue(v) é usado para mapear números inteiros sem sinal, o modo se(v) números inteiros com sinal, o modo me(v) para padrões de predição e o modo te(v) quando os elementos sintáticos foram truncados. Durante o estado 1 é calculado o valor de M, ou seja, a quantidade de bits '0' precedendo o primeiro bit '1'. Seu valor é acumulado em AC. No estado 2 o valor INFO é calculado, partindo do valor de CodeNum e do valor acumulado em AC. Enquanto AC 0, seu valor é decrementado e uma variável auxiliar k (inicializada com o valor 1) é deslocada à esquerda. Logo, a variável k corresponde ao valor 2 M, presente na expressão (3). Quando AC atinge o valor zero, INFO pode ser calculado como em (3) utilizando para tal o valor de k. Após o cálculo de INFO a máquina segue para o estado 3. Nesse estado ocorre a geração do código binário de saída, considerando os valores de M e de INFO. O código é gerado bit a bit seguindo a estrutura apresentada na expressão (1). 4. Arquitetura para o Codificador CAVLC A arquitetura para o codificador CAVLC foi projetada através de oito blocos principais e cinco memórias ROM, como mostra a Figura 4. Os blocos são NC, Calc_Info, PreMont_TCoeff_T1s, Levels, TotalZeros, RunBefore_ZerosLeft, Montador e Controle, como apresentado na Figura 4. Tal arquitetura foi projeta usando pipeline de três estágios para aumentar seu desempenho. As memórias ROM armazenam os valores de código ideais, indicados no padrão, e seu respectivo tamanho. Figura 4. Diagrama de blocos do codificador CAVLC O bloco ZigZag, apresentado na Figura 4, foi também implementado. Este bloco não faz parte do codificador CAVLC, mas é fundamental para seu funcionamento. Tal bloco é responsável pela ordenação em ziguezague dos resultados do processo de quantização que
servem como entrada para o codificador CAVLC. O bloco NC é responsável pelo cálculo do parâmetro nc para cada bloco. O parâmetro nc é calculado a partir da quantidade de coeficientes dos blocos acima e à esquerda do bloco que está sendo codificado e é usado para a decisão das tabelas de codificação. O bloco Calc_Info é responsável pela geração dos principais valores envolvidos no processo de codificação, além de sinais informando quando cada um desses é valido e pode ser usado pelos outros blocos. O bloco PreMont_Tcoeff_T1s é responsável por concatenar os códigos para codificação da quantidade total de coeficientes e quantidade total de Trailing Ones com os sinais dos Trailing Ones. A saída do bloco é tal código concatenado e seu tamanho. Os coeficientes não zero e não Trailing Ones (níveis) são codificados pelo bloco Levels. A saída deste bloco é o código do nível atual e o tamanho deste código. O bloco TotalZeros possui três memórias ROM que são acessadas para codificação do total de zeros precedendo o coeficiente não zero de mais alta ordem. A saída deste bloco é o código resultante do acesso à uma das ROM e o tamanho de tal código em bits. O bloco RunBefore_ZerosLeft é responsável pela codificação dos RunBefores de cada coeficiente. Este bloco utiliza a quinta ROM, a qual é acessada de acordo com os sinais Run_Before e Zeros_Left, e tem por saída o código proveniente do acesso à ROM e seu tamanho em bits. O bloco Montador recebe como entrada a saída de todos os blocos descritos anteriormente exceto o bloco Calc_Info. Este bloco possui em sua entrada dois multiplexadores, os quais selecionam a palavra de código de saída de cada bloco e os tamanho de tal código, respectivamente. A saída desse bloco é constituída de palavras de código montadas pela concatenação de suas entradas além de um sinal ok_mont, indicando quando uma nova palavra é válida. O controle e sincronização de todos os outros blocos é realizado pelo bloco Controle, o qual implementa uma máquina de estados finitos. As amostras de entrada do codificador usam 9 bits e os valores de saída usam 32 bits. As saídas são amostradas de forma assíncrona e o sinal ok_mont indica quando tal valor é válido. Tal assincronismo é decorrente do processamento de palavras de código de tamanho variável as quais são inerentes a este processo de codificação. Assim, uma saída é formada pela união de várias palavras de código de tamanho variável. A latência é também dependente de tal assincronismo, sendo a latência mínima igual a 44 ciclos de relógio. 5. Resultados de Síntese A síntese do codificador Exp-Golomb e do codificador CAVLC tiveram como alvo o FPGA Virtex-II 2V8000 da Xilinx [XILINX 2006]. A ferramenta de síntese usada foi a ISE da Xilinx [XILINX 2006]. Os resultados de síntese são mostrados na Tabela 1. Tabela 1. Resultados de Síntese Arquiteturas LUTs Freqüência (MHz) Throughput (Mamostras/s) Codificador Exp-Golomb 341 122,76 10,2 Codificador CAVLC 3137 117,62 117,62 Codificador de Entropia* 3500 100 100 * Valores Estimados Dispositivo 2V8000 O atraso do caminho crítico do codificador Exp-Golomb foi estimado pela ferramenta de síntese como sendo igual a 8,15 ns. Tal atraso conduz a uma freqüência máxima de operação de 122,76 MHz, permitindo throughput de 10,2 milhões de amostras por segundo, no caso médio. Considerando o caso médio, a arquitetura proposta utiliza 12 ciclos para processar uma amostra. Em termos de recursos utilizados, a arquitetura utilizou 341 LUTs. Tais resultados
indicam que a arquitetura proposta para o codificador Exp-Golomb é capaz de atingir uma alta taxa de processamento, utilizando poucos recursos do FPGA alvo. A respeito da arquitetura para o codificador CAVLC, os resultados de síntese demonstraram que esta utilizou 3137 LUTs do FPGA alvo. Em termos de desempenho, foi estimado que o atraso do caminho crítico é de de 8,5 ns, correspondendo a uma freqüência máxima de operação de 117,62 MHz. Considerando que a arquitetura do codificador CAVLC é capaz de processar uma amostra por ciclo, tal arquitetura atinge throughput de 117,62 milhões de amostras por segundo. A integração do codificador Exp-Golomb e do codificador CAVLC está em andamento. O projeto do bloco de controle e a validação completa do bloco são tarefas ainda em desenvolvimento. Considerando que os codificadores Exp-Golomb e CAVLC operam em paralelo diferentes elementos sintáticos e considerando que o volume de informação residual, utilizada pelo codificador CAVLC, é muito maior que a informação restante, codificada pelo codificador Exp-Golomb, é possível estimar que o desempenho do codificador de entropia seja equivalente ao desempenho do codificador CAVLC. Esta estimativa considera que há duas freqüências de relógio sendo utilizadas. Logo, é possível estimar que o codificador de entropia completo atingirá throughput aproximado de 100 milhões de amostras por segundo. O uso de recursos foi estimado em 3500 LUTs. Estas estimativas indicam que o codificador de entropia é capaz de codificar vídeos HDTV (1920x1080 pixels) em tempo real. 6. Comparação com trabalhos relacionados Sendo o padrão H.264/AVC o estado da arte em compressão de vídeo, ainda são poucas as publicações nesta área. No entanto, foram encontrados na literatura especializada, um artigo relacionado ao codificador Exp-Golomb e três artigos relacionados ao codificador CAVLC. O trabalho relacionado ao codificador Exp-Golomb [Di; et. al 2003] foi descrito usando Verilog e sintetizado em standard cells em tecnologia 0,25 µm. A arquitetura projetada em tal trabalho obteve uma freqüência máxima de operação de 166,7 MHz. A taxa de processamento desta solução não foi apresentada. Assim, não é possível realizar uma análise completa do trabalho. A solução aqui apresentada executa a 122,8 MHz em um FPGA Virtex II. Esta freqüência de operação é menor do que aquela apresentada em [Di; et. al 2003], mas não é possível comparar a taxa de processamento. Em relação ao codificador CAVLC, o primeiro trabalho a ser comparado [Amer, Badawy and Jullien 2004] trata de uma arquitetura em pipeline. Esta arquitetura foi descrita em VHDL e sintetizada usando o software Symplify Pro. Tal arquitetura teve como alvo o dispositivo FPGA Virtex-II 2V8000 da Xilinx [XILINX 2006]. Da síntese obtiveram-se os seguintes resultados: freqüência máxima de operação de 31,9 MHz com uso de 84902 LUTs. Nesta solução, 16 amostras são processadas por ciclo de relógio, atingindo throughput de 510,4 milhões de amostras por segundo. O segundo trabalho relacionado ao codificador CAVLC [Sahin and Hamzaoglu 2005] apresenta uma arquitetura semelhante à apresentada aqui, mas utilizando um pipeline mais profundo. Esta solução utiliza aproximadamente 12 ciclos de relógio para processar uma amostra. Ela foi descrita em Verilog e sintetizada para o FPGA Virtex-II 2V8000 da Xilinx [XILINX 2006]. Os resultados obtidos nesta implementação demonstram que a arquitetura utiliza 3946 LUTs, é capaz de operar à 76 MHz e alcança throughput de 6,75 milhões de amostras por segundo. O terceiro trabalho relacionado à codificação CAVLC [Chien; et. al 2006] apresenta uma arquitetura paralela. Esta solução foi sintetizada para standard cells em tecnologia 0,18 µm e apresentou uma freqüência máxima de 125 MHz. Esta arquitetura utiliza 27 ciclos de relógio para processar um bloco 4x4 e processa menos de uma amostra por ciclo de relógio. Ela
apresenta throughput de 74,04 milhões de amostras por segundo. Dos resultados de tais trabalhos é possível perceber que a solução aqui proposta para o codificador CAVLC apresenta algumas características singulares. Comparando-se a solução apresentada com a desenvolvida por [Amer, Badawy and Jullien 2004] nota-se que a primeira possui throughput 4,3 vezes menor que a segunda, porém utilizando 27 vezes menos recursos de hardware. Comparando-se a solução desenvolvida neste trabalho com aquela apresentada em [Sahin and Hamzaoglu 2005], observa-se que a primeira apresenta throughput 17,4 vezes maior que a segunda, usando aproximadamente a metade dos recursos de hardware. Finalmente, comparando-se a implementação proposta neste trabalho com aquela apresentada em [Chien; et. al 2006], verifica-se que a primeira atinge o dobro do throughput obtido pela segunda. Em termos de uso de recursos a comparação não pôde ser feita uma vez que as tecnologias alvo são muito diferentes (FPGA e standard cells). Através de tais comparações é possível concluir que a arquitetura para o codificador CAVLC aqui projetada apresenta interessantes benefícios em relação às outras publicações. 7. Conclusão e trabalhos futuros Este trabalho apresentou o projeto de arquiteturas para o codificador de entropia segundo o perfil baseline do padrão H.264/AVC de compressão de vídeo. Tal codificador é composto por dois blocos principais: o codificador Exp-Golomb e o codificador CAVLC. Foram propostas arquiteturas para ambos os blocos, as quais foram descritas em VHDL e sintetizadas para o FPGA Virtex-II da Xilinx. Os resultados de síntese indicaram que o codificador Exp-Golomb teve uma utilização de 341 LUTs, sendo capaz de operar a uma freqüência máxima de operação de 122,76 MHz e atingindo throughput médio de 10,2 milhões de amostras por segundo. A arquitetura para o codificador CAVLC utilizou 3137 LUTs atingindo uma freqüência máxima de operação de 117,62 MHz. Como esta é capaz de processar uma amostra por ciclo de relógio, o throughput atingido é de 117,62 milhões de amostras por segundo. Das comparações entre tais resultados e resultados de trabalhos relacionados pôde-se notar que o projeto de ambas as arquiteturas resultaram em características interessantes. A integração do codificador Exp-Golomb e do codificador CAVLC está em andamento, mas algumas estimativas já podem ser geradas baseadas em resultados preliminares. Estas estimativas indicam que o codificador de entropia completo utilizará aproximadamente 3500 LUTs, atingindo throughput de 100 milhões de amostras por segundo. Tal throughput é suficiente para processar vídeos HDTV (1920x1080) em tempo real. Como trabalhos futuros, pretende-se finalizar a integração de ambos codificadores e, assim, obter um codificador de entropia completo para o perfil baseline do padrão H.264/AVC de compressão de vídeo. 8. Referências Amer, I., Badawy, W., and Jullien, G. (2004) Towards MPEG-4 Part 10 System on Chip: a VLSI Prototype for Context Based Adaptive Variable Length Coding (CAVLC), In: IEEE Workshop on Signal Processing Systems, pp. 275-279. Chien, C., Lu, K., Shih, Y., and Guo, J. (2006) A High Performance CAVLC Encoder Design for MPEG-4 AVC/H.264 Video Coding Applications, In: International Symposium on Circuits and Systems - ISCAS, pp. 3838-3841. Di, W., Wen, G., Mingzeng, H., and Zhenzhou, J. (2003) An Exp-Golomb Encoder and Decoder Architecture for JVT/AVS, IEEE Transactions on Circuits and Systems for Video Technology, vol. 2, no. 21-24, pp. 910-913.
ITU - INTERNATIONAL TELECOMMUNICATION UNION. ITU-T Recommendation H.264 (03/05) (2005): Advanced Video Coding for Generic Audiovisual Services. Richardson, I. (2003), H.264 and MPEG-4 Video Compression Video Coding for Next- Generation Multimedia, Chichester: John Wiley and Sons. Sahin, E., and Hamzaoglu, I. (2005) A High Performance and Low Power Hardware Architecture for H.264 CAVLC Algorithm, In: 13th European Signal Processing Conference, Antalya, Turkey. Salomon, D. (2000), Data Compression: The Complete Reference, 2. ed. New York: Springer. XILINX INC. Virtex-II Pro and Virtex-II Pro X Platform FPGAs: Complete Data Sheet. (2006). Disponível em: <www.xilinx.com>. Acesso em: mar. 2006.