Especificação



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

Acrônimos




AVC: Advanced Video CODEC.

CABAC: Context-based Adaptive Binary Arithmetic Coding.

CAVLC: Context-based Adaptive Variable Length Coding.

CBR: Constant Bit Rate.

CIF: Common Interchange Format. É uma resolução de vídeo medindo 352 por 288 pixels.

DCT: Discrete Cosine Transform.

DPB: Decoded Picture Buffer.

FPS: Frames per Second.

JMF: Java Media Framework.

MBAFF: Macroblock-Adaptive Frame-Field Coding.

QCIF: Quarter Common Interchange Format. Um quarto de um CIF, mede 176 por 144 pixels.

QP: Quantization Parameter. Ver Quantização.

RBSP: Raw Byte Sequence Payload.

RTP: Rapid Transport Protocol.

VBR: Variable Bit Rate.

VCL: Video Coding Layer.

VLC: Variable Length Coding.
  1. Glossário




Artefato

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


Artefato de blocagem

Tradução do termo blocking artifacts que se refere ao padrão do bloco em uma seqüência comprimida devido à quantização individual de cada bloco, levando à discontinuidades entre os blocos adjacentes. Artefato de blocagem é uma das mais perceptíveis distorções visuais.


CODEC

Um CODEC (Compression Decompression Algorithm) é um programa que codifica e decodifica dados digitais com intuito de comprimir esses dados, reduzindo a quantidade de espaço necessária para armazenar ou a largura de banda para transmiti-los.


Crominância (Chroma)

Corresponde à amostra dos dois sinais de cor (U e V). Geralmente possui uma freqüência de amostragem menor em relação às amostras de luma.


Fatia Intra (I-Slice)

Uma fatia Intra codificada é comprimida sem fazer referência a nenhuma outra fatia em nenhum outro quadro, anterior ou posterior, na seqüência. Essa fatia é comprimida usando técnicas similares às empregadas na compressão de imagens estáticas, tal como as utilizadas na compressão JPEG.


Fatia Predita (P-Slice)

Fatias P são preditas de amostras decodificadas de um quadro de referência anterior. Isso significa que para decodificar uma fatia P em um dado instante de tempo, é necessário um quadro de referência anterior. Fatias P podem servir como referência para predizer fatias em outros quadros.


Framework

É um conjunto de classes que fornecem uma funcionalidade genérica comum a vários projetos de software. Diferente das bibliotecas, o Framework quem dita o fluxo de controle da aplicação, o que é chamado de Inversão de Controle.



Luma

Corresponde às amostras do sinal acromático (componente Y do espaço de cor YCbCr), ou brilho. Segundo [4], luma é diferente de luminância, uma vez que esta é uma medida, definida pelo CIE, puramente fotométrica e independente de dispositivo.


Partição

É uma região do macrobloco que possui seu próprio Vetor de Movimento.


Predição

Processo no qual os valores de uma amostra são estimados com base em uma amostra previamente codificada.


Quadro

É o conjunto de amostras que formam uma imagem estática. Um vídeo é o conjunto de quadros (figuras estáticas) exibidos em intervalos de tempo. No caso de vídeo entrelaçado, um quadro é o conjunto dos campos superior e inferior, correspondentes às linhas pares e ímpares, respectivamente.


Quadros por segundo (Frames per second)

Representa a quantidade de quadros exibidos ou processados a cada segundo.


Quadro Intra (I-Frame)

Nos padrões anteriores, o quadro quem determinava o tipo dos macroblocos. Contudo, no padrão H.264 são as fatias quem determinam. Veja Fatia I.


Quadro Predito (P-Frame)

Nos padrões anteriores, o quadro quem determinava o tipo dos macroblocos. Contudo, no padrão H.264 são as fatias quem determinam. Veja Fatia P.


Quantização

É a redução da informação, por meio do truncamento de números, para obter uma maior taxa de compressão. O parâmetro de quantização QP seleciona o nível de truncamento dos coeficientes. Quanto mais alto o QP, maior o truncamento e compressão dos dados, e consequentemente menor a qualidade do vídeo decodificado.



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


O H.264 é um padrão para compressão de vídeo desenvolvido pela ITU-T Video Coding Experts Group (VCEG) em conjunto com a ISO/IEC MPEG que formaram uma parceria conhecida por Joint Video Team (JVT). O padrão H.264 foi baseado no padrão MPEG-4 Part 10 ou AVC (Advanced Video Coding). Sua versão final, formalmente chamada por ISO/IEC 14496-10, foi lançada em 2003. Posteriormente, foram desenvolvidas extensões da versão original do padrão, conhecidas por Fidelity Range Extensions (FRExt).

O projeto do H.264/AVC foi norteado pela criação de um padrão de compressão de vídeo capaz de fornecer boa qualidade a uma taxa de bits baixa em relação aos padrões já existentes, como o MPEG-1, MPEG-2 e H.263. Outra meta do projeto foi a de criar um padrão que permitisse a codificação de vídeos com diferentes taxas de bits/resolução..

Uma lacuna ainda existente em relação ao padrão H.264, é que, a despeito da existência de várias implementações na forma de codificadores (encoders) e decodificadores/players (decoders), ainda não há implementações do codificador independentes de plataforma (processador + sistema operacional), o que exige novas implementações para novos dispositivos com plataformas muito específicas (por exemplo, dispositivos móveis como celulares). É pertinente salientar que, devido às melhorias introduzidas pelo padrão H.264 em relação ao seus antecessores, aumentou razoavelmente a complexidade dos algoritmos utilizados, exigindo otimizações no código que dificultam bastante a obtenção de implementações eficazes e, ao mesmo tempo, eficientes, condição essencial para o seu uso em máquinas com recursos computacionais (capacidade de processamento e memória, particularmente) restritos.




    1. 1.1 Motivações


O objetivo deste trabalho é preencher a lacuna exposta acima através da implementação de um codificador de vídeo H.264 independente de plataforma. A linguagem escolhida para tal é a linguagem Java. Tal escolha foi motivada pelos seguintes aspectos:




  1. Código de máquina independente de plataforma: muito mais que uma linguagem orientada a objetos, Java é uma tecnologia na qual um programa Java é compilado gerando um bytecode (código de máquina) que é executado por qualquer máquina virtual Java (JVM);

  2. Diversidade de ambientes e recursos para programação: além de possuir uma gama enorme de recursos para facilitar a programação, a máquina virtual Java é disponível em diversos equipamentos e ambientes, como navegadores, mainframes, SOs, celulares, palmtops e cartões inteligentes, entre outros. O que abre um grande leque de consumidores para os produtos desenvolvidos nessa plataforma; e

  3. Desempenho: ao longo dos anos, foram agregadas à plataforma Java diversas otimizações que tornaram o desempenho de um programa Java próximo a um mesmo programa codificado em C++, com código compilado “nativo”. Dentre essas otimizações, destaca-se a compilação “especulativa”, que aproveita o tempo ocioso do processador para pré-compilar o bytecode para código nativo. Outro mecanismo - o HotSpot da Sun - guarda informações disponíveis somente em tempo de execução (por exemplo, número de usuários, processamento usado, memória disponível), que possibilitam que a JVM vá "aprendendo" e melhorando seu desempenho;

Não obstante a implementação descrita neste trabalho ter tido, como referência, uma implementação pré-existente em C, nosso código não representa, de forma alguma, uma mera transcodificação de C para Java, o que, per si, já seria demasiado trabalhoso, dada não só à diferença entre os paradigmas de programação utilizados por essas linguagens, mas também a aspectos como formato e tipos de dados e uso de chamadas de sistemas específicas de plataforma (no caso do código em C). Nossa implementação teve como base a criação de modelo orientado a objetos a partir do código de referência em C, estruturado de forma procedural. O projeto desse modelo envolveu a aplicação de diversos conceitos de Engenharia de Software

.

    1. 1.2 Organização do documento


Este documento descreve os diversos aspectos relacionados à nossa implementação do codificador H.264 em Java e é estruturado da seguinte forma: o Capítulo 2 fornece o embasamento teórico necessário para entender o domínio do problema, abordando os conceitos fundamentais da codificação de vídeo com ênfase nas diferenças introduzidas pelo padrão H.264. A compressão deste capítulo parte da premissa que o leitor já conhece os fundamentos da compressão de vídeo; no Capítulo 3 são abordadas as tecnologias utilizadas na implementação do trabalho, a saber, a plataforma Java e a Java Media Framework; no Capítulo 4 são descritas algumas das premissas e restrições impostas por nossa implementação. Como o padrão H.264 é muito abrangente em relação às suas aplicações, esse capítulo é essencial para a compreensão do Capítulo 5, o qual detalha a nossa implementação, mencionando pontos chave de seu código-fonte bem como do código-fonte de referência;

Por fim, o Capítulo 6 apresenta algumas conclusões obtidas após o desenvolvimento do trabalho e são mencionadas possíveis melhorias no projeto.

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


Em um primeiro momento, este capítulo aborda de maneira geral os conceitos gerais relativos à codificação de vídeo. E em um segundo momento, trata sobre as melhorias e pontos principais da codificação de vídeo especificada pelo padrão H.264. O Anexo B contém informações mais detalhadas a respeito dos algoritmos de codificação de vídeo.

A maioria dos documentos de referência utiliza o termo figura (picture) para designar tanto frames (amostras progressivas) quanto fields (amostras entrelaçadas). Entretanto, como o codificador descrito neste trabalho se restringe a vídeos progressivos, utilizaremos apenas o termo quadro (frame) para designar tanto figura quanto quadro.


    1. 2.1 Passos na Codificação de Vídeo padrão pelo H.264


Esta seção aborda de maneira geral o modo pelo qual funciona a compactação (ou codificação) de vídeo para o formato H.264. Será adotada a mesma divisão apresentada por Richardson [1], que consiste em separar a codificação de vídeo em três grandes blocos: modelo temporal, modelo espacial e codificação por entropia. A Figura 2.1 mostra o diagrama do codificador. Conforme esse diagrama, o codificador recebe como entrada um arquivo ou um stream de vídeo gerado em tempo real na forma “crua” (raw video), no qual cada quadro é representado por matrizes de pixels contendo os valores dos componentes Y, U e V; a saída é o vídeo codificado (comprimido). Nas seções seguintes, são detalhados os papeis de cada bloco desse diagrama.


Figura 2.1 – Diagrama do codificador de vídeo [1].




      1. 2.1.1 Pré-Processamento


Antes de iniciar a compressão propriamente dita, o quadro de entrada é dividido em blocos de 8x8 pixels (no H.264, 4x4, como veremos adiante). Seja, por exemplo, uma imagem de 640x480 pixels representada por três componentes: a luminância Y e as diferenças de cores U e V. Se a relação entre esses componentes é 4:1:1, então o componente Y consiste de uma matriz 640x480 e os outros dois consistem de matrizes 320x240. A preparação dos blocos irá fornecer para o passo seguinte 4800 blocos para o componente Y, 1200 para U e 1200 para V.




      1. 2.1.2 Modelo Temporal


O modelo temporal tem como objetivo reduzir a redundância temporal, ou seja, porções da imagem que se repetem por vários quadros.



        1. 2.1.2.1 Predição Inter Quadro

Predição inter quadro é o processo que consiste em estimar valores dos bloco de um quadro baseado nos valores dos blocos de quadros previamente codificados.




      1. 2.1.3 Modelo Espacial


Este modelo implica em um conjunto de técnicas para redução da redundância espacial, aquela presente em um mesmo quadro.



        1. 2.1.3.1 Predição Intra Quadro

A Compensação de Movimento é uma forma de predição, onde o codificador cria uma predição a partir de uma área do quadro atual baseada em quadros de anteriores (ou posteriores) e subtraí essa predição do quadro original para formar um resíduo. Da mesma forma, a predição Intra Quadro consiste em criar valores residuais a partir de predições realizadas por meio de amostras do mesmo quadro, ao invés de outros quadros.



        1. 2.1.3.2 Transformada

O processo de transformação consiste em converter os valores dos resíduos, que estão no domínio espacial, para outro o domínio de frequência. Devido ao fato que amostras no domínio espacial variam muito ao longo do tempo, elas não são comprimidas muito bem pelas técnicas de entropia. Já quando as amostras são convertidas para o domínio da frequência, elas se tornam muito mais adequadas para compressão por entropia.



A técnica mais comumente utilizada para transformadas em codificação de vídeo é a DCT (discrete cosine transform). A transformada dos blocos ocorre componente por componente e, dentro de um componente, da esquerda para a direita, do topo para a base, em um esquema chamado de ordenamento não-entrelaçado. Os blocos são compostos de 64 valores que representam a amplitude do sinal amostrado que é função de duas coordenadas espaciais, ou seja, a = f(x,y) onde x e y são as duas dimensões. Após a transformação, obtém-se a função c= g(Fx,Fy) onde c é um coeficiente e Fx e Fy são as frequências espaciais para cada direção. O resultado é outro bloco de 64 valores onde cada valor representa um coeficiente DCT - isto é, uma determinada frequência - e não mais a amplitude do sinal na posição amostrada (x,y). O coeficiente g(0,0) correspondente às frequências zero, é chamado de coeficiente DC. Ele representa o valor médio das 64 amostras. Como em um bloco representando uma porção da imagem os valores amostrados geralmente variam pouco de um ponto para outro, os coeficientes de mais baixa frequência serão altos e os de média e alta frequência terão valores baixos ou zero, podendo ser descartados. A energia do sinal é concentrada nas frequências espaciais mais baixas. A Figura 2.2 [6] é uma representação tridimensional da transformação DCT.

Figura 2.2 – Representação tridimensional da transformação discreta de cossenos (DCT). Antes da transformada (esquerda) e depois da transformação (direita).


Em uma imagem, os coeficientes de média e baixa frequência ocorrerão quando há uma mudança brusca (em um desenho preto-e-branco, a mudança de uma zona totalmente branca para um zona com uma linha preta representando parte da figura, por exemplo). Em uma imagem da natureza, por outro lado, as transições entre as zonas da imagem são suaves.

A transformada do H.264/AVC introduz duas grandes novidades: transformada usando apenas aritmética inteira e operando sobre blocos menores.

O código de referência [2] utiliza uma aproximação ortogonal da DCT que opera com números inteiros [33] para evitar divisões, as quais acumulam erros. Os padrões anteriores utilizam a transformada sob números de ponto-flutuante. O bloco sob o qual a transformada opera também dimuniu, de 8x8 para 4x4.


        1. 2.1.3.3 Quantização

A quantização é basicamente uma redução na amplitude do sinal por meio de uma divisão seguida por arredondamento. O objetivo por trás dessa redução de amplitude das amostras é transmitir valores que ocupem menos bits. Uma vez recebidos (ou descompactados), esses valores são redimensionados por meio de uma multiplicação, obtendo valores próximos aos originais.

A quantização é o processo que mais acumula erros durante a codificação de vídeo. Dessa forma, o H.264/AVC possui algumas melhorias nesse processo com intuito de amenizar esses erros.


      1. 2.1.4 Codificação por Entropia


A codificação por entropia converte uma série de símbolos, que representam os elementos da sequência de vídeo, em um fluxo de bits compactados apropriados para transmissão ou armazenamento [1]. Símbolos de entrada podem incluir coeficientes quantizados de transformadas, vetores de movimento (deslocamentos no eixo x e y para cada bloco com compensação de movimento), marcadores (códigos indicando pontos de sincronização), cabeçalhos (de macroblocos, quadros ou sequência de quadros) e informações suplementares (informações não essenciais para correta decodificação da mídia).






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


©livred.info 2017
enviar mensagem

    Página principal