Guilherme Maciel Ferreira




Implementação de um Codificador de Vídeo H.264/AVC em Java




                       Floria...
i




           Universidade Federal de Santa Catarina


           Bacharelado em Ciências da Computação




Implementaç...
i




        Implementação de um Codificador de Vídeo H.264/AVC em Java
                         Guilherme Maciel Ferreir...
i




Dedicatória


       Dedico este trabalho em memória dos meus falecidos pais, principalmente a minha mãe,
Amélia Mac...
v




Agradecimentos


       Agradeço primeiramente aos meus pais, que com muito esforço deram uma educação de
qualidade ...
v




Resumo


Orientador: Prof. Cristian Koliver
Área de Concentração: Processamento Digital de Imagens
Palavras-chave: C...
v




Abstract


Adviser: Prof. Cristian Koliver
Concentration area: Digital Image Processing
Key-words: Video coding and ...
v




Lista de figuras


FIGURA 2.1 – DIAGRAMA DO CODIFICADOR DE VÍDEO [1]...................................................
i



FIGURA APD.2 – ESTATÍSTICAS DO ARQUIVO SENDO REPRODUZIDO...................................107



FIGURA APD.3 – INTE...
Lista de tabelas


TABELA 4.1 – RESUMO DAS ESPECIFICAÇÕES DO PROJETO PARA VÍDEO DE ENTRADA....18



TABELA 4.2 – RESUMO DA...
Sumário



ACRÔNIMOS.........................................................................................................
2.3.1.1 Caminho de codificação...............................................................................................
6.2.2 TRANSPORTE E ARMAZENAMENTO.............................................................................................
D1 YUVPLAYER.................................................................................................................
Acrônimos


AVC: Advanced Video CODEC.
CABAC: Context-based Adaptive Binary Arithmetic Coding.
CAVLC: Context-based Adapti...
Glossário


Artefato
        Refere-se a algum tipo de distorção visual em uma imagem.


Artefato de blocagem
        Trad...
Luma
       Corresponde às amostras do sinal acromático (componente Y do espaço de cor YCbCr), ou
       brilho. Segundo [...
1




Capítulo 1: Introdução e Motivação


        O H.264 é um padrão para compressão de vídeo desenvolvido pela ITU-T Vi...
2



        cartões inteligentes, entre outros. O que abre um grande leque de consumidores para os
        produtos desen...
3




Capítulo 2: Codificação de Vídeo H.264


       Em um primeiro momento, este capítulo aborda de maneira geral os con...
4



relação entre esses componentes é 4:1:1, então o componente Y consiste de uma matriz 640x480 e
os outros dois consist...
5



do sinal amostrado que é função de duas coordenadas espaciais, ou seja, a = f(x,y) onde x e y são as
duas dimensões. ...
6



2.1.3.3 Quantização

        A quantização é basicamente uma redução na amplitude do sinal por meio de uma divisão
se...
7




2.2.1.1 Mudança na unidade espacial

        A fatia (ou slice) tem grande importância no H.264 uma vez que agora el...
8



2.2.2.4 Múltiplos Quadros de Referência

        Uma novidade neste padrão é a possibilidade de quadros com Compensaç...
9




2.2.3.2 Transformada com bloco de tamanho menor

          Enquanto os padrões anteriores realizam a transformada em...
10




2.2.4.1 Context Adaptive Variable Length Coding (CAVLC)

        A Codificação de Largura Variável (CAVLC) mapeia u...
11




2.2.5.1 Fatias SI e SP

       Esses quadros permitem intercâmbio e sincronização entre quadros, sendo SI de Switch...
12



acúmulo dessas pequenas melhorias proporciona uma grande taxa de compactação por parte desse
padrão.




2.3.1 Esque...
13



         No modo Intra, P é formado a partir de amostras da fatia atual que foram previamente
codificadas, decodific...
14




Capítulo 3: Codificação de Vídeo em Java


        No presente momento serão explicados os aspectos relevantes a ce...
15




3.2     Java Media Framework (JMF)


        A Java Media Framework (JMF) é uma API destinada a incorporar dados mu...
16




-      Demultiplexer: representa um demultiplexador, necessário para suportar novos tipos de
       arquivos. No ca...
17



trilha de áudio MP3 da trilha de vídeo, é utilizado o mesmo Codec para decodificar o MP3 de ambos
os tipos de arquiv...
18




Capítulo 4: Especificações do Codificador H.264 em Java


        Como todo software, o codificador implementado ne...
19




                 FIGURA 4.1 – (A) ESTRUTURA E (B) EXEMPLO DE QUADRO YUV 4:2:0 PLANAR.




4.1.2 Resolução, taxa de ...
20




4.2.1 Perfis


         De acordo com [26], um perfil especifica qual sintaxe de codificação (algoritmo) é usada,
e...
21




Capítulo 5: Desenvolvimento do Codificador H.264 em Java


        O comitê criador do padrão H.264 disponibilizou ...
22



         O método process da classe H264Encoder possui dois argumentos, ambos objetos da
classe Buffer, onde o prime...
23




5.2.1 I_PCM


       O modo I_PCM é uma alternativa à predição intra e consiste em transmitir os valores das
amostr...
24



possui a menor distorção por meio da função find_sad_16x16 e por fim aplica a transformada e
quantização usando a fu...
25



então quantizados e reordenados. Os blocos –1 (contendo dezesseis coeficientes), 16 (com quatro
coeficientes) e 17 (...
26




5.4     Transformada, Quantização e Reordenação


        No código desenvolvido neste trabalho os algoritmos de tr...
27




                        FIGURA 5.3 – QUANTIZAÇÃO DOS COEFICIENTES DA DCT [48].




5.4.3 Reordenação


       A reo...
28




                    FIGURA 5.4 – REORDENAÇÃO ZIG-ZAG PARA BLOCOS 4X4 LUMA (MODO FRAME).


          No codificador,...
29




5.5.1 Exp-Golomb


5.5.1.1 Conceito

       Exp-Golomb são códigos de largura variável com construções regulares [1...
30




                     v                   code_num        Código Exp-Golomb

                     0                 ...
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Implementação de um Codificador de Vídeo H.264/AVC em Java
Upcoming SlideShare
Loading in …5
×

Implementação de um Codificador de Vídeo H.264/AVC em Java

4,814 views
4,701 views

Published on

Java implementation of H.264/AVC

Published in: Technology, News & Politics
2 Comments
1 Like
Statistics
Notes
No Downloads
Views
Total views
4,814
On SlideShare
0
From Embeds
0
Number of Embeds
10
Actions
Shares
0
Downloads
192
Comments
2
Likes
1
Embeds 0
No embeds

No notes for slide

Implementação de um Codificador de Vídeo H.264/AVC em Java

  1. 1. Guilherme Maciel Ferreira Implementação de um Codificador de Vídeo H.264/AVC em Java Florianópolis 2009
  2. 2. i Universidade Federal de Santa Catarina Bacharelado em Ciências da Computação Implementação de um Codificador de Vídeo H.264/AVC em Java Trabalho de Conclusão de Curso submetido à Universidade Federal de Santa Catarina como parte dos requisitos para a obtenção do grau de Bacharel em Ciências da Computação. Guilherme Maciel Ferreira Florianópolis, Outubro de 2009
  3. 3. i Implementação de um Codificador de Vídeo H.264/AVC em Java Guilherme Maciel Ferreira Bacharelado em Ciências da Computação Prof. Cristian Koliver, Dr. Orientador Prof. Roberto Willrich, Dr. Prof. Responsável Banca examinadora: Prof. Roberto Willrich, Dr. Prof. Cristian Koliver, Dr. Mateus K. Ludwich, Ba.
  4. 4. i Dedicatória Dedico este trabalho em memória dos meus falecidos pais, principalmente a minha mãe, Amélia Maciel Ferreira (1950-2007), que sempre me apoiou em meus projetos e me ensinou que perseverança, acima de tudo, é o que nos leva a alcançar nossos objetivos.
  5. 5. v Agradecimentos Agradeço primeiramente aos meus pais, que com muito esforço deram uma educação de qualidade aos meus irmãos e a mim. Um agradecimento especial ao meu orientador, Prof. Cristian Koliver, que sempre foi muito atencioso, dando feedback sobre os resultados do trabalho. Ao Prof. Jean-Marie Farines, que me incentivou a dar continuidade ao projeto durante o primeiro ano de desenvolvimento. E ao Prof. Willrich que por muitas vezes fez a ponte entre o Departamento de Automação e Sistemas (DAS) e o Departamento de Informática e Estatística (INE). Também tenho que agradecer a sociedade brasileira como um todo, pois foram verbas públicas que me subsidiaram durante esses anos de estudo. Obrigado Brasilllll!
  6. 6. v Resumo Orientador: Prof. Cristian Koliver Área de Concentração: Processamento Digital de Imagens Palavras-chave: Codificação e compressão de vídeo, padrão H.264, C, Java, Java Media Framework (JMF), CODEC, Orientação a objetos. Este trabalho de conclusão descreve o projeto e implementação de um codificador de vídeo (encoder) no padrão H.264 usando a linguagem de programação Java. A escolha desse padrão para implementação deveu-se à inexistência de implementações do H.264 independentes de plataforma e ao crescente interesse nesse padrão uma vez que ele vem sendo usado como substituto ao MPEG- 2, devido à sua maior eficiência na compactação de vídeo, em termos de taxa de compressão e qualidade obtida. Uma vez que o código fonte usado como base para o desenvolvimento deste projeto foi originalmente escrito em linguagem C, este trabalho também descreve as modificações na arquitetura do codificador original, baseado em um modelo de arquitetura estruturada, para um modelo orientado a objetos. Tal modelo poderá ser utilizado como base para novas implementações do codificador H.264 ou mesmo de outros padrões. Por fim, neste trabalho é realizada uma comparação do desempenho da implementação do codificador em linguagem C com esta implementação em linguagem Java, em termos de parâmetros como velocidade e consumo de memória, dentre outros , sendo avaliada a a viabilidade do uso deste codificador para aplicações multimídia interativas, como videofone. Por ser um trabalho de implementação, há um grande nível de detalhamento em relação ao funcionamento do codificador H.264. Alguns detalhes presentes neste trabalho não estão disponíveis em nenhum material de referência.
  7. 7. v Abstract Adviser: Prof. Cristian Koliver Concentration area: Digital Image Processing Key-words: Video coding and compression, H.264 standard, C, Java, Java Media Framework (JMF), CODEC, Object orientation. This graduation conclusion work describe the project and implementation of a video encoder in H.264 standard using the Java programming language. The choice of this standard to implement is given by the nonexistence of platform independent H.264 implementations and the rising interest in this standard, once its becoming a replacement for MPEG-2 due its greater video encoding efficiency, in terms of compression ratio and quality obtained. Once the source code used as reference to this project development was originally written in C language, this work also describe the architectural modifications in the original encoder, based on a structured architecture model, to a object oriented model. This model can be used as basis to new H.264 encoder implementations or even other standards. Finally, in this work is performed a comparison among the C and the Java encoder implementations performance, in parameters terms as speed and memory consumption, among others, and assessed the feasibility of using this encoder for interactive multimedia applications, such as videophone. As a implementation work, there's a high level of details on the H.264 encoder operation. Some details in this work are not available in any reference material.
  8. 8. v Lista de figuras FIGURA 2.1 – DIAGRAMA DO CODIFICADOR DE VÍDEO [1]............................................................3 FIGURA 2.2 – REPRESENTAÇÃO TRIDIMENSIONAL DA TRANSFORMAÇÃO DISCRETA DE COSSENOS (DCT). ANTES DA TRANSFORMADA (ESQUERDA) E DEPOIS DA TRANSFORMAÇÃO (DIREITA).............................................................................................................5 FIGURA 2.3 – MODELO DE ENCADEAMENTO DOS PROCESSOS NO CODIFICADOR PADRÃO H.264 [4]...............................................................................................................................................12 FIGURA 3.1 – ESTRUTURA DE UM PROCESSADOR COM OS ESTÁGIOS DE PROCESSAMENTO.............................................................................................................................16 FIGURA 4.1 – (A) ESTRUTURA E (B) EXEMPLO DE QUADRO YUV 4:2:0 PLANAR......................19 FIGURA 5.1 – PARTIÇÃO CORRENTE (E) E PARTIÇÕES VIZINHAS (A, B, C E D)........................23 FIGURA 5.2 – ORDEM DE ESCANEAMENTO DOS BLOCOS 4X4 EM UM MACROBLOCO [1].....24 FIGURA 5.3 – QUANTIZAÇÃO DOS COEFICIENTES DA DCT [48]..................................................27 FIGURA 5.4 – REORDENAÇÃO ZIG-ZAG PARA BLOCOS 4X4 LUMA (MODO FRAME)................28 FIGURA APB.1 – DIAGRAMA DE CLASSE.....................................................................................103 FIGURA APB.2 – DIAGRAMA DE CLASSE.....................................................................................104 FIGURA APB.3 – DIAGRAMA DAS CLASSES DE MODO DE CODIFICAÇÃO..............................105 FIGURA APD.1 – PLAYER REPRODUZINDO UM ARQUIVO YUV.................................................107
  9. 9. i FIGURA APD.2 – ESTATÍSTICAS DO ARQUIVO SENDO REPRODUZIDO...................................107 FIGURA APD.3 – INTERFACE GRÁFICA DO CODIFICADOR DESENVOLVIDO NESTE TRABALHO.......................................................................................................................................108 FIGURA APD.4 – JANELA DE CONFIGURAÇÕES DO CODIFICADOR.........................................108 FIGURA ANB.1 - PASSOS PARA COMPRESSÃO DE IMAGENS USANDO O ALGORITMO JPEG COM O MODO DE OPERAÇÃO SEQUENCIAL...............................................................................115 FIGURA ANB.2 – REPRESENTAÇÃO TRIDIMENSIONAL DA TRANSFORMAÇÃO DCT: ANTES DA TRANSFORMAÇÃO (ESQUERDA); DEPOIS DA TRANSFORMAÇÃO (DIREITA)...................116 FIGURA ANB.4 – EXPLORAÇÃO DA CORRELAÇÃO TEMPORAL USANDO O ALGORITMO MPEG-1..............................................................................................................................................119
  10. 10. Lista de tabelas TABELA 4.1 – RESUMO DAS ESPECIFICAÇÕES DO PROJETO PARA VÍDEO DE ENTRADA....18 TABELA 4.2 – RESUMO DAS ESPECIFICAÇÕES DO PROJETO PARA VÍDEO DE SAÍDA...........19 TABELA 5.1 – OITO PRIMEIROS CÓDIGOS EXP_GOLOMB PARA UE(V).....................................29 TABELA 5.2 – OITO PRIMEIROS CÓDIGOS EXP_GOLOMB PARA SE(V)......................................30 TABELA 5.3 – EXEMPLO DE PARÂMETROS A SEREM CODIFICADOS........................................30 TABELA APC.1 – MÓDULOS DO CÓDIGO DE REFERÊNCIA.......................................................106 TABELA ANA.1 – PERFIS DO MPEG-4 PARTE 10 (H.264)............................................................109 TABELA ANA.2 – NÍVEIS DO MPEG-4 PARTE 10 (H.264)..............................................................110
  11. 11. Sumário ACRÔNIMOS......................................................................................................................................XV GLOSSÁRIO......................................................................................................................................XVI CAPÍTULO 1: INTRODUÇÃO E MOTIVAÇÃO......................................................................................1 1.1 MOTIVAÇÕES.........................................................................................................................................1 1.2 ORGANIZAÇÃO DO DOCUMENTO..................................................................................................................2 CAPÍTULO 2: CODIFICAÇÃO DE VÍDEO H.264..................................................................................3 2.1 PASSOS NA CODIFICAÇÃO DE VÍDEO PADRÃO PELO H.264.............................................................................3 2.1.1 PRÉ-PROCESSAMENTO.........................................................................................................................3 2.1.2 MODELO TEMPORAL.............................................................................................................................4 2.1.2.1 Predição Inter Quadro................................................................................................................4 2.1.3 MODELO ESPACIAL..............................................................................................................................4 2.1.3.1 Predição Intra Quadro................................................................................................................4 2.1.3.2 Transformada.............................................................................................................................4 2.1.3.3 Quantização................................................................................................................................6 2.1.4 CODIFICAÇÃO POR ENTROPIA.................................................................................................................6 2.2 MELHORIAS ADOTADAS NO PADRÃO H.264..................................................................................................6 2.2.1 MUDANÇAS ESSENCIAIS.........................................................................................................................6 2.2.1.1 Mudança na unidade espacial....................................................................................................7 2.2.2 MELHORIAS NO MODELO TEMPORAL........................................................................................................7 2.2.2.1 Compensação de Movimento com Blocos de Tamanho Variável (VBSMC)...............................7 2.2.2.2 Compensação de Movimento com amostras precisão de ¼ de pixel (Qpel)..............................7 2.2.2.3 Vetores de movimento além dos limites do quadro....................................................................7 2.2.2.4 Múltiplos Quadros de Referência................................................................................................8 2.2.2.5 Filtro Anti-Blocagem...................................................................................................................8 2.2.2.6 Predição com peso (Weighted Prediction)..................................................................................8 2.2.3 MELHORIAS NO MODELO ESPACIAL..........................................................................................................8 2.2.3.1 Predição espacial (predição intra quadro)..................................................................................8 2.2.3.2 Transformada com bloco de tamanho menor.............................................................................9 2.2.3.3 Transformada de bloco hierárquico............................................................................................9 2.2.3.4 Transformada com palavra de pequeno comprimento...............................................................9 2.2.3.5 Transformada inversa exata.......................................................................................................9 2.2.4 MELHORIAS NA CODIFICAÇÃO POR ENTROPIA.............................................................................................9 2.2.4.1 Context Adaptive Variable Length Coding (CAVLC).................................................................10 2.2.4.2 Context Adaptive Binary Arithmetic Coding (CABAC)..............................................................10 2.2.4.3 Exponecial Golomb Variable Length Coding (Exp-Golomb).....................................................10 2.2.5 MELHORIAS NA ROBUSTEZ E TRANSPORTE..............................................................................................10 2.2.5.1 Fatias SI e SP...........................................................................................................................11 2.2.5.2 Seqüência Flexível de Macrobloco (FMO)................................................................................11 2.2.5.3 Seqüência Arbitrária de Fatia (ASO)........................................................................................11 2.2.5.4 Fatias Redundantes (RS).........................................................................................................11 2.2.5.5 Particionamento de Dado (DP).................................................................................................11 2.3 FUNCIONAMENTO DO CODIFICADOR H.264.................................................................................................11 2.3.1 ESQUEMA........................................................................................................................................12
  12. 12. 2.3.1.1 Caminho de codificação...........................................................................................................12 2.3.1.2 Caminho de reconstrução.........................................................................................................13 CAPÍTULO 3: CODIFICAÇÃO DE VÍDEO EM JAVA..........................................................................14 3.1 PLATAFORMA JAVA..............................................................................................................................14 3.1.1 MANIPULAÇÃO DE DADOS.....................................................................................................................14 3.2 JAVA MEDIA FRAMEWORK (JMF)...........................................................................................................15 3.2.1 HISTÓRICO.......................................................................................................................................15 3.2.2 COMPONENTES.................................................................................................................................15 CAPÍTULO 4: ESPECIFICAÇÕES DO CODIFICADOR H.264 EM JAVA...........................................18 4.1 VÍDEO DE ENTRADA...............................................................................................................................18 4.1.1 FORMATO DO QUADRO........................................................................................................................18 4.1.2 RESOLUÇÃO, TAXA DE QUADROS E TAXA DE BITS.......................................................................................19 4.2 VÍDEO DE SAÍDA...................................................................................................................................19 4.2.1PERFIS............................................................................................................................................20 4.2.1.1 Baseline....................................................................................................................................20 4.2.2 ORIENTAÇÃO DA PALAVRA DE DADO (ENDIANESS)....................................................................................20 CAPÍTULO 5: DESENVOLVIMENTO DO CODIFICADOR H.264 EM JAVA......................................21 5.1 LEITURA DOS QUADROS DO ARQUIVO YUV.................................................................................................21 5.1.1 FUNÇÃO ENCODE_ONE_FRAME.............................................................................................................21 5.1.2 FUNÇÃO READONEFRAME..................................................................................................................22 5.2 PREDIÇÃO INTRA QUADRO.....................................................................................................................22 5.2.1 I_PCM..........................................................................................................................................23 5.2.2 INTRA 16X16 LUMA..........................................................................................................................23 5.2.2 INTRA 8X8 CHROMA..........................................................................................................................25 5.3 PREDIÇÃO INTER QUADRO.....................................................................................................................25 5.4 TRANSFORMADA, QUANTIZAÇÃO E REORDENAÇÃO.......................................................................................26 5.4.1 TRANSFORMADA................................................................................................................................26 5.4.2 QUANTIZAÇÃO...................................................................................................................................26 5.4.3 REORDENAÇÃO.................................................................................................................................27 5.5 CODIFICAÇÃO POR ENTROPIA..................................................................................................................28 5.5.1 EXP-GOLOMB...................................................................................................................................29 5.5.1.1 Conceito....................................................................................................................................29 5.5.1.2 Aplicação..................................................................................................................................30 5.5.2 CAVLC.........................................................................................................................................30 5.5.2.1 Codificação do número de coeficientes diferentes de zero e 1s em carreira............................31 5.5.2.2 Codificação do sinal de cada 1 em carreira..............................................................................32 5.5.2.3 Codificação da magnitude dos coeficientes diferentes de zero remanescentes.......................32 5.5.2.4 Codificação do número de zeros antes do último coeficiente...................................................32 5.5.2.5 Codificação das seqüências de zeros antes de cada coeficiente diferente de zero.................33 5.6 GRAVAÇÃO DO ARQUIVO CODIFICADO........................................................................................................33 5.6.1 FORMATOS DE SAÍDA..........................................................................................................................33 5.6.1.1 Fluxo de bits puro.....................................................................................................................33 5.6.1.2 Container MP4..........................................................................................................................34 CAPÍTULO 6: CONCLUSÕES.............................................................................................................35 6.1 FATORES TÉCNICOS..............................................................................................................................35 6.1.1 DIFICULDADES DURANTE O DESENVOLVIMENTO...........................................................................................35 6.2 CONSIDERAÇÕES PARA O FUTURO.............................................................................................................35 6.2.1 DESEMPENHO DE ALGORITMOS..............................................................................................................35
  13. 13. 6.2.2 TRANSPORTE E ARMAZENAMENTO...........................................................................................................36 6.2.3 PERFIS...........................................................................................................................................36 6.2.4 DECODIFICADOR................................................................................................................................36 APÊNDICE A: CÓDIGO-FONTE..........................................................................................................37 A1 CLASSES DE SUPORTE...........................................................................................................................37 A1.1 CLASSE REGISTRY.............................................................................................................................37 A2 CLASSES PARA LEITURA DO ARQUIVO DE VÍDEO YUV....................................................................................38 A2.1 CLASSE YUVPARSER........................................................................................................................38 A2.2 CLASSE YUVVIDEOTRACK..................................................................................................................41 A2.3 CLASSE YUVFORMATHANDLER............................................................................................................43 A2.4 CLASSE YUVFRAMEBUFFER...............................................................................................................44 A3 CLASSES PARA ESCRITA NO ARQUIVO H.264..............................................................................................47 A3.1 CLASSE H264MUX...........................................................................................................................47 A3.2 CLASSE NALUBYTESTREAM...............................................................................................................49 A3.3 CLASSE NALU................................................................................................................................50 A4 CLASSES DE CODIFICAÇÃO 1 – CONTROLE ................................................................................................52 A4.1 CLASSE H264ENCODER.....................................................................................................................52 A4.2 CLASSE BASELINEPROFILEFACTORY.......................................................................................................55 A5 CLASSES DE CODIFICAÇÃO 2 – ALGORITMOS..............................................................................................56 A5.1 CLASSE INTEGERTRANSFORM................................................................................................................56 A5.2 CLASSE ZIGZAGFRAMESCANNER..........................................................................................................59 A5.3 CLASSE INTEGERROUNDQUANTIZER.......................................................................................................60 A6 CLASSES DE CODIFICAÇÃO 3 – MODOS DE CODIFICAÇÃO...............................................................................64 A6.1 INTERFACE ENCODINGMODE.................................................................................................................64 A6.2 CLASSE ABSTRACTENCODINGMODE.......................................................................................................65 A6.3 CLASSE INTRA16X16ENCODINGMODE....................................................................................................66 A6.4 CLASSE IPCMENCODINGMODE...........................................................................................................69 A6.5 CLASSE INTRA16X16LUMAABSTRACTPREDICTOR......................................................................................70 A6.6 CLASSE INTRA8X8CHROMAABSTACTPREDICTOR.......................................................................................75 A6.7 CLASSE INTRA16X16LUMADCPREDICTOR..............................................................................................81 A6.8 CLASSE INTRA8X8CHROMADCPREDICTOR..............................................................................................82 A7 CLASSES PARA MEDIÇÃO DE DISTORÇÃO.....................................................................................................84 A7.1 INTERFACE DISTORTIONMETRIC.............................................................................................................84 A7.1 CLASSE SATD................................................................................................................................84 A8 CLASSES PARA CODIFICAÇÃO DE ENTROPIA.................................................................................................86 A8.1 CLASSE VLCTABLE...........................................................................................................................87 A8.2 CLASSE CAVLC..............................................................................................................................88 A9 CLASSES PARA CONTROLE DOS MACROBLOCOS VIZINHOS................................................................................96 A9.1 CLASSE MACROBLOCKACCESS..............................................................................................................96 A9.2 CLASSE MACROBLOCKACCESSNONMBAFF............................................................................................98 A9.3 CLASSE MACROBLOCKINFO..................................................................................................................99 A9.4 CLASSE MACROBLOCKPOSITION..........................................................................................................102 APÊNDICE B: DIAGRAMAS UML ....................................................................................................103 B1 CLASSES PARA ESCRITA NO ARQUIVO H.264............................................................................................103 B2 CLASSES DE CONTROLE DE CODIFICAÇÃO................................................................................................103 B3 CLASSES DE CODIFICAÇÃO....................................................................................................................104 APÊNDICE C: EQUIVALÊNCIA ENTRE OS MÓDULOS..................................................................106 APÊNDICE D: FERRAMENTAS DE SUPORTE ...............................................................................107
  14. 14. D1 YUVPLAYER....................................................................................................................................107 D2 AVCENCODER..................................................................................................................................108 ANEXO A: PARÂMETROS DO PADRÃO H.264 .............................................................................109 A1 PERFIS DO PADRÃO H.264..................................................................................................................109 A2 NÍVEIS DO PADRÃO H.264...................................................................................................................110 ANEXO B: ALGORITMOS DE COMPRESSÃO ...............................................................................111 B1 TIPOS DE COMPRESSÃO.......................................................................................................................111 B2 CATEGORIAS DE COMPRESSÃO..............................................................................................................111 B2.1 CODIFICAÇÃO DE ENTROPIA................................................................................................................111 B2.1.1 Supressão de sequências repetitivas......................................................................................112 B2.1.2 Codificação Estatística............................................................................................................112 B2.2 CODIFICAÇÃO DA FONTE....................................................................................................................113 B2.2.1 Codificação de Transformada.................................................................................................113 B2.2.2 Codificação Diferencial............................................................................................................114 B2.2.3 Quantização Vetorial...............................................................................................................114 B3 COMPRESSÃO DE IMAGEM.....................................................................................................................115 B3.1 O PADRÃO JPEG..........................................................................................................................115 B3.1.1 Passos da Codificação Progressiva........................................................................................115 B3.2 PADRÃO MPEG.............................................................................................................................117 B3.2.1 Quadros de Referência e Intracodificados..............................................................................118 B3.2.2 Compressão de Quadros I......................................................................................................120 B3.2.3 Compressão de Quadros P e B...............................................................................................120 REFERÊNCIAS BIBLIOGRÁFICAS..................................................................................................121
  15. 15. Acrônimos AVC: Advanced Video CODEC. CABAC: Context-based Adaptive Binary Arithmetic Coding. CAVLC: Context-based Adaptive Variable Length Coding. CBR: Constant Bit Rate. CIF: Common Interchange Format. É uma resolução de vídeo medindo 352 por 288 pixels. DCT: Discrete Cosine Transform. DPB: Decoded Picture Buffer. FPS: Frames per Second. JMF: Java Media Framework. MBAFF: Macroblock-Adaptive Frame-Field Coding. QCIF: Quarter Common Interchange Format. Um quarto de um CIF, mede 176 por 144 pixels. QP: Quantization Parameter. Ver Quantização. RBSP: Raw Byte Sequence Payload. RTP: Rapid Transport Protocol. VBR: Variable Bit Rate. VCL: Video Coding Layer. VLC: Variable Length Coding.
  16. 16. Glossário Artefato Refere-se a algum tipo de distorção visual em uma imagem. Artefato de blocagem Tradução do termo blocking artifacts que se refere ao padrão do bloco em uma seqüência comprimida devido à quantização individual de cada bloco, levando à discontinuidades entre os blocos adjacentes. Artefato de blocagem é uma das mais perceptíveis distorções visuais. CODEC Um CODEC (Compression Decompression Algorithm) é um programa que codifica e decodifica dados digitais com intuito de comprimir esses dados, reduzindo a quantidade de espaço necessária para armazenar ou a largura de banda para transmiti-los. Crominância (Chroma) Corresponde à amostra dos dois sinais de cor (U e V). Geralmente possui uma freqüência de amostragem menor em relação às amostras de luma. Fatia Intra (I-Slice) Uma fatia Intra codificada é comprimida sem fazer referência a nenhuma outra fatia em nenhum outro quadro, anterior ou posterior, na seqüência. Essa fatia é comprimida usando técnicas similares às empregadas na compressão de imagens estáticas, tal como as utilizadas na compressão JPEG. Fatia Predita (P-Slice) Fatias P são preditas de amostras decodificadas de um quadro de referência anterior. Isso significa que para decodificar uma fatia P em um dado instante de tempo, é necessário um quadro de referência anterior. Fatias P podem servir como referência para predizer fatias em outros quadros. Framework É um conjunto de classes que fornecem uma funcionalidade genérica comum a vários projetos de software. Diferente das bibliotecas, o Framework quem dita o fluxo de controle da aplicação, o que é chamado de Inversão de Controle.
  17. 17. Luma Corresponde às amostras do sinal acromático (componente Y do espaço de cor YCbCr), ou brilho. Segundo [4], luma é diferente de luminância, uma vez que esta é uma medida, definida pelo CIE, puramente fotométrica e independente de dispositivo. Partição É uma região do macrobloco que possui seu próprio Vetor de Movimento. Predição Processo no qual os valores de uma amostra são estimados com base em uma amostra previamente codificada. Quadro É o conjunto de amostras que formam uma imagem estática. Um vídeo é o conjunto de quadros (figuras estáticas) exibidos em intervalos de tempo. No caso de vídeo entrelaçado, um quadro é o conjunto dos campos superior e inferior, correspondentes às linhas pares e ímpares, respectivamente. Quadros por segundo (Frames per second) Representa a quantidade de quadros exibidos ou processados a cada segundo. Quadro Intra (I-Frame) Nos padrões anteriores, o quadro quem determinava o tipo dos macroblocos. Contudo, no padrão H.264 são as fatias quem determinam. Veja Fatia I. Quadro Predito (P-Frame) Nos padrões anteriores, o quadro quem determinava o tipo dos macroblocos. Contudo, no padrão H.264 são as fatias quem determinam. Veja Fatia P. Quantização É a redução da informação, por meio do truncamento de números, para obter uma maior taxa de compressão. O parâmetro de quantização QP seleciona o nível de truncamento dos coeficientes. Quanto mais alto o QP, maior o truncamento e compressão dos dados, e consequentemente menor a qualidade do vídeo decodificado.
  18. 18. 1 Capítulo 1: Introdução e Motivação O H.264 é um padrão para compressão de vídeo desenvolvido pela ITU-T Video Coding Experts Group (VCEG) em conjunto com a ISO/IEC MPEG que formaram uma parceria conhecida por Joint Video Team (JVT). O padrão H.264 foi baseado no padrão MPEG-4 Part 10 ou AVC (Advanced Video Coding). Sua versão final, formalmente chamada por ISO/IEC 14496-10, foi lançada em 2003. Posteriormente, foram desenvolvidas extensões da versão original do padrão, conhecidas por Fidelity Range Extensions (FRExt). O projeto do H.264/AVC foi norteado pela criação de um padrão de compressão de vídeo capaz de fornecer boa qualidade a uma taxa de bits baixa em relação aos padrões já existentes, como o MPEG-1, MPEG-2 e H.263. Outra meta do projeto foi a de criar um padrão que permitisse a codificação de vídeos com diferentes taxas de bits/resolução.. Uma lacuna ainda existente em relação ao padrão H.264, é que, a despeito da existência de várias implementações na forma de codificadores (encoders) e decodificadores/players (decoders), ainda não há implementações do codificador independentes de plataforma (processador + sistema operacional), o que exige novas implementações para novos dispositivos com plataformas muito específicas (por exemplo, dispositivos móveis como celulares). É pertinente salientar que, devido às melhorias introduzidas pelo padrão H.264 em relação ao seus antecessores, aumentou razoavelmente a complexidade dos algoritmos utilizados, exigindo otimizações no código que dificultam bastante a obtenção de implementações eficazes e, ao mesmo tempo, eficientes, condição essencial para o seu uso em máquinas com recursos computacionais (capacidade de processamento e memória, particularmente) restritos. O desenvolvimento deste trabalho também tem como objetivo fornecer uma implementação e um texto de fácil compreensão para estudo e desenvolvimento de outros codificadores. 1.1 Motivações O objetivo deste trabalho é preencher a lacuna exposta acima através da implementação de um codificador de vídeo H.264 independente de plataforma. A linguagem escolhida para tal é a linguagem Java. Tal escolha foi motivada pelos seguintes aspectos: 1. Código de máquina independente de plataforma: muito mais que uma linguagem orientada a objetos, Java é uma tecnologia na qual um programa Java é compilado gerando um bytecode (código de máquina) que é executado por qualquer máquina virtual Java (JVM); 2. Diversidade de ambientes e recursos para programação: além de possuir uma gama enorme de recursos para facilitar a programação, a máquina virtual Java é disponível em diversos equipamentos e ambientes, como navegadores, mainframes, SOs, celulares, palmtops e
  19. 19. 2 cartões inteligentes, entre outros. O que abre um grande leque de consumidores para os produtos desenvolvidos nessa plataforma; e 3. Desempenho: ao longo dos anos, foram agregadas à plataforma Java diversas otimizações que tornaram o desempenho de um programa Java próximo a um mesmo programa codificado em C++, com código compilado “nativo”. Dentre essas otimizações, destaca-se a compilação “especulativa”, que aproveita o tempo ocioso do processador para pré-compilar o bytecode para código nativo. Outro mecanismo - o HotSpot da Sun - guarda informações disponíveis somente em tempo de execução (por exemplo, número de usuários, processamento usado, memória disponível), que possibilitam que a JVM vá "aprendendo" e melhorando seu desempenho; Não obstante a implementação descrita neste trabalho ter tido, como referência, uma implementação pré-existente em C, nosso código não representa, de forma alguma, uma mera transcodificação de C para Java, o que, per si, já seria demasiado trabalhoso, dada não só à diferença entre os paradigmas de programação utilizados por essas linguagens, mas também a aspectos como formato e tipos de dados e uso de chamadas de sistemas específicas de plataforma (no caso do código em C). Nossa implementação teve como base a criação de modelo orientado a objetos a partir do código de referência em C, estruturado de forma procedural. O projeto desse modelo envolveu a aplicação de diversos conceitos de Engenharia de Software . 1.2 Organização do documento Este documento descreve os diversos aspectos relacionados à nossa implementação do codificador H.264 em Java e é estruturado da seguinte forma: o Capítulo 2 fornece o embasamento teórico necessário para entender o domínio do problema, abordando os conceitos fundamentais da codificação de vídeo com ênfase nas diferenças introduzidas pelo padrão H.264. A compressão deste capítulo parte da premissa que o leitor já conhece os fundamentos da compressão de vídeo; no Capítulo 3 são abordadas as tecnologias utilizadas na implementação do trabalho, a saber, a plataforma Java e a Java Media Framework; no Capítulo 4 são descritas algumas das premissas e restrições impostas por nossa implementação. Como o padrão H.264 é muito abrangente em relação às suas aplicações, esse capítulo é essencial para a compreensão do Capítulo 5, o qual detalha a nossa implementação, mencionando pontos chave de seu código-fonte bem como do código-fonte de referência; Por fim, o Capítulo 6 apresenta algumas conclusões obtidas após o desenvolvimento do trabalho e são mencionadas possíveis melhorias no projeto.
  20. 20. 3 Capítulo 2: Codificação de Vídeo H.264 Em um primeiro momento, este capítulo aborda de maneira geral os conceitos gerais relativos à codificação de vídeo. E em um segundo momento, trata sobre as melhorias e pontos principais da codificação de vídeo especificada pelo padrão H.264. O Anexo B contém informações mais detalhadas a respeito dos algoritmos de codificação de vídeo. A maioria dos documentos de referência utiliza o termo figura (picture) para designar tanto frames (amostras progressivas) quanto fields (amostras entrelaçadas). Entretanto, como o codificador descrito neste trabalho se restringe a vídeos progressivos, utilizaremos apenas o termo quadro (frame) para designar tanto figura quanto quadro. 2.1 Passos na Codificação de Vídeo padrão pelo H.264 Esta seção aborda de maneira geral o modo pelo qual funciona a compactação (ou codificação) de vídeo para o formato H.264. Será adotada a mesma divisão apresentada por Richardson [1], que consiste em separar a codificação de vídeo em três grandes blocos: modelo temporal, modelo espacial e codificação por entropia. A Figura 2.1 mostra o diagrama do codificador. Conforme esse diagrama, o codificador recebe como entrada um arquivo ou um stream de vídeo gerado em tempo real na forma “crua” (raw video), no qual cada quadro é representado por matrizes de pixels contendo os valores dos componentes Y, U e V; a saída é o vídeo codificado (comprimido). Nas seções seguintes, são detalhados os papeis de cada bloco desse diagrama. FIGURA 2.1 – DIAGRAMA DO CODIFICADOR DE VÍDEO [1]. 2.1.1 Pré-Processamento Antes de iniciar a compressão propriamente dita, o quadro de entrada é dividido em blocos de 8x8 pixels (no H.264, 4x4, como veremos adiante). Seja, por exemplo, uma imagem de 640x480 pixels representada por três componentes: a luminância Y e as diferenças de cores U e V. Se a
  21. 21. 4 relação entre esses componentes é 4:1:1, então o componente Y consiste de uma matriz 640x480 e os outros dois consistem de matrizes 320x240. A preparação dos blocos irá fornecer para o passo seguinte 4800 blocos para o componente Y, 1200 para U e 1200 para V. 2.1.2 Modelo Temporal O modelo temporal tem como objetivo reduzir a redundância temporal, ou seja, porções da imagem que se repetem por vários quadros. 2.1.2.1 Predição Inter Quadro Predição inter quadro é o processo que consiste em estimar valores dos bloco de um quadro baseado nos valores dos blocos de quadros previamente codificados. 2.1.3 Modelo Espacial Este modelo implica em um conjunto de técnicas para redução da redundância espacial, aquela presente em um mesmo quadro. 2.1.3.1 Predição Intra Quadro A Compensação de Movimento é uma forma de predição, onde o codificador cria uma predição a partir de uma área do quadro atual baseada em quadros de anteriores (ou posteriores) e subtraí essa predição do quadro original para formar um resíduo. Da mesma forma, a predição Intra Quadro consiste em criar valores residuais a partir de predições realizadas por meio de amostras do mesmo quadro, ao invés de outros quadros. 2.1.3.2 Transformada O processo de transformação consiste em converter os valores dos resíduos, que estão no domínio espacial, para outro o domínio de frequência. Devido ao fato que amostras no domínio espacial variam muito ao longo do tempo, elas não são comprimidas muito bem pelas técnicas de entropia. Já quando as amostras são convertidas para o domínio da frequência, elas se tornam muito mais adequadas para compressão por entropia. A técnica mais comumente utilizada para transformadas em codificação de vídeo é a DCT (discrete cosine transform). A transformada dos blocos ocorre componente por componente e, dentro de um componente, da esquerda para a direita, do topo para a base, em um esquema chamado de ordenamento não-entrelaçado. Os blocos são compostos de 64 valores que representam a amplitude
  22. 22. 5 do sinal amostrado que é função de duas coordenadas espaciais, ou seja, a = f(x,y) onde x e y são as duas dimensões. Após a transformação, obtém-se a função c= g(Fx,Fy) onde c é um coeficiente e Fx e Fy são as frequências espaciais para cada direção. O resultado é outro bloco de 64 valores onde cada valor representa um coeficiente DCT - isto é, uma determinada frequência - e não mais a amplitude do sinal na posição amostrada (x,y). O coeficiente g(0,0) correspondente às frequências zero, é chamado de coeficiente DC. Ele representa o valor médio das 64 amostras. Como em um bloco representando uma porção da imagem os valores amostrados geralmente variam pouco de um ponto para outro, os coeficientes de mais baixa frequência serão altos e os de média e alta frequência terão valores baixos ou zero, podendo ser descartados. A energia do sinal é concentrada nas frequências espaciais mais baixas. A Figura 2.2 [6] é uma representação tridimensional da transformação DCT. FIGURA 2.2 – REPRESENTAÇÃO TRIDIMENSIONAL DA TRANSFORMAÇÃO DISCRETA DE COSSENOS (DCT). ANTES DA TRANSFORMADA (ESQUERDA) E DEPOIS DA TRANSFORMAÇÃO (DIREITA ). Em uma imagem, os coeficientes de média e baixa frequência ocorrerão quando há uma mudança brusca (em um desenho preto-e-branco, a mudança de uma zona totalmente branca para um zona com uma linha preta representando parte da figura, por exemplo). Em uma imagem da natureza, por outro lado, as transições entre as zonas da imagem são suaves. A transformada do H.264/AVC introduz duas grandes novidades: transformada usando apenas aritmética inteira e operando sobre blocos menores. O código de referência [2] utiliza uma aproximação ortogonal da DCT que opera com números inteiros [33] para evitar divisões, as quais acumulam erros. Os padrões anteriores utilizam a transformada sob números de ponto-flutuante. O bloco sob o qual a transformada opera também dimuniu, de 8x8 para 4x4.
  23. 23. 6 2.1.3.3 Quantização A quantização é basicamente uma redução na amplitude do sinal por meio de uma divisão seguida por arredondamento. O objetivo por trás dessa redução de amplitude das amostras é transmitir valores que ocupem menos bits. Uma vez recebidos (ou descompactados), esses valores são redimensionados por meio de uma multiplicação, obtendo valores próximos aos originais. A quantização é o processo que mais acumula erros durante a codificação de vídeo. Dessa forma, o H.264/AVC possui algumas melhorias nesse processo com intuito de amenizar esses erros. 2.1.4 Codificação por Entropia A codificação por entropia converte uma série de símbolos, que representam os elementos da sequência de vídeo, em um fluxo de bits compactados apropriados para transmissão ou armazenamento [1]. Símbolos de entrada podem incluir coeficientes quantizados de transformadas, vetores de movimento (deslocamentos no eixo x e y para cada bloco com compensação de movimento), marcadores (códigos indicando pontos de sincronização), cabeçalhos (de macroblocos, quadros ou sequência de quadros) e informações suplementares (informações não essenciais para correta decodificação da mídia). 2.2 Melhorias adotadas no padrão H.264 Em 1998, a proposta do padrão H.264/AVC era dobrar a eficiência de codificação em relação a qualquer outro padrão de codificação de vídeo [6], o que significaria dividir pela metade a taxa de bit necessária dado um certo nível de fidelidade. O padrão H.264/AVC possibilita essa maior eficiência por meio de melhorias nos processos de codificação de vídeo existentes em padrões anteriores. As próximas seções descrevem brevemente as melhorias propostas e no Anexo A há uma tabela descrevendo quais desses elementos técnicos estão disponíveis a cada perfil. As melhorias que fazem parte do perfil Baseline serão abordadas novamente no capítulo 5, que descreve nosso código. 2.2.1 Mudanças essenciais O padrão H.264 define todo um novo conjunto de divisões de cada quadro do vídeo. Fatias, Macroblocos e Blocos continuam existindo, tal como nos padrões anteriores. Todavia, a forma como eles funcionam foi alterada.
  24. 24. 7 2.2.1.1 Mudança na unidade espacial A fatia (ou slice) tem grande importância no H.264 uma vez que agora ela é o elemento espacial independente básico [26]. No padrão H.262 (MPEG-2) há três tipos de quadros: I, P e B [15]. Esses tipos são determinados pela forma como os macroblocos do quadro foram codificados e, consequentemente, quais informações eles vão necessitar para serem decodificados. Quadros I são codificados sem fazer referência a qualquer outro quadro, usando apenas informações presentes neles mesmos. Quadros P usam informações de um outro quadro de referência preditas por meio da compensação de movimento. Quadros B usam informações preditas de mais de um quadro de referência (um antes e outro depois, por isso é bidirecional). No padrão H.264 os tipos I, P e B foram deslocados do nível de Quadro para o nível de Fatia. Dessa forma, existem fatias I, fatias P e fatias B, além de serem adicionados dois novos tipos de fatias: switching I pictures (SI) e switching P pictures (SP). Essas novas fatias visam reduzir significativamente a taxa de bits resultante da compressão. Para suprir a ausência de um quadro intra codificado – decorrente, por exemplo, de peradas de pacotes na rede – foi adicionado o quadro IDR, um quadro codificado contendo apenas fatias I ou SI e que serve como referência primária para os outros quadros. 2.2.2 Melhorias no Modelo Temporal Esta seção descreve brevemente os aspectos técnicos propostos pelo padrão para melhoria na habilidade de predizer os valores do conteúdo de um quadro a ser codificado. 2.2.2.1 Compensação de Movimento com Blocos de Tamanho Variável (VBSMC) Permite uma segmentação mais precisa das regiões de movimento de um quadro por meio de blocos com tamanhos variando entre 16x16 e 4x4. 2.2.2.2 Compensação de Movimento com amostras precisão de ¼ de pixel (Qpel) Possibilitam descrições mais precisas de deslocamento de áreas de movimento com precisão de até um quarto de pixel. 2.2.2.3 Vetores de movimento além dos limites do quadro No H.264/AVC é possível ao vetor de movimento apontar para áreas fora dos limites do quadro usado como referência.
  25. 25. 8 2.2.2.4 Múltiplos Quadros de Referência Uma novidade neste padrão é a possibilidade de quadros com Compensação de Movimento poderem fazer referência não apenas a um quadro, tal como no MPEG-2, mas que seja escolhido um dentre uma lista. Isso possibilita um significativo ganho de compressão quando o vídeo apresenta movimentos periódicos. Quadros P podem fazer referência a N quadros da lista 0; Quadros B podem ser usados como referência para outros quadros e usam quantidade arbitrária de quadros de referência da lista 0 e 1. 2.2.2.5 Filtro Anti-Blocagem Baseado no parâmetro de quantização, no modo de compressão e no movimento em uma cena, o Filtro Anti-Blocagem permite diferenciar artefatos de compressão (por exemplo as bordas quadradas dos blocos) do conteúdo da cena. Ele proporciona uma melhoria substancial nas qualidades objetiva e subjetiva do vídeo principalmente através da suavização das boradas dos blocos, reduzindo os artefatos típicos de vídeos codificados. 2.2.2.6 Predição com peso (Weighted Prediction) Além de especificar o deslocamento do vetor de movimento (i.e. quantos pixels uma área deve ser deslocada), no padrão H.264/AVC é possível especificar a dimensão do vetor, aumentando significativamente desempenho em casos especiais, tal como transições fade-to-black, fade-in e cross-fade. Este recurso não está presente no perfil Baseline. 2.2.3 Melhorias no Modelo Espacial Além das melhorias propostas no método de predição, foram aprimorados os processos de transformada, quantização e codificação de entropia. Nesta seção serão apresentadas as melhorias na trasnformada e na quantização. 2.2.3.1 Predição espacial (predição intra quadro) Da mesma forma como é feita a predição temporal – que utiliza amostras de quadros anteriores previamente decodificadas para predizer os valores das amostras do quadro sendo decodificado – a predição espacial utiliza amostras decodificadas do mesmo quadro para predizer os valores das amostras que estão sendo codificadas. A predição espacial é uma técnica comum na codificação de imagens estáticas, tal como JPEG.
  26. 26. 9 2.2.3.2 Transformada com bloco de tamanho menor Enquanto os padrões anteriores realizam a transformada em blocos de 8x8, o H.264/AVC baseia-se principalmente em transformadas sobre blocos de 4x4, visando acompanhar a diminuição do tamanho dos blocos na predição. Isso permite diminuir os artefatos de blocos e também manter maior nível de detalhes na cena. 2.2.3.3 Transformada de bloco hierárquico Em casos especiais é possível aplicar uma transformada Hadamard 2×2, 2×4 ou 4×4 nos coeficientes DC (de mais baixa frequência) dos blocos 4×4. Essa transformação extra estende a transformada 4×4 para os tamanhos 8×8, 8×16 (utilizadas para as amostras croma de um MB) ou 16×16 (utilizada para as amostras de um MB Intra especial denominado Intra_16×16). 2.2.3.4 Transformada com palavra de pequeno comprimento O padrão H.264/AVC utiliza palavras de 16 bits para aritmética, ao invés das palavras de 32 bits utilizadas nos padrões anteriores. Isso reduz a carga computacional das operações tanto no codificador quanto no decodificador. 2.2.3.5 Transformada inversa exata Nos padrões anteriores não era possível obter um transformada inversa exata, apenas um limite de tolerância a erros, resultando em diferença na qualidade do vídeo decodificado entre as várias implementações. O padrão H.264/AVC é o primeiro padrão a obter a mesma qualidade de vídeo decodificado entre as várias implementações de decodificadores [6], tudo graças à transformada DCT1 ser realizada sobre números inteiros ao invés de números de ponto flutuante. Tal como é apresentado em [33], transformação e quantização sobre números reais causam erros de precisão entre o codificador e o decodificador, além de serem mais difíceis de implementar e custosas para processar. 2.2.4 Melhorias na Codificação por Entropia Esta seção apresenta todos os métodos de codificação por entropia disponíveis no padrão H.264/AVC, entretanto, no perfil Baseline (o qual é implementado pelo presente trabalho), os coeficientes da transformada são codificados usando CAVLC2 e todos os outros elementos de sintaxe são codificados usando códigos de largura fixa ou Exp-Golomb de largura variável. 1 A transformada é na verdade realizada por meio de uma aproximação ortogonal da DCT [33]. 2 CABAC é utilizado no lugar de CAVLC em alguns perfis.
  27. 27. 10 2.2.4.1 Context Adaptive Variable Length Coding (CAVLC) A Codificação de Largura Variável (CAVLC) mapeia uma série de símbolos de entrada para uma série de códigos de tamanho variável. Símbolos que ocorrem com maior frequência são mapeados para códigos com tamanho menor e símbolos menos frequentes são mapeados para códigos de tamanho maior. O mapeamento entre valor real e código é feita utilizando uma tabela. No H.264/AVC foi incluída uma forma aprimorada da CAVLC, que determina qual a melhor tabela de mapeamento usar de acordo com o contexto. Assim, essa codificação é adaptável ao contexto. 2.2.4.2 Context Adaptive Binary Arithmetic Coding (CABAC) Um avançado método de codificação por entropia conhecido como Codificação Aritmética Binária Adaptável ao Contexto (CABAC) foi incluído no H.264/AVC que permite atribuir um tamanho não-inteiro (como 2,5 bits ao invés de 2 ou 3 bits) a um código (os códigos usados pela VLC são sempre de largura inteira). A CABAC é superior às codificações baseadas em Huffman em diversos aspectos [38], e se baseia na subdivisão recursiva de intervalos de números, sendo que a distribuição dos intervalos corresponde à distribuição de probabilidade dos símbolos. Ela é binária pelo fato de transformar qualquer valor em binário antes da codificação aritmética e adaptável ao contexto porque seleciona o modelo de probabilidade de cada elemento de sintaxe baseado em seu contexto, adaptando a probabilidade baseada nas estatísticas locais. A codificação CABAC consegue, em média, reduzir a taxa de bit de 9% a 14% em relação ao CAVLC (sem degradação na qualidade, uma vez que codificação por entropia é sem perda) [37]. Este recurso não está presente no perfil Baseline. 2.2.4.3 Exponecial Golomb Variable Length Coding (Exp-Golomb) Exp-Golomb é uma codificação ideal quando valores pequenos têm uma grande freqüência. Nela, o tamanho do código é proporcional ao valor a ser codificado e consiste de duas partes: uma codificação unária de tamanho variável e uma codificação binária de tamanho fixo (dado pelo valor da codificação unária). 2.2.5 Melhorias na Robustez e Transporte Os itens destacados nesta seção fazem parte das melhorias para evitar perda e erros em dados, além daquelas que possibilitam maior flexibilidade para operar em diversos ambientes de rede. Essas melhorias não representam mudanças no codificador de vídeo propriamente dito, VCL, mas na camada de abstração de rede, NAL.
  28. 28. 11 2.2.5.1 Fatias SI e SP Esses quadros permitem intercâmbio e sincronização entre quadros, sendo SI de Switching I e SP de Switching P. Este recurso não está presente no perfil Baseline. 2.2.5.2 Seqüência Flexível de Macrobloco (FMO) Essa nova característica permite que cada fatia de um quadro seja decodificada independentemente das outras fatias do mesmo quadro. 2.2.5.3 Seqüência Arbitrária de Fatia (ASO) Devido ao fato de cada fatia de um quadro poder ser decodificada independentemente das outras fatias do mesmo quadro, é possível enviar e receber as fatias de um quadro em qualquer ordem relacionada as outras fatias do mesmo quadro. Isso possibilita uma menor espera fim-a-fim em aplicações de tempo real distribuídas, particularmente quando usadas em redes com entrega de pacotes sem ordenação, tal como os protocolos da Internet. 2.2.5.4 Fatias Redundantes (RS) O codificador H.264/AVC possui a habilidade de enviar representações redundantes de regiões de um quadro, fornecendo uma cópia de segurança das regiões de uma figura que foram perdidas durante a transmissão. 2.2.5.5 Particionamento de Dado (DP) O particionamento de dado permite que um codificador reorganize o dado codificado em um pacote de vídeo, de modo a reduzir o impacto na transmissão de erros, colocando dados mais importantes em partições distintas dos dados menos importantes. 2.3 Funcionamento do codificador H.264 Tal como os padrões anteriores (MPEG1, MPEG2 e MPEG4 Parte 2), o padrão H.264/AVC não define um codificador explicitamente, mas uma sintaxe de fluxo de bits de vídeo codificado juntamente com um método para decodificar esse fluxo de bits. Na prática, um codificador de vídeo inclui os elementos funcionais básicos mostrados na figura 2.3; no H.264 esses elementos são um pouco diferente dos padrões anteriores, sendo que o
  29. 29. 12 acúmulo dessas pequenas melhorias proporciona uma grande taxa de compactação por parte desse padrão. 2.3.1 Esquema Conforme mostrado na figura 2.3, um codificador inclui dois caminhos, um caminho de codificação (representado pelas linhas em azul) e outro de reconstrução (em vermelho). No esquema mostrado nessa figura, o caminho de codificação “flui” da esquerda para a direita e é chamado em inglês de forward path, ou caminho para à frente. Todavia, preferimos utilizar o termo caminho de codificação pelo fato que esse é o sentido que realmente codifica o vídeo (o caminho de reconstrução é para suporte deste). Já o caminho de reconstrução segue o sentido oposto, da direita para a esquerda, e tem como principal objetivo fornecer os quadros e fatias de referência para serem utilizados pelo caminho de codificação, pois a codificação deve utilizar os quadros (e fatias) que estarão disponíveis no decodificador, não os quadros (e fatias) originais do arquivo lido, evitando assim o acúmulo de erros. FIGURA 2.3 – MODELO DE ENCADEAMENTO DOS PROCESSOS NO CODIFICADOR PADRÃO H.264 [4]. 2.3.1.1 Caminho de codificação Um quadro de entrada Fn é processado em unidades de macroblocos. Cada macrobloco pode ser codificado no modo Intra ou no modo Inter e, para cada bloco no macrobloco, uma predição P é formada com base nas amostras de figuras reconstruídas.
  30. 30. 13 No modo Intra, P é formado a partir de amostras da fatia atual que foram previamente codificadas, decodificadas e reconstruídas (sF’n na figura 2.3; perceba que são utilizadas amostras não filtradas para formar P). No modo Inter, P é formado a partir da predição de compensação de movimento de um ou dois quadros selecionados do conjunto de quadros de referência das listas 0 ou 1. Na figura 2.3, o quadro de referência é mostrado como um quadro já codificado F’n-1. Mas a predição de referência de cada partição de macrobloco (no modo Inter) pode ser escolhida a partir de uma seleção de quadros passados ou futuros (na ordem de apresentação) que tenham sido codificados, reconstruídos e filtrados. A predição P é subtraída do bloco atual para formar um bloco residual (diferença) Dn que é transformado e quantizado para produzir X, um conjunto de coeficientes que são reordenados e codificados por entropia. Os coeficientes codificados por entropia, juntamente as informações de predição de modos, parâmetros de quantização, vetor de movimento, etc. formam o fluxo de bit comprimido que é passado à Camada de Abstração de Rede (NAL) para transmissão ou armazenamento. 2.3.1.2 Caminho de reconstrução Tal como codificar e transmitir cada bloco em um macrobloco, o codificador decodifica (reconstrói) esses blocos de modo a prover uma referência para predições posteriores. Os coeficientes X são dimensionados (Q-1) e inversamente transformados (T-1) para produzir um bloco de diferença D’n. O bloco de predição P é adicionado à D’n para criar um bloco reconstruído sF’n (uma versão decodificada do bloco original; o s significa “sem filtro”). Um filtro é então aplicado para reduzir o efeito de distorção do bloco e um quadro de referência é reconstruído a partir de uma série de blocos F’n.
  31. 31. 14 Capítulo 3: Codificação de Vídeo em Java No presente momento serão explicados os aspectos relevantes a cerca das tecnologias para o qual o código de referência foi portado. Ou seja, a plataforma para a qual o codificador proposto pelo trabalho foi desenvolvido. Não entrarei no mérito pelo qual essas tecnologias foram escolhidas, apenas ressalto os detalhes mais importantes. Este capítulo está subdividido em duas seções: a primeira que trata sobre a plataforma Java, descrevendo as características mais relevantes ao desenvolvimento do trabalho; e uma segunda que aborda a Framework para a qual o codificador foi desenvolvido. 3.1 Plataforma Java A plataforma para o qual o código foi portado é a Java Standard Edition 1.5.0, incluindo todos os recursos incorporados à linguagem até essa versão. É importante ressaltar que a implementação não foi desenvolvida para ser compatível com versões anteriores, apenas posteriores, desde de que sejam compatíveis com a dada versão na qual o trabalho foi desenvolvido. 3.1.1 Manipulação de dados Diferente da linguagem C, na qual o código de referência [2] foi escrito, a linguagem Java fornece suporte de mais alto nível para a manipulação dos bytes do arquivo. Nesta seção serão descritas quais classes da plataforma Java foram utilizadas para substituir as funções desempenhadas por algumas estruturas implementadas no código de referência. - OutputStream: o código de referência utiliza uma estrutura chamada Bitstream para escrever um fluxo de bytes [2]. Todavia, a plataforma Java oferece uma classe abstrata padrão para fluxos de dados, a OutputStream. Foi criada para este trabalho uma classe que unia todas as funcionalidades daquela presente no código de referência com a padronização da classe presente na plataforma Java. Essa classe foi chamada de BitOutputStream.
  32. 32. 15 3.2 Java Media Framework (JMF) A Java Media Framework (JMF) é uma API destinada a incorporar dados multimídia, tal como áudio e vídeo, em aplicações Java e Applets. Ela foi especialmente desenvolvida para tirar proveito das características da plataforma Java. A versão utilizada neste trabalho foi a 2.1.1e, por ser a última disponível na data de início do desenvolvimento. 3.2.1 Histórico A JMF 1.0, conhecida como Java Media Player API, permitia aos programadores Java desenvolverem programas para reproduzir mídias de tempo real. A JMF 2.0 estendeu a 1.0 para fornecer suporte para captura e armazenamento de dados multimídia, controlando o tipo de processamento que era realizado durante a reprodução, e realizando processamento personalizado nos fluxos de dados multimídia. Além disso, a JMF 2.0 define uma API de plug-in, que permite desenvolvedores avançados e provedores de tecnologia uma personalização mais fácil para estender a funcionalidade da JMF [17]. 3.2.2 Componentes Para adicionar novas funcionalidades à JMF é necessário estendê-la, implementando novos componentes, essa arquitetura de plug-ins é uma das principais vantagens pela qual a JMF foi escolhida. Antes de adicionar novos componentes, se deve primeiro analisar todo fluxo de dados multimídia, partindo de sua captura ou leitura, interpretação, processamento e, por fim, sua apresentação ou gravação. Tendo em mente cada um desses aspectos, é preciso verificar quais das funcionalidades estão disponíveis na JMF, para utilizá-las, ou então implementar novos componentes que forneçam as funcionalidades indisponíveis na JMF original. Os principais componentes presentes na JMF e que devem ser estendidos para permitir recursos adicionais, são os seguintes: - DataSource: representa um protocolo, tal como FILE, FTP e HTTP. Seria necessário implementar para suportar novos protocolos onde os dados podem trafegar. Todavia, como neste trabalho a leitura e gravação é feita por meio de arquivos locais, é utilizado o DataSource para o protocolo FILE, que já está disponível na JMF;
  33. 33. 16 - Demultiplexer: representa um demultiplexador, necessário para suportar novos tipos de arquivos. No caso deste trabalho, foi necessário implementar um novo Demultiplexer para manusear os arquivos do tipo YUV. A classe YUVParser contém um objeto membro do tipo VideoTrack que representa a única trilha presente em um arquivo YUV, a trilha de vídeo. Em arquivos multimídia, cada tipo de dado presente, áudio, vídeo ou legenda, representa uma trilha distinta; - Multiplexer: esses são os objetos que pegam todas as trilhas processadas e as colocam em um mesmo arquivo. Neste trabalho foi implementado um multiplexador para permitir colocar a trilha de vídeo no arquivo; - DataSink: serve para escrever dados em um local, seja a rede ou um arquivo. Um DataSink lê dados de um DataSource e os grava em algum destino – outro destino sem ser o dispositivo de apresentação; - Processor: define um módulo de processamento sobre dado multimídia. Um objeto que implementa essa interface permite que seja definida uma cadeia de componentes que vão processar o dado. Neste caso, os componentes são um demultiplexador, um codificador ou decodificador, e um multiplexador. A figura 3.1 apresenta a estrutura de um objeto Processor; FIGURA 3.1 – ESTRUTURA DE UM PROCESSADOR COM OS ESTÁGIOS DE PROCESSAMENTO. A figura 3.1 mostra a relação entre os principais componentes da JMF que são usados para codificar dados multimídia. O DataSource da esquerda, e os objetos associados a ele, lidam com a leitura da mídia de origem. Enquanto o DataSource da direita trata do esquema de gravação da mídia processada. Os objetos dentro do quadrado tracejado realizam tarefas pré determinadas dentro do processamento do objeto Processor. O Demultiplexer separa a mídia em objetos trilhas (Track), cada uma destas representando um tipo de dado multimídia (vídeo, áudio, legenda, etc.). A codificação (ou decodificação) de cada uma dessas trilhas é feita individualmente por um determinado Codec, esse modelo de arquitetura permite que os mesmos CODEC sejam usados por tipos diferentes de arquivos. Por exemplo, tanto os arquivos AVI quanto MPEG podem conter áudio em formato MP3, então, após o Demultiplexer específico de cada um desses arquivos separar a
  34. 34. 17 trilha de áudio MP3 da trilha de vídeo, é utilizado o mesmo Codec para decodificar o MP3 de ambos os tipos de arquivos. Há ainda a possibilidade de aplicar efeitos especiais (como por exemplo, eco) em cada trilha por meio de objetos Effect. No estágio final, é possível reproduzir cada uma das trilhas por meio de um objeto Renderer, de acordo com o tipo de mídia que elas contém, assim, reproduzindo vídeo em um monitor e áudio em caixas de som, por exemplo. Ainda é possível mesclar as trilhas por meio de um objeto Multiplexer e salvá-las em um novo arquivo, que pode conter as trilhas decodificadas ou codificadas.
  35. 35. 18 Capítulo 4: Especificações do Codificador H.264 em Java Como todo software, o codificador implementado neste trabalho possui um nicho específico de aplicação, um tipo de dado sobre o qual trabalha. Neste capítulo são descritas as especificações técnicas do trabalho, ou seja, os tipos de dados processados pelo codificador, tal como seus parâmetros de funcionamento. 4.1 Vídeo de entrada A objetivo de todo codificador compactador é reduzir o tamanho de um determinado arquivo, mantendo os dados utilizáveis dentro de certa tolerância. No caso de um codificador de vídeo, o arquivo de entrada é um vídeo descompactado, um vídeo bruto, ou Raw Video YUV. A tabela 4.1 apresenta um resumo das características que o vídeo de entrada necessita possuir para ser utilizado pelo codificador apresentado neste trabalho. Parâmetro Resumo Formato do quadro YUV 4:2:0 Resolução QCIF (176x144) CIF(352x258) Taxa de quadros ~ 15 fps para QCIF Taxas de bit ~ 60 kbps VBR ou CBR Bytes por quadro 38016 (25344 de Y, 6336 de U e 6336 de V) TABELA 4.1 – RESUMO DAS ESPECIFICAÇÕES DO PROJETO PARA VÍDEO DE ENTRADA 4.1.1 Formato do quadro O único formato de quadro aceito pelo codificador implementado neste trabalho é o YUV 4:2:0 Planar, onde cada quadro é composto por 3 planos, ou matrizes, tal como mostrado na figura 4.1 (a). Sendo N a largura e M a altura em pixels do vídeo, os primeiros NxM bytes de cada quadro representam a matriz de luma Y, os próximos (N/2)x(M/2) bytes correspondem à matriz de crominância U e os últimos (N/2)x(M/2) bytes do quadro são a matriz de crominância V. Por exemplo, em uma resolução de 176x144 pixels (QCIF), os primeiros 25344 bytes de cada quadro correspondem ao componente Y, os próximos 6336 bytes representam o componente de cor U e os últimos 6336 bytes o componente V, totalizando 12672 bytes de crominância UV em cada quadro. Podemos considerar que são 12 bits por pixel nesse formato.
  36. 36. 19 FIGURA 4.1 – (A) ESTRUTURA E (B) EXEMPLO DE QUADRO YUV 4:2:0 PLANAR. 4.1.2 Resolução, taxa de quadros e taxa de bits. Para cada quadro foi adotado o formato QCIF, que define as dimensões em 176 pixels de largura por 144 pixels de altura, a uma taxa de 15 fps, o que gera uma taxa de aproximadamente 60 kbps. 4.2 Vídeo de saída A implementação tratada neste trabalho suporta um subconjunto dos recursos presentes no padrão. A tabela 4.2 apresenta um resumo dos recursos suportados. Parâmetro Resumo Perfis Baseline Níveis 1 e 1.2 Latência de codificação 4 quadros/segundo Formato de vídeo Fluxo de bytes H.264 (ISO/IEC 14496-15), Anexo B da comprimido Recomendação do ITU-T. TABELA 4.2 – RESUMO DAS ESPECIFICAÇÕES DO PROJETO PARA VÍDEO DE SAÍDA
  37. 37. 20 4.2.1 Perfis De acordo com [26], um perfil especifica qual sintaxe de codificação (algoritmo) é usada, enquanto um nível especifica os vários parâmetros (resolução, taxa de quadros, taxa de bit, etc.). Os padrões de codificação de vídeo em geral possuem uma gama enorme de recursos que, quando aplicados em conjunto, permitem obter altas taxas de compactação de vídeo. Um perfil nada mais é que um subconjunto desses recursos, especialmente selecionados para funcionar em determinados equipamentos e abranger um determinado público. O perfil implementado neste trabalho é o Baseline, que é destinado aos dispositivos de baixa capacidade de processamento e o público de aplicações via Internet, tal como vídeo conferências, vídeo telefonia e comunicação sem fio. 4.2.1.1 Baseline Dos cinco tipos de fatias disponíveis no padrão H.264, o perfil Baseline suporta apenas duas, I e P. Por meio desses dois tipos de fatias são implementadas as codificações Intra e Inter. As fatias nesse perfil também não podem ser particionadas, ou seja, toda a fatia deverá ser enviada em uma única unidade NAL. As codificações por entropia presentes são Exp-Golomb para parâmetros e CAVLC para dados. Os recursos que não são permitidos nesse perfil são: a codificação CABAC; predição com peso; fatias SP, SI e B; particionamento de dado (fatias); 4.2.2 Orientação da Palavra de Dado (Endianess) A função que testa o endian foi fixada para retornar little-endian, que é o padrão da arquitetura Intel.
  38. 38. 21 Capítulo 5: Desenvolvimento do Codificador H.264 em Java O comitê criador do padrão H.264 disponibilizou um código-fonte de referência [2] escrito em C para que terceiros implementem suas próprias versões do codificador H.264, e como mencionado anteriormente a idéia central do trabalho é implementar uma versão em Java desse codificador. O trabalho não consiste somente em portar um código-fonte escrito em C para Java, foi feita uma análise de orientação a objetos em cima do código estruturado fornecido como referência. Além disso, há toda uma preocupação com a integração dele com a JMF, que por sua vez possui uma arquitetura particular. Seguindo a ordem como os dados são processados, os itens a seguir abordam cada aspecto relacionado ao projeto, descrevendo como cada parte do código-fonte de referência foi implementado em Java utilizando a Java Media Framework. E no Apêndice C há uma tabela que complementa este capítulo, mostrando mais diretamente a equivalência entre os diversos módulos do código de referência e as classes Java que implementam as funções desses módulos. 5.1 Leitura dos quadros do arquivo YUV O processamento inicia pela leitura dos quadros descompactados no formato YCbCr, que eqüivale ao quadro original Fn da figura 2.3. No código de referência, há um laço de repetição que percorre todos os quadros do arquivo a ser codificado. A cada iteração, é chamada a função encode_one_frame do arquivo image.c, que por sua vez chama a função ReadOneFrame, presente no mesmo arquivo, para ler um quadro do arquivo a ser codificado. Neste trabalho, a leitura é realizada por meio da JMF, que lê cada quadro de vídeo do arquivo de entrada e permite acesso aos bytes individuais desse quadro por meio de um objeto da classe javax.media.Buffer. 5.1.1 Função encode_one_frame No código do trabalho, o método process da classe H264Encoder eqüivale à função encode_one_frame. Mas o método process não chama nenhum método para ler um quadro do arquivo de origem, pois ele é chamado após a JMF ler cada quadro do arquivo. Em suma, é chamado o método process após cada quadro ter sido lido.
  39. 39. 22 O método process da classe H264Encoder possui dois argumentos, ambos objetos da classe Buffer, onde o primeiro contém os dados lidos do arquivo de entrada e o segundo é destinado a armazenar os dados codificados. 5.1.2 Função ReadOneFrame A funcionalidade oferecida pela função ReadOneFrame do código de referência é fornecida no trabalho por meio de um conjunto de classes implementadas por mim e controladas pela JMF. O primeiro passo consiste em dizer à JMF que os arquivos com extensão .yuv devem ser lidos pela classe YUVParser. Então ao abrir um arquivo desse tipo a JMF chama o método setSource dessa classe passando um objeto DataSource que contém um fluxo com os bytes do arquivo lido. Então é criado um objeto YUVVideoTrack que representa a trilha de vídeo desse arquivo. Caso o arquivo lido fosse composto por uma trilha de vídeo e uma de som, seria criada uma trilha a mais para interpretar o fluxo de áudio do arquivo. A classe YUVVideoTrack possui um método chamado readFrame que é chamado para ler um número determinado de bytes do arquivo (cujo valor foi preestabelecido no construtor dessa classe por meio do argumento dataSize). Esse número de bytes representa o tamanho de cada quadro de vídeo, dessa forma, a JMF chama o método readFrame para ler cada quadro do arquivo de origem, interpretar os dados, e colocar o resultado no objeto Buffer que recebe como parâmetro. Os dados lidos pelo método readFrame da classe YUVVideoTrack e colocado no objeto Buffer recebido como argumento, são passados então para a classe de codificação por meio da JMF. 5.2 Predição Intra Quadro A predição Intra é aquela que utiliza apenas as amostras contidas no mesmo quadro, sem fazer referência nenhum outro quadro anteriormente codificado, para reduzir a redundância entre duas amostras. A predição intra quadro visa reduzir a redundância espacial de cada quadro de um vídeo.
  40. 40. 23 5.2.1 I_PCM O modo I_PCM é uma alternativa à predição intra e consiste em transmitir os valores das amostras diretamente, sem predição, transformada ou codificação por entropia. Um macrobloco I_PCM é gravado com os mesmos valores que possuia no arquivo descompactado. Neste trabalho, a classe IPCMEncodingMode implementa a predição I_PCM. 5.2.2 Intra 16x16 Luma O modo de predição Intra 16x16 consiste em predizer os valores de um macrobloco inteiro a partir das amostras previamente codificadas de macroblocos vizinhos. Os valores preditos são subtraídos das amostras originais para obter valores residuais. Em seguida, esses valores residuais são transformados e quantizados. Lembrando que mesmo a predição sendo realizada no macrobloco como um todo, a transformada é aplicada em cada bloco 4x4 individualmente. O H.264 utiliza as letras A, B, C e D para indicar quais partições (blocos ou macroblocos) estão disponíveis para a partição sendo codificada. A figura 5.1 mostra a posição dos macroblocos vizinhos (A, B, C e D) em relação ao macrobloco sendo codificado (E), e em vermelho blocos vizinhos e bloco corrente. Alguns macroblocos vizinhos não estão disponíveis próximo às bordas do quadro, por exemplo, se o macrobloco sendo codificado (E) for o número 0, ou seja, o primeiro do quadro, nenhum dos vizinhos estará disponível. Já o segundo macrobloco, número 1, terá apenas o vizinho A. FIGURA 5.1 – PARTIÇÃO CORRENTE (E) E PARTIÇÕES VIZINHAS (A, B, C E D). O padrão H.264/AVC define quatro modos de predição Intra 16x16 Luma: Vertical, Horizontal, DC e Plano. Cada qual sendo melhor aplicado em um determinado padrão de pixels. Por exemplo, o modo Plano se aplica bem em regiões onde há transição de tons. No código de referência [2], a função Intra16x16_Mode_Decision calcula os quatro modos de predição por meio da função intrapred_16x16, logo em seguida verifica qual dos modos
  41. 41. 24 possui a menor distorção por meio da função find_sad_16x16 e por fim aplica a transformada e quantização usando a função dct_16x16. O código desenvolvido neste trabalho separa cada um dos quatros modos em classes: Intra16x16LumaDCPredictor, Intra16x16LumaHorizontalPredictor, Intra16x16LumaVerticalPredictor e Intra16x16LumaChromaPlanePredictor. Cada uma dessas classes sobrescreve o método doIntraPrediction, o qual é invocado pela classe abstrata Intra16x16LumaAbstractPredictor que é a classe base dos modos. Toda funcionalidade comum aos quatro modos foi implementada nesta classe, tal como as rotinas de transformação, reconstrução, codificação por entropia e cálculo da distorção. Assim, cada classe é responsável por sua codificação. Para saber qual é o melhor modo para um determinado macrobloco, basta obter a distorção de cada um dos modos e comparar os valores entre si. FIGURA 5.2 – ORDEM DE ESCANEAMENTO DOS BLOCOS 4X4 EM UM MACROBLOCO [1]. Quando um macrobloco é codificado no modo Intra 16x16 Luma, cada coeficiente DC de cada um dos dezesseis blocos 4x4 luma é escaneado primeiro, formando um bloco 4x4 composto unicamente por coeficientes DC (figura 5.2). Nesse bloco de coeficientes DC é aplicada uma transformada adicional chamada Hadamard e, em seguida esses coeficientes são quantizados e reordenados. De forma similar, no modo Intra 8x8 Chroma, para cada componente é formado um bloco 2x2 de coeficientes DC, aplicada a transformada de Hadamard, uma quantização nos coeficientes e a reordenação dos mesmos em um vetor. Os dezesseis blocos 4x4 luma (0 a 15), os quatro blocos 4x4 Cb (18 a 21) e os quatro blocos 4x4 Cr (22 a 25) são chamados de blocos AC. Esses blocos são escaneados a partir da segunda posição da figura 5.4, contendo quinze coeficientes cada, ao invés de dezesseis. Esses blocos são
  42. 42. 25 então quantizados e reordenados. Os blocos –1 (contendo dezesseis coeficientes), 16 (com quatro coeficientes) e 17 (também com quatro coeficientes) são chamados de blocos DC. 5.2.2 Intra 8x8 Chroma Os modos de predição Intra 8x8 Chroma são bem parecidos com os Intra 16x16 Luma, exceto pela ordem (DC, Horizontal, Vertical e Plano) e pelo fato do modo 0, Plano, realizar a predição individualmente nos quatro blocos 4x4 que compõem o bloco 8x8, ao contrário do modo Intra 16x16 Luma Plano, que realiza uma única predição no bloco inteiro. No código de referência [2], a função IntraChromaPrediction calcula os quatro modos de predição Intra Chroma (DC, Horizontal, Vertical e Plana) para cada um dos componentes de cor (Cb e Cr) do macrobloco sendo codificado. Nessa mesma função são computados todos os quatros modos de predição. Em seguida é chamada na função ChromaResidualCoding, para cada um dos componente de cor (Cb e Cr), é decidido o tipo de predição e realizada a transformada e quantização do resíduo dos coeficientes. A função ChromaPrediction4x4 fica responsável por decidir o tipo de predição, Intra ou Inter, e a função IntraChromaPrediction4x4 copia os valores da predição para um buffer global e atribui os valores residuais à outro buffer. Por fim, a função dct_chroma aplica a transformada e quantização no resíduo dos coeficientes. O modo Intra 8x8 Chroma adota o mesmo esquema do modo Intra 16x16 Luma, separando cada um dos quatros modos de predição em classes: Intra8x8ChromaDCPredictor, Intra8x8ChromaHorizontalPredictor, Intra8x8ChromaVerticalPredictor e Intra8x8ChromaPlanePredictor. Cada uma dessas classes sobrescreve o método doIntraPrediction, invocado pela classe abstrata Intra8x8ChromaAbstractPredictor que é a classe base dos modos e onde toda funcionalidade comum aos quatro modos de predição foi implementada. 5.3 Predição Inter Quadro Esta predição visa reduzir a redundância temporal, ou seja, aquela que existe entre dois ou mais quadros.
  43. 43. 26 5.4 Transformada, Quantização e Reordenação No código desenvolvido neste trabalho os algoritmos de transformada, quantização e reordenação foram isolados em classes específicas. Outra diferença crucial entre o código de referência [2] e este trabalho é que, neste trabalho é codificado um quadro inteiro antes dele ser escrito, enquanto que no código de referência cada macrobloco é codificado e escrito. 5.4.1 Transformada A transformada é uma operação sobre matrizes que tem como objetivo homogeneizar os valores dos coeficientes dessa matriz, possibilitando uma melhor codificação por entropia. A transformada utilizada no H.264 é uma aproximação ortogonal da Transformada Discreta de Cosenos, DCT. Ela não é uma implementação da fórmula da DCT, mas uma operação cujo resultado se aproxima muito com os da DCT usando apenas números inteiros. Outro fator de grande importância é o da transformada ser aplicada aos blocos de tamanho 4x4, permitindo grande redução nos artefatos de blocagem característicos da codificação de vídeo. No código do trabalho, a transformada é implementada pela classe IntegerTransform que fornece exclusivamente serviços de transformação de matrizes. 5.4.2 Quantização A operação de quantização tem como intuito reduzir a magnitude dos coeficientes resultantes da transformada por meio de uma divisão, e a restituição dos valores originais por meio de uma multiplicação. A figura 5.3 mostra graficamente o processo de quantização.
  44. 44. 27 FIGURA 5.3 – QUANTIZAÇÃO DOS COEFICIENTES DA DCT [48]. 5.4.3 Reordenação A reordenação consiste basicamente em colocar os valores dos coeficientes de uma matriz bidimensional NxN em um vetor unidimensional de tamanho M, onde M = N * N. O objetivo desse processo é criar um vetor que possua em seqüência os elementos de valores parecidos, permitindo uma maior compressão por entropia. O código de referência [2] realiza a ordenação, ou zig-zag scan, juntamente com a quantização dos coeficientes. Isso proporciona uma otimização no código, entretanto também o torna mais difícil de ser compreendido. No código desenvolvido neste trabalho, a quantização e a reordenação foram separadas em classes distintas, o que torna o código mais legível e fácil de ser modificado. A classe ZigZagFrameScanner implementa a interface Scanner para blocos de frames (existem dois modos, frame e field).
  45. 45. 28 FIGURA 5.4 – REORDENAÇÃO ZIG-ZAG PARA BLOCOS 4X4 LUMA (MODO FRAME). No codificador, cada bloco 4x4 – contendo coeficientes transformados e quantizados – é reordenado em um vetor de acordo com a ordem mostrada na figura 5.4. 5.5 Codificação por Entropia O padrão H.264 define dois tipos de codificação por entropia, CAVLC e CABAC. O método utilizado neste trabalho é o CAVLC, por ser o tipo usado pelo perfil Baseline. O padrão H.264 codifica todas as informações de fatias, macroblocos e blocos usando ou CAVLC, ou CABAC, enquanto as informações acima da camada de fatia são codificadas usando códigos binários de tamanho fixo ou variável. A classe CAVLC, juntamente com BitOutputStream, são responsáveis por implementar as funções para codificação por entropia CAVLC e Exp-Golomb. Abaixo está um exemplo que codifica o parâmetro profile_idc usando a função u(v)1, onde stream é um objeto da classe CAVLC. len += stream.write_u_v(8, profile_idc); A classe CAVLC é responsável por construir os códigos da codificação por entropia, enquanto a classe BitOutputStream é quem escreve os bits na stream de saída, que pode ser um arquivo ou a rede. 1 Nomenclatura utilizada pelo documento padrão do ITU-T [3].
  46. 46. 29 5.5.1 Exp-Golomb 5.5.1.1 Conceito Exp-Golomb são códigos de largura variável com construções regulares [1], dispensando o uso de tabelas ou árvores de código. Esse método é usado para codificação da maior parte das informações do vídeo codificado pelo H.264 e é ideal para comprimir dados cujos valores pequenos têm uma freqüência muito grande[4]. O código Exp-Golomb possui a seguinte forma: [M zeros][1][INFO] Onde: M = floor( log2(code_num + 1) ) INFO = code_num + 1 – 2M Sendo INFO um campo de M bits contendo a informação codificada, a largura do código Exp- Golomb é (2M + 1) bits. As funções Exp-Golomb recebem um número inteiro v como argumento e o mapeiam para code_num. No padrão H.264 são usadas algumas formas distintas de mapeamento entre v e code_num, dentre as quais estão presentes neste trabalho: - ue(v) é a função que codifica inteiros sem sinal (unsigned) usando Exp-Golomb. Essa função utiliza mapeamento direto, ou seja, code_num = v, e é representada no código pelo método CAVLC.write_ue_v(int value); - se(v) é uma variação da função ue(v) que codifica inteiros com sinal (signed). Representada pelo método CAVLC.write_se_v(int value). Nela, code_num é mapeado da seguinte forma: code_num = 2 * |v| (v < 0) code_num = 2 * |v| - 1 (v > 0) As tabelas 5.1 e 5.2 ilustram os primeiros códigos Exp-Golomb para ue(v) e se(v), respectivamente. v code_num Código Exp-Golomb 0 0 1 1 1 010 2 2 011 3 3 00100 4 4 00101 5 5 00110 6 6 00111 7 7 0001000 TABELA 5.1 – OITO PRIMEIROS CÓDIGOS EXP_GOLOMB PARA UE(V).
  47. 47. 30 v code_num Código Exp-Golomb 0 0 1 1 1 010 -1 2 011 2 3 00100 -2 4 00101 3 5 00110 -3 6 00111 4 7 0001000 TABELA 5.2 – OITO PRIMEIROS CÓDIGOS EXP_GOLOMB PARA SE(V). No caso da codificação usando ue(v), é passado um valor v ao método public int write_ue_v(int value) da classe CAVLC. Esse método chama outros dois métodos para (1) criar INFO a partir do argumento v e (2) criar a string de código [M zeros][1][INFO]. 5.5.1.2 Aplicação Exp-Golomb é a técnica adotada para codificar a maioria dos parâmetros do vídeo H.264. Dentre os quais se destacam aqueles apresentes na tabela 5.3. Parâmetro Descrição Conjunto de Parâmetros de Seqüência São os cabeçalhos que contém informações sobre e de Figura (Sequence and Picture todo o vídeo ou um quadro. parameter Sets) Tipo do Macrobloco (mb_type) O tipo do macrobloco indica qual o método de predição adotado naquele macrobloco. Blocos Codificados (Coded Block Indica quais blocos de um macrobloco contém Pattern) coeficientes codificados. Parâmetro do Quantizador (Quantiser Transmitido como um valor delta a partir do QP Parameter, QP) anterior. TABELA 5.3 – EXEMPLO DE PARÂMETROS A SEREM CODIFICADOS. Como regra, tudo que estiver acima da camada de fatia é codificado usando Exp-Golomb ou códigos binários. Enquanto que tudo que estiver na camada de fatia e abaixo é codificado usando CAVLC ou CABAC, dependendo do modo de codificação por entropia. 5.5.2 CAVLC A codificação CAVLC do H.264 é usada para codificar os resíduos dos coeficientes da transformada, por meio de modificação em algumas técnicas de codificação por entropia, tal como Huffman e RLE (Run Length Encoding).

×