Especificação



Baixar 2,81 Mb.
Página1/24
Encontro01.07.2018
Tamanho2,81 Mb.
  1   2   3   4   5   6   7   8   9   ...   24


Guilherme Maciel Ferreira

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

Florianópolis

2009

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

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.



. .

Prof. Jean-Marie Farines, Dr.


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.



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!



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.


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.



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 ApC.1 – Player reproduzindo um arquivo YUV. 104

Figura ApC.2 – Estatísticas do arquivo sendo reproduzido. 104

Figura ApC.3 – Interface gráfica do codificador desenvolvido neste trabalho. 105

Figura ApC.4 – Janela de configurações do codificador. 105

112

Figura AnB.1 - Passos para compressão de imagens usando o algoritmo JPEG com o modo de operação sequencial. 112

Figura AnB.2 – Representação tridimensional da transformação DCT: antes da transformação (esquerda); depois da transformação (direita). 113

Figura AnB.4 – Exploração da correlação temporal usando o algoritmo MPEG-1. 116


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 ApB.1 – Módulos do código de referência 103

Tabela AnA.1 – Perfis do MPEG-4 Parte 10 (H.264) 106

Tabela AnA.2 – Níveis do MPEG-4 Parte 10 (H.264) 107


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 46

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 68

A6.5 Classe Intra16x16LumaAbstractPredictor 70

A6.6 Classe Intra8x8ChromaAbstactPredictor 74

A6.7 Classe Intra16x16LumaDCPredictor 80

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 86

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: Equivalência entre os módulos 103

Apêndice C: Ferramentas de suporte 104

C1 YUVPlayer 104

C2 AVCEncoder 105

Anexo A: Parâmetros do padrão H.264 106

A1 Perfis do padrão H.264 106

A2 Níveis do padrão H.264 107

Anexo B: Algoritmos de compressão 108

B1 Tipos de Compressão 108

B2 Categorias de Compressão 108

B2.1 Codificação de Entropia 108

B2.1.1 Supressão de sequências repetitivas 109

B2.1.2 Codificação Estatística 109

B2.2 Codificação da Fonte 110

B2.2.1 Codificação de Transformada 110

B2.2.2 Codificação Diferencial 111

B2.2.3 Quantização Vetorial 111



B3 Compressão de Imagem 112

B3.1 O Padrão JPEG 112

B3.1.1 Passos da Codificação Progressiva 112

B3.2 Padrão MPEG 114

B3.2.1 Quadros de Referência e Intracodificados 115

B3.2.2 Compressão de Quadros I 117

B3.2.3 Compressão de Quadros P e B 117

Referências Bibliográficas 118




  1   2   3   4   5   6   7   8   9   ...   24


©livred.info 2017
enviar mensagem

    Página principal