ver/abrir - Repositório do Departamento de Ciência da Computação
Transcrição
ver/abrir - Repositório do Departamento de Ciência da Computação
Universidade de Brasília Instituto de Ciências Exatas Departamento de Ciência da Computação Sistema de Correção de Erros em Transmissões de Vídeo Digital Utilizando Vista Prévia Diego Carvalho Souza Monografia apresentada como requisito parcial para conclusão do Bacharelado em Ciência da Computação Orientador Prof. Dr. Bruno Luiggi Macchiavello Espinoza Brasília 2011 Universidade de Brasília — UnB Instituto de Ciências Exatas Departamento de Ciência da Computação Bacharelado em Ciência da Computação Coordenador: Prof. Dr. Maurício Lamar Banca examinadora composta por: Prof. Dr. Bruno Luiggi Macchiavello Espinoza (Orientador) — CIC/UnB Prof. Dr. Camilo Chang Dórea — CIC/UnB Prof. Dr. Alexandre Zaghetto — CIC/UnB CIP — Catalogação Internacional na Publicação Souza, Diego Carvalho. Sistema de Correção de Erros em Transmissões de Vídeo Digital Utilizando Vista Prévia / Diego Carvalho Souza. Brasília : UnB, 2011. 197 p. : il. ; 29,5 cm. Monografia (Graduação) — Universidade de Brasília, Brasília, 2011. 1. H.264, 2. Codificação, 3. Streaming, 4. Compressão, 5. Vídeo Digital, 6. Baixa Latência, 7. Robustez à Erros, 8. Ocultamento de Erros, 9. Alta Definição CDU 004.4 Endereço: Universidade de Brasília Campus Universitário Darcy Ribeiro — Asa Norte CEP 70910-900 Brasília–DF — Brasil Universidade de Brasília Instituto de Ciências Exatas Departamento de Ciência da Computação Sistema de Correção de Erros em Transmissões de Vídeo Digital Utilizando Vista Prévia Diego Carvalho Souza Monografia apresentada como requisito parcial para conclusão do Bacharelado em Ciência da Computação Prof. Dr. Bruno Luiggi Macchiavello Espinoza (Orientador) CIC/UnB Prof. Dr. Camilo Chang Dórea CIC/UnB Prof. Dr. Alexandre Zaghetto CIC/UnB Prof. Dr. Maurício Lamar Coordenador do Bacharelado em Ciência da Computação Brasília, 08 de Fevereiro de 2011 Dedicatória Eu dedico este trabalho, assim como todas as minhas realizações, única e inequivocamente, à minha mãe. Agradeço por ser meu anjo vigilante, por me oferecer seu amor infinito, sua dedicação intensa e seu apoio incondicional. Te amo! i Agradecimentos À minha família: meu padrasto João, meu maior professor, por ser meu modelo de homem. Minhas irmãs Aline e Luana por me suportarem assim como eu suporto meus sobrinhos João Pedro, Lucca, Geovanna e Sophia, que alegram até meus dias mais mal humorados. E ao meu pai Osvaldo que, mesmo distante, é meu maior exemplo de humildade e dignidade. Aos meus amigos de faculdade: Marcos Antônio, meu grande amigo que compartilhou comigo momentos difíceis de estudos de madrugada e momentos felizes de truco e risadas, além, é claro, de suas pérolas, as quais a ausência tornaria o curso menos suportável. E Daniel Saad, pelo companheirismo, por me ajudar diversas vezes durante o curso em trabalhos infindáveis e dividir comigo os almoços no Careca. Agradeço também àqueles amigos não tão próximos, mas que compartilharam comigo esses nove semestres de computação: Raul, Zucca, Lino, Zumba, Gabi, Dudu, Cristiano, Luíza, Mayara, Rafa, Melão, Danete, Asari, Danilo, Capu, Davi, etc. Aos meus amigos: Danilo, meu grande irmão, simplesmente por estar sempre comigo e não me deixar desistir e ao meu outro irmão, Índio, à quem eu devo muito na minha formação por me ajudar diversas vezes, sempre solícito e disponível. À minha namorada Dedê, que sempre me animou e entendeu minhas ausências e angústias. Obrigado por sempre me dar força, me servir de companhia e, claro, me ajudar a fazer a correção ortográfica desta monografia. Sem você, tudo ficaria infinitamente mais difícil. Aos meus amigos de ensino médio: Tuca, Carol, Cissa, Alice, Nikito, Esmeras, George, Thiago, etc, que sempre estarão comigo e aos meus amigos de forró e futebol. Obrigado pelos momentos de descontração que me ajudaram a manter a sanidade. Ao meu orientador, Dr. Bruno Macchiavello, por ler e responder os mais de 184 emails. Obrigado pela atenção, compreensão, flexibilidade, paciência e por estar sempre disponível quando precisei de auxílio. Meus sinceros agradecimentos a todos aqueles que, de alguma maneira, doaram um pouco de si para tornar este trabalho possível. Vocês estarão sempre guardados no peito e na memória. Obrigado. ii Resumo Neste trabalho, buscou-se implementar e melhorar um método de ocultamento de erros em transmissão de sinal de vídeo digital chamado RECAP (Receiver Error Concealment using Acknowledge Preview ). Este método propõe a estimação de dados perdidos através de um sinal adicional de baixa resolução e baixa latência (chamado Vista Prévia) que é enviado em conjunto com o sinal original codificado (chamado Vista Principal). Ambos os sinais são codificados e enviados separadamente ao decodificador. Este decodifica os sinais e os envia a um detector de erros que verifica a consistência dos macroblocos e envia as informações de macroblocos perdidos ou corrompidos à um ocultador de erros que tenta estimá-los utilizando macroblocos de quadros anteriores decodificados do próprio sinal original ou macroblocos de quadros correspondentes corretamente decodificados do sinal da vista prévia. As análises finais aferem que a técnica proposta consegue resultados satisfatórios tanto para perdas isoladas de macroblocos quanto para perdas integrais de quadros. Além do método proposto, são apresentados os cenários de simulação de testes, resultados e contribuições. Também são discutidos problemas, consequências e possíveis projetos futuros. Palavras-chave: H.264, Codificação, Streaming, Compressão, Vídeo Digital, Baixa Latência, Robustez à Erros, Ocultamento de Erros, Alta Definição iii Abstract In this project, we aim to implement and improve an error concealment technique in digital signal video transmission named RECAP (Receiver Error Concealment using Acknowledge Preview). This technique proposes a data loss estimation using a low-latency and low-resolution additional signal (referred as the preview view) which is sent jointly with the coded bit-stream of the original signal (referred as the main view). Both signals are coded and sent apart to the decoder that decodes these streams and sends them to an error detector which tests the macroblock’s consistency and sends information about the lost or corrupted macroblocks to an error concealer. The error concealer tries to estimate corrupted blocks using macroblocks from previous decoded frames of the main view or colocated macroblocks from the preview view. The results show that the proposed technique achieves satisfying results for both, isolated and bursty losses. We present the simulation scenarios, results and contributions. We also discuss the problems, effects and possible future projects. Keywords: H.264, Coding, Streaming, Compression, Digital Video, Low Latency, Error Resiliency, Error Concealment, High Definition iv Sumário 1 INTRODUÇÃO 1.1 Apresentação do Problema 1.2 Objetivos Gerais . . . . . 1.3 Objetivos Específicos . . . 1.4 Revisão Bibliográfica . . . 1.5 Organização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 2 3 3 4 2 CODIFICAÇÃO DE DADOS 2.1 Conceitos Fundamentais . . . . . . 2.2 Codificação de Fonte . . . . . . . . 2.2.1 Codificação sem Perdas . . . 2.2.2 Codificação com Perdas . . 2.3 Codificação de Canal . . . . . . . . 2.3.1 Informação Mútua . . . . . 2.3.2 Capacidade do Canal . . . . 2.3.3 Códigos Corretores de Erro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 6 6 7 7 7 7 8 . . . . . . . . . . . . . 9 9 10 11 12 15 18 20 22 24 27 28 30 30 . . . . . . . . . . . . . . . . . . . . 3 CODIFICAÇÃO DE VÍDEO DIGITAL 3.1 Conceitos de Vídeo Digital . . . . . . . . . . . . 3.2 Codificação de Vídeo Digital . . . . . . . . . . . 3.2.1 Modelo Temporal . . . . . . . . . . . . . 3.2.2 Estimação e Compensação de Movimento 3.2.3 Modelo Espacial . . . . . . . . . . . . . . 3.2.4 Quantização . . . . . . . . . . . . . . . . 3.2.5 Controle de Erros em Sinal de Vídeo . . 3.2.6 Codificadores de Entropia . . . . . . . . 3.3 H.264/MPEG-4 AVC . . . . . . . . . . . . . . . 3.3.1 Predição Intra . . . . . . . . . . . . . . . 3.3.2 Predição Inter . . . . . . . . . . . . . . . 3.3.3 Transformada e Quantização . . . . . . . 3.3.4 Codificação de Entropia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 SISTEMA DE CORREÇÃO DE ERROS UTILIZANDO VISTA PRÉVIA 4.1 Introdução . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.2 RECAP (Receiver Error Concealment Using Acknowledge Preview ) . . . . 4.2.1 Fluxo de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v 31 31 33 34 4.2.2 4.2.3 4.2.4 4.2.5 4.2.6 Etapa Etapa Etapa Etapa Etapa de de de de de Codificação . . . . . Decodificação . . . . Redimensionamento Detecção de Erros . Ocultação de Erros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 38 39 39 44 5 RESULTADOS E ANÁLISES 5.1 Sequências de Teste . . . . . . . . . . . . . . . . . . . . . . 5.1.1 Medida Objetiva de Qualidade . . . . . . . . . . . . 5.2 Cenários de Simulação . . . . . . . . . . . . . . . . . . . . 5.2.1 Simulação de canal de retorno. . . . . . . . . . . . . 5.2.2 Simulação de erros . . . . . . . . . . . . . . . . . . 5.2.3 Simulação com Vetor de Limiares . . . . . . . . . . 5.2.4 Simulação com Limiar baseado no Primeiro Quadro 5.3 Apresentação e análise de testes . . . . . . . . . . . . . . . 5.3.1 Utilizando Vetor de Limiares . . . . . . . . . . . . . 5.3.2 Utilizando Limiar baseado no Primeiro Quadro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 49 51 52 52 52 53 53 55 55 73 6 CONCLUSÃO 83 6.1 Apresentação das Contribuições . . . . . . . . . . . . . . . . . . . . . . . . 84 6.2 Perspectiva para Trabalhos Futuros . . . . . . . . . . . . . . . . . . . . . . 84 Referências 85 vi Lista de Figuras 2.1 2.2 Diagrama de um sistema genérico de comunicação. . . . . . . . . . . . . . Compressão de fonte sem perdas. . . . . . . . . . . . . . . . . . . . . . . . 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 3.20 Elementos de uma sequência de vídeo digital. . . . . . . . . . . . . Diagrama de um codificador genérico. . . . . . . . . . . . . . . . . . Quadros estimados. . . . . . . . . . . . . . . . . . . . . . . . . . . . Fluxo Óptico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Estimação de Movimento. . . . . . . . . . . . . . . . . . . . . . . . Predição temporal de quadros. . . . . . . . . . . . . . . . . . . . . . Resíduos com compensação de movimento. . . . . . . . . . . . . . . DCT com base 4×4 [1]. . . . . . . . . . . . . . . . . . . . . . . . . . DCT com base 8×8 [1]. . . . . . . . . . . . . . . . . . . . . . . . . . Seção de uma imagem com um bloco 4×4 em destaque [1]. . . . . . Resultado da Transformada [1]. . . . . . . . . . . . . . . . . . . . . Blocos reconstruídos com um, dois, três e cinco coeficientes [1]. . . . Codificador Fonte-Canal separado. . . . . . . . . . . . . . . . . . . Codificador H.264 e suas unidades funcionais básicas. . . . . . . . . Decodificador H.264 e suas unidades funcionais básicas. . . . . . . . Perfil Baseline, Main, Extended e High. . . . . . . . . . . . . . . . . Rótulos das amostras e direções de predição (4×4) [1]. . . . . . . . Métodos de predição intra para blocos de luminância de 16×16 [1]. Métodos de predição intra para blocos de luminância de 4×4 [1]. . . Possibilidades de partição de um macrobloco [1]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 Padrão checkerboard do algoritmo FMO em um quadro da sequência Funcionamento básico do método proposto. . . . . . . . . . . . . . . Diagrama de Blocos. . . . . . . . . . . . . . . . . . . . . . . . . . . Informações de codificação. . . . . . . . . . . . . . . . . . . . . . . . Arquivos de saída da codificação. . . . . . . . . . . . . . . . . . . . Reordenação dos quadros. . . . . . . . . . . . . . . . . . . . . . . . Reordenação dos quadros. . . . . . . . . . . . . . . . . . . . . . . . Decimação - Reconstruído e seu respectivo decimado. . . . . . . . . Cálculo de Limiares da Vista Prévia. . . . . . . . . . . . . . . . . . Vetor de Limiares da Vista Prévia. . . . . . . . . . . . . . . . . . . Cálculo de Limiares da Vista Principal. . . . . . . . . . . . . . . . . Vetor de Limiares da Vista Principal. . . . . . . . . . . . . . . . . . Comparação do bloco reconstruído com o bloco do Preview. . . . . Mobile. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . vii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 6 10 11 12 13 14 15 16 17 18 19 19 20 22 24 25 27 28 29 29 30 32 33 34 36 36 37 38 39 40 40 41 41 42 4.14 4.15 4.16 4.17 4.18 4.19 4.20 4.21 4.22 4.23 Comparação do bloco reconstruído com o bloco do quadro anterior. Perda de bloco isolado no quadro da vista prévia. . . . . . . . . . . Perda de bloco isolado no quadro da vista principal. . . . . . . . . . Perda de bloco correspondente completo em ambas as vistas. . . . . Perda de quadro completo na vista prévia. . . . . . . . . . . . . . . Perda de quadro completo na vista principal. . . . . . . . . . . . . . Perda de quadro correspondente em ambas as vistas. . . . . . . . . Alta frequência. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Exemplo de Janela de Buscas. . . . . . . . . . . . . . . . . . . . . . Quadros da sequência Foreman. . . . . . . . . . . . . . . . . . . . . 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12 5.13 5.14 5.15 5.16 5.17 5.18 5.19 5.20 5.21 5.22 5.23 5.24 5.25 5.26 5.27 5.28 5.29 5.30 5.31 5.32 5.33 5.34 5.35 Informações básicas das sequências utilizadas. . . . . . . . . . . . . . . . . Descrição de conteúdo das sequências utilizadas. . . . . . . . . . . . . . . . Quadros das sequências utilizadas. . . . . . . . . . . . . . . . . . . . . . . . RECAP modificado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Simulação de canal de retorno na vista prévia. . . . . . . . . . . . . . . . . Perfis de erros na vista principal e/ou vista prévia. . . . . . . . . . . . . . Sequência Foreman - Erro na Vista Principal - 1 Quadro de Atraso . . . . Sequência Foreman - Erros na Vista Principal - 1 Quadro de Atraso . . . . Sequência Akiyo - Erros na Vista Principal - 1 Quadro de Atraso . . . . . Sequência Mobile - Erros na Vista Principal - 1 Quadro de Atraso . . . . . Sequência City - Erros na Vista Principal - 1 Quadro de Atraso . . . . . . Sequência Foreman - Erro na Vista Principal - 3 Quadros de Atraso . . . . Sequência Foreman - Erros na Vista Principal - 3 Quadros de Atraso . . . Sequência Akiyo - Erros na Vista Principal - 3 Quadros de Atraso . . . . . Sequência Mobile - Erros na Vista Principal - 3 Quadros de Atraso . . . . Sequência City - Erros na Vista Principal - 3 Quadros de Atraso . . . . . . Sequência Foreman - Erro na Vista Principal - 6 Quadros de Atraso . . . . Sequência Foreman - Erros na Vista Principal - 6 Quadros de Atraso . . . Sequência Akiyo - Erros na Vista Principal - 6 Quadros de Atraso . . . . . Sequência Mobile - Erros na Vista Principal - 6 Quadros de Atraso . . . . Sequência City - Erros na Vista Principal - 6 Quadros de Atraso . . . . . . Sequência Foreman - Perda integral na Vista Principal - 1 Quadro de Atraso Sequência Foreman - Perda integral na Vista Principal - 1 Quadro de Atraso Sequência Foreman - Erros na Vista Prévia e Principal - 1 Quadros de Atraso Sequência Akiyo - Erros na Vista Prévia e Principal - 1 Quadros de Atraso Sequência Mobile - Erros na Vista Prévia e Principal - 1 Quadro de Atraso Sequência City - Erros na Vista Prévia e Principal - 1 Quadro de Atraso . Sequência Foreman - Erros na Vista Prévia e Principal - 3 Quadros de Atraso Sequência Akiyo - Erros na Vista Prévia e Principal - 3 Quadros de Atraso Sequência Mobile - Erros na Vista Prévia e Principal - 3 Quadros de Atraso Sequência City - Erros na Vista Prévia e Principal - 3 Quadros de Atraso . Sequência Foreman - Erros na Vista Prévia e Principal - 6 Quadros de Atraso Sequência Akiyo - Erros na Vista Prévia e Principal - 6 Quadros de Atraso Sequência Mobile - Erros na Vista Prévia e Principal - 6 Quadros de Atraso Sequência City - Erros na Vista Prévia e Principal - 6 Quadros de Atraso . viii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 44 44 45 45 45 46 46 47 48 49 50 51 52 53 54 55 56 56 57 57 58 58 59 59 60 60 61 61 62 62 63 63 65 65 66 66 67 67 68 68 69 69 70 70 5.36 5.37 5.38 5.39 5.40 5.41 5.42 5.43 5.44 5.45 5.46 5.47 5.48 5.49 5.50 5.51 5.52 5.53 5.54 5.55 Sequência Foreman - Perda integral na Vista Principal/Prévia . . . . . . . Sequência Foreman - Perda integral na Vista Principal/Prévia . . . . . . . Sequência Foreman - Perda integral na Vista Principal/Prévia . . . . . . . Sequência Foreman - Erros na Vista Principal - 1 Quadro de Atraso . . . . Sequência Akiyo - Erros na Vista Principal - 1 Quadro de Atraso . . . . . Sequência Foreman - Erros na Vista Principal - 3 Quadros de Atraso . . . Sequência Akiyo - Erros na Vista Principal - 3 Quadros de Atraso . . . . . Sequência Foreman - Erros na Vista Principal - 6 Quadros de Atraso . . . Sequência Akiyo - Erros na Vista Principal - 6 Quadros de Atraso . . . . . Sequência Foreman - Perda Integral na Vista Principal - 1 Quadro de Atraso Sequência Foreman - Perda Integral na Vista Principal - 1 Quadro de Atraso Sequência Foreman - Erros na Vista Prévia e Principal - 1 Quadro de Atraso Sequência Akiyo - Erros na Vista Prévia e Principal - 1 Quadro de Atraso Sequência Foreman - Erros na Vista Prévia e Principal - 3 Quadros de Atraso Sequência Akiyo - Erros na Vista Prévia e Principal - 3 Quadros de Atraso Sequência Foreman - Erros na Vista Prévia e Principal - 6 Quadros de Atraso Sequência Akiyo - Erros na Vista Prévia e Principal - 6 Quadros de Atraso Sequência Foreman - Perda integral na Vista Principal/Prévia . . . . . . . Sequência Foreman - Perda integral na Vista Principal/Prévia . . . . . . . Sequência Foreman - Perda integral na Vista Principal/Prévia . . . . . . . ix 71 71 72 73 73 74 74 75 75 77 77 78 78 79 79 80 80 81 81 82 SIGLAS, ABREVIAÇÕES E ACRÔNIMOS AVC BNM CABAC CAVCL CODEC DCT DVD DWT FEC FMO H.264 IDCT IEC IP ISO ITU JPEG2000 LDPC MPEG MSE PRISM PSNR QP RECAP SEA SLEP SNR TCP TV UEP VCEG YUV Advanced Video Coding Best Neighborhood Matching Context-based Adaptative Binary Arithmetic Coding Context-based Adaptative Variable Length Coding Codificador/Decodificador Discrete Cosine Transform Digital Versatile Disc Discrete Wavelet Transform Forward Error Correction Flexible Macroblock Order Padrão de Codificação de Vídeo Inverse Discrete Cosine Transform International Electrotechnical Commission Internet Protocol International Organization for Standardization International Telecommunication Union Joint Photographic Experts Group 2000 Low-Density Parity-Check Codes Moving Picture Experts Group Mean Square Error Power-efficient Robust high-compression Syndromebased Multimedia coding Peak Signal-to-Noise Ratio Quantiser Parameter Receiver Error Concealment using Acknowledge Preview Soma de Erros Absolutos Systematic Lossy Error Protection Signal-to-Noise Ration Transmission Control Protocol Televisão Unequal Error Protection Video Coding Experts Group Espaço de Crominância e Luminância x Capítulo 1 INTRODUÇÃO O processamento digital de sinais é o estudo das regras e características que governam o comportamento dos sinais discretos, assim com os sistemas utilizados para processar os sinais [2]. Ele é extremamente útil em muitas áreas, tais como engenharia biomédica, sistemas de comunicação robótica, sensoriamento remoto, etc. Dada a grande variedade de sinais existentes na natureza, o processamento digital de sinais pode ser dividido em sub-áreas como o processamento digital de imagens, processamento digital de áudio, processamento de voz, processamento de sinais biométricos, etc. Um dos campos mais proeminentes do processamento digital de sinais é o processamento digital de imagens que, recentemente, vem sendo objeto de grande interesse de vários ramos da atividade humana, os quais têm sido beneficiados a partir de seus avanços, como Medicina, Biologia, Geografia, Metereologia, Astronomia, etc. Dentro do processamento de imagens, uma área importante é a codificação e compressão de imagens e vídeo digital. Hoje em dia o acesso a imagens e vídeo digital é mais comum e até imprescindível em algumas aplicações. Muitos aparelhos eletrônicos, como telefones celulares, possuem câmeras para capturar imagens e/ou vídeo. Logo, uma transmissão ou armazenamento eficiente destes sinais se torna indispensável. As técnicas de codificação de vídeo e imagens são baseadas na diminuição da redundância presente no sinal. A codificação pode ser feita com ou sem perdas, sendo que a codificação com perdas permite que certa informação (não relevante para uma determinada aplicação) seja eliminada. Atualmente, com o boom de tecnologias como TV Digital, streaming de vídeo, DVD, blu-ray e aplicativos de vídeoconferência, a compressão de vídeo se torna essencial para todas as categorias de mídia digital. Hoje em dia, o padrão mais popular de codificação de vídeo é o H.264/AVC, que busca prover qualidade semelhante aos seus antecessores, porém alcançando melhores taxas de compressão, sem ser impraticável computacionalmente nem inviável economicamente. Além disso, deve suportar transmissão robusta e eficiente de vídeos para os mais diversos perfis de aplicações, redes e sistemas. Uma das aplicações potenciais compreendida pelo padrão H.264/AVC é a videoconferência, que se tornou possível utilizando computadores pessoais em meados da década de 90 e que se popularizou em 2003, coincidindo o lançamento do aplicativo Skype [3]. 1 Sabe-se que este perfil de aplicação necessita de alta resolução e baixa latência para que reproduza uma conversa naturalmente. Logo, faz-se necessário técnicas de detecção e correção de erros caso haja perda ou corrompimento de dados que não inflijam as exigências da aplicação. Há três abordagens genéricas de detecção e correção de erros: retransmissão de dados perdidos, transmissão de dados de paridade e estimação de dados perdidos. A retransmissão de dados aumenta a latência, logo sua utilização é limitada. A transmissão de dados de paridade aumenta a taxa de dados enviados e é útil somente se os dados chegam corrompidos, porém não é proveitosa quando há perda de pacotes. A terceira opção tenta estimar os dados perdidos (ou corrompidos) a partir de dados recebidos corretamente. Esta estimação pode aumentar a carga computacional do receptor, contudo evita a latência e é capaz de lidar tanto com perdas quanto com a corrupção de pacotes. Assim, neste trabalho, buscou-se implementar e melhorar uma técnica de estimação de dados chamada RECAP (Receiver Error Concealment using Akcnowledge Preview) [4]. Esta é uma tecnica de controle de erros criada por pesquisadores da Universidade de Berkeley em conjunto com pesquisadores dos laboratórios da Hewlett-Packard na Califórnia e propõe a transmissão de um sinal adicional que representa uma versão em baixa resolução do sinal de vídeo original. 1.1 Apresentação do Problema O controle de erros em aplicativos de comunicação de vídeo digital traz, inerentemente, problemas críticos. Sinais de vídeo comprimidos são bastante suscetíveis a erros de transmissão por duas razões capitais: a predição, temporal e espacial, utiliza a correlação de suas amostras para codificar as amostras seguintes, logo pode haver propagação de erros (Drifting Error ). Além disso, erros em códigos de comprimento variável geram dessincronização do decodificador e a perda de grandes partes do sinal codificado [5]. Não obstante, aplicações de comunicação de vídeo, tais como TV Digital, videoconferência e streaming de vídeo, necessitam de um sistema robusto, com baixa latência e alta qualidade. Entretanto, a exigência de alta qualidade reduz a eficiência da compressão de dados, já a exigência de baixa latência limita a efetividade de abordagens de correção de erros não robustas à drifting e àquelas que fazem retransmissão de dados perdidos. Portanto, faz-se necessário um sistema de ocultamento de erros que satisfaça ambos esses requisitos de maneira eficiente e viável. 1.2 Objetivos Gerais O objetivo principal deste trabalho é implementar e melhorar uma técnica chamada RECAP (Receiver Error Concealment using Akcnowledge Preview). Para tal, busca-se diminuir ao máximo a taxa de overhead e combinar o sinal de vídeo a ser reproduzido com quadros previamente decodificados para ocultar erros e realizar este processo sem causar um atraso perceptível. 2 1.3 Objetivos Específicos • Propor melhorias no RECAP. • Estudar o padrão de codificação H.264/AVC. 1.4 Revisão Bibliográfica O problema de ocultação de erros tem se tornado cada mais importante devido ao aumento do interesse por sistemas de videocomunicação em canais não-confiáveis. O efeito de ruído destes canais pode gerar erros durante a transmissão que precisam ser tratados para que não haja distorções críticas na imagem apresentada ao espectador nem perda de interatividade. Há técnicas que visam recuperar dados e outras que visam reconstruir ou ocultar erros. Como exemplo, tem-se o FEC (Forward Error Correction) [6] que envia dados de paridade para detecção e recuperação de dados perdidos. Há também o UEP (Unequal Error Protection) [7] que oferece mais proteção a dados mais importantes. O próprio padrão H.264/AVC possui ferramentas que podem ser usadas para ajudar a ocultar erros, como o FMO (Flexible Macroblock Ordering) [8] que organiza os macroblocos em padrões diferentes para codificação. Dessa forma, pode se explorar a redundância espacial das imagens para ajudar na correção de erros. Há, também, técnicas mais modernas como o SLEP (Systematic Lossy Error Protection) [9], que provê técnicas de proteção contra perdas isoladas em um quadro, mas não oferece proteção contra perdas integrais de um ou mais quadros. Há o esquema proposto por Wang [10], que busca atenuar a propagação de erros, contudo seu desempenho é refém do quadro com erros ocultados usado como referência para codificação dos quadros seguintes e não é eficaz caso a correlação estatística não seja estimada eficientemente. No RECAP, utiliza-se uma janela de buscas similar ao PRISM (Power-efficient Robust high-compression Syndrome based Multimedia coding)[11]. Há métodos que estudam as semelhanças dos macroblocos vizinhos com o macrobloco corrompido de modo a estimá-lo [12]. Para tanto, identificam-se texturas, bordas, arestas entre outras características para descobrir padrões e, então, estimar os dados perdidos. Outra técnica é o BNM (Best Neighborhood Matching) [13], que procura o casamento de uma região com a vizinhança do macrobloco perdido. É possível também utilizar os vetores de movimento dos macroblocos vizinhos ao macrobloco perdido para estimá-lo, utilizando polinômios obtidos a partir de fórmulas de interpolação de Lagrange [14]. Há técnicas contra perda integral de quadros que exploram informações do último quadro reconstruído e do próximo quadro para estimar vetores de movimento baseados em pixel do quadro perdido utilizando compensação de movimento de múltiplas hipóteses [15]. 3 1.5 Organização O trabalho está dividido em seis capítulos, incluindo o presente capítulo introdutório. No capítulo 2, encontram-se conceitos básicos de teoria da informação e codificação de fonte e canal. O capítulo 3 introduz conceitos e fundamentos da codificação de vídeo digital e descreve as funções principais do padrão H.264/AVC mais convenientes para o desenvolvimento deste trabalho. O capítulo 4 apresenta, detalhadamente, a arquitetura do método RECAP e todas as etapas de ocultamento de erros. Os procedimentos experimentais, cenários de simulação, resultados obtidos, análise e discussões são relatados no capítulo 5. O último capítulo mostra as conclusões finais com comentários sobre os resultados e propostas de trabalhos futuros. 4 Capítulo 2 CODIFICAÇÃO DE DADOS Neste capítulo serão definidos conceitos básicos de teoria da informação. Serão explicados, também, os conceitos de entropia e os teoremas de codificação de fonte e canal. Estes conceitos são de suma importância para compreensão da aplicação do presente trabalho. 2.1 Conceitos Fundamentais O problema fundamental da comunicação é tentar transportar uma mensagem de um determinado ponto até outro dado ponto [16]. Normalmente, essa mensagem é codificada para ser transmitida por um canal. Para tanto, a teoria da informação responde a duas questões fundamentais: qual a melhor taxa de compressão possível e qual a melhor taxa de transmissão de mensagens na comunicação [17]. Figura 2.1: Diagrama de um sistema genérico de comunicação. Um sistema clássico de comunicação é esquematizado na Figura 2.1. O primeiro bloco deste modelo é a fonte. Este termo se refere ao processo de geração de um subconjunto de mensagens de informação sucessivas dentro de um conjunto de mensagens possíveis [17]. A fonte pode ser vista como uma variável aleatória que transmite símbolos obtidos a partir de determinado alfabeto. A mensagem pode ter significado, entretanto os aspectos semânticos são irrelevantes para o problema. 5 Associada a cada fonte existe uma entropia H, que é a medida de incerteza média de um sinal. No campo da Teoria da Informação, a entropia indica o quanto é desconhecido do sinal, logo quantifica a informação média que deve ser transmitida para realizar a comunicação [17]. A entropia é, normalmente, medida em bits por símbolo, podendo ser expressada também em bits por segundo. Para isso, é necessário saber o tempo médio de geração de cada mensagem. Segue abaixo equação da entropia de uma variável aleatória discreta X: H(X) = − X p(x) log2 p(x) (2.1) x∈χ onde χ representa o alfabeto utilizado, p(x) é a função de probabilidade, com x ∈ χ. Continuando com o modelo clássico de comunicação, a segunda etapa é a codificaçã. Esta codifica a mensagem da fonte em um sinal adequado para transmissão no canal. O canal é o meio utilizado para transmitir um sinal de informação por meios físicos, como cabos, ou por meios lógicos, como canal de rádio. O canal possui uma capacidade máxima de transmissão de informação, geralmente medida pela sua largura de banda em Hertz. O bloco decodificador faz o inverso do codificador, reconstruindo a mensagem que é enviada ao destinatário. O bloco de fonte de ruído é aquele que, durante a transmissão da mensagem no canal, desorienta o sinal, gerando imperfeições no processo de comunicação. 2.2 Codificação de Fonte A codificação de fonte se baseia em dois conceitos básicos: a codificação sem perdas e a codificação com perdas. 2.2.1 Codificação sem Perdas Shannon, em seu trabalho [16], diz que para se garantir a codificação sem perdas, a taxa Rx de transmissão ou armazenamento de um sinal X não pode ser inferior a entropia H(X) deste sinal, isto é: Rx ≥ H(X) (2.2) A Figura 2.2 descreve um sistema básico de codificação e transmissão de uma fonte sem perda de informação. Nota-se que o sinal recebido é idêntico ao transmitido. Figura 2.2: Compressão de fonte sem perdas. 6 2.2.2 Codificação com Perdas O teorema da codificação com perdas indica que para uma determinada distorção aceitável, existe uma taxa mínima associada, de tal forma que a função taxa-distorção é uma função convexa [18]. A distorção é definida como a função que mede a disparidade entre a reconstrução de um sinal X, denotada por X 0 . Ou seja, a distorção D pode ser definida como: D = d(X; X 0 ), (2.3) onde d é uma medida de distorção. Há várias maneiras de medir a distorção, porém a mais amplamente utilizada na literatura e utilizada neste trabalho é o Erro Quadrático Médio ou Mean Square Error (MSE) que é definido por: i h 0 0 2 (2.4) d (X; X ) = E (X − X ) , onde E [·] indica o valor esperado de uma variável aleatória. 2.3 Codificação de Canal A codificação de canal tem como objetivo garantir a correta decodificação de um sinal dada a capacidade deste. Para tanto, devemos definir os conceitos de informação mútua e capacidade de canal. 2.3.1 Informação Mútua A informação mútua mede a dependência recíproca de duas variáveis aleatórias, i.e., a quantidade de informação aproximada que pode se obter de uma variável aleatória observando outra [19]. Segue abaixo a equação da informação mútua de duas variáveis aleatórias X e Y, com função massa de probabilidade conjunta p(x, y) e com funções massa de probabilidade marginais p(x) e p(y). XX p (x, y) , (2.5) I (X; Y ) = p (x, y) log2 p (x) p (y) x∈χ x∈γ onde a informação mútua I(X; Y ) é a entropia relativa entre a distribuição conjunta e o produto de p(x)p(y). 2.3.2 Capacidade do Canal A capacidade do canal indica quanta informação pode ser transmitida por um canal com uma probabilidade de erro próxima de zero [17], i.e., a taxa limite de dados que pode ser alcançada com uma probabilidade de erro arbitrariamente pequena. A equação da capacidade do canal é dada por: C = maxp(x) I(X; C), 7 (2.6) onde X é a entrada de um código discreto de canal sem memória que gera a saída C e C é a capacidade do canal. 2.3.3 Códigos Corretores de Erro Dada uma fonte, podemos então codificar a fonte com ou sem perdas, com o objetivo de diminuir a taxa de transmissão. Por outro lado, a capacidade do canal indica quanta informação redundante se deve agregar ao sinal para que a decodificação tenha uma probabilidade próxima de zero, dada as características do ruído presente no canal. Os códigos corretores de erro adicionam dados redundantes na mensagem, de modo a torná-la recuperável pelo receptor. Logo, esta pode ser transmitida eficientemente e de maneira confiável mesmo através de um canal com ruídos. Ao trabalhar com sinais reais, é praticamente impossível definir um codificador de fonte e/ou canal que chegue sempre no limite teórico. Existem diversos algoritmos de codificação de fonte sem perdas que podem chegar a entropia do sinal, mas não garantidamente. Entre estes, tem-se o código de Huffman [20], códigos baseados em dicionário [21], códigos aritméticos [22], etc. Da mesma forma, há códigos corretores de erro que funcionam adequadamente dado um conjunto de circunstâncias, por exemplo, os códigos LDPC [23], Turbo Coding [24], etc. No capítulo seguinte será detalhado especificamente o sinal de vídeo e técnicas de codificação e compressão para este tipo de sinais. 8 Capítulo 3 CODIFICAÇÃO DE VÍDEO DIGITAL Neste capítulo, serão discutidos os conceitos de Vídeo Digital e a codificação de um sinal de vídeo, além do padrão H.264/AVC. Sera explicado, de forma genérica, o que é um quadro e um pixel. Será descrito como é feita uma codificação de vídeo digital, como é produzida a estimação de movimento, a quantização e as transformadas e mostrar como é feita a correção e ocultação de erros. 3.1 Conceitos de Vídeo Digital Um Vídeo Digital é a representação, tipicamente em três dimensões, de uma cena contínua amostrada no espaço-tempo em formato digital. Cada amostra espacial é chamada de pixel (do inglês, Picture Element) e possui números que a representam no formato digital, de forma a descrever o seu brilho (Luminância) e sua cor (Crominância). No espaço de cores YUV, a componente de luminância é representada pelo valor de Y e pode ser reproduzida separadamente, obtendo uma imagem monocromática ou em escalas de cinza. Já as componentes U e V têm informações sobre as cores. Na Figura 3.1 pode-se ver a sequência de um sinal de vídeo digitalizada. A tridimensionalidade do vídeo digital se dá pelo fato de que duas dimensões indicam a disposição espacial (horizontal e vertical) e a terceira dimensão é o próprio tempo. Quando se faz a amostragem temporal de um vídeo digital, obtém-se um quadro (do inglês, frame). Este representa todos os pixels de um determinado instante de tempo. Grosso modo, um quadro é simplesmente uma foto. Ao mostrar-se uma série de quadros a uma certa velocidade, produz-se a ilusão de movimento. A resolução temporal de um vídeo é definida pela quantidade de quadros por segundo deste. Já a resolução espacial é definida pela quantidade de pixels por quadro. Uma alta taxa de amostragem temporal dá ao espectador uma sensação de suavidade, entretanto requer mais amostras capturadas e armazenadas. 9 Figura 3.1: Elementos de uma sequência de vídeo digital. 3.2 Codificação de Vídeo Digital O principal objetivo de codificar um vídeo é comprimi-lo, i.e., representar seus dados com o menor número de bits possível. Isto se faz necessário para que sua eventual transmissão ou armazenamento, dentro do contexto da aplicação exigente, seja mais eficiente. A compressão se baseia em um codificador e um decodificador. O codificador converte a fonte de dados em uma formato melhor para transmissão e armazenamento. Já o decodificador converte esse formato comprimido de volta ao seu estado original ou aproximado. Esse sistema complementar codificador/decodificador é frequentemente citado como CODEC (do inglês, enCOder -DECoder ). Um modelo ideal de CODEC deveria codificar um vídeo com o mínimo possível de bits e decodificá-lo fielmente ao vídeo original, contudo estes objetivos são, em geral, conflitantes, dado que quanto menor a taxa de bits, menor a qualidade do sinal de saída no decodificador. Um codificador de vídeo genérico é composto de três unidades principais: um modelo temporal, um espacial e um codificador de entropia. O modelo temporal tenta reduzir a redundância explorando a semelhança entre quadros vizinhos, geralmente tentando prever o próximo quadro. Isto é conhecido como codificação inter -quadros. No padrão H.264/AVC, utilizam-se quadros anteriores e futuros para se obter esta predição e esta se torna mais eficiente calculando a compensação de movimento entre a predição e os quadros vizinhos. Geralmente a saída do modelo temporal é uma série de vetores de 10 compensação de movimento, que descrevem como o movimento foi compensado, e o erro de predição, que é chamado de resíduo. Já o modelo espacial faz uso da semelhança entre amostras vizinhas com o objetivo de reduzir a redundância. Isto é feito, normalmente, aplicando uma transformada às amostras residuais e quantizando os resultados. Este processo é conhecido como codificação intra-quadros. A transformada muda o domínio das amostras nos quais estas são representadas por coeficientes transformados. Estes coeficientes são transformados de modo a remover eventuais valores insignificantes. Desta forma, tem-se a representação mais compacta de um quadro residual com menor número de coeficientes significativos. O codificador de entropia tem como função primordial reduzir a redundância estatística dos dados de saída do modelo temporal/espacial, i.e., utilizam-se compressores sem perda para compactar os vetores de compensação de movimento provenientes da saída do modelo temporal e os coeficientes quantizados provenientes da saída do modelo espacial. Gerando, assim, uma sequência de bits compactados que consiste de parâmetros de vetores de movimento, coeficientes residuais codificados e informações de cabeçalho que podem ser transmitidos e/ou armazenados. Na Figura, 3.2 encontra-se o diagrama de um codificador genérico. Figura 3.2: Diagrama de um codificador genérico. 3.2.1 Modelo Temporal O modelo temporal tem como objetivo principal atenuar a redundância entre quadros, prevendo um determinado quadro através do quadro previamente codificado (conhecido 11 como Quadro de Referência). Faz-se a diferença entre ambos os quadros gerando um resíduo. Este é codificado e enviado ao decodificador, que adiciona o resíduo do quadro de referência. Geralmente utiliza-se apenas o quadro anterior como referência, contudo pode-se usar um ou mais quadros passados ou futuros para se prever os quadros seguintes. 3.2.2 Estimação e Compensação de Movimento A Figura 3.3a refere-se ao primeiro quadro de uma sequência de vídeo. A Figura 3.3b refere-se ao quadro seguinte, temporalmente. E a Figura 3.3c refere-se a diferença (resíduo) entre os dois quadros supracitados. No quadro residual, é adicionada uma constante para melhor visualização. (a) Quadro de referência (b) Quadro Atual (c) Quadro Residual Figura 3.3: Quadros estimados. As regiões mais claras e escuras representam diferenças positivas e negativas, respectivamente, e contêm mais energia. As regiões em tom médio de cinza representam pequenas diferenças. Quanto mais precisa a predição, menos energia é observada no quadro residual. Pode-se notar que ainda há muita energia no resíduo, uma vez que há diversas regiões claras e escuras, especialmente na silhueta do objeto. 12 A diferença notada no terceiro quadro pode ter sido causada por diversos fatores: o movimento do objeto em questão, movimentação da câmera filmadora ou até mesmo mudanças de intensidade de luz. Todavia o mais comum é a movimentação do objeto ou da câmera. Desta maneira, a diferença se dá pela movimentação dos pixels entre os quadros. Na Figura 3.4, encontram-se quatro exemplos de um Fluxo Óptico (do inglês, Optical Flow ) que estima a trajetória de cada pixel entre dois quadros, com blocos de diferentes tamanhos [25]. Este fluxo óptico funciona como um campo de trajetórias de cada pixel. Dado um fluxo óptico apurado, é possível construir uma previsão bastante precisa da maioria dos pixels do quadro atual apenas movendo cada pixel da posição de referência de acordo com sua posição no seu campo de trajetórias. (a) Bloco 16×16 (b) Bloco 8×8 (c) Bloco 4×4 (d) Bloco 2×2 Figura 3.4: Fluxo Óptico. No entanto, este modelo de fluxo óptico por blocos, em geral, não é eficiente em termos práticos, uma vez que o cálculo preciso deste necessita de um processamento computacional bastante intenso, muitas vezes através de procedimentos iterativos para cada pixel, e seria necessário enviar um vetor de movimento de cada pixel para o decodificador. Evidentemente, isto poderia gerar um imenso volume de dados a serem enviados e, assim, a vantagem de se ter uma grande precisão e pouco resíduo seria anulada pela grande quantidade de informação em movimento. 13 Uma saída bastante eficaz e amplamente utilizada seria utilizar blocos de pixels ao invés dos pixels individualmente, como pode ser visto na Figura 3.4. Dessa forma, dividi-se o quadro atual em blocos retangulares e procura-se em uma janela de busca ao redor do bloco a ser estimado, no quadro de referência, aquele que melhor se encaixa na posição do quadro atual. O critério de escolha é baseado na quantidade de energia resisual resultante da diferença entre os blocos. Costuma-se utilizar a SEA (Soma dos Erros Absolutos) e suas variantes de função de risco que medem quão próximos são as predições de um resultado final. O processo de procura da região mais semelhante é chamado de Estimação de Movimento e o processo de obtenção do bloco residual é chamado Compensação de Movimento. Figura 3.5: Estimação de Movimento. A região que foi escolhida se torna, então, a predição do bloco atual. Através do processo de estimação de movimento é gerado um vetor de movimento que é codificado e transmitido junto com o resíduo. Estes dados e as informações do bloco usado como referência são suficientes para que o decodificador reconstrua os quadros semelhantes aos originais. Este processo é mostrado na Figura 3.5. A Compensação de Movimento em blocos é a base do modelo temporal de todos os padrões de codificação de vídeo utilizados hoje em dia. É um processo viável computacionalmente e de fácil entendimento. Ao mesmo tempo, responde bem, em geral, a 14 transformadas em bloco aplicadas aos resíduos e funcionam bem para variações temporais. Evidentemente, possui também uma série de desvantagens, como por exemplo: cenas reais nem sempre têm objetos que se encaixem em um formato de blocos, principalmente quando se trata de objetos que mudam sua forma, rotacionam ou se deslocam em movimentos aleatórios (como fumaça, etc.). A Figura 3.6 mostra três quadros. A primeira figura representa o primeiro quadro de uma cena real, a segunda mostra o quadro seguinte e a terceira mostra o resíduo sem compensação de movimento. Já a Figura 3.7 mostra mais quatro quadros residuais com compensação de movimento em macroblocos de 16×16, 8×8, 4×4 e 2×2 pixels, respectivamente. (a) Quadro 1 (b) Quadro 2 (c) Resíduo Figura 3.6: Predição temporal de quadros. É possivel notar facilmente que quanto menor o tamanho do bloco utilizado para fazer a compensação de movimento, menor é a energia residual. Entretanto, apesar dos ganhos obtidos, aumenta-se a complexidade da predição, uma vez que há mais buscas a serem feitas e, também, a quantidade de vetores de movimento, logo há mais informação para transmitir e/ou armazenar. Por conseguinte, a medida que se reduz o tamanho do bloco mais se aproxima do problema da utilização do fluxo óptico com precisão de um pixel. 3.2.3 Modelo Espacial Como já foi dito anteriormente, um vídeo nada mais é que a representação tridimensional de uma cena contínua amostrada no espaço e no tempo, em formato digital. A amostragem temporal já foi discutida. Agora será detalhada como é feita a codificação dentro do próprio quadro, i.e., intra-quadro. Sabe-se que um quadro é uma representação bidimensional de uma cena real em que cada posição do plano (pixel ) é associado à um valor de intensidade de luz e cor. Imagens reais são, muitas vezes, difíceis de comprimir em sua forma natural por causa da alta correlação entre amostras de imagens vizinhas. Já o resíduo da Figura 3.6 é mais fácil de comprimir, uma vez que possui uma correlação menor entre suas amostras. 15 (a) 16×16 (b) 8×8 (c) 4×4 (d) 2×2 Figura 3.7: Resíduos com compensação de movimento. Há três processos básicos para converter os dados em um formato que permita maior eficiência na compressão de dados. Estes são: a tranformada, que descorrelaciona as amostras; a quantização, que diminui a precisão dos dados transformados permitindo diminuir o número de bits para compressão; e a reordenação, que rearranja os dados em grupos de valores significativos. Em um CODEC, a transformada converte os dados da imagem ou do resíduo para outro domínio de representação. Esta transformada deve ter dados descorrelacionados em seu domínio (i.e., amostras minimamente dependentes) e compactos (i.e., a energia em forma de dados deve estar concentrada no menor número de valores possível). Além disso, a transformada deve ser computacionalmente viável e eficiente e, por fim, deve possuir uma inversa. Há muitas transformadas utilizadas na compressão de vídeo e imagem. No entanto, as mais populares geralmente se encaixam em duas categorias: transformadas de bloco e imagem. A transformada de bloco mais comumente utilizada é a DCT (Discrete Cosine Transform) ou Transformada Discreta de Cosseno. A mais popular no caso das transformadas de imagem é a DWT (Discrete Wavelet Transform) ou Transformada Discreta de Leve Ondulação, que é bastante eficiente na compressão de imagens estáticas (é, inclusive, utilizada no padrão JPEG2000 [26]). Contudo, esta última demanda alta disponibilidade de memória e não funciona efetivamente com compensação de movimento em blocos. 16 A DCT opera em um bloco N ×N de amostras, X, e gera um bloco N ×N de coeficientes, Y. Tanto a DCT direta quanto sua inversa (IDCT) podem ser descritas através de uma matriz A, como é mostrado abaixo: Y = AXAT (3.1) X = AT Y A (3.2) Os elementos de A são: Ai,j = Ci cos onde Ci = (2j + 1)iπ 2N , (3.3) p p 1/N , para i = 0, e Ci = 2/N , para i > 0. Como saída, a DCT direta retorna um conjunto de coeficientes N × N que representam os dados da imagem em blocos no domínio da DCT e estes coeficientes podem ser vistos como pesos de um conjunto de padrões de base. Os padrões de base para DCT 4 × 4 e 8 × 8 compostas por combinações de funções cosseno horizontais e verticais podem ser visualizados na Figura 3.8 e Figura 3.9 respectivamente. Figura 3.8: DCT com base 4×4 [1]. Não é intuitivamente óbvio as vantagens de se representar um bloco no domínio da DCT, uma vez que a quantidade de dados permanece a mesma. Porém, ao invés de 16 valores de pixels, há 16 coeficientes da DCT. Fica mais clara a utilidade da transformada quando o bloco é reconstruído por meio de um subconjunto de coeficientes. A Figura 3.10 apresenta uma imagem com um bloco 4×4 destacado. Já a Figura 3.11 mostra esse mesmo bloco ampliado e a Figura 3.12 mostra o resultado após a transformada com coeficientes da DCT. Fazendo todos os coeficientes iguais a zero, exceto o primeiro (conhecido como coeficiente DC), e aplicando a DCT inversa, obtém-se um bloco em que todos seus elementos são iguais a média dos valores dos pixels do bloco original. Adicionando-se mais coeficientes antes de calcular a IDCT, produz-se uma precisão progressivamente maior na 17 Figura 3.9: DCT com base 8×8 [1]. reconstrução do bloco original, como pode ser visto na Figura 3.12. Ao adicionar-se cinco coeficientes, o bloco reconstruído já pode ser considerado uma representação satisfatória do bloco original, dependendo do perfil de aplicação. Portanto, é possível construir um bloco semelhante ao original com um subconjunto dos coeficientes da DCT. 3.2.4 Quantização A fase final do modelo espacial de codificação é a quantização dos coeficientes do bloco no domínio da DCT. Uma função quantizadora busca mapear um sinal com uma extensão de valores X para uma com uma extensão de valores reduzida Y. Dessa forma, esperase representar o sinal com menos bits, uma vez que a variação de valores disponíveis é menor. Há quantizadores escalares que mapeiam elementos individualmente e os vetoriais que mapeiam um conjunto de elementos. A quantização escalar é, grosso modo, um arredondamento. Um exemplo bastante simples de quantização é quando se arredonda um número fracionário para seu inteiro mais próximo. Este é um processo com perdas e irreversível, dado que não há como saber qual era o seu valor original. Neste caso, mapeiam-se valores do conjunto dos números reais para o conjunto dos números inteiros. Como não há preservação do valor original, as informações são descartadas e é por isso que a quantização reduz a quantidade de dados no modelo espacial. Um quantizador uniforme genérico é da forma: X , (3.4) Y = QP.round QP 18 Figura 3.10: Seção de uma imagem com um bloco 4×4 em destaque [1]. (a) Bloco Original (b) Coeficientes da DCT Figura 3.11: Resultado da Transformada [1]. em que X é a extensão de valores originais, Y é a extensão de valores a serem quantizados e QP é o parâmetro de quantização (do inglês, Quantizer Parameter ). A QP também é conhecida como Step Size, pois os valores de saída Y são espaçados uniformemente de 19 (a) 1 Coeficiente (b) 2 Coeficientes (c) 3 Coeficientes (d) 5 Coeficientes Figura 3.12: Blocos reconstruídos com um, dois, três e cinco coeficientes [1]. acordo com o tamanho da QP. É possível perceber facilmente que o conjunto de valores Y é inversamente proporcional ao tamanho da QP. Cria-se, então, uma situação crítica na escolha do valor do parâmetro de quantização do codificador. Há uma dicotomia: um valor grande diminui a extensão de valores de saída Y e, assim, aumenta a compressão dos dados. Já um valor pequeno tem menos perda de informação, portanto se aproxima mais da informação original, contudo reduz a eficiência da compressão. Geralmente a saída de um quantizador é uma matriz esparsa de coeficientes quantizados, contendo, na maioria das vezes, zeros. Para facilitar a compressão por parte do codificador de entropia, agrupam-se os coeficientes nulos, mantendo um número reduzido de valores significativos (não-nulos). A quantização vetorial é análoga à escalar, com a variação de que, utiliza-se uma série de padrões de coeficientes (codebook ) como espaço de mapeamento e o decodificador deve conhecer o codebook para fazer a reconstrução. 3.2.5 Controle de Erros em Sinal de Vídeo Em todo sistema de comunicação pode haver perda ou alteração da informação na transmissão de dados devido a problemas de ruído no canal. Estes erros têm um efeito direto sobre os dados comprimidos, uma vez que qualquer dano a esses dados levam a uma distorção no sinal decodificado. Além disso, os requisitos para transmissão de vídeo digital em sistemas interativos ou em tempo-real excluem várias técnicas de implementação em determinadas aplicações. Por fim, problemas como sincronização de áudio e vídeo e comunicações multiponto dificultam a recuperação dos erros. Grosso modo, as transmissões de erros se dão de duas maneiras: erros de bit aleatórios e erros de apagamento. Os erros de bit aleatórios são causados por imperfeições dos canais físicos, resultando em inversão, inserção ou deleção de bits. Dependendo dos métodos de codificação e do conteúdo da informação distorcida, o impacto pode ser desprezível ou crítico. Por outro lado, erros de apagamento podem ser causados por perda de dados em redes de comutação de pacotes, perdas integrais em mídias de armazenamento devido a defeitos 20 físicos ou falhas no sistema por um pequeno período de tempo. De modo geral, há duas maneiras de se contrapor aos erros de transmissão. Por um lado há o controle tradicional de erros e esquemas de recuperação para comunicação de dados, que podem ser estendidos para transmissão de vídeos. Códigos de controle ou correção de erros são inseridos no sinal codificado para detectar e tentar corrigir os erros encontrados. Essa técnica é útil para erros de bit aleatório. Por outro lado, técnicas de reconstrução de sinal e ocultamento de erros procuram obter, no decodificador, uma aproximação do sinal original com um sinal de saída menos crítica aos olhos humanos, visto que para estes um certo nível de distorção em sinais de imagem e vídeo é tolerável. As técnicas de ocultação de erros durante a reconstrução do sinal são mais úteis para erros de apagamento. Codificação Fonte-Canal Há dois tipos de distorção quando se utiliza um canal de transporte com perdas. O primeiro é o ruído da quantização introduzida pelo codificador de forma de onda e a segunda é a distorção causada pela transmissão de erros. Um codificador e um canal de transporte ideais, em princípio, devem ser projetados de tal maneira que a distorção conjunta devido à quantização e transmissão de erros seja mínima, dado uma largura de banda e uma taxa de erro de canal característicos. Os CODEC’s, em geral, seguem o teorema de codificação separada de fonte-canal de Shannon [16], que estabelece que se pode projetar separadamente o codificador de canal e o codificador de fonte para alcançar uma perfomance ótima do sistema. Primeiramente, estes resultados foram demonstrados para fontes e canais estáticos e sem memória e, mais tarde, foram demonstrados para uma classe mais geral de fontes e canais [27]. Este teorema assume que a complexidade e atrasos de processamento do codificador de fonte e canal podem ser infinitos, contudo, em aplicações reais, isto não ocorre. Primeiro, os sinais de fonte e ambientes de canal podem variar rapidamente, logo, não são estáticos. Segundo, codificadores de fonte e canal devem ser viáveis, i.e., com atraso e complexidade aceitáveis. Nesta situação, o projeto conjunto do codificador de fonte e canal pode alcançar um melhor desempenho [27]. Há várias maneiras de se fazer a ocultação de erros. Essencialmente, todas adicionam um conjunto controlado de dados redundantes no codificador de fonte ou no codificador de transporte. No primeiro caso, a redundância pode ser inserida no codificador de forma de onda ou no codificador de entropia. Alguma técnicas exigem cooperação entre os codificadores de fonte e de transporte, enquanto outros deixam um pouco de redundância ou adicionam informações aos dados codificados que ajudam a ocultação de erros por parte do decodificador. Na Figura 3.13, tem-se um diagrama de blocos de um codificador fonte-canal separado. O codificador de fonte vai tentar mapear o sinal para um conjunto de símbolos de tal forma que a taxa de transmissão seja a mais próxima possível da entropia do sinal. Enquanto 21 Figura 3.13: Codificador Fonte-Canal separado. o codificador de canal vai introduzir redundância, de acordo com a capacidade do canal, para evitar erros de transmissão. Códigos Corretores de Erro Os códigos corretores de erros são um sistema de controle de erros em que a fonte envia informação redundante na mensagem, que poderá ser, eventualmente, utilizada pelo receptor para corrigir efeitos de ruído ou interferências durante a transmissão através do canal. A redundância inserida na informação permite que o receptor detecte e recupere a informação danificada sem que haja retransmissão de dados perdidos, entretanto é necessária uma largura de banda maior e a compressão não será tão eficiente. Os códigos Low-density Parity-check (LDPC) são uma classe importante de códigos corretores de erro linear. Sua principal vantagem em relação aos outros códigos é que este provê um desempenho muito próximo da capacidade de vários canais diferentes e algoritmos complexos de tempo linear [23]. Há também os códigos Turbo Coding, que são uma classe de códigos de correção de erros que foram introduzidas junto com um algoritmo de decodificação [24]. Sua principal vantagem em relação aos outros é que este provê uma eficiência muito próxima do limite teórico predito por Shannon [16] e uma comunicação confiável. Neste trabalho não detalhamos os diferentes códigos corretores de erro, uma vez que o método proposto é uma técnica de ocultação de erros de apagamento. 3.2.6 Codificadores de Entropia Um codificador de entropia , também chamado codificador de fonte, converte um grupo de símbolos, representando elementos da sequência de vídeo, em um fluxo de bits comprimido adequado para transmissão ou armazenamento. Em um sinal de vídeo, estes símbolos de entrada podem ser coeficientes quantizados de uma transformada, vetores de movimento, marcadores, cabeçalhos e outras informações. 22 Codificação Preditiva Certos símbolos tem alta correlação em certas regiões de uma figura, como o coeficiente DC e o valor médio de blocos de pixels intra-codificados e seus vizinhos ou os deslocamentos dos vetores de movimento de blocos vizinhos. Nesses casos, pode haver uma melhoria na eficiência da codificação através da predição de elementos do macrobloco atual a partir de dados previamente codificados e codificando a diferença entre a predição e o valor atual. Normalmente, em um CODEC de vídeo, a codificação preditiva é feita em uma etapa anterior ao codificador de entropia. Codificação de Comprimento Variável Um codificador de comprimento variável (do inglês, Variable-length Coding) mapeia símbolos de entrada em uma série de palavras que funcionam como códigos. Cada símbolo é mapeado em um código e estes podem ter comprimento variável, entretanto devem ter números inteiros de bits. Os símbolos que ocorrem com maior frequência são representados com códigos menores enquanto símbolos mais raros são mapeados com códigos maiores. Sob um número suficientemente grande de símbolos de entrada, isto leva à compressão de dados. O codificador de comprimento variável mais conhecido é o Codificador de Huffman [20]. Este se utiliza da probabilidade de ocorrência de símbolos em um conjunto de dados a ser comprimido para determinar códigos de tamanho variável para cada símbolo. Contudo, o codificador de Huffman tem duas grandes desvantagens para um CODEC de vídeo real: primeiro, o codificador e o decodificador devem utilizar o mesmo conjunto de códigos e transmitir a tabela de probabilidades ao decodificador elevaria o overhead e, portanto, reduziria a compressão de dados, especialmente para pequenas sequências de vídeo. Segundo que a tabela de probabilidades não pode ser calculada até que se tenha codificado todo o vídeo. Logo, para sequências de vídeo muito grandes, o atraso seria considerável, de modo que os codificadores de imagem e vídeo atuais definem conjuntos de códigos baseados em distribuições de probabilidade de vídeos genéricos. Outra grande desvantagem do codificador de Huffman, e todos os outros baseados na mesma ideia, é que estes são sensíveis a transmissão de erros, de maneira que se ocorre um erro em uma sequência de codificação de comprimento variável, isto pode levar o decodificador a se dessincronizar e não ser possível mais codificar corretamente os códigos subsequentes, propagando o erro na sequência decodificada. Codificação Aritmética A codificação aritmética fornece uma alternativa prática à codificação de Huffman, aproximando-se mais das taxas de compressão teóricas máximas [28]. Um codificador aritmético converte uma sequência de símbolos em um número fracionário e pode se aproximar do número fracionário de bits ótimo requisitado para representar cada símbolo. A grande vantagem é que o número transmitido não é limitado há um número de bits inteiro para cada símbolo transmitido. Todavia, existem poucas implementações de codificadores aritméticos binários, sendo as mais conhecidas o Q-coder [29] e o M-coder [30]. 23 3.3 H.264/MPEG-4 AVC O Padrão H.264/MPEG-4 Parte 10, também chamado AVC (do inglês, Advanced Video Coding), foi desenvolvido pelo MPEG (Moving Pictures Expert Group) da ISO (International Organization for Standardization) e IEC (International Electrotechnical Commission) em conjunto com o VCEG (Video Coding Experts Group) da ITU-T (International Telecommunication Union). É o padrão de codificação mais utilizado atualmente tanto em meios comerciais quanto em meios acadêmicos e é mantido conjuntamente pela VCEG e pela MPEG. O objetivo do desenvolvimento do padrão era fornecer funcionalidade semelhante aos padrões anteriores H.263+ e MPEG4 Visual, contudo provendo melhores taxas de compressão à mesma qualidade, adicionar suporte à transmissão robusta em canais de comunicação e sem aumentar a complexidade do projeto a ponto de se tornar inviável de implementar ou custear. As suas aplicações mais comuns são videoconferência (como o aplicativo Skype [3]), streaming em redes comutadas por pacotes (como a Internet), armazenamento (como o Blu-ray) e teledifusão em alta definição (nos sistemas de Transmissão de TV). O padrão nada mais é que um documento que define uma sintaxe para representar sequências de vídeo comprimidas e um método de decodificação dessa sintaxe, de modo que seja feita uma reconstrução correta da sequência. Desta forma, o documento fornece liberdade aos desenvolvedores para criar suas inovações, pois o documento garante que os CODEC’s compatíveis com o padrão sejam operáveis entre si. O documento também apresenta um Decoder e mostra como é feita a decodificação, sendo que cada desenvolvedor pode criar sua própria versão, desde que seja compatível com o método apresentado. Figura 3.14: Codificador H.264 e suas unidades funcionais básicas. 24 A Figura 3.14 apresenta um diagrama com os elementos funcionais básicos de um codificador H.264/AVC: bloco preditor, transformação, quantização, codificador de entropia e um bloco filtrador, que tem como objetivo reduzir o chamado "Efeito de Bloco". Há dois sentidos de fluxo de dados, um direto, da esquerda para direita e o outro chamado reconstrutor ou decodificador local, da direita para esquerda. A Figura 3.15 mostra o caminho do fluxo de dados do decodificador, onde pode ser facilmente verificada a semelhança com o fluxo reconstrutor do codificador. Figura 3.15: Decodificador H.264 e suas unidades funcionais básicas. Na Figura 3.14, o quadro de entrada é processado em unidades de macroblocos, cada qual codificado em modo intra ou inter. Quando se utiliza o modo intra, amostras do mesmo quadro atual que já tenham sido codificadas, decodificadas e reconstruídas são utilizadas como referência para as próximas predições. Já no modo inter, as predições são feitas através da compensação de movimento a partir de blocos de um ou mais quadros previamente codificados, reconstruídos e filtrados, que são usados como referência. É importante ressaltar que pode-se utilizar como referência quadros anteriores ou posteriores, somente com a ressalva de que se houver a utilização de quadros posteriores, deve-se garantir que estes foram codificados, reconstruídos e filtrados antes do atual. A predição é, então, subtraída do bloco atual a fim de produzir um bloco residual que é transformado para o domínio da DCT e quantizado. Na Figura 3.14, este processo é descrito pelos blocos identificados por T e Q, respectivamente. Finalmente, os coeficientes quantizados da DCT são reordenados e codificados por um codificador binário sem perdas ou codificador de entropia. Estes coeficientes codificados formam o bitstream de saída juntamente com as informações sobre modo de predição, parâmetro de quantização, vetores de movimento, cabeçalhos, etc. O codificador possui um decodificador local (Fluxo reconstrutor), como é possível ver na parte inferior da Figura 3.14. Este decodificador interno reconstrói os quadros para que estes possam ser usados como referência para futuras predições. Os coeficientes quantizados são escalonados e transformados inversamente, produzindo um bloco diferencial 25 que é somado ao resíduo a fim de formar uma versão reconstruída que é filtrada e utilizada como quadros de referência. Na Figura 3.15, o decodificador recebe uma sequência binária comprimida e utiliza o seu decodificador de entropia para obter os símbolos que representam os coeficientes que são reordenados, reescalonados e transformados em blocos diferenciais pela transformada inversa. Com a adição das informações de cabeçalho, vetores de movimento e informações de modos de predição, um bloco de predição é gerado e somado ao bloco diferencial, obtendo, assim, o bloco reconstruído que é posteriormente filtrado e armazenado para criar cada bloco decodificado. Quando foi concebido, o padrão H.264/AVC definiu um conjunto de três perfis de configuração, que determina um conjunto específico de técnicas e algoritmos do codificador e do decodificador concordantes com uma determinada aplicação. Estes perfis respondem pelo nome de Baseline, Main e Extended e contemplam classes de aplicação específicas. A modelagem de codificadores e decodificadores utiliza esse tipo de classificação para serem projetados. As aplicações do perfil Baseline utilizam baixa complexidade computacional e precisam ser suficientemente robustos contra a perda de dados, como videotelefonia, videoconferência e comunicação sem-fio. Já o perfil Main é utilizado em aplicações em que se faz necessário alta compressão para teledifusão ou armazenamento. O perfil Extended é como uma mistura entre os dois anteriores, sendo robusto para transmissão e com alta taxa de compressão, utilizada em aplicações de streaming de vídeo em que a banda pode ser suficiente, mas perdas são comuns. Após a definição desses três perfis básicos, foi criada uma extensão do padrão H.264/AVC, conhecido como FRExt Extention [31]. Essa extensão foi depois incorporada como um novo perfil, chamado High, que possui sub-perfis e tem o objetivo de codificar sequências de vídeo de alta qualidade. Apesar de depender da natureza da utilização, estes perfis são adaptáveis à uma grande variedade de aplicações, portanto não devem ser analisados como invariáveis. A Figura 3.16 apresenta as relações dos perfis e mostra distintamente que o perfil Baseline é um subconjunto do perfil Extended, mas não do perfil Main e que todos estes fazem parte do perfil High. A seguir será explicado como é feita a predição em blocos inter e intra e para isso é necessário saber o que é uma figura, um field, um slice e os tipos de macrobloco. Muitas vezes os termos quadro e figura são usados indiscriminadamente para se referir a uma mesma coisa. Contudo, figura é uma noção mais gerérica, visto que pode ser um quadro ou um campo (field ). Um quadro é uma amostra temporal progressiva de um vídeo. Um campo também é amostrado temporalmente, porém só as linhas de número par ou de número ímpar por intervalo de amostragem, logo somente metade dos dados são amostrados. 26 Um slice é um região espacialmente distinta de um figura que é codificada separadamente de todas as outras regiões na figura. O H.264/AVC é um padrão de codificação orientado a macroblocos e, neste contexto, slice é um conjunto de macroblocos ordenados em um quadro e possui diferentes disposições como interleaved, dispersa, raster scan, etc [1]. Os macroblocos podem ser do tipo I (que são codificados com predição intra), do tipo P (que são codificados com predição inter ) ou do tipo B (que são codificados de modo bi-preditivo, onde um macrobloco pode ser formado como a média aritmética ou média ponderada de duas referências). Os slices do tipo I contêm somente macroblocos I. Os slices do tipo P contêm somente macroblocos I ou P. Há também os slices do tipo SP (contêm macroblocos P e/ou I) e tipo SI (tipo especial de macrobloco I). Os slices do tipo B contêm macroblocos I, P ou B. Figura 3.16: Perfil Baseline, Main, Extended e High. 3.3.1 Predição Intra A predição intra se alicerça nas correlações espaciais existentes entre macroblocos vizinhos do mesmo slice que já tenham sido codificados e reconstruídos. O codificador tem o papel de reduzir ao máximo a diferença entre o bloco original e sua predição, ao escolher o melhor modo de predição. Para cada componente de luminância são formados blocos de amostras 4×4 (Figura 3.18), 16×16 (Figura 3.19) ou 8×8 (somente no perfil High). Para cada componente de crominância são formados blocos de amostras 8×8. O que o codificador faz é escolher métodos de interpolação e extrapolação sobre as amostras vizinhas para gerar um bloco. Pode-se fazer a predição intra em uma única operação através de amostras de luminância 16×16. Há quatro modos descritos na Figura 3.19: extrapolação das amostras 27 superiores; extrapolação das amostras da esquerda; média entre as amostras superiores e da esquerda; e uma função linear das amostras superiores e da esquerda. Já a predição intra, com amostras de luminância de tamanho 8×8, utiliza o mesmo conceito da predição 4×4, isto é, nove modos distintos. A Figura 3.17 mostra a representação com letras do alfabeto de um bloco 4×4 de luminância a ser estimado. As amostras acima e à esquerda que vão de A a M são amostras previamente codificadas e reconstruídas e que podem ser usadas para produzir uma predição do bloco adjacente. As amostras representadas por letra minúscula simbolizam o bloco a ser estimado pela predição. Escolhe-se um dos nove métodos mostrados na Figura 3.18 para, então, calcular as amostras (de a-p) do modo de predição a partir de interpolações ou extrapolações. O Método 2, conhecido como Predição DC, é basicamente uma média simples entre as amostras que já tiverem sido previamente codificadas. Os modos restantes só são usados se todas as amostras do bloco de predição requerido estiverem disponíveis. Figura 3.17: Rótulos das amostras e direções de predição (4×4) [1]. O método 0 extrapola verticalmente as amostras de A a D. O método 1 extrapola horizontalmente as amostras I-L. O terceiro método interpola em 45 graus as amostras do canto superior direito ao canto inferior esquerdo. O quarto método extrapola em 45 graus as amostras do canto superior esquerda ao canto inferior direito. O método 5 extrapola em um ângulo aproximado de 26.6 graus para direita verticalmente e o sexto método faz o mesmo, porém para direita horizontalmente. O penúltimo método extrapola ou interpola no mesmo ângulo anterior para a esquerda verticalmente e o último utiliza o mesmo ângulo para interpolar horizontalmente acima e à direita. A escolha do método indica que mais dados serão inseridos no arquivo de saída, diminuindo a taxa de compressão, contudo este overhead pode ser reduzido estimando-se o método mais provável para o bloco analisado e é então codificada a diferença entre o método real e aquele estimado. 3.3.2 Predição Inter A predição inter utiliza a estimação de blocos a partir de um ou mais quadros previamente codificados e reconstruídos. O padrão H.264/AVC apresenta novos recursos nesta 28 Figura 3.18: Métodos de predição intra para blocos de luminância de 16×16 [1]. Figura 3.19: Métodos de predição intra para blocos de luminância de 4×4 [1]. área como suporte à uma variedade de tamanhos de bloco entre 16×16, como é mostrado na Figura 3.20a e em sub-macroblocos como é mostrado na Figura 3.20b. Como há várias possibilidades dentro das possibilidades, este método ficou conhecido como Compensação de Movimento em Estrutura de Árvore. A Figura 3.20 mostra as divisões para componente Y. Para as outras componentes é análogo, porém com as dimensões pela metade. O tipo de partição escolhido pode melhorar ou piorar a compressão do vídeo. De modo geral, as partições maiores (por exemplo, 16×16) são mais apropriadas para regiões homogêneas da imagem. Ela exige poucos bits indicadores dos vetores de movimento e 29 (a) Macrobloco 16×16 (b) Sub-macrobloco Figura 3.20: Possibilidades de partição de um macrobloco [1]. tipo de partição, porém pode sobrar muita energia no resíduo da compensação de movimento, caso o macrobloco tenha muitos detalhes. Já no caso de partições menores (por exemplo, 4×4), há mais vetores de movimento, portanto mais bits a serem transmitidos, além do tipo de partição, entretanto sobra menos energia no resíduo da compensação de movimento, logo estas são mais apropriadas para regiões com pouco detalhamento. 3.3.3 Transformada e Quantização O padrão H.264/AVC utiliza transformada DCT (Discrete Cosine Transform) com coeficientes inteiros, de modo a tornar a etapa da transformação menos computacionalmente custosa. O parâmetro de quantização é responsável por controlar a qualidade da imagem reconstruída e a taxa de bits do arquivo de saída do decodificador. O padrão H.264/AVC realiza a quantização e transformação conjuntamente. 3.3.4 Codificação de Entropia O padrão se utiliza de duas classes de codificadores de entropia. A primeira é baseada em códigos de Huffman, chamada CAVLC (do inglês, Context-Adaptative Variable-Length Coding) e a segunda baseada em codificação aritmética, chamada CABAC (do inglês, Context-Adaptative Binary Arithmetic Coding). O segundo modelo de codificador de entropia, CABAC, necessita de mais custo computacional, porém é mais eficiente na compressão dos dados [32]. O Huffman também melhora o desempenho da codificação e é mais brando computacionalmente, porém é menos eficiente. Neste trabalho, estes codificadores não serão detalhados. 30 Capítulo 4 SISTEMA DE CORREÇÃO DE ERROS UTILIZANDO VISTA PRÉVIA O objetivo deste capítulo é apresentar um método de ocultamento de erros em transmissão de vídeo digital utilizando um sinal auxiliar paralelo e independente do sinal original. Este capítulo irá mostrar o método RECAP, explicar sua arquitetura e detalhar suas unidades básicas. 4.1 Introdução Em princípio, a comunicação entre interlocutores utilizando videoconferência deveria ser uma experiência sensitiva simuladora da comunicação real. Para tanto, faz-se imprescindível que o fluxo de transmissão de vídeo tenha baixa latência e alta qualidade. Entretanto, a exigência de baixa latência limita a efetividade de abordagens de correção de erro tradicionais, como a retransmissão de dados. Já o requisito de alta qualidade diminui a eficiência de compressão de dados e a transferência de um arquivo grande pode aumentar a probabilidade de perdas de pacote em redes não-seguras. Neste trabalho, buscou-se implementar uma solução prática para aplicativos de videocomunicação de baixa latência em redes do tipo melhor-esforço, como TCP/IP, adicionandose uma cópia robusta do vídeo, porém de baixa resolução e qualidade. Esta abordagem impõe taxa mínima de overhead e pode ser combinada com quadros previamente codificados, de forma a ocultar perdas isoladas ou integrais, mesmo sob diminutas restrições de atraso. Apesar da utilização de dispositivos eletrônicos (webcam, microfone, etc), uma conversa entre interlocutores por videoconferência deve se assemelhar à uma conversa real, como se estivessem frente a frente em um mesmo local. Entretanto, este é um processo bastante complexo, visto que frequentemente há a necessidade de se utilizar fontes de vídeo de alta resolução, como 720p ou 1080p, que estressam a rede. Ao mesmo tempo, são inadmissíveis eventuais congelamentos de imagem que são comuns em streaming de vídeo na Internet. 31 Como já foi visto no Capítulo 3, existem três abordagens genéricas de controle de erros: a retransmissão, a correção e a estimação de dados perdidos. A primeira não se revela satisfatória em aplicações que exijam transmissão em tempo-real. Isto ocorre porque, impreterivelmente, a retransmissão de dados aumenta a latência, que é diretamente proporcional a distância do ponto de codificação ao ponto de decodificação. Logo, uma única retransmissão de dados poderia causar atrasos, dessincronizar a conversa e suprimir a naturalidade da videoconferência. A segunda abordagem também não convém aos propósitos do trabalho. Métodos de correção de erros, como o FEC (Forward Error Correction [6]), enviam informações redundantes para ajudar a detectar e corrigir erros. Sua variação, o UEP (Unequal Error Protection [7]), oferece mais proteção a dados mais importantes, como modelos de macrobloco e vetores de movimento. Porém, ambos necessitam utilizar interleaving, que aumenta a latência, para canais com Bursty Losses, i.e., com perdas integrais. Estes sistemas de correção de erros são inúteis quando a perda se dá em mais de um quadro. A terceira abordagem é a que mais se ajusta às requisições de alta qualidade e baixa latência. Nesta abordagem, não se tenta reenviar ou corrigir os dados perdidos, mas sim, estimá-los de forma inteligente através de técnicas que serão descritas mais à frente no capítulo. Sabe-se que, de modo geral, ocultar erros em áreas pequenas e dispersas do quadro é mais fácil que ocultá-los em grandes regiões contíguas [33]. Para tanto, o padrão H.264/AVC definiu um conjunto de ferramentas de controle de erros que proporcionam maior eficiência no processo de ocultamento. Figura 4.1: Padrão checkerboard do algoritmo FMO em um quadro da sequência Mobile. Este é o caso do algoritmo de Ordenação Flexível de Macroblocos (do inglês, Flexible Macroblock Ordering) que permite que os macroblocos em slices sejam organizados no padrão checkerboard, como é mostrado na Figura 4.1. Entretanto, o FMO - que utiliza a correlação especial das suas amostras para ocultar erros - não oferece nenhuma proteção quando se perde todos os slices de um quadro [8]. 32 4.2 RECAP (Receiver Error Concealment Using Acknowledge Preview ) O método sugerido neste trabalho propõe a transmissão de um sinal de baixa resolução adicional e independente do sinal original, chamado vista prévia (ou Preview ). A diferença entre o sinal original e o Preview é que o segundo só faz a predição do quadro atual a partir de quadros passados em que não foram detectados erros, já o primeiro faz a predição a partir de qualquer quadro anterior ou conforme foi codificado. A principal vantagem de se usar somente quadros comprovadamente sem erros para predição é que este poderá sempre ser decodificado corretamente para auxiliar o ocultamento de erros no sinal original. Figura 4.2: Funcionamento básico do método proposto. A Figura 4.2 mostra, em laranja, a sequência de quadros decimados (Preview ) e, em azul, a sequência original correspondente. As setas em azul indicam qual quadro foi utilizado como referência para codificação do quadro atual, i.e., na sequência principal, utilizam-se quadros imediatamente anteriores e, na sequência auxiliar, utilizam-se sete quadros anteriores como referência para codificação. Neste exemplo, o Quadro 0, em vermelho, é integralmente perdido. Contudo, seu Preview correspondente 0’ pode ser usado para fazer a ocultação do erro. E até mesmo se todos os quadros anteriores e seus correspondentes no Preview fossem perdidos do (0,0’) até o (-6,-6’) e o 1, ainda assim o quadro 1’ poderia ser usado para fazer o ocultamento de erros do quadro 1. No exemplo, o Preview está sendo codificado com uma referência de sete quadros anteriores, simulando o tempo que o codificador demorou para verificar que este determinado quadro foi decodificado sem erros. 33 O RECAP se alicerça em três fundamentos: • Blocos da sequência principal podem ser aleatoriamente perdidos/corrompidos. Caso não se tenha perdido/corrompido também o bloco de mesma localização no Preview correspondente, o decodificador pode utilizar este último para fazer uma pesquisa dentro de uma janela de buscas no quadro anterior e substituir o bloco perdido pelo bloco mais semelhante ao seu Preview. • Seguindo o mesmo caso do item anterior, ao invés de procurar o bloco mais semelhante no quadro anterior, pode-se fazer uma reconstrução rudimentar do bloco perdido através da interpolação do bloco correspondente no Preview. • Por ter baixa resolução, o sinal de Preview não eleva consideralmente a taxa de overhead e por ser codificado usando apenas quadros comprovadamente sem perdas, é confiável e pode ser utilizado para ocultar erros na sequência principal. Figura 4.3: Diagrama de Blocos. 4.2.1 Fluxo de Dados A Figura 4.3 apresenta um diagrama de blocos referente ao modelo proposto. Uma sequência de vídeo é codificada com o padrão H.264/AVC e gera um bitstream codificado e a sequência de vídeo reconstruída. O primeiro é enviado ao decodificador e o segundo é decimado, i.e., suas dimensões são divididas por quatro, logo seu tamanho é 16 vezes menor 34 que o original. Este arquivo decimado é codificado novamente, gerando outro arquivo bitstream que é enviado, também, ao decodificador. Este segundo bitstream representa a vista prévia. Caso se encontre em alguma rede de datagramas não-segura (rede de melhor esforço), os pacotes dos dois bitstreams podem ser corrompidos ou perdidos. Então, o sinal decodificado é enviado ao detector de erros. O sinal de vista prévia é utilizado tanto para detectar erros quanto para corrigir o sinal decodificado. Note que o decodificador da vista prévia possui um canal de retorno (feedback ) que envia uma mensagem ao codificador indicando se o quadro foi decodificado sem erros. Dessa forma, pode-se garantir que o sinal de vista prévia não possui erros de drifting. Como esta comunicação é em um único sentido e o codificador não fica esperando a mensagem, além de sempre usar o último quadro corretamente decodificado, o canal de retorno não acrescenta latência ao sistema. Uma demora na transmissão do canal de retorno vai, no máximo, fazer com que a vista prévia não tenha uma taxa de compressão tão elevada, visto que os quadros serão codificados utilizando uma referência distante. Entretanto, como este sinal foi decimado por um fator de 41 , este aumento de taxa não é significativo ao se comparar com a taxa do sinal principal. Para encontrar um erro, o detector calcula o MSE (do inglês, Mean Square Error ) entre o versão decimada do bloco reconstruído e o bloco de mesma localização no seu Preview correspondente. Se o valor do MSE for maior que um determinado limiar calculado previamente através de blocos consistentes, esse bloco é marcado como perdido ou corrompido. Então os quadros reconstruídos e seus respectivos Previews são enviados ao corretor de erros juntamente com informações sobre blocos inconsistentes. Através das informações de blocos inconsistentes, faz-se a interpolação do bloco de mesma localização no Preview, i.e., suas dimensões são multiplicadas por 4. Calcula-se, então, o menor MSE entre este bloco e todos os blocos dentro de uma janela de busca no quadro anterior do sinal da vista principal, logo este é o bloco mais semelhante ao correspondente no Preview, tornando-se um candidato a ocultar o erro do reconstruído. Se o menor MSE for menor que um determinado limiar calculado previamente, então utilizase o bloco do quadro anterior, caso contrário utiliza-se o bloco do Preview interpolado para ocultar o erro. Cada etapa será explicada em detalhes na próxima seção. 4.2.2 Etapa de Codificação O codificador H.264 recebe várias informações sobre como proceder na codificação da sequência de entrada, como pode ser visto na Figura 4.4: nome do arquivo, dimensões do vídeo, quantidade de quadros, formato de amostragem, parâmetro de quantização e, no caso do codificador RECAP, qual quadro anterior será utilizado como referência, dentre outras informações. 35 Figura 4.4: Informações de codificação. A codificação gera três arquivos de saída: um arquivo codificado (.264 ), que será enviado ao decodificador; um arquivo YUV reconstruído pelo decodificador local do codificador e um arquivo de texto contendo um relatório de codificação, como pode ser visto na Figura 4.5. Figura 4.5: Arquivos de saída da codificação. 36 O codificador da vista principal utiliza o quadro anterior como referência para codificação do quadro atual. Já o codificador da vista prévia utiliza-se somente de quadros comprovadamente sem erros, i.e., aqueles que receberam uma mensagem do canal de retorno. Há duas possibilidades se simular esse tipo de codificação: modificar o código do padrão H.264 ou fazer uma reordenação dos quadros. A idéia da reordenação é simular o tempo necessário para que o codificador receba a mensagem de decodificação sem erros. Neste trabalho, optou-se por reordenar os quadros, por ser considerado mais viável. Figura 4.6: Reordenação dos quadros. Para realizar a reordenação, deve-se informar qual será o atraso gerado, em quantidade de quadros. Então divide-se os quadros em grupos do mesmo tamanho, como é mostrado na sequência superior da Figura 4.6, para um atraso de três quadros, e reordena-se os quadros de acordo com o algoritmo mostrado a seguir: Algorithm 1 Desordena os quadros da sequência decimada. 1: j ←REF+1 2: for i=2 até F do 3: Y 1(i) ←Y2(j) 4: U 1(i) ←U2(j) 5: V 1(i) ←V2(j) 6: j ←j+REF 7: if j > F then 8: j ←j-F+1 9: end if 10: end for Neste algoritmo, REF é a variável que guarda em quantos grupos os quadros serão divididos. Y2 é uma cópia de Y1, que é um vetor de matrizes contendo os valores da componente Y e o mesmo serve para as outras componentes. Após desordenar-se a sequência de acordo com o algoritmo proposto, faz-se a codificação normal, i.e., a partir do quadro anterior, exceto para os REF primeiros quadros, que são codificados no modo Intra. Produz-se, então, um arquivo decimado codificado que é enviado ao decodificador. 37 4.2.3 Etapa de Decodificação O decodificador H.264 recebe também várias informações sobre como proceder na decodificação, com algumas diferenças, como por exemplo: nome do arquivo codificado (.264) recebido do codificador. E, no caso do codificador da vista prévia, qual quadro anterior será utilizado como referência para fazer a reordenação do vídeo, dentre outras informações. A decodificação gera somente dois arquivos de saída: um arquivo decodificado YUV, que será enviado ao detector de erros e um arquivo de texto, contendo um relatório de decodificação. O decodificador da vista principal utiliza o quadro anterior como referência para decodificação do quadro atual. Já o decodificador da vista prévia se utiliza somente de quadros comprovadamente sem erros, i.e., aqueles que receberam uma mensagem do canal de retorno. Contudo, o arquivo codificado recebido pelo decodificador está desordenado. Como mostra a Figura 4.7, faz-se, então, a reordenação para colocar a sequência de vídeo na sua ordem natural. Figura 4.7: Reordenação dos quadros. Cabe enfatizar que esta ordenação é necessária somente porque está sendo simulado o processo do canal de retorno. Para realizar a reordenação, deve-se informar qual foi o atraso utilizado. Então seguindo o algoritmo 2, faz-se a reordenação dos quadros, como mostra o exemplo da Figura 4.7. Após reordenar-se a sequência de acordo com o algoritmo proposto, o fluxo de dados continua normalmente. Algorithm 2 Reordena os quadros da sequência decimada. 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: j ←round(F/REF)+1 for i=2 até F do Y 1(i) ←Y2(j) U 1(i) ←U2(j) V 1(i) ←V2(j) j ←j+F/REF if j > F then j ←j-F+1 end if end for 38 4.2.4 Etapa de Redimensionamento O bloco redimensionador é o mais simples de todos. Ele recebe o arquivo reconstruído YUV do codificador e redimensiona cada quadro retornando um quadro dezesseis vezes menor, como mostra a Figura 4.8. Figura 4.8: Decimação - Reconstruído e seu respectivo decimado. 4.2.5 Etapa de Detecção de Erros O detector de erros recebe a sequência decodificada da vista principal e a decimada da vista prévia, além do tamanho do bloco (16×16 e 4×4, respectivamente) e dois limiares que foram calculados previamente e que irão determinar se um bloco é consistente ou não com seu respectivo quadro da vista prévia e da vista principal. 4.2.5.1 Limiares de Detecção de Erros Aqui se faz um parêntese para discussão sobre o cálculo do limiar. No trabalho original do RECAP [4], não se explicita como esse cálculo foi feito. Portanto, para este trabalho foram desenvolvidos dois métodos que serão explicados a seguir: um chamado Vetor de Limiares e outro chamado Limiar baseado no Primeiro Quadro. Vetor de Limiares: Neste caso, faz-se um pré-processamento do vídeo para descobrir o limiar de erro entre o quadro atual da vista principal e o anterior, assim como entre o quadro atual da vista principal e seu correspondente decimado e criam-se dois vetores: um vetor de limiares da vista principal e um vetor de limiares da vista prévia. Para descobrir o limiar de um quadro em relação ao seu correspondente decimado (Preview ), redimensiona-se o quadro da vista principal, de tal forma que este fique do mesmo tamanho do quadro da vista prévia e faz-se o cálculo do MSE, bloco a bloco (como é mostrado na Figura 4.9), de cada quadro da sequência decodificada com o quadro correspondente na vista prévia e guarda-se o maior valor no vetor de limiares da vista prévia, como é mostrado na Figura 4.10. 39 Para descobrir o limiar da vista principal, faz-se o cálculo do MSE, bloco a bloco (como é mostrado na Figura 4.11), de cada quadro da sequência reconstruída com o quadro anterior reconstruído. Guarda-se o maior valor do quadro e registra-se no vetor de limiares da vista principal, como é mostrado na Figura 4.12. Figura 4.9: Cálculo de Limiares da Vista Prévia. Cabe salientar duas coisas em relação ao vetor de limiares. Primeiro, o vetor da vista principal não possui informações na primeira posição, uma vez que este não possui um quadro anterior para fazer comparações. Segundo, os valores do vetor de limiares da vista prévia são significativamente menores em relação aos valores do vetor da vista principal, uma vez que os quadros da vista principal e seus correspondentes decimados são muito similares. Figura 4.10: Vetor de Limiares da Vista Prévia. 40 Figura 4.11: Cálculo de Limiares da Vista Principal. Para obter o vetor de limiares da vista prévia, como os blocos tem tamanhos diferentes, faz-se necessário decimar o quadro reconstruído de modo que este fique do mesmo tamanho do bloco do Preview. O processo de calcular o vetor de limiares é mostrado no Algoritmo 3. Neste algoritmo, D1 e D2 são as dimensões dos vídeos e Limiar é o maior MSE do quadro. Faz-se necessário enfatizar que o processo de calcular o vetor de limiares deve ser feito antes da codificação. Logo, é um processo offline que não pode ser feito em tempo real. Uma vez calculados os limiares para cada quadro, a detecção de erros é feita procurando erros no quadro atual, fazendo comparações com seu correspondente na vista prévia e com o quadro anterior da vista principal. No caso de erros no Preview, redimensiona-se o bloco do quadro reconstruído de forma que ele fique do mesmo tamanho do bloco do Preview. Então, calcula-se o MSE entre ambos e compara-se este valor com o limiar correspondente no vetor. Utilizando-se o exemplo da Figura 4.13, redimensiona-se o bloco A do reconstruído, criando-se o bloco B e compara-se este com o correspondente Figura 4.12: Vetor de Limiares da Vista Principal. 41 Algorithm 3 Cálculo do Limiar. 1: Limiar ← 0 2: for i=1 até X do 3: for j=1 até Y do 4: if D1 6= D2 then 5: REDIM EN SION A(Y 1, 0.25) 6: M SE_Atual ←MSE(Y1(i,j),Y2(i,j)) 7: else 8: M SE_Atual ←MSE(Y1(i,j),Y2(i,j)) 9: end if 10: if MSE_Atual > Limiar then 11: Limiar ←MSE_Atual 12: end if 13: end for 14: end for no Preview, bloco A’. Se o valor do MSE é maior que o valor do limiar, o bloco é marcado como errado ou inconsistente. Figura 4.13: Comparação do bloco reconstruído com o bloco do Preview. No trabalho original do RECAP [4], caso o valor encontrado fosse maior que o limiar, este bloco era diretamente marcado como inconsistente e não se testava se houve erros com relação ao reconstruído anterior. Neste trabalho, utilizando-se do vetor de limiares da vista principal, faz-se também a detecção de erros em relação ao quadro anterior, 42 como mostra a Figura 4.14. Calcula-se o MSE entre o bloco B, com o bloco de mesma localização A, no quadro anterior. Se este valor ultrapassar o limiar correspondente no vetor de limiares, este bloco é marcado como inconsistente. A detecção de erro utilizando o quadro anterior da vista principal é importante porque o quadro da vista prévia pode também conter erros e não ser útil na detecção. Não é difícil assumir que a vista prévia possa ser enviada por um canal mais seguro, logo pode estar livre de erros, entretanto, em algumas aplicações esse canal seguro pode não estar presente, logo, procurar erros também no quadro anterior da vista principal torna o sistema mais robusto. Figura 4.14: Comparação do bloco reconstruído com o bloco do quadro anterior. Limiar baseado no Primeiro Quadro: Neste caso, faz-se o mesmo procedimento do vetor de limiares, i.e., faz-se um pré-processamento, contudo só para o primeiro quadro no Preview e só para o segundo quadro da vista principal. O H.264 possui ferramentas que enviam dados redundantes para garantir que determinados quadros sejam decodificados corretamente, i.e., há meios de se proteger quadros importantes [34]. Assim, o codificador pode se utilizar destes meios para se assegurar de que os dois primeiros quadros sejam corretamente decodificados e, então, calcular o limiar Preview do primeiro e o limiar reconstruído do segundo quadro. Estes dois limiares serão multiplicados por uma constante K e K 0 , respectivamente. E estes serão os limiares para todos os outros quadros. Empiricamente, foi verificado que para a constante K, da vista prévia, o valor razoável seria 10, uma vez que se um quadro for consistente com seu Preview não deverá ultrapassar este valor. Já para o reconstruído, o valor empiricamente verificado é 100, porém, como será visto mais a frente, este limiar não é utilizado para detectar erros e, sim, para testar candidatos a ocultamento de erros na etapa de ocultação de erros. Este processo, então, vai automaticamente gerar dois limiares durante a codificação do sinal. 43 4.2.6 Etapa de Ocultação de Erros O bloco ocultador de erros recebe o quadro reconstruído atual, o quadro reconstruído anterior, o quadro Preview e informações como tamanho de bloco, tamanho de janela de busca, limiares e informações sobre blocos inconsistentes. Durante a transmissão de dados, as perdas nos canais podem ocorrer em blocos isolados ou em quadros inteiros. Verifica-se, então, as informações de blocos inconsistentes de forma a casá-las com um dos seguintes casos: 1. Caso um bloco esteja marcado como inconsistente em relação ao Preview, porém consistente em relação ao reconstruído anterior, este bloco não será enviado para correção, visto que o mais provável é que a vista prévia esteja com erros e, não, a vista principal, como mostra a Figura 4.15. Figura 4.15: Perda de bloco isolado no quadro da vista prévia. 2. Caso um bloco esteja marcado como inconsistente em relação ao Preview e como inconsistente em relação ao reconstruído anterior, este bloco será enviado para correção, visto que somente a vista principal contém erros, como mostra a Figura 4.16. Figura 4.16: Perda de bloco isolado no quadro da vista principal. 3. Caso um bloco esteja marcado como consistente em relação ao Preview, porém inconsistente em relação ao reconstruído anterior, este bloco será enviado para correção, visto que tanto o Preview quanto a vista principal podem conter erros, como mostra a Figura 4.17. 44 Figura 4.17: Perda de bloco correspondente completo em ambas as vistas. 4. Caso todos os blocos de um quadro estejam marcados como inconsistentes em relação ao Preview, mas não em relação ao reconstruído anterior, este bloco não será enviado para correção, visto que isto indica que o quadro da vista prévia foi perdido, como mostra a Figura 4.18. Figura 4.18: Perda de quadro completo na vista prévia. 5. Caso todos os blocos de um quadro estejam marcados como inconsistentes em relação ao Preview e como inconsistentes em relação ao reconstruído anterior, este bloco será enviado para correção, visto que somente o quadro da vista principal foi completamente perdido, como mostra a Figura 4.19. Figura 4.19: Perda de quadro completo na vista principal. 45 6. Caso todos os blocos de um quadro estejam marcados como consistentes em relação ao Preview, mas não em relação ao reconstruído anterior, este bloco será enviado para correção, visto que tanto a vista prévia quanto a vista principal contém erros ou foram perdidos ambos os quadros, como mostra a Figura 4.20. Figura 4.20: Perda de quadro correspondente em ambas as vistas. Quando um bloco é marcado como inconsistente e enviado para correção, seu Preview é redimensionado de modo a ficar do mesmo tamanho do bloco do quadro reconstruído. Aqui há outra modificação em relação ao trabalho original do RECAP [4]: faz-se a adição de componentes de alta frequência no bloco redimensionado. A alta frequência enriquece o Preview redimensionado e ajuda a ocultar mais eficientemente os blocos inconsistentes e é calculada como mostra a Figura 4.21. Para gerar o quadro de alta frequência, decimou-se o quadro anterior da vista principal e o resultado foi interpolado e subtraído do quadro original. No exemplo da Figura 4.21, foi adicionado uma constante de 128 em todos os pixels de modo a melhor a visualização. Figura 4.21: Alta frequência. 46 Este bloco redimensionado é utilizado para fazer uma procura dentro de uma janela de busca no quadro anterior. O bloco mais semelhante ao Preview redimensionado é escolhido como um dos candidados à subsituição do bloco perdido, como mostra a Figura 4.22. O bloco vai ser comparado com todos os possíveis blocos da janela de buscas, pixel a pixel. Essa comparação é feita calculando o MSE entre o bloco redimensionado e o bloco da janela de buscas e será escolhido o que tiver menor MSE. Para o caso do bloco do Preview também estar com erro, então o bloco da mesma posição do quandro anterior da vista principal é utilizado para ocultar o erro. De forma similar, se todo o quadro atual for perdido, então uma simples interpolação do Preview é utilizada. Figura 4.22: Exemplo de Janela de Buscas. Algorithm 4 Escolha do bloco a ser usado para ocultar o erro. 1: if M SEP review < M SEReconstrudo then 2: BlocoP erdido ← BlocoP review + AltaF requencia 3: else 4: BlocoP erdido ← BlocoReconstruidoAnterior 5: end if A Figura 4.23 mostra o quadro original (a), o quadro corrompido (b) e o quadro com erros ocultados (c) de uma sequência de vídeo. 47 (a) Quadro Original Decodificado (b) Quadro Corrompido (c) Quadro Corrigido Figura 4.23: Quadros da sequência Foreman. 48 Capítulo 5 RESULTADOS E ANÁLISES Este capítulo apresenta os resultados obtidos nos testes para avaliação de performance do codificador RECAP modificado mostrado no capítulo anterior. Além disso, são analisados os cenários de simulação de testes, sequências utilizadas e gráficos resultantes. 5.1 Sequências de Teste Neste trabalho, os testes foram feitos com quatro sequências frequentemente utilizadas para realizar simulações e testes para mensuração de eficiência e desempenho de codificação de vídeo. A Figura 5.1 apresenta as informações básicas de cada uma delas: Figura 5.1: Informações básicas das sequências utilizadas. 49 Como as sequências estão no formato CIF YUV 4:2:0, a componente de luminância possui 352×288 pixels e as componentes de crominância possuem 176×144 pixels, exceto no caso da sequência City, visto que essa possui resolução 4CIF, logo sua componente de luminância possui 704×576 pixels e as componentes de crominância possuem 352×288 pixels. Há diversos fatores que podem influenciar a maneira em que macroblocos perdidos são percebidos visualmente pelo espectador, tais como mudança de cena e, com bastante relevância, a quantidade de movimento. Para tanto, foram escolhidas sequências de teste que abrangem de pouco movimento a muito movimento [35], como mostra a Figura 5.2. Figura 5.2: Descrição de conteúdo das sequências utilizadas. É importante notar também que a qualidade do vídeo recuperado é influenciado diretamente pela taxa de compressão, visto que a exigência de alto grau de compactação compromete a qualidade do vídeo decodificado e pela quantidade de macroblocos codificados por predição intra, uma vez que estes geralmente são melhor recuperados através de técnicas espaciais de ocultamente de erros. O padrão H.264 possui também a opção de utilizar particionamento de dados, onde as informações são divididas em nível de importância [34]. Os dados que contêm macroblocos Intra são mais importantes do que aqueles que contêm informações de movimento (Vetores de Movimento), que são mais importantes que aqueles que contêm informação de textura (resíduo) dos macroblocos inter. Desta forma, a utilização de codificação redundante [34] pode ser aplicada somente a certos dados, dependendo da importância. 50 5.1.1 Medida Objetiva de Qualidade Para fazer a avaliação dos resultados experimentais, foi utilizada a PSNR (peak signalto-noise ratio), que é a medida de qualidade objetiva mais comumente utilizada na literatura. A PSNR é definida como: H−1 −1 XW X 1 [I(i, j) − K(i, j)]2 M SE = H ∗ W i=0 j=0 M AX 2 P SN RdB = 10 · log10 M SE (5.1) (5.2) onde I(i, j) e K(i, j) representam os valores dos pixels na posição (i, j) de duas imagens monocromáticas I e K, com resolução H×W, em que uma das imagens é considerada a aproximação da outra e M AX é o máximo valor possível para um pixel da imagem. Os cálculos de PSNR foram feitos, na maioria dos casos, comparando somente as componentes de luminância das sequências. Isto se dá devido à condição do ser humano de ser mais sensível à brilho do que a cor [36], logo preterimos as componentes de crominância. Entretanto, para apenas um cenário de simulação, foi realizado um teste utilizando a média aritmética simples total das três componentes em função da taxa. A Figura 5.3 mostra um quadro de cada uma das sequências utilizadas para testes. Figura 5.3: Quadros das sequências utilizadas. 51 5.2 Cenários de Simulação Na Figura 5.4, encontra-se a arquitetura do RECAP com as modificações realizadas utilizado para realização dos testes, i.e., com o bloco simulador do canal de retorno e com a adição de alta frequência na etapa de ocultamento de erros. Figura 5.4: RECAP modificado. 5.2.1 Simulação de canal de retorno. A Figura 5.5 apresenta a simulação do canal de retorno utilizando um, três e seis quadros de atraso em azul-claro, laranja e verde, respectivamente. Considerando-se 300 quadros, no primeiro caso se utiliza codificação (IPPPP), no segundo caso se utiliza codificação (IIIPPPP) e, no caso de simulação com atraso de seis quadros, utiliza-se codificação (IIIIIIPPPP). A simulação do canal de retorno através de atraso temporal dos quadros reconstruídos pode ser vista no bloco em laranja do diagrama do RECAP modificado da Figura 5.4. 5.2.2 Simulação de erros Para os erros de transmissão, foram simulados diferentes cenários. Inicialmente, simulamos a perda de alguns macroblocos em todas as componentes YUV. A seguir foi feita a simulação de perda de um quadro inteiro. 52 Figura 5.5: Simulação de canal de retorno na vista prévia. A Figura 5.6a apresenta a simulação de erros na vista prévia e principal, com perda de três macroblocos aleatórios por quadro e QP variando de dois em dois de 20 a 38. Já a Figura 5.6b segue a mesma forma, porém com perdas somente na vista principal, assumindo que o sinal do preview foi enviado por um canal mais seguro. Nas simulações de perda integral de quadro, utilizou-se um número menor de quadros, QP = 30, com perda de três macroblocos por quadro e a perda integral de apenas um quadro. A Figura 5.6c apresenta a simulação de perda de um quadro completo somente no sinal do reconstruído, assumindo novamente que o sinal do preview foi enviado através de um canal mais seguro e, por último, a Figura 5.6d apresenta a simulação de perda de um quadro completo correspondente tanto na vista principal quanto na vista prévia. 5.2.3 Simulação com Vetor de Limiares Neste cenário de simulação, foi utilizado um Vetor de Limiares para pré-processar a sequência de vídeo a fim de guardar os resultados de limiar reconstruído e preview para posterior detecção e ocultação de erros. 5.2.4 Simulação com Limiar baseado no Primeiro Quadro Neste cenário de simulação, foi utilizado o Limiar baseado no Primeiro Quadro para calcular o limiar que seria usado posteriormente para detectar e ocultar erros nos quadros subsequentes. 53 (a) Erro em ambas as vistas. (b) Erro na vista principal. (c) Perda integral da vista principal. (d) Perda integral de ambas as vistas. Figura 5.6: Perfis de erros na vista principal e/ou vista prévia. 54 5.3 Apresentação e análise de testes Aqui serão apresentados os gráficos obtidos através da utilização do método RECAP modificado e estes serão analisados de acordo com o cenário de simulação em que estão inseridos. Os resultados obtidos serão apresentados em gráficos de Distorção × Taxa, sendo a PSNR a medida de distorção utilizada. Normalmente serão mostrados os resultados para a componente de luminância (Y). Entretanto, é importante ressaltar que os sistemas e testes foram elaborados para as três componentes (YUV), porém como o sinal de brilho possui mais detalhes, a sua análise foi considerada mais importante. 5.3.1 Utilizando Vetor de Limiares 5.3.1.1 Simulando erros somente na Vista Principal 1 Quadro de Atraso: Figura 5.7: Sequência Foreman - Erro na Vista Principal - 1 Quadro de Atraso Pode-se visualizar nas Figuras 5.7 e 5.8, 5.12 e 5.13 e 5.17 e 5.18 que a diferença entre o sinal sem erros e o corrigido é mais acentuada se considerarmos somente a componente de luminância (Y). Isto se deve ao fato de que as componentes de crominância são mais suaves, logo os erros são mais fáceis de serem ocultados. Pode-se notar que o resultado das Figuras 5.8 a 5.11 foram satisfatórios, principalmente para a sequência Akiyo. A sequência que teve pior ocultamento de erros foi a Mobile, porém, mesmo no pior caso, o sinal corrigido tem uma relação taxa-distorção muito superior ao sinal com erros, especialmente para QP’s mais altas. 55 Figura 5.8: Sequência Foreman - Erros na Vista Principal - 1 Quadro de Atraso Figura 5.9: Sequência Akiyo - Erros na Vista Principal - 1 Quadro de Atraso 56 Figura 5.10: Sequência Mobile - Erros na Vista Principal - 1 Quadro de Atraso Figura 5.11: Sequência City - Erros na Vista Principal - 1 Quadro de Atraso 57 3 Quadros de Atraso: Figura 5.12: Sequência Foreman - Erro na Vista Principal - 3 Quadros de Atraso Figura 5.13: Sequência Foreman - Erros na Vista Principal - 3 Quadros de Atraso 58 Figura 5.14: Sequência Akiyo - Erros na Vista Principal - 3 Quadros de Atraso Figura 5.15: Sequência Mobile - Erros na Vista Principal - 3 Quadros de Atraso Os resultados para três quadros de atraso mostrados nas Figuras 5.13 a 5.16 é bastante parecido com os resultados para atraso de um quadro. Observa-se que, como a maioria dos blocos são corrigidos por quadros da vista prévia, usar três ou seis quadros de atraso não geram perdas significativas, provando que o RECAP vai funcionar adequadamente mesmo se existir um retardo considerável no canal de retorno. 59 Figura 5.16: Sequência City - Erros na Vista Principal - 3 Quadros de Atraso 6 Quadros de Atraso: Figura 5.17: Sequência Foreman - Erro na Vista Principal - 6 Quadros de Atraso Novamente, os resultados mostrados nas Figuras 5.18 a 5.21 evidenciam que o aumento no atraso do canal de retorno não reflete negativamente no desempenho do sistema. 60 Figura 5.18: Sequência Foreman - Erros na Vista Principal - 6 Quadros de Atraso Figura 5.19: Sequência Akiyo - Erros na Vista Principal - 6 Quadros de Atraso 61 Figura 5.20: Sequência Mobile - Erros na Vista Principal - 6 Quadros de Atraso Figura 5.21: Sequência City - Erros na Vista Principal - 6 Quadros de Atraso 62 5.3.1.2 Simulando perda de quadro completo somente na Vista Principal 1 Quadro de Atraso: Figura 5.22: Sequência Foreman - Perda integral na Vista Principal - 1 Quadro de Atraso 1 Quadro de Atraso: Figura 5.23: Sequência Foreman - Perda integral na Vista Principal - 1 Quadro de Atraso 63 Neste cenário de simulação, perdeu-se apenas o quadro do meio integralmente. Vale ressaltar que, a fim de testar o algoritmo ao máximo, quando se testou perda integral de quadros, continuou havendo perdas isoladas de macroblocos. Logo, o gráfico da Figura 5.22 segue o mesmo padrão das sequências anteriores. Já no gráfico da Figura 5.23, que representa a PSNR de cada um dos quadros codificados, pode-se notar que, quando há a perda integral de quadro, a PSNR diminui significativamente, entretanto recupera-se rapidamente sem propagar o erro para os quadros posteriores. Como não houve como fazer a simulação real de perda de pacotes, não foi possível simular o drifting, portanto é importante notar que os resultados são melhores que esses mostrados no gráfico, porque caso se tivesse feito a simulação real, haveria propagação de erros para os quadros seguintes , i.e., a curva da sequência com erros não se recuperaria tão rapidamente como no gráfico apresentado, enquanto o RECAP consegue evitar a propagação dos erros [4]. 64 5.3.1.3 Simulando erros na Vista Principal e na Vista Prévia 1 Quadro de Atraso: Figura 5.24: Sequência Foreman - Erros na Vista Prévia e Principal - 1 Quadros de Atraso Figura 5.25: Sequência Akiyo - Erros na Vista Prévia e Principal - 1 Quadros de Atraso Os resultados dos gráficos das Figuras 5.24 a 5.27 foram similares àqueles com perda isolada de macroblocos somente na vista principal. Mesmo considerando que o canal 65 Figura 5.26: Sequência Mobile - Erros na Vista Prévia e Principal - 1 Quadro de Atraso Figura 5.27: Sequência City - Erros na Vista Prévia e Principal - 1 Quadro de Atraso por onde foi transmitida a vista prévia é tão inseguro quanto o canal da vista principal, o sistema proposto consegue corrigir os erros adequadamente. Um dos motivos foi a decodificação proposta neste trabalho, em que os erros são procurados tanto na vista prévia quanto no quadro anterior da vista principal. 66 3 Quadros de Atraso: Figura 5.28: Sequência Foreman - Erros na Vista Prévia e Principal - 3 Quadros de Atraso Figura 5.29: Sequência Akiyo - Erros na Vista Prévia e Principal - 3 Quadros de Atraso Das Figuras 5.28 a 5.31, pode-se notar que, para a sequência Akiyo, os resultados foram muito bons, porém houve um afastamento maior em relação a curva da sequência codificada sem erros quando a QP aumenta. 67 Figura 5.30: Sequência Mobile - Erros na Vista Prévia e Principal - 3 Quadros de Atraso Figura 5.31: Sequência City - Erros na Vista Prévia e Principal - 3 Quadros de Atraso 68 6 Quadros de Atraso: Figura 5.32: Sequência Foreman - Erros na Vista Prévia e Principal - 6 Quadros de Atraso Figura 5.33: Sequência Akiyo - Erros na Vista Prévia e Principal - 6 Quadros de Atraso Os gráficos apresentados nas Figuras 5.32 a 5.35 foram bastante similares àqueles com atraso de três quadros. Isto mostra a robustez do sistema mesmo com alto atraso do canal de retorno e erro em ambas as vistas. 69 Figura 5.34: Sequência Mobile - Erros na Vista Prévia e Principal - 6 Quadros de Atraso Figura 5.35: Sequência City - Erros na Vista Prévia e Principal - 6 Quadros de Atraso 70 5.3.1.4 Simulando perda de quadro completo na Vista Principal e Prévia 1 Quadro de Atraso: Figura 5.36: Sequência Foreman - Perda integral na Vista Principal/Prévia 3 Quadros de Atraso: Figura 5.37: Sequência Foreman - Perda integral na Vista Principal/Prévia 71 6 Quadros de Atraso: Figura 5.38: Sequência Foreman - Perda integral na Vista Principal/Prévia Das Figuras 5.36 a 5.38, observa-se que mesmo com a perda integral da vista prévia e da vista principal, os resultados foram satisfatórios para as três quantidades de atraso e bastante similar aos resultados com perda integral apenas da vista principal. É possível notar que a queda na qualidade do quador perdido não é tão brusca quanto no sinal sem correção. Inclusive, o quadro corrigido, após ser totalmente perdido em ambas as vistas, tem uma qualidade objetiva similar a de um quadro com alguns blocos perdidos, já que a PSNR deste quadro é similar a PSNR dos quadros com erros isolados em apenas alguns blocos. 72 5.3.2 Utilizando Limiar baseado no Primeiro Quadro 5.3.2.1 Simulando erros somente na Vista Principal 1 Quadro de Atraso: Figura 5.39: Sequência Foreman - Erros na Vista Principal - 1 Quadro de Atraso Figura 5.40: Sequência Akiyo - Erros na Vista Principal - 1 Quadro de Atraso 73 3 Quadros de Atraso: Figura 5.41: Sequência Foreman - Erros na Vista Principal - 3 Quadros de Atraso Figura 5.42: Sequência Akiyo - Erros na Vista Principal - 3 Quadros de Atraso 74 6 Quadros de Atraso: Figura 5.43: Sequência Foreman - Erros na Vista Principal - 6 Quadros de Atraso Figura 5.44: Sequência Akiyo - Erros na Vista Principal - 6 Quadros de Atraso 75 Dos resultados das Figuras 5.39 a 5.44, é importante notar que para a sequência Foreman, os resultados obtidos foram praticamente os mesmo daqueles utilizando vetor de limiares. Isto não ocorre para a sequência Akiyo com três e seis quadros de atraso. É possivel perceber um distanciamento maior entre a curva codificada original e a corrigida, para QP’s mais altas. Isso se deve ao fato de que, como há pouco movimentação no vídeo, logo consegue-se altas taxas de compressão, portanto o envio do sinal adicional da vista prévia é significativo para esta sequência. Porém, é importante ressaltar que o método proposto para a seleção automática do limiar baseado na análise do primeiro quadro consegue resultados similares à pré-processar a sequência inteira em busca do limiar ótimo. Nas Figuras 5.45 a 5.55 serão mostrados resultados análogos àqueles utilizando vetor de limiares, porém utilizando o método automático de seleção do limiar. Como pode ser visto, não existem diferenças muito significativas entre ambos. 76 5.3.2.2 Simulando perda de quadro completo somente na Vista Principal 1 Quadro de Atraso: Figura 5.45: Sequência Foreman - Perda Integral na Vista Principal - 1 Quadro de Atraso 1 Quadro de Atraso: Figura 5.46: Sequência Foreman - Perda Integral na Vista Principal - 1 Quadro de Atraso 77 5.3.2.3 Simulando erros na Vista Principal e na Vista Prévia 1 Quadro de Atraso: Figura 5.47: Sequência Foreman - Erros na Vista Prévia e Principal - 1 Quadro de Atraso Figura 5.48: Sequência Akiyo - Erros na Vista Prévia e Principal - 1 Quadro de Atraso 78 3 Quadros de Atraso: Figura 5.49: Sequência Foreman - Erros na Vista Prévia e Principal - 3 Quadros de Atraso Figura 5.50: Sequência Akiyo - Erros na Vista Prévia e Principal - 3 Quadros de Atraso 79 6 Quadro de Atraso: Figura 5.51: Sequência Foreman - Erros na Vista Prévia e Principal - 6 Quadros de Atraso Figura 5.52: Sequência Akiyo - Erros na Vista Prévia e Principal - 6 Quadros de Atraso 80 5.3.2.4 Simulando perda de quadro completo na Vista Principal e na Vista Prévia 1 Quadro de Atraso: Figura 5.53: Sequência Foreman - Perda integral na Vista Principal/Prévia 3 Quadros de Atraso: Figura 5.54: Sequência Foreman - Perda integral na Vista Principal/Prévia 81 6 Quadros de Atraso: Figura 5.55: Sequência Foreman - Perda integral na Vista Principal/Prévia 82 Capítulo 6 CONCLUSÃO O RECAP é um método de ocultamento de erros baseado na estimação de dados perdidos através de um sinal adicional de baixa qualidade e baixa latência (vista prévia) que é enviado em conjunto com o sinal original codificado (vista principal). Ambos os sinais são codificados e enviados separadamente ao decodificador. Este decodifica os sinais e os enviam a um detector de erros. Através de técnicas como Vetor de Limiares e Limiar baseado no Primeiro Quadro, os blocos inconsistentes são detectados e enviados para um ocultador de erros. Nesta etapa, os blocos inconsistentes são estimados, usando macroblocos de quadros anteriores decodificados do próprio sinal original ou macroblocos de quadros correspondentes corretamente decodificados do sinal da vista prévia. Para testar o método supracitado, foram utilizadas sequências de testes que abrangem pouco, médio e muito movimento [35]. Os cenários de teste envolvem perda de macroblocos apenas na vista principal e em ambas as vistas. Foram feitos, também, testes simulando um atraso de codificação de um, três e seis quadros. Pode-se verificar também como foi o comportamento do método em perdas integrais de quadro, tanto somente da vista principal, quanto de ambas as vistas. De modo geral, o resultado foi bastante satisfatório. Os testes mostraram que, por muitas vezes, o método chegou muito próximo do ideal. Quando foi testada a perda completa de quadro, pôde-se notar que o algoritmo também foi muito eficiente, ocultando o erro sem propagá-lo para os quadros seguintes. O uso do limiar baseado no primeiro bloco não foi tão eficaz quanto o vetor de limiares, porém foi bastante próximo e é computacionalmente mais simples e viável. Já o vetor de limiares é extremamente eficiente, mas à um custo algorítmico elevado e só é útil em aplicações off-line. Já o atraso de um, três ou seis quadros não influenciou expressivamente os resultados. Evidentemente, a utilização de atrasos de apenas um quadro retorna melhores efeitos, visto que a correlação entre amostras temporais imediatas é maior do que entre três e seis quadros, respectivamente. Logo, o aumento do atraso vai aumentar a taxa do sinal da vista prévia, porém como esse sinal possui uma resolução muito inferior à da vista principal, o aumento na taxa não é tão significativo. 83 6.1 Apresentação das Contribuições Foram feitas três modificações significativas em relação ao projeto original, que podem ser vistas na seção 5.2, na Figura 5.4. A primeira é a adição da alta frequência no macrobloco interpolado, melhorando visualmente a imagem ocultada. A segunda é a detecção de erros não só em relação à vista prévia, mas também em relação à vista principal, no caso da utilização de Vetor de Limiares. E a terceira é um método para selecionar os limiares automaticamente, baseada na correta codificação dos primeiros quadros da sequência. 6.2 Perspectiva para Trabalhos Futuros A fim de alcançar resultados mais satisfatórios, propõe-se o estudo mais avançado da etapa de detecção de erros. Para tanto, sugerem-se pesquisas no campo de identificação de mudança de cena e limiares baseados na correlação temporal de amostras. Podese usar, também, o framework de para vídeos escaláveis [37] para estimar macroblocos perdidos e uma camada Wyner-Ziv adicional para melhorar a qualidade do quadro com erros ocultados [38]. Pode-se fazer também uma análise da complexidade computacional do algoritmo de modo a torná-lo mais eficiente. Também é possível aumentar o número de cenários de simulação e variar as sequências de teste, além, é claro, de mudar as configurações do padrão H.264 para que o torne mais eficiente e adequado ao método proposto. Pode-se, realmente, simular a perda de pacotes em redes não confiáveis. Outra ideia seria usar uma janela de buscas hexagonal ao redor do macrobloco corrompido de acordo com o método proposto por Kang [39] que faz uma busca centralizada em pontos específicos do hexágono. 84 Referências [1] I. Richardson, H. 264 and MPEG-4 video compression: video coding for nextgeneration multimedia. John Wiley & Sons Inc, 2003. vii, 17, 18, 19, 20, 27, 28, 29, 30 [2] P. Diniz, E. A. B. da Silva, and S. Lima Netto, Digital signal processing. Cambridge University Press, 2010. 1 [3] Skype. (2003, Aug.) Skype 5.1. [Online]. Available: http://www.skype.com 1, 24 [4] C. Yeo, W. Tan, and D. Mukherjee, “Receiver error concealment using acknowledge preview (RECAP)-An approach to resilient video streaming,” in Acoustics, Speech and Signal Processing, 2009. ICASSP 2009. IEEE International Conference on. IEEE, 2009, pp. 785–788. 2, 39, 42, 46, 64 [5] Y. Wang, S. Wenger, J. Wen, and A. Katsaggelos, “Error resilient video coding techniques,” Signal Processing Magazine, IEEE, vol. 17, no. 4, pp. 61–82, 2002. 2 [6] C. Wang, D. Sklar, and D. Johnson, “Forward error-correction coding,” Crosslink, vol. 3, no. 1, pp. 26–29, 2001. 3, 32 [7] S. Zheng, “Unequal Error Protection: Some fundamental limits and optimal strategies.” 3, 32 [8] P. Lambert, W. De Neve, Y. Dhondt, and R. Van de Walle, “Flexible macroblock ordering in H. 264/AVC,” Journal of Visual Communication and Image Representation, vol. 17, no. 2, pp. 358–375, 2006. 3, 32 [9] S. Rane, P. Baccichet, and B. Girod, “Modeling and optimization of a systematic lossy error protection system based on H. 264/AVC redundant slices,” in Picture Coding Symposium, Beijing, China. Citeseer, 2006. 3 [10] J. Wang, A. Majumdar, K. Ramchandran, and H. Garudadri, “Robust video transmission over a lossy network using a distributed source coded auxiliary channel,” in Proc. Picture Coding Symposium (PCS). Citeseer, 2004. 3 [11] R. Puri, A. Majumdar, and K. Ramchandran, “PRISM: A video coding paradigm with motion estimation at the decoder,” IEEE transactions on image processing, vol. 16, no. 10, pp. 2436–2448, 2007. 3 85 [12] S. Tsekeridou and I. Pitas, “MPEG-2 error concealment based on block-matching principles,” Circuits and Systems for Video Technology, IEEE Transactions on, vol. 10, no. 4, pp. 646–658, 2002. 3 [13] Z. Wang, Y. Yu, and D. Zhang, “Best neighborhood matching: an information loss restoration technique for block-based image coding systems,” Image Processing, IEEE Transactions on, vol. 7, no. 7, pp. 1056–1061, 2002. 3 [14] J. Zheng and L. Chau, “A temporal error concealment algorithm for H. 264 using Lagrange interpolation,” in Circuits and Systems, 2004. ISCAS’04. Proceedings of the 2004 International Symposium on, vol. 2. IEEE, 2004. 3 [15] Y. Chen, K. Yu, J. Li, and S. Li, “An error concealment algorithm for entire frame loss in video transmission,” in Proc. PCS. Citeseer, 2004. 3 [16] C. Shannon, “A mathematical theory of communication,” ACM SIGMOBILE Mobile Computing and Communications Review, vol. 5, no. 1, pp. 3–55, 2001. 5, 6, 21, 22 [17] T. Cover, J. Thomas, and J. Wiley, Elements of information theory. Library, 1991, vol. 1. 5, 6, 7 [18] D. MacKay, Information theory, inference, and learning algorithms. Univ Pr, 2003. 7 Wiley Online Cambridge [19] S. Kullback, Information theory and statistics. Dover Pubns, 1997. 7 [20] D. Huffman, “A method for the construction of minimum-redundancy codes,” Proceedings of the IRE, vol. 40, no. 9, pp. 1098–1101, 1952. 8, 23 [21] J. Ziv and A. Lempel, “A universal algorithm for sequential data compression,” Information Theory, IEEE Transactions on, vol. 23, no. 3, pp. 337–343, 2002. 8 [22] G. Langdon, “An introduction to arithmetic coding,” IBM Journal of Research and Development, vol. 28, no. 2, pp. 135–149, 1984. 8 [23] B. Leiner, “LDPC Codes–a brief Tutorial,” Stud. ID.: 53418L April, vol. 8, 2005. 8, 22 [24] C. Heegard and S. Wicker, Turbo coding. Kluwer Academic Pub, 1999. 8, 22 [25] A. Sadka, Compressed video communications. Wiley, 2002. 13 [26] D. Taubman, M. Marcellin, and M. Rabbani, “JPEG2000: Image compression fundamentals, standards and practice,” Journal of Electronic Imaging, vol. 11, p. 286, 2002. 16 [27] S. Vembu, S. Verdu, and Y. Steinberg, “The source-channel separation theorem revisited,” Information Theory, IEEE Transactions on, vol. 41, no. 1, pp. 44–54, 2002. 21 [28] I. Witten, R. Neal, and J. Cleary, “Arithmetic coding for data compression,” Communications of the ACM, vol. 30, no. 6, pp. 520–540, 1987. 23 86 [29] W. Pennebaker, J. Mitchell, G. Langdon, and R. Arps, “An overview of the basic principles of the Q-coder adaptive binary arithmetic coder,” IBM Journal of research and development, vol. 32, no. 6, pp. 717–726, 2010. 23 [30] D. Marpe and T. Wiegand, “A highly efficient multiplication-free binary arithmetic coder and its application in video coding,” in Image Processing, 2003. ICIP 2003. Proceedings. 2003 International Conference on, vol. 2. IEEE, 2003. 23 [31] H. Schwarz, D. Marpe, and T. Wiegand, “Overview of the scalable video coding extension of the H. 264/AVC standard,” IEEE Transactions on Circuits and Systems for Video Technology, vol. 17, no. 9, pp. 1103–1120, 2007. 26 [32] R. Osorio and J. Bruguera, “Arithmetic coding architecture for H. 264/AVC CABAC compression system,” 2004. 30 [33] Y. Dhondt and P. Lambert, “Flexible Macroblock Ordering: an error resilience tool in H. 264/AVC,” in Fifth FTW Ph. D. Symposium,(106), 2004. 32 [34] H. Kalva, “The H. 264 video coding standard,” IEEE multimedia, vol. 13, no. 4, pp. 86–90, 2006. 43, 50 [35] B. Espinoza, “Codificador distribuído de vídeo com complexidade variável a partir de codificação em resolução espacial mista.” 2009. 50, 83 [36] R. Gonzalez, R. Woods, and S. Eddins, Digital image processing using MATLAB. Prentice Hall Upper Saddle River, NJ, 2004, vol. 624. 51 [37] K. Rose and S. Regunathan, “Toward optimality in scalable predictive coding,” Image Processing, IEEE Transactions on, vol. 10, no. 7, pp. 965–976, 2002. 84 [38] D. Mukherjee, B. Macchiavello, and R. de Queiroz, “A simple reversed-complexity Wyner-Ziv video coding mode based on a spatial reduction framework,” in Proc. of SPIE Visual Communications and Image Processing, vol. 6508. Citeseer, p. 65. 84 [39] L. Kang and J. Leou, “A hybrid error concealment scheme for MPEG-2 video transmission based on best neighborhood matching algorithm,” Journal of Visual Communication and Image Representation, vol. 16, no. 3, pp. 288–310, 2005. 84 87