SlideShare ist ein Scribd-Unternehmen logo
1 von 141
Downloaden Sie, um offline zu lesen
Guilherme Maciel Ferreira




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




                       Florianópolis
                            2009
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
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.
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.
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!
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.
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.
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
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
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
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
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
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
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
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.
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.
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.
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
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.
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
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
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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;
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
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.
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.
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
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.
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.
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.
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
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
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.
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.
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).
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].
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).
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).
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

Weitere ähnliche Inhalte

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

Tcc leonildo wagner reestruturação de website utilizando padrões w3 c 26-04...
Tcc leonildo wagner   reestruturação de website utilizando padrões w3 c 26-04...Tcc leonildo wagner   reestruturação de website utilizando padrões w3 c 26-04...
Tcc leonildo wagner reestruturação de website utilizando padrões w3 c 26-04...Léo Dias
 
Dissertação - Mestrado - Nelson Alves - Final com ficha d e aprovação
Dissertação - Mestrado - Nelson Alves - Final com ficha d e aprovaçãoDissertação - Mestrado - Nelson Alves - Final com ficha d e aprovação
Dissertação - Mestrado - Nelson Alves - Final com ficha d e aprovaçãoNelson Alves Ferreira Neto
 
Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...
Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...
Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...Gabriel Cabral
 
Programando para processadores paralelos
Programando para processadores paralelosProgramando para processadores paralelos
Programando para processadores paralelosshichibukai_01
 
Introducao a acessibilidade_web
Introducao a acessibilidade_webIntroducao a acessibilidade_web
Introducao a acessibilidade_webTiago
 
WebTV: Um novo método para assistir TV.
WebTV: Um novo método para assistir TV.WebTV: Um novo método para assistir TV.
WebTV: Um novo método para assistir TV.Rafael Macedo
 
New TCP version for large bandwidth networks
New TCP version for large bandwidth networksNew TCP version for large bandwidth networks
New TCP version for large bandwidth networksDavid Serafim
 
Metricas de qualidade em produtos de software
Metricas de qualidade em produtos de softwareMetricas de qualidade em produtos de software
Metricas de qualidade em produtos de softwarecarlosabs13
 
COCOMO E COCOMO II
COCOMO E COCOMO IICOCOMO E COCOMO II
COCOMO E COCOMO IIIsraelCunha
 
Desenvolvimento de um aplicativo para TV Digital usando as bibliotecas de JavaTV
Desenvolvimento de um aplicativo para TV Digital usando as bibliotecas de JavaTVDesenvolvimento de um aplicativo para TV Digital usando as bibliotecas de JavaTV
Desenvolvimento de um aplicativo para TV Digital usando as bibliotecas de JavaTVgomarin
 
(Pt) curso e certificacao para manutencao de hds
(Pt) curso e certificacao para manutencao de hds(Pt) curso e certificacao para manutencao de hds
(Pt) curso e certificacao para manutencao de hdsseriusalmeida
 
plano_de_projeto_controlart_final
plano_de_projeto_controlart_finalplano_de_projeto_controlart_final
plano_de_projeto_controlart_finaluserrx
 
Monografia douglashiura
Monografia douglashiuraMonografia douglashiura
Monografia douglashiuraDouglas Longo
 
Monografia_Raphael.Fernandes.Ribeiro_RA.A17809-0
Monografia_Raphael.Fernandes.Ribeiro_RA.A17809-0Monografia_Raphael.Fernandes.Ribeiro_RA.A17809-0
Monografia_Raphael.Fernandes.Ribeiro_RA.A17809-0Rapha Fernandes
 
PROJETO INTEGRADO - CURSOS DA ÁREA DE TI - Uma das tecnologias mais populare...
PROJETO INTEGRADO - CURSOS DA ÁREA DE TI -  Uma das tecnologias mais populare...PROJETO INTEGRADO - CURSOS DA ÁREA DE TI -  Uma das tecnologias mais populare...
PROJETO INTEGRADO - CURSOS DA ÁREA DE TI - Uma das tecnologias mais populare...HELENO FAVACHO
 
TV Digital interativa - Projeto TeouVi
TV Digital interativa - Projeto TeouViTV Digital interativa - Projeto TeouVi
TV Digital interativa - Projeto TeouViLucas Augusto Carvalho
 
O Uso da Linguagem Declarativa NCL no Desenvolvimento de Software para TV Dig...
O Uso da Linguagem Declarativa NCL no Desenvolvimento de Software para TV Dig...O Uso da Linguagem Declarativa NCL no Desenvolvimento de Software para TV Dig...
O Uso da Linguagem Declarativa NCL no Desenvolvimento de Software para TV Dig...Diogo Dostoiévsky Robespierre de Sá
 
Dovecot
DovecotDovecot
DovecotTiago
 

Ähnlich wie Implementação de um Codificador de Vídeo H.264/AVC em Java (20)

Tcc leonildo wagner reestruturação de website utilizando padrões w3 c 26-04...
Tcc leonildo wagner   reestruturação de website utilizando padrões w3 c 26-04...Tcc leonildo wagner   reestruturação de website utilizando padrões w3 c 26-04...
Tcc leonildo wagner reestruturação de website utilizando padrões w3 c 26-04...
 
Projeto BECI
Projeto BECIProjeto BECI
Projeto BECI
 
Dissertação - Mestrado - Nelson Alves - Final com ficha d e aprovação
Dissertação - Mestrado - Nelson Alves - Final com ficha d e aprovaçãoDissertação - Mestrado - Nelson Alves - Final com ficha d e aprovação
Dissertação - Mestrado - Nelson Alves - Final com ficha d e aprovação
 
Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...
Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...
Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...
 
Programando para processadores paralelos
Programando para processadores paralelosProgramando para processadores paralelos
Programando para processadores paralelos
 
Introducao a acessibilidade_web
Introducao a acessibilidade_webIntroducao a acessibilidade_web
Introducao a acessibilidade_web
 
WebTV: Um novo método para assistir TV.
WebTV: Um novo método para assistir TV.WebTV: Um novo método para assistir TV.
WebTV: Um novo método para assistir TV.
 
masterthesis_cel
masterthesis_celmasterthesis_cel
masterthesis_cel
 
New TCP version for large bandwidth networks
New TCP version for large bandwidth networksNew TCP version for large bandwidth networks
New TCP version for large bandwidth networks
 
Metricas de qualidade em produtos de software
Metricas de qualidade em produtos de softwareMetricas de qualidade em produtos de software
Metricas de qualidade em produtos de software
 
COCOMO E COCOMO II
COCOMO E COCOMO IICOCOMO E COCOMO II
COCOMO E COCOMO II
 
Desenvolvimento de um aplicativo para TV Digital usando as bibliotecas de JavaTV
Desenvolvimento de um aplicativo para TV Digital usando as bibliotecas de JavaTVDesenvolvimento de um aplicativo para TV Digital usando as bibliotecas de JavaTV
Desenvolvimento de um aplicativo para TV Digital usando as bibliotecas de JavaTV
 
(Pt) curso e certificacao para manutencao de hds
(Pt) curso e certificacao para manutencao de hds(Pt) curso e certificacao para manutencao de hds
(Pt) curso e certificacao para manutencao de hds
 
plano_de_projeto_controlart_final
plano_de_projeto_controlart_finalplano_de_projeto_controlart_final
plano_de_projeto_controlart_final
 
Monografia douglashiura
Monografia douglashiuraMonografia douglashiura
Monografia douglashiura
 
Monografia_Raphael.Fernandes.Ribeiro_RA.A17809-0
Monografia_Raphael.Fernandes.Ribeiro_RA.A17809-0Monografia_Raphael.Fernandes.Ribeiro_RA.A17809-0
Monografia_Raphael.Fernandes.Ribeiro_RA.A17809-0
 
PROJETO INTEGRADO - CURSOS DA ÁREA DE TI - Uma das tecnologias mais populare...
PROJETO INTEGRADO - CURSOS DA ÁREA DE TI -  Uma das tecnologias mais populare...PROJETO INTEGRADO - CURSOS DA ÁREA DE TI -  Uma das tecnologias mais populare...
PROJETO INTEGRADO - CURSOS DA ÁREA DE TI - Uma das tecnologias mais populare...
 
TV Digital interativa - Projeto TeouVi
TV Digital interativa - Projeto TeouViTV Digital interativa - Projeto TeouVi
TV Digital interativa - Projeto TeouVi
 
O Uso da Linguagem Declarativa NCL no Desenvolvimento de Software para TV Dig...
O Uso da Linguagem Declarativa NCL no Desenvolvimento de Software para TV Dig...O Uso da Linguagem Declarativa NCL no Desenvolvimento de Software para TV Dig...
O Uso da Linguagem Declarativa NCL no Desenvolvimento de Software para TV Dig...
 
Dovecot
DovecotDovecot
Dovecot
 

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

  • 1. Guilherme Maciel Ferreira Implementação de um Codificador de Vídeo H.264/AVC em Java Florianópolis 2009
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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).