BRPI0718628A2 - Codificação de bloco adaptativa em memória eficiente. - Google Patents

Codificação de bloco adaptativa em memória eficiente. Download PDF

Info

Publication number
BRPI0718628A2
BRPI0718628A2 BRPI0718628-2A BRPI0718628A BRPI0718628A2 BR PI0718628 A2 BRPI0718628 A2 BR PI0718628A2 BR PI0718628 A BRPI0718628 A BR PI0718628A BR PI0718628 A2 BRPI0718628 A2 BR PI0718628A2
Authority
BR
Brazil
Prior art keywords
codewords
codeword
subgroup
value
subgroups
Prior art date
Application number
BRPI0718628-2A
Other languages
English (en)
Inventor
Yuriy Reznik
Original Assignee
Qualcomm Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Qualcomm Inc filed Critical Qualcomm Inc
Publication of BRPI0718628A2 publication Critical patent/BRPI0718628A2/pt

Links

Classifications

    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M7/00Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
    • H03M7/30Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
    • H03M7/40Conversion to or from variable length codes, e.g. Shannon-Fano code, Huffman code, Morse code

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Compression, Expansion, Code Conversion, And Decoders (AREA)
  • Compression Or Coding Systems Of Tv Signals (AREA)

Description

"CODIFICAÇÃO DE BLOCO ADAPTATIVA EM MEMÓRIA EFICIENTE" Este pedido reivindica o benefício do Pedido de Patente Provisional U.S. No. de série 60/865.827, depositado em 14 de novembro de 2006 e Pedido de Patente Provisional U.S. No. de série 60/867.081, depositado em 22 de novembro de 2006, o conteúdo inteiro de cada um dos pedidos é incorporado aqui por referência.
CAMPO TÉCNICO
Esta revelação se refere a compressão de dados e, mais particularmente, a compressão de dados usando códigos de comprimento variável (VLCs).
FUNDAMENTOS
A compressão de dados é amplamente utilizada em uma variedade de aplicações para reduzir o consumo de espaço de armazenamento de dados, de largura de banda de transmissão, ou de ambos. As aplicações exemplares da compressão de dados incluem codificação de vídeo digital, de imagem, de fala, e de áudio. A codificação de vídeo digital, por exemplo, é usada na ampla faixa de dispositivos, incluindo televisões digitais, sistemas de broadcast direto digitais, dispositivos de comunicação sem fio, assistentes digitais pessoais (PDAs), computadores laptop ou de mesa, câmeras digitais, dispositivos de gravação digital, dispositivos de vídeo-game, telefones de rádio via satélite ou celulares, ou os semelhantes. Os dispositivos de vídeo digitais implementam técnicas de compressão de vídeo, tais como MPEG-2, MPEG-4, ou
H.264/MPEG-4 Codificação de Vídeo Avançada (AVC), para transmitir e receber mais eficientemente vídeo digital.
Geralmente, as técnicas de compressão de vídeo realizam a predição espacial, estimação de movimento, e compensação de movimento para reduzir ou remover a redundância inerente nos dados de vídeo. Em particular, a intra-codificação depende da predição espacial para reduzir ou remover a redundância espacial em vídeo dentro de um quadro de vídeo dado. A inter-codificação depende da predição temporal para reduzir ou remover a redundância temporal em vídeo dentro de quadros adjacentes. Para a inter-codificação, um encodificador de vídeo realiza estimação de movimento para seguir o movimento de blocos de vídeo coincidentes entre dois ou mais quadros adjacentes. A estimação de movimento gera vetores de movimento, que indicam o deslocamento de blocos de vídeo relativos a blocos de vídeo de predição correspondentes em um ou mais quadros de referência. A compensação de movimento usa os vetores de movimento para gerar o bloco de vídeo de predição a partir de um quadro de referência. Após a compensação de movimento, um bloco de vídeo residual é formado subtraindo o bloco de vídeo de predição a partir do bloco de vídeo original.
Um encodificador de vídeo aplica transformada, quantização e processos de codificação por entropia para reduzir mais a taxa de bit do bloco residual produzido pelo processo de codificação de vídeo. As técnicas de encodificação por entropia são usadas nos estágios finais de um encodificador-decodificador (CODEC), e em várias outras aplicações de codificação, antes do armazenamento ou transmissão dos dados encodifiçados. A encodificação por entropia envolve geralmente a aplicação de códigos aritméticos ou códigos de comprimento variável (VLCs) para comprimir mais os coeficientes residuais produzidos pelas operações de transformada e de quantização. Os exemplos de técnicas de codificação por entropia incluem a codificação aritmética binária adaptativa em contexto (CABAC) e a codificação de comprimento variável adaptativa em contexto (CAVLC), que podem ser usadas como modalidades alternativas de codificação por entropia em alguns encodificadores. Um decodificador de vídeo realiza a decodificação por entropia para descomprimir as informações residuais para cada um dos 5 blocos, e reconstrói o vídeo encodificado usando as informações de movimento e as informações residuais.
SUMÁRIO
Geralmente, esta revelação é direcionada a técnicas para codificação de comprimento variável (VLC) 10 adaptativa em complexidade baixa e em memória eficiente de dados para uma variedade de aplicações, tais como a codificação de vídeo digital, de imagem, de áudio, ou de dados de fala. Em um primeiro aspecto geral, as técnicas podem explorar propriedades de conjuntos particulares de 15 palavras-código para suportar estruturas de dados muito compactas. Em um segundo aspecto geral, as técnicas podem suportar a encodificação e decodificação adaptativa em baixa complexidade de seqüências binárias produzidas por fontes sem-memória.
A revelação fornece, em um primeiro aspecto, em
um método compreendendo gerar valores parciais de palavras- código. base para níveis de uma árvore de codificação que especifica palavras-código de comprimento variável, gerar um indicador de pulo (skip) que instrui um decodificador a 25 pular um número de bits em um fluxo de bits a ser decodificado antes de prosseguir a um nível selecionado da árvore de codificação, e armazenar os valores parciais e o indicador de pulo em uma estrutura de dados em uma memória.
Em um outro aspecto, a revelação fornece um meio legível por computador tangível compreendendo uma estrutura de dados que armazena valores parciais de palavras-código base para níveis de uma árvore de codificação que especifica palavras-código de comprimento variável, e um indicador de pulo que instrui um decodif icador para pular um número de bits em um fluxo de bits a ser decodificado antes de prosseguir a um nível selecionado da árvore de codificação.
Em um aspecto adicional, a revelação fornece um dispositivo compreendendo um processador configurado para gerar valores parciais de palavras-código base para níveis de uma árvore de codificação que especifica palavras-código 10 de comprimento variável, e gerar um indicador de pulo que instrui um decodif icador a pular um número de bits em um fluxo de bits a ser decodificado antes de prosseguir a um nível selecionado da árvore de codificação, e uma memória que armazena os valores parciais e o indicador de pulo em 15 uma estrutura de dados.
Em um outro aspecto, a revelação fornece um dispositivo de decodificação compreendendo uma memória que armazena uma estrutura de dados compreendendo valores parciais de palavras-código base para níveis de uma árvore 20 de codificação especificando palavras-código de comprimento variável, e um indicador de pulo que instrui um decodif icador para pular um número de bits em um fluxo de bits a ser decodificado antes de prosseguir a um nível selecionado da árvore de codificação, e um decodificador 25 que acessa a memória para decodificar uma das palavras- código a partir do fluxo de bits baseado nos valores parciais e no indicador de pulo na estrutura de dados armazenados.
Em um aspecto mais adicional, a revelação fornece um método de decodificação compreendendo acessar uma estrutura de dados armazenada na memória, em que a estrutura de dados compreende valores parciais de palavras- código base para níveis de uma árvore de codificação especificando palavras-código de comprimento variável, e um indicador de pulo que instrui um decodif icador para pular um número de bits em um fluxo de bits a ser decodificado antes de prosseguir a um nível selecionado da árvore de codificação, e decodificar uma das palavras-código do fluxo de bits baseado nos valores parciais e no indicador de pulo na estrutura de dados armazenados.
Em um outro aspecto, a revelação fornece um meio legível por computador tangível compreendendo instruções para fazer um processador acessar uma estrutura de dados armazenada na memória, em que a estrutura de dados compreende valores parciais de palavras-código base para níveis de uma árvore de codificação especificando palavras- código de comprimento variável, e um indicador de pulo que instrui um decodificador para pular um número de bits em um fluxo de bits a ser decodificado antes de prosseguir a um nível selecionado da árvore de codificação, e decodificar uma das palavras-código do fluxo de bits baseado nos valores parciais e no indicador de pulo na estrutura de dados armazenados.
Em um aspecto adicional, a revelação fornece um método compreendendo realizar a codificação de comprimento variável de acordo com uma estrutura de código, em que a estrutura de código define grupos de palavras-código em uma árvore de codificação, cada um dos grupos inclui as palavras-código que representam valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e aos primeiros e segundos subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui as palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui as palavras-código possuindo um segundo comprimento diferente do primeiro comprimento, e gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
Em um aspecto adicional, a revelação fornece um meio legível por computador tangível compreendendo instruções para fazer um processador executar a codificação de comprimento variável de acordo com uma estrutura de código, em que a estrutura de código define grupos de palavras-código em uma árvore de codificação, cada um dos grupos inclui as palavras-código que representam os valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e os primeiros e segundos subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui as palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui as palavras-código possuindo um segundo comprimento diferente do primeiro comprimento, e gera um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
Em um aspecto adicional, a revelação fornece um dispositivo compreendendo um processador configurado para realizar a codificação de comprimento variável de acordo com uma estrutura de código, em que a estrutura de código define grupos de palavras-código em uma árvore de codificação, cada um dos grupos inclui as palavras-código que representam os valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e os primeiros e segundos subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui as palavras- código possuindo um primeiro comprimento e o segundo subgrupo inclui as palavras-código possuindo um segundo comprimento diferente do primeiro comprimento, e gera um 5 resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
Em um aspecto adicional, a revelação fornece um método compreendendo, para uma estrutura de código 10 definindo grupos de palavras-código em uma árvore de codificação que especifica palavras-código de comprimento variável, em que cada um dos grupos inclui as palavras- código que representam os valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de 15 forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, primeiros e segundos subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui as palavras-código possuindo um primeiro comprimento e o segundo subgrupo 20 inclui as palavras-código possuindo um segundo comprimento diferente do primeiro comprimento, realizar a codificação de comprimento variável usando palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, um número de palavras-código dentro 25 de cada um dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos, e gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
Em um aspecto adicional, a revelação fornece um
dispositivo compreendendo, para uma estrutura de código, mecanismos para definir grupos de palavras-código em uma árvore de codificação que especifica palavras-código de comprimento variável, em que cada um dos grupos inclui as palavras-código representando os valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos 5 valores representados pelas palavras-código, e primeiros e segundos subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui as palavras- código possuindo um primeiro comprimento e o segundo subgrupo inclui as palavras-código possuindo um segundo 10 comprimento diferente do primeiro comprimento, mecanismos para realizar codificação de comprimento variável usando palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, um número de palavras-código dentro de cada um dos primeiros 15 subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos, e mecanismos para gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
Em um aspecto adicional, a revelação fornece um
meio legível por computador tangível compreendendo instruções para fazer um processador, para uma estrutura de código definindo os grupos de palavras-código em uma árvore de codificação que especifica palavras-código de 25 comprimento variável, em que cada um dos grupos inclui as palavras-código que representam os valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e os primeiros 30 e segundos subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui as palavras- código possuindo um primeiro comprimento e o segundo subgrupo inclui as palavras-código possuindo um segundo comprimento diferente do primeiro comprimento, realizar codificação de comprimento variável usando palavras-código base para cada um dos subgrupos, posições de palavras- código dentro de cada um dos grupos, um número de palavras- código dentro de cada um dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos, e gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
Em um aspecto adicional, a revelação fornece um dispositivo compreendendo, para uma estrutura de código que define os grupos de palavras-código em uma árvore de codificação especificando palavras-código de comprimento variável, em que cada um dos grupos inclui as palavras- código que representam os valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e primeiros e segundos subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui as palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui as palavras-código possuindo um segundo comprimento diferente do primeiro comprimento, um processador configurado para realizar a codificação de comprimento variável usando palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, um número de palavras-código dentro de cada um dos primeiros subgrupos, e os comprimentos das palavras- código dentro de cada um dos subgrupos, e gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário. Em um outro aspecto, a revelação fornece um meio legivel por computador tangível compreendendo instruções para fazer com que um processador acessa uma estrutura de dados armazenada na memória, em que a estrutura de dados compreende valores parciais de palavras-código base para níveis de uma árvore de codificação que especifica palavras-código de comprimento variável, e um indicador de pulo que instrui um decodificador para pular um número de bits em um fluxo de bits a ser decodificado antes de prosseguir a um nível selecionado da árvore de codificação, e decodifica um das palavras-código do fluxo de bits baseado nos valores parciais e no indicador de pulo na estrutura de dados armazenados.
Em um outro aspecto, a revelação fornece um meio legível por computador tangível compreendendo uma estrutura de dados para codificação de comprimento variável usando uma estrutura de código de comprimento variável que define grupos de palavras-código em uma árvore de codificação, cada um dos grupos inclui as palavras-código que representam os valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e os primeiros e segundos subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui as palavras- código possuindo um primeiro comprimento e o segundo subgrupo incluem as palavras-código possuindo um segundo comprimento diferente do primeiro comprimento.
Em um aspecto mais adicional, a revelação fornece um dispositivo de circuito integrado compreendendo um processador configurado para realizar a codificação de comprimento variável de acordo com uma estrutura de código, em que a estrutura de código define grupos de palavras- código em uma árvore de codificação, cada um dos grupos inclui as palavras-código que representam os valores que têm os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e os primeiros e segundos subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui as palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui as palavras-código possuindo um segundo comprimento diferente do primeiro comprimento, e em que o processador é configurado para gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
Em um outro aspecto, a revelação fornece um aparelho telefônico de comunicação sem fio compreendendo um processador configurado para realizar a codificação de comprimento variável de acordo com uma estrutura de código, em que a estrutura de código define grupos de palavras- código em uma árvore de codificação, cada um dos grupos inclui as palavras-código que representam os valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e os primeiros e segundos subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui as palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui as palavras-código possuindo um segundo comprimento diferente do primeiro comprimento, e em que o processador é configurado para gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário. Em um aspecto mais adicional, a revelação fornece um dispositivo de circuito integrado compreendendo uma memória que armazena uma estrutura de dados compreendendo valores parciais de palavras-código base para níveis de uma árvore de codificação que especifica palavras-código de comprimento variável, e um indicador de pulo que instrui um decodif icador para pular um número de bits em um fluxo de bits a ser decodificado antes de prosseguir a um nível selecionado da árvore de codificação, e um decodificador que acessa a memória para decodificar uma das palavras- código do fluxo de bits baseado nos valores parciais e no indicador de pulo na estrutura de dados armazenados.
Em um outro aspecto, a revelação fornece um aparelho telefônico de comunicação sem fio compreendendo uma memória que armazena uma estrutura de dados compreendendo valores parciais de palavras-código base para níveis de uma árvore de codificação que especifica palavras-código de comprimento variável, e um indicador de pulo que instrui um decodificador para pular um número de bits em um fluxo de bits a ser decodificado antes de prosseguir a um nível selecionado da árvore de codificação, um decodificador que acessa a memória para decodificar uma das palavras-código do fluxo de bits baseado nos valores parciais e no indicador de pulo na estrutura de dados armazenados, em um receptor para receber as palavras-código a partir de um codificador por uma comunicação sem fio, e um dispositivo de saída que apresenta a saída a um usuário com base pelo menos em parte nas palavras-código decodificadas.
As técnicas descritas nesta revelação podem ser implementadas em um hardware, software, firmware, ou qualquer combinação desses. Se implementado em software, o software pode ser executado em um ou mais processadores, tais como um microprocessador, circuito integrado de aplicação especifica (ASIC), arranjo de porta programável em campo (FPGA), ou processador de sinal digital (DSP), ou outros circuitos integrados ou de lógica discreta 5 equivalentes. O software que executa as técnicas pode inicialmente ser armazenado em um meio legível por computador e ser carregado e executado por um processador. Portanto, esta revelação também contempla os produtos de programa de computador compreendendo um meio legível por 10 computador que compreende instruções para fazer um processador executar qualquer uma de uma variedade de técnicas como descritas nesta revelação.
Os detalhes de um ou mais aspectos da revelação são determinados nos desenhos em acompanhamento e na 15 descrição abaixo. Outras características, objetos, e vantagens das técnicas descritas nesta revelação serão aparentes da descrição e dos desenhos, e das reivindicações.
BREVE DESCRIÇÃO DOS DESENHOS
A Fig. 1 é um diagrama de blocos que ilustra um
sistema de encodificação e de decodificação de vídeo.
A Fig. 2 é um diagrama de blocos que ilustra um exemplo de um encodificador de vídeo.
A Fig. 3 é um diagrama de blocos que ilustra um exemplo de um decodificador de vídeo.
A Fig. 4 é um diagrama que ilustra um exemplo de uma árvore de codificação binária.
A Fig. 5 é um gráfico que ilustra a taxa de redundância de um código de bloco adaptativo com um comportamento assintótico.
A Fig. 6 é um diagrama de uma árvore binária que ilustra grupos de bloco, subgrupos e palavras-código base. As Figs. 7Α e 7Β são gráficos que ilustram a comparação de taxas de redundância de um código de bloco adaptativo com valores diferentes de p.
A Fig. 8 é um gráfico que ilustra a sensibilidade de redundância à assimetria de dados fonte.
A Fig. 9 é um fluxograma que ilustra um método para construir a codificação de comprimento variável em memória eficiente para distribuições monotônicas de acordo com um aspecto desta revelação.
A Fig. 10 é um fluxograma que ilustra um método
para encodificar símbolos usando os códigos de comprimento variável construídos de acordo com o método da Fig. 9.
A Fig. 11 é um fluxograma que ilustra um método para decodificar os códigos de comprimento variável construídos de acordo com o método da Fig. 9.
A Fig. 12 é um fluxograma que ilustra um método para construir códigos de bloco adaptáveis de acordo com um outro aspecto desta revelação.
A Fig. 13 é um fluxograma que ilustra um método para blocos de codificação usando os códigos de comprimento variável construídos de acordo com o método da Fig. 12.
A Fig. 14 é um diagrama de blocos que ilustra um método para decodificar os códigos de comprimento variável construídos de acordo com o método da Fig. 12.
DESCRIÇÃO DETALHADA
Em geral, esta revelação é direcionada a técnicas para complexidade baixa e em memória eficiente, codificação de comprimento variável adaptativa (VLC) de dados para uma variedade de aplicações, tais como a codificação de vídeo 30 digital, imagem, áudio, ou dados de fala. Em alguns aspectos, as técnicas podem explorar propriedades de conjuntos particulares de palavras-código para suportar estruturas de dados muito compactas. Em outros aspectos, as técnicas podem suportar a encodificação e a decodificação adaptativa de baixa complexidade de seqüências binárias produzidas por fontes sem-memória. Embora as técnicas descritas nesta revelação possam ser aplicáveis a uma grande variedade de aplicações práticas, incluindo a compressão e a codificação de dados gerais, a revelação referirá a codificação e a decodificação de video digital para finalidades de exemplo e de ilustração.
De acordo com um primeiro aspecto geral desta revelação, para suportar estruturas de dados compactas, as técnicas divulgadas não precisam depender de nenhum esquema de construção de código particular. Por exemplo, Huffman, Shannon, Shannon-Fano, Gilbert-Moore ou outros esquemas de construção de código podem ser usados. Para este primeiro aspecto geral, entretanto, supor que tal código é construído para uma fonte com probabilidades monotonicamente crescentes de símbolos a partir de um alfabeto de entrada de símbolos. Mais especificamente, é assumido que as palavras-código possuem comprimentos monotonicamente decrescentes, ou pelo menos comprimentos não-crescentes, e que as palavras-código do mesmo comprimento têm a mesma ordem lexicográfica que os símbolos no alfabeto de entrada que representam.
A ordem lexicográfica desejada pode ser conseguida reordenando o alfabeto de entrada. Para tais palavras-código, os valores de palavra-código base podem ser computados para cada nível de uma árvore de codificação. Os valores de palavra-código base representam as menores palavras-código canônicas de forma lexicográfica em cada nível da árvore de codificação. Os valores e os índices de palavra-código base de seus respectivos símbolos podem ser armazenados em um arranjo reordenado. Os índices podem ser armazenados como valores offset para cada nível povoado na árvore. Um processo de decodificação pode envolver a comparação de um buffer de fluxo de bits com os valores de palavra-código base justificados a esquerda, seguida pela computação simples direta de um índice de um símbolo decodificado.
As propriedades acima podem ser usadas para descrever exclusivamente tal código com uma estrutura de dados que pode ser mais comprimida para produzir uma estrutura de dados muito compacta que facilite a decodificação incrementai de códigos de comprimento variável. Por exemplo, os valores de palavra-código base justificados a esquerda ordinariamente terão grandes quantidades de zeros dianteiros da direita para a esquerda. Os números de zeros dianteiros estão diminuindo monotonicamente enquanto o processo se move para camadas mais profundas em uma árvore de codificação aplicável. Dessa forma, quando os bits estão começando a serem decodificados seqüencialmente com a primeira camada e se movendo para baixo, alguns dos bits zeros dianteiros podem ser pulados sem afetar a exatidão do processo de decodificação.
Os zeros dianteiros podem ser removidos em incrementos fixos, por exemplo, incrementos de 8 bits, que é conveniente para o gerenciamento de buffer de fluxo de bits em computadores convencionais de 8 bits/byte. Uma tabela adicional de um ou mais indicadores de pulo pode ser fornecida para controlar este processo. Como um exemplo, um indicador de pulo direciona um decodificador para seguir adiante em um buffer de fluxo de bits por um incremento fixo de modo que os diferentes valores de palavra-código base possam ser distintos quando os zeros dianteiros são abandonados. Com remoção de zeros dianteiros, a largura do arranjo resultante de valores de palavra-código base modificados pode substancialmente ser reduzida, conservando desse modo a utilização de memória.
Dessa forma, em um primeiro aspecto geral, a 5 revelação contempla um método compreendendo gerar valores parciais de palavras-código base para niveis de uma árvore de codificação que especifica palavras-código de comprimento variável, gerar um indicador de pulo que instrui um decodificador para pular um número de bits em um 10 fluxo de bits a ser decodificado antes de prosseguir a um nível selecionado da árvore de codificação, e armazenar os valores parciais e o indicador de pulo em uma estrutura de dados em uma memória. A estrutura de dados pode ser alguma de uma grande variedade de estruturas de dados, tais como 15 tabelas, lista encadeada, árvores binárias, árvores de raiz, arquivos flat ou semelhantes, e pode ser armazenada em alguns de uma variedade de dispositivos de memória diferentes, tais como muitas formas de memória de acesso aleatório (RAM), memória somente de leitura (ROM), ou
2 0 ambas. A estrutura de dados pode ser armazenada em tal memória dentro de um encodificador ou de um decodificador. Por exemplo, um decodificador pode acessar a estrutura de dados, ou parcelas dos conteúdos da estrutura de dados, a partir da memória associada com o decodificador para 25 realizar a decodificação de comprimento variável das palavras-código em uma maneira em memória eficiente.
De acordo com este primeiro aspecto geral, a revelação contempla ainda um processador configurado para gerar valores parciais de palavras-código base para níveis 30 de uma árvore de codificação que especifica palavras-código de comprimento variável, e gera um indicador de pulo que instrui um decodificador para pular um número de bits em um fluxo de bits a ser decodificado antes de prosseguir a um nível selecionado da árvore de codificação, assim como uma memória que armazena os valores parciais e o indicador de pulo em uma estrutura de dados. Tais informações podem ser armazenadas em uma única estrutura de dados ou em múltiplas estruturas de dados. Portanto, a referência a uma estrutura de dados pode incluir uma ou mais estruturas de dados que armazenam as informações contempladas nesta revelação. Um processador configurado para acessar uma estrutura de dados para realizar a codificação de comprimento variável pode ser implementado dentro de um dispositivo fonte ou dispositivo de recepção, ou dentro de um dispositivo separado que gera estruturas de dados definindo estruturas de código a ser utilizadas por um encodificador e/ou por um decodificador realizando a codificação de comprimento variável.
De acordo com esta técnica para conseguir estruturas de dados compactas, consistente com um primeiro aspecto geral desta revelação, cada comprimento de palavra- código válido pode corresponder a um nível com um nó externo em uma árvore de código. Como discutido acima, a estrutura de dados pode incluir valores parciais de palavras-código base e um ou mais indicadores de pulo. Mais particularmente, em algumas modalidades, a estrutura de dados pode conter, para cada comprimento de palavra-código válido, as seguintes informações: (a) um valor parcial da menor (ou maior) palavra-código de forma lexicográfica no nível atual da árvore de código, (b) o número de bits no valor parcial, (c) um valor do símbolo que corresponde à menor (ou maior) palavra-código de forma lexicográfica, e (d) um indicador que instrui o decodificador a pular um determinado número de bits antes de prosseguir ao nível seguinte da árvore de código. Portanto, a estrutura de dados pode ainda incluir valores para os símbolos representados pelas palavras-código base e pelos comprimentos de valores parciais das palavras-código base, isto é, o número de bits em cada valor parcial de uma palavra-código base. As técnicas de encodificação e 5 decodificação podem usar esta estrutura de dados para identificar o nivel que corresponde a uma palavra-código a ser produzido ou decodificado, e então computam diretamente o valor da palavra-código ou do símbolo decodificado. Portanto, a estrutura de dados pode ser armazenada na 10 memória de um encodificador ou decodificador de vídeo, encodificador ou decodificador de imagem, encodificador ou decodificador de áudio, ou encodificador ou decodificador de fala, alguns desses podem ser construídos como CODECs combinados.
Os exemplos de técnicas existentes para a
encodificação ou a decodificação de códigos de comprimento variável são descritos em A. Moffat e A. Turpin, no Implementation of Minimum-Redundancy Prefix Codes, IEEE. Trans. Communications, 45 (10) (1997) 1200-1207, J.B. 20 Connell, A Huffman-Shannon-Fano Code, Proc. IEEE, julho 1973, 1046-1047, e A. Brodnik e S. Carlsson, Sublinear Decoding of Huffman Codes Almost in Place, DIMACS Workshop on Codes and Trees: Algorithmic and Information Theoretic Approaches, outubro 1998, Universidade de Rutgers, DIMACS 25 Center, NJ. Comparado a estas técnicas existentes, as técnicas divulgadas para conseguir estruturas de dados compactas podem oferecer determinadas vantagens.
Como um primeiro exemplo, uma estrutura de dados produzida pela técnica revelada pode usar uma quantidade 30 muito menor de memória devido ao fato de que somente os valores parciais das menores palavras-código de forma lexicográfica são armazenados e usados, por exemplo, por um decodificador de vídeo. Como um outro exemplo, a técnica revelada pode usar o acesso incrementai aos dados de fluxo de bits, permitindo que um buffer de fluxo de bits seja apresentado por um registrador razoavelmente curto, e atualizado em quaisquer intervalos convenientes, por exemplo, através de uma indicação de pulo, uma complexidade de redução mais adicional da implementação.
Por exemplo, em algumas implementações, um registrador de 32 bits pode ser suficiente mesmo para códigos muito longos. Além disso, as atualizações podem ser feitas em intervalos de 8 bits. Em geral, a técnica revelada pode significativamente reduzir a complexidade da representação e a encodificação/decodificação de códigos de comprimento variável, que podem permitir desenvolvedores de algoritmos de compressão de utilizar livros-código muito maiores, e dessa foram mais eficientes.
De acordo com um segundo aspecto geral desta revelação, para suportar a encodificação e a decodificação adaptativa de baixa complexidade das seqüências binárias produzidas por fontes sem-memória, as técnicas reveladas podem implementar códigos de bloco universais construídos para um conjunto de contextos identificados pelos números de bits diferentes de zero em bits precedentes em uma seqüência. Este segundo aspecto geral pode ser fornecido ou praticado independente ou conjuntamente com o primeiro aspecto geral descrito acima no que diz respeito à geração de estruturas de dados muito compactas. As técnicas para a encodificação e a decodificação adaptativa de baixa complexidade, de acordo com este segundo aspecto geral, podem depender de uma fórmula divulgada para a redundância assintótica de tais códigos, que refina a estimativa descrita em R.E. Krichevsky e V.K. Trofimov, The Performance of Universal Encoding, IEEE Trans. Information Theory, 27 (1981) 199-207. As técnicas de acordo com este segundo aspecto geral podem usar uma disposição de códigos de Huffman projetados para diversas densidades estimadas e indexados pelo número de bits diferentes de zero em blocos precedentes (contextos) em uma seqüência. Ao usar blocos mesmo dimensionados modestamente de bits η = 8...16 (e usar
l,5...5k bytes da memória correspondente), tais técnicas podem conseguir o desempenho de compressão comparável ou superior a outros algoritmos existentes tais como o algoritmo do codificador-Q descrito em W.B. Pennebaker, J.L. Mitchell, G.G. Langdon, Jr., R.B. Arps, An overview of the basic principies of the Q-Coder adaptive binary arithmetic coder, IBM J. Res. Dev., 32 (6) (1988) 717, que é usado no padrão de codificação de imagem JBIG, ou o algoritmo CABAC descrito em D. Marpe, H. Schwartz, e T. Wiegand, Context-Based Adaptive Binary Aruthmetic Coding in the H.264/AVC vídeo compression standard, IEEE Trans. on CSVT, 13(7):620 636, julho 2003, que é usado nos padrões de ITU-T H.264/MPEG AVC para a compressão de vídeo.
A encodificação e a decodificação adaptativa de baixa complexidade, de acordo com este segundo aspecto geral da revelação, podem ser baseadas na realização que, em um modelo sem-memória, a probabilidade de um bloco de bits, ou sua estimativa, depende somente de seu peso (o número de bits diferentes de zero), e não em um padrão real de seus bits. Dessa forma, um conjunto de todos os blocos possíveis de algum comprimento fixo pode ser separado em grupos diferentes que contêm blocos do mesmo peso (e conseqüentemente, a mesma probabilidade). Pode-se supor que cada grupo armazena blocos em uma ordem lexicográfica, naturalmente ou por reordenação.
É uma propriedade conhecida dos códigos de redundância mínima (tais como códigos de Huffman ou de Shannon) que cada grupo de blocos equiprováveis pode incluir no máximo dois subgrupos, onde os blocos em cada tal subgrupo são encodifiçados por palavras-código do mesmo comprimento. Sem limitação em generalidade, pode ser ainda 5 assumido que o comprimento das palavras-código no primeiro subgrupo é mais curto do que o comprimento das palavras- código no segundo subgrupo. Porque os blocos (ou as palavras) dentro de um grupo seguem a ordem lexicográfica, pode ser simplesmente dividido entre um subgrupo com 10 comprimento maior de palavra-código e um subgrupo com comprimento menor de palavra-código. Um valor de índice indica a posição do bloco dentro de um grupo. O menor bloco de forma lexicográfica (ou palavra) em cada subgrupo é atribuído uma palavra-código base. Dado uma palavra-código 15 base, as palavras-código restantes em cada subgrupo podem prontamente ser computadas.
Dessa forma, de acordo com este segundo aspecto geral da revelação, a codificação de comprimento variável pode ser realizada, por exemplo, por um encodif icador ou 20 por um decodificador usando uma estrutura de código que define grupos de blocos ou de palavras de entrada e suas respectivas palavras-código de saída em uma árvore de codificação, em que cada um dos grupos inclui as palavras- código que representam os blocos (ou palavras) que têm os 25 mesmos pesos, e os primeiros e segundos subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui as palavras-código que têm um primeiro comprimento e o segundo subgrupo inclui as palavras-código que têm um segundo comprimento diferente do 30 primeiro comprimento. Os blocos em cada um dos grupos são ordenados de forma lexicográfica e então separados em subgrupos, tais que a ordem lexicográfica está retida em cada um dos subgrupos. Além disso, as palavras-código que correspondem a cada bloco dentro de um subgrupo são atribuídos tais que também seguem a mesma ordem lexicográfica e facilitam encodificar e decodificar pela computação direta.
Baseado neste arranjo de blocos e os seus grupos e subgrupos, as palavras-código podem diretamente ser computadas usando um processo simplificado. Por exemplo, quando da obtenção de um valor de peso e de indice para um bloco, se o valor de indice é menos do que o número máximo de blocos no primeiro subgrupo, a seguir um primeiro subgrupo é selecionado para localizar a palavra-código. Se não, o segundo subgrupo é selecionado para localizar a palavra-código. Então, quando da recuperação da palavra- código base para o subgrupo selecionado, a palavra-código é computada prontamente somando o valor da palavra-código base com um valor determinado baseado no valor de índice do bloco dentro do subgrupo selecionado. Para finalidades deste segundo aspecto geral da revelação, os termos blocos ou palavras podem ser usados permutavelmente para se referir geralmente a quantidades de entrada a ser codificadas de acordo com um esquema de codificação. Um bloco ou uma palavra pode incluir uma seqüência de símbolos, que pode ser formada a partir de um alfabeto de entrada, tal como um alfabeto binário {0, 1}. As palavras- código se referem geralmente a quantidades de saída atribuídas aos blocos (ou às palavras) em conseqüência do esquema de codificação.
Estes e outros aspectos das técnicas descritas nesta revelação serão descritos em maiores detalhes abaixo. As técnicas podem ser usadas junto ou independente, e podem ser implementadas em qualquer uma de uma variedade de sistemas e dispositivos de encodificação e de decodificação, incluindo os sistemas e dispositivos configurados para encodificação ou decodificação de dados de video digital, imagem, áudio ou fala. Para finalidades de exemplo e de ilustração, a revelação descreverá a aplicação de tais técnicas à codificação e decodificação de 5 vídeo digital, sem limitação a respeito da aplicação prática geral da compressão e codificação de dados, ou outras aplicações específicas aos tipos diferentes de dados.
A Fig. 1 é um diagrama de blocos que ilustra um 10 sistema de encodificação e de decodificação de vídeo 10. Como mostrado na Fig. 1, o sistema 10 inclui um dispositivo fonte 12 que transmite o vídeo encodificado a um dispositivo de recepção 14 através de um canal de comunicação 16. O dispositivo fonte 12 pode incluir uma 15 fonte de vídeo 18, o encodif icador de vídeo 20 e um transmissor 22. 0 dispositivo de recepção 14 pode incluir um receptor 24, decodificador de vídeo 26 e dispositivo de display de vídeo 28. 0 sistema 10 pode ser configurado para aplicar técnicas para codificação de comprimento variável
2 0 (VLC) adaptativa de baixa complexidade e em memória
eficiente de dados de vídeo digital. Em particular, as técnicas de VLC adaptativas de baixa complexidade e em memória eficiente, podem ser usadas para a codificação por entropia dos coeficientes residuais do bloco produzidos por 25 um processo de codificação de vídeo preditivo. As técnicas podem ser aplicadas a esquemas de codificação de vídeo que codificam as posições de coeficientes de transformada diferentes de zero usando carreiras de zeros, ou a outros esquemas de codificação de vídeo.
3 0 No exemplo da Fig. 1, o canal de comunicação 16
pode compreender qualquer meio de comunicação cabeado ou sem fio, tal como um espectro de radiofreqüência (RF) ou uma ou mais linhas de transmissão físicas, ou qualquer combinação de meios sem fio e cabeados. O canal 16 pode fazer parte de uma rede baseada em pacote, tal como uma rede de área local, a rede de longa distância, ou uma rede global tal como a Internet. O canal de comunicação 16 representa geralmente qualquer meio de comunicação apropriado, ou coleção de meios de comunicação diferentes, para transmitir dados de vídeo a partir do dispositivo fonte 12 para o dispositivo de recepção 14.
O dispositivo fonte 12 gera o vídeo para a transmissão ao dispositivo de destino 14. Em alguns casos, entretanto, os dispositivos 12, 14 podem operar em uma maneira substancialmente simétrica. Por exemplo, cada um dos dispositivos 12, 14 pode incluir componentes de encodificação e decodificação de vídeo. Dessa forma, o sistema 10 pode suportar a transmissão de vídeo unidirecional ou bidirecional entre os dispositivos de vídeo 12, 14, por exemplo, para streaming de vídeo, broadcasting de vídeo, ou telefonia em vídeo. Para outras aplicações de compressão e de codificação de dados, os dispositivos 12, 14 poderiam ser configurados para enviar e receber, ou trocar, outros tipos de dados, tais como imagem, fala ou dados de áudio, ou combinações de dois ou mais dentre vídeo, imagem, fala e dados de áudio. Portanto, a discussão de aplicações de vídeo é fornecida para finalidades de ilustração e não deve ser considerada limitação dos vários aspectos da revelação como descrito amplamente aqui.
A fonte de vídeo 18 pode incluir um dispositivo de captura de vídeo, tal como uma ou mais câmeras de vídeo, um arquivo de vídeo contendo o vídeo previamente capturado, ou uma alimentação de vídeo ao vivo a partir de um fornecedor de conteúdo de vídeo. Como uma alternativa mais adicional, a fonte de vídeo 18 pode gerar dados com base em gráficos de computador como o vídeo fonte, ou uma combinação de vídeo ao vivo e de vídeo gerado por computador. Em alguns casos, se a fonte de vídeo 18 é uma câmera, o dispositivo fonte 12 e o dispositivo de recepção
14 pode formar os assim chamados telefones com câmera ou telefones com vídeo. Dessa forma, em alguns aspectos, o dispositivo fonte 12, o dispositivo de recepção 14 ou ambos podem formar um aparelho telefônico de comunicação sem fio, tal como um telefone móvel. Em cada caso, o vídeo capturado, pré-capturado ou gerado por computador pode ser encodificado pelo encodificador de vídeo 20 para a transmissão a partir do dispositivo fonte de vídeo 12 ao decodificador de vídeo 26 do dispositivo de recepção de vídeo 14 através do transmissor 22, do canal 16 e do receptor 24. O dispositivo de display 28 pode incluir qualquer de uma variedade de dispositivos de, display tais como um display de cristal líquido (LCD), display de plasma ou display de diodo emissor de luz orgânico (OLED).
0 encodificador de vídeo 20 e o decodificador de vídeo 26 podem ser configurados para suportar a codificação de vídeo escalonável para a escalabilidade espacial, temporal e/ou de relação sinal/ruído (SNR). Em alguns aspectos, o encodificador de vídeo 20 e o decodificador de vídeo 22 podem ser configurados para suportar a codificação de escalabilidade de SNR de granulosidade fina (FGS) para a SVC. 0 encodificador 20 e o decodificador 26 podem suportar vários graus de escalabilidade suportando a encodificação, a transmissão e a decodificação de uma camada base e de uma ou mais camadas escalonáveis de melhoramento. Para a codificação de vídeo escalonável, uma camada base carrega os dados de vídeo com um nível de qualidade mínimo. Uma ou mais camadas de melhoramento carregam o fluxo de bits adicional para suportar niveis mais elevados espaciais, temporais e/ou de SNR.
O encodificador de vídeo 20 e o decodificador de vídeo 2 6 podem operar de acordo com um padrão de compressão de vídeo, tal como a Codificação de Vídeo Avançada (AVC) H.264/MPEG-4 ITU-T, MPEG-2, MPEG-4, ou H.263 ITÜ-T. Embora não mostrado na Fig. 1, em alguns aspectos, o encodificador de vídeo 20 e o decodif icador de vídeo 26 pode ser integrado com um encodificador e decodificador de áudio, respectivamente, e incluem unidades apropriadas de MUX- DEMUX, ou outro hardware e software, para tratar a encodificação tanto de áudio como de vídeo em um fluxo de dados comum ou em fluxos de dados separados. Se aplicáveis, as unidades de MUX-DEMUX podem se conformar ao protocolo do multiplexador H.223 UIT, ou outros protocolos tais como o protocolo de datagrama de usuário (UDP).
0 padrão H.264/MPEG-4 (AVC) foi formulado pelo VCEG (Coding Experts Group) ITU-T junto com o MPEG (Moving Picture Experts Group) ISO/IEC como o produto de uma 20 parceria coletiva conhecida como o JVT (Joint Video Team). O padrão H.264 é descrito na recomendação H.264 ITU-T, codificação de vídeo avançada para serviços áudiovisuais gerais, pelo Grupo de Estudo ITU-T, e datado 03/2005, que pode ser referido aqui como o padrão H.2 64 ou a 25 especificação H.264, ou o padrão ou especificação H.264/AVC.
O JVT (Joint Video Team) continua a trabalhar em uma extensão de codificação de vídeo escalonável (SVC) para AVC H.264/MPEG-4. A especificação da extensão SVC em 30 desenvolvimento está na forma de um Esboço em Conjunto (JD - Joint Draft). O JSVM (Joint Scalable Vídeo Model) criado pelo JVT implementa ferramentas para uso em vídeo escalonável, que pode ser usado dentro do sistema 10 para as várias tarefas de codificação descritas nesta revelação. As informações detalhadas a respeito da codificação de Escalabilidade SNR de Granularidade Fina (FGS) pode ser encontrada nos documentos do Joint Draft, e particularmente 5 no Joint Draft 6 (SVC JD6), Thomas Wiegand, Gary Sullivan, Julien Reichel, Heiko Schwarz, e Mathias Wien, "Joint Draft 6: Scalable Video Coding", JVT-S 201, abril de 2006, Genebra, e no Joint Draft 9 (SVC JD9), Thomas Wiegand, Gary Sullivan, Julien Reichel, Heiko Schwarz, e Mathias Wien, 10 "Joint Draft 9 of SVC Amendment", JVT-V 201, janeiro de 2007, Marraquexe, Marrocos.
Em alguns aspectos, para broadcasting de vídeo, as técnicas descritas nesta revelação podem ser aplicadas a codificação de vídeo H.264 Melhorada para distribuir 15 serviços de vídeo em tempo real em sistemas multicast de multimídia móvel terrestre (TM3) usando a Especificação de Interface Aérea de Link Direto Somente (FLO), "Forward Link Only Air Interface Specification for Terrestrial Mobile Multimedia Multicast" para ser publicada como o Padrão 20 Técnico TIA-1099 (a "Especificação FLO"). 0 que quer dizer, que o canal de comunicação 15 pode compreender um canal de informação sem fio usado para efetuar broadcast das informações de vídeo sem fio de acordo com a Especificação FLO, ou semelhantes. A especificação FLO inclui exemplos 25 que definem a sintaxe e a semântica do fluxo de bits e processos de decodificação apropriados para a Interface Aérea FLO. Alternativamente, o vídeo pode ser transmitido de acordo com outros padrões tais como DVB-H (broadcast de vídeo digital - aparelho portátil), ISDB-T (broadcast 30 digital de serviços integrados - terrestre), ou DMB (broadcast de mídia digital). Dessa forma, o dispositivo fonte 12 pode ser um terminal sem fio móvel, um servidor de streaming de vídeo, ou um servidor de broadcast de vídeo. Entretanto, as técnicas descritas nesta revelação não são limitadas a nenhum tipo particular de sistema de broadcast, multicast, ou de ponto a ponto. No caso de broadcast, o dispositivo fonte 12 pode efetuar broadcast de diversos canais de dados de video a múltiplos dispositivos de recepção, cada um dos quais pode ser similar ao dispositivo de recepção 14 mostrado na FIG. 1.
O encodificador de vídeo 20 e o decodificador de vídeo 2 6 cada um pode ser implementado como um ou mais microprocessadores, processadores de sinal digital (DSPs) , circuitos integrados de aplicação específica (ASICs), arranjos de porta programáveis em campo (FPGAs), lógica discreta, software, hardware, firmware ou quaisquer combinações desses. Cada um dentre o encodificador de vídeo e o decodificador de vídeo 26 pode ser incluído em um ou mais encodificadores ou decodificadores, tanto um quanto o outro pode ser integrado como parte de um encodificador/decodificador (CODEC) combinado em um dispositivo móvel respectivo, dispositivo de assinante, dispositivo de broadcast, servidor, ou semelhantes. Além disso, o dispositivo fonte 12 e o dispositivo de recepção
14 cada um pode incluir componentes apropriados de modulação, demodulação, conversão de freqüência, filtragem, e de amplificador para a transmissão e recepção de vídeo encodificado, conforme aplicáveis, incluindo componentes sem fio e antenas de radiofreqüência (RF) suficientes para suportar uma comunicação sem fio. Para facilidade de ilustração, entretanto, tais componentes não são mostrados na FIG. 1.
Uma seqüência de vídeo inclui uma série de quadros de vídeo. 0 encodificador de vídeo 20 opera em blocos de pixels dentro de quadros de vídeo individuais a fim de encodificar os dados de vídeo. Os blocos de vídeo podem ter tamanhos fixos ou variáveis, e podem diferir no tamanho de acordo com um padrão de codificação especificado. Cada quadro de video inclui uma série de fatias. Cada fatia pode incluir uma série de macroblocos, que podem ser arranjados em sub-blocos. Como um exemplo, o padrão ITU-T H.264 suporta intra predição em vários tamanhos de bloco, tais como 16 por 16, 8 por 8, ou 4 por 4 para componentes luma, e 8x8 para componentes croma, assim como a inter predição em vários tamanhos de bloco, tais como 16 por 16, 16 por 8, 8 por 16, 8 por 8, 8 por 4, 4 por 8 e 4 por 4 para componentes luma e tamanhos dimensionados correspondentes para componentes croma.
Os blocos de video menores podem fornecer melhor resolução, e podem ser usados para as posições de um quadro de vídeo que incluem níveis de detalhe mais elevados. Em geral, os macroblocos (MBs) e os vários sub-blocos podem ser considerados para serem blocos de vídeo. Além disso, uma fatia pode ser considerada para ser uma série de blocos de vídeo, tais como MBs e/ou sub-blocos. Cada fatia pode ser uma unidade decodificável independente. Após a predição, uma transformada pode ser realizada no bloco residual 8x8 ou bloco residual 4x4, e uma transformada pode ser aplicada aos coeficientes DC dos blocos 4x4 para componentes croma ou componente luma se o modo de predição intra 16x16 for usado.
O encodificador de vídeo 20 e/ou o decodificador de vídeo 2 6 do sistema 10 da Fig. 1 podem ser configurados para empregar técnicas para a codificação de comprimento variável (VLC) adaptativa de baixa complexidade e em memória eficiente como descrito nesta revelação. Em particular, o encodificador de vídeo 20 e/ou o decodificador de vídeo 26 podem incluir um encodificador de entropia e um decodificador de entropia, respectivamente, que aplicam pelo menos algumas de tais técnicas para reduzir a utilização de memória, processamento de overhead, complexidade de processamento, consumo de largura de banda, espaço de armazenamento de dados, e/ou consumo de potência.
A Fig. 2 é um diagrama de blocos que ilustra um
exemplo de um encodificador de video 20 como mostrado na Fig. I. O encodif icador de video 20 pode ser formado pelo menos em parte como um ou mais dispositivos de circuito integrado, que podem ser referidos coletivamente como um 10 dispositivo de circuito integrado. Em alguns aspectos, o encodificador de video 20 pode fazer parte de um aparelho telefônico de comunicação sem fio ou de servidor de broadcast. 0 encodificador de vídeo 20 pode realizar a intra e inter-codificação de blocos dentro dos quadros de 15 vídeo. A intra-codificação depende da predição espacial para reduzir ou remover a redundância espacial no vídeo dentro de um quadro de vídeo dado. A inter-codificação depende da predição temporal para reduzir ou remover a redundância temporal em vídeo dentro dos quadros adjacentes 20 de uma seqüência de vídeo. Para a inter-codificação, o encodificador de vídeo 20 realiza a estimação de movimento para seguir o movimento de blocos de vídeo coincidentes entre quadros adjacentes.
Como mostrado na FIG. 2, o encodificador de vídeo 25 20 recebe um bloco de vídeo atual 30 dentro de um quadro de vídeo a ser encodif icado. No exemplo da FIG. 2, o encodificador de vídeo 20 inclui a unidade de estimação de movimento 32, armazenador de quadro de referência 34, unidade de compensação de movimento 36, unidade de 30 transformada de bloco 38, unidade de quantização 40, unidade de quantização inversa 42, unidade de transformada inversa 44 e a unidade de codificação por entropia 46. A unidade de codificação por entropia 4 6 pode acessar uma ou mais estruturas de dados armazenadas em uma memória 45 para obter os dados úteis na codificação. Um filtro de desblocagem (não mostrado) pode ser aplicado para filtrar blocos para remover os artefatos de blocagem. 0 5 encodificador de vídeo 20 também inclui o somador 48 e o somador 50. A FIG. 2 ilustra os componentes de predição temporal de encodificador de vídeo 20 para a inter- codif icação de blocos de vídeo. Embora não mostrado na Fig. 2 para facilidade de ilustração, o encodificador de vídeo 10 20 também pode incluir componentes de predição espaciais para a intra-codificação de alguns blocos de vídeo.
A unidade de estimação de movimento 32 compara o bloco de vídeo 30 com os blocos em um ou mais quadros de vídeo adjacentes para gerar um ou mais vetores de
movimento. 0 quadro ou os quadros adjacentes podem ser recuperados a partir do armazenador de quadro de referência 34, que pode compreender qualquer tipo de dispositivo de armazenamento de dados de memória ou para armazenar os blocos de vídeo reconstruídos a partir dos blocos 20 previamente encodifiçados. A estimação de movimento pode ser realizada para blocos de tamanhos variáveis, por exemplo, 16x16, 16x8, 8x16, 8x8 ou tamanhos de bloco menores. A unidade de estimação de movimento 32 identifica um bloco em um quadro adjacente que melhor casa com o bloco 25 de vídeo atual 30, por exemplo, com base em um modelo de distorção de taxa, e determina um deslocamento entre os blocos em quadros adjacentes e o bloco de vídeo atual. Nesta base, a unidade de estimação de movimento 32 produz um ou mais vetores de movimento (MV) que indicam a 30 magnitude e a trajetória do deslocamento entre o bloco de vídeo atual 30 e um ou mais blocos coincidentes a partir de quadros de referência usados para codificar o bloco de vídeo atual 30. Os vetores de movimento podem ter precisão de meio pixel ou de um quarto de pixel, ou mesmo a precisão mais fina, permitindo que o encodificador de vídeo 20 siga o movimento com precisão mais elevada do que posições de pixel inteiro e obtenha um bloco de predição melhor. Quando os vetores de movimento com valores de pixel fracionários são usados, as operações de interpolação são realizadas na unidade de compensação de movimento 36. A unidade de estimação de movimento 32 identifica as melhores partições de bloco e vetor de movimento ou vetores de movimento para um bloco de vídeo usando certos critérios, tal como um modelo de distorção de taxa. Por exemplo, pode existir mais de um vetor de movimento no caso de predição bidirecional. Usando os vetores de movimento e partições de bloco resultantes, a unidade de compensação de movimento 36 forma um bloco de vídeo de predição.
0 encodificador de vídeo 20 , forma um bloco de vídeo residual subtraindo o bloco de vídeo de predição produzido pela unidade de compensação de movimento 36 a partir do bloco de vídeo atual original 30 no somador 48. A unidade de transformada de bloco 38 aplica uma transformada, tal como a transformada de inteiro 4x4 ou 8x8 usada em H.264/AVC, ao bloco residual, produzindo os coeficientes de bloco de transformada residuais. A unidade de quantização 40 quantiza os coeficientes de bloco de transformada residuais para reduzir mais a taxa de bit. A unidade de codificação por entropia 46 codifica em entropia os coeficientes quantizados para reduzir ainda mais a taxa de bits.
A unidade de codificação por entropia 4 6 opera como uma unidade de codificação de comprimento variável (VLC) para aplicar codificação VLC aos coeficientes de bloco quantizados. Em particular, a unidade de codificação por entropia 46 pode ser configurada para realizar a codificação VLC de coeficientes de bloco de video digital usando técnicas de VLC adaptativas de baixa complexidade em memória eficiente, como descritas nesta revelação. Dessa 5 forma, os vários processos de encodificação descritos nesta revelação podem ser implementados dentro da unidade de codificação por entropia 46 para realizar a codificação de dados de vídeo. Alternativamente, tal unidade de codificação por entropia 46 pode realizar os processos 10 descritos nesta revelação para codificar alguns dentre uma variedade de dados, incluindo mas não limitados a vídeo, imagem, fala e dados de áudio. Geralmente, o decodificador de vídeo 26 realiza as operações inversas, incluindo decodificação VLC, para decodificar e reconstruir o vídeo
encodif icado, como será descrito, por exemplo, em referência a Fig. 3.
A unidade de quantização inversa 42 e a unidade de transformada inversa 44 aplicam a quantização inversa e a transformação inversa, respectivamente, para reconstruir 20 o bloco residual. O somador 50 adiciona o bloco residual reconstruído ao bloco de predição de movimento compensado produzido pela unidade de compensação de movimento 3 6 para produzir um bloco de vídeo reconstruído para o armazenamento no armazenador de quadro de referência 34. O 25 bloco de vídeo reconstruído é usado pela unidade de estimação de movimento 32 e pela unidade de compensação de movimento 36 para encodificar um bloco em um quadro de vídeo subseqüente.
A Fig. 3 é um diagrama de blocos que ilustra um exemplo de um decodificador de vídeo 26. 0 decodificador de vídeo 2 6 pode ser formado pelo menos em parte como um ou mais dispositivos de circuito integrado, que podem ser referidos coletivamente como um dispositivo de circuito integrado. Em alguns aspectos, o decodificador de vídeo 26 pode fazer parte de um aparelho telefônico de comunicação sem fio. 0 decodificador de vídeo 26 pode realizar a intra e inter-decodificação de blocos dentro dos quadros de vídeo. Como mostrado na Fig. 3, o decodificador de vídeo 26 recebe um fluxo de bits de vídeo encodificado que foi encodificado pelo codificador de vídeo 20. No exemplo da Fig. 3, o decodif icador de vídeo 2 6 inclui a unidade de decodificação por entropia 52, a unidade de compensação de movimento 54, unidade de quantização inversa 56, a unidade de transformada inversa 58, e o armazenador de quadro de referência 62. 0 decodificador de vídeo 2 6 também pode incluir um filtro de desblocagem em-loop (não mostrado) que filtra a saída do somador 64. 0 decodif icador de vídeo 26 também inclui q somador 64. A Fig. 3 ilustra os componentes de predição temporal do decodificador de vídeo 2 6 para inter-decodificar os blocos de vídeo. Embora não mostrado na Fig. 3, o decodificador de vídeo 2 6 também pode incluir componentes de predição espacial para intra-decodificar alguns blocos de vídeo.
A unidade,de decodificação por entropia 52 recebe o fluxo de bits de vídeo encodificado e decodifica a partir dos coeficientes residuais quantizados de fluxo de bits, modo de codificação de macrobloco e informações de 2 5 movimento, que podem incluir vetores de movimento e partições de bloco. Dessa forma, a unidade de decodificação por entropia 52 funciona como uma unidade de decodificação VLC. Por exemplo, a fim de decodificar coeficientes residuais quantizados a partir do fluxo de bits encodificado, como a unidade de codificação por entropia 4 6 da Fig. 2, a unidade de decodif icação por entropia 52 da Fig. 3 pode realizar a decodificação VLC adaptativa de baixa complexidade e em memória eficiente de coeficientes de bloco de vídeo digital como descrito nesta revelação. Entretanto, a unidade de decodificação por entropia 52 pode realizar decodificação VLC em uma maneira inversa em relação a unidade de codificação por entropia 46 da Fig. 2 a fim de recuperar coeficientes de bloco quantizados a partir do fluxo de bits encodifiçado. Dessa forma, os vários processos de decodificação descritos nesta revelação podem ser implementados dentro da unidade de decodificação por entropia 52 para realizar a decodificação de dados de video. Alternativamente, tal unidade de decodificação por entropia 52 pode realizar os processos descritos nesta revelação para decodificar qualquer um de uma variedade de dados, incluindo mas não limitados a dados de vídeo, de imagem, de fala e de áudio. Em um ou outro caso, o resultado da codificação de comprimento variável realizada pela unidade de decodif icação por entropia 52 pode ser emitida a um usuário, armazenado na memória e/ou transmitido a uma outra unidade de processamento ou dispositivo.
A unidade de compensação de movimento 54 recebe
as partições de bloco e vetores de movimento e um ou mais quadros de referência reconstruídos a partir do armazenador de quadro de referência 62 para produzir um bloco de vídeo de predição. A unidade de quantização inversa 56 quantiza inversamente, isto é, de-quantiza, os coeficientes de bloco quantizados. A unidade de transformada inversa 58 aplica uma transformada inversa, por exemplo, uma DCT inversa ou uma transformada inversa de inteiro 4x4 ou 8x8, aos coeficientes para produzir blocos residuais. Os blocos de vídeo de predição são então somados pelo somador 64 com os blocos residuais para formar blocos decodificados. Um filtro de desblocagem (não mostrado) pode ser aplicado para filtrar os blocos decodificados para remover artefatos de blocagem. Os blocos filtrados são colocados então no armazenador de quadro de referência 62, que fornece o quadro de referência para decodificar quadros de video subseqüentes e também produz o video decodificado para acionar o dispositivo de display 28 (Fig. 1).
CODIFICAÇÃO EM MEMÓRIA EFICIENTE DE CÓDIGOS DE COMPRIMENTO VARIÁVEL
De acordo com um primeiro aspecto geral da revelação, um exemplo de uma técnica em memória eficiente para a codificação de comprimento variável suportar estruturas de dados compactas será descrito agora em maior detalhe. A técnica não precisa depender de nenhum esquema de construção de código particular, tal como Huffman, Shannon, Shannon-Fano, Gilbert-Moore, ou outros códigos. A técnica assume, entretanto, que um código é construído para uma fonte com probabilidades monotonicamente crescentes de símbolos. Mais especificamente, é assumido que as palavras- código têm comprimentos monotonicamente decrescentes (ou pelo menos não-crescentes), e que as palavras-código do mesmo comprimento têm a mesma ordem lexicográfica que símbolos no alfabeto de entrada que eles representam.
Esta técnica, conforme aplicada a codificação de vídeo ou a outras aplicações, usa as propriedades acima para descrever unicamente tal código com uma estrutura de dados muito compacta. Como descrito previamente, a estrutura de dados pode conter, para cada comprimento de palavra-código válido, isto é, nível com nós externos em uma árvore de código, a seguinte informação:
a. um valor parcial da menor (ou maior) palavra- código de forma lexicográfica no nível atual em uma árvore
de código,
b. um número de bits no valor parcial, c. um valor de um símbolo correspondendo a menor (ou maior) palavra-código de forma lexicográfica, e
d. um indicador que instrui um decodificador para pular um certo número de bits antes de prosseguir ao nível
seguinte da árvore de código.
Os processos de encodificação e de decodificação podem usar esta estrutura para identificar um nível da árvore de código que corresponde a uma palavra-código a ser produzida (ou decodificada), e então computam diretamente o valor da palavra-código (ou do símbolo decodificado).
Esta técnica pode permitir o uso de uma quantidade muito menor de memória para a codificação e decodifícação devido ao fato de que somente os valores parciais das menores palavras-código de forma lexicográfica são armazenados. A estrutura de dados pode ser qualquer uma de uma grande variedade de estruturas de dados, tais como tabelas, lista encadeada, árvores binárias, árvores de raiz, arquivos flat ou semelhantes, e pode ser armazenada em qualquer uma de uma variedade de dispositivos de memória diferentes, tais como muitas formas de memória de acesso aleatório (RAM), memória somente de leitura (ROM), ou de ambos. A estrutura de dados pode ser armazenada em tal memória dentro de um encodificador ou de um decodificador, por exemplo, dentro da memória 45 ou da memória 51 mostrada nas Figs. 2 e 3, respectivamente. Além disso, pelo menos alguns dos níveis da árvore de codificação incluem as palavras-código arranjadas em uma ordem lexicográfica no que diz respeito à ordem dos valores de símbolo representados pelas palavras-código. Portanto, cada uma das palavras-código base é uma menor palavra-código de forma lexicográfica em um nível correspondente na árvore de codificação. Além disso, esta técnica permite o uso de acesso incrementai aos dados de fluxo de bits, permitindo que um buffer de fluxo de bits seja apresentado por um registrador razoavelmente curto. Por exemplo, um registrador de 32 bits poderia ser suficiente, mesmo para códigos muito longos. O registrador pode ser atualizado em intervalos convenientes (por exemplo, 8 bits), diminuindo mais a complexidade da implementação. Em geral, em vários aspectos, a técnica pode ser capaz significativamente de reduzir a complexidade de representação e
encodificação/decodificação de códigos de comprimento variável, que podem permitir aos desenvolvedores de algoritmos de compressão de utilizar livros-código maiores e mais eficientes.
Uma discussão geral de códigos de comprimento variável é fornecida agora para ajudar na ilustração das técnicas descritas nesta revelação. Os códigos de comprimento variável representam uma ferramenta fundamental na compressão de dados. Geralmente, os códigos de comprimento variável são usados para representar seqüências de símbolos com alguma distribuição conhecida e tipicamente altamente desbalanceada. Tais seqüências podem ser representadas por seqüências binárias, ou por códigos, de um comprimento total muito mais curto. A redução do comprimento é feita pela substituição de símbolos ocorrendo mais freqüentemente com os códigos mais curtos, e por símbolos menos freqüentes com códigos mais longos.
Os exemplos de códigos de comprimento variável usados na compressão de dados são códigos de Huffman, por exemplo, como descrito em D.A. Huffman. Um método para a construção de códigos de redundância mínima. Proc. IRE, Vol. 40, pp. 1098-1101. Set. 1952, Shannon Codesr por exemplo, como descrito em C.E. Shannon, Teoria matemática de comunicação, Bell Syst. Tech J. Vol. 27. pp. 379-423, julho 1948, Shannon-Fano codes, por exemplo, como descrito em R M. Fano, A transmissão de informação, Res. Lab. Electronics, Massachusetts Instituto de Tecnologia, Cambridge, Mass. Tec. Rep. No. 65, 194 9, e Gilbert-Moore codes, por exemplo, como descrito em E.N. Gilbert e em E.F. Moore, Encodificações Binárias de Comprimento Variável, Bell Syst. Tech. J., Vol.7, pp. 932-967, 1959 (também referido às vezes como Shannon-Fano-Elias codes).
Os códigos descritos acima pertencem a uma classe de códigos livres de prefixo, por exemplo, como descrito em T. Cover e J. Thomas, Elementos da Teoria de Informação, Wiley, 1991. A Fig. 4 é um diagrama que ilustra um exemplo de uma árvore de codificação binária. Os códigos descritos acima podem convenientemente ser representados por uma árvore binária tal como aquela mostrada . na FIG. 4. Dessa forma, um codificador pode encodificar os valores de símbolo consistentes com a árvore de codificação. Os valores de acordo com a árvore podem representar alguns de uma variedade de dados, tais como os dados de vídeo, os dados de imagem, os dados de fala ou dados de áudio. Cada nó interno em tal árvore corresponde a um dígito binário, cujo valor 0 força um movimento à direita, e cujo valor 1 força um movimento à esquerda do nó filho em uma árvore. 0 nó mais de topo é chamado de nó raiz, que é o nó a partir do qual a encodificação/decodificação começa.
Cada nó externo em uma árvore é onde o processo de encodificação/decodificação reinicia, produzindo uma palavra-código, ,isto é, como uma seqüência de bits a partir da raiz ao nó atual, ou um valor decodificado de um símbolo associado com uma palavra-código atual. Na árvore de codificação do exemplo da Fig. 4, há dezesseis palavras-código que correspondem aos símbolos indexados 0 a 15. Neste exemplo, a palavra-código mais curta tem um comprimento de 1 bit, e as palavras-código mais longas têm comprimentos de 10 bits cada uma. O número de niveis que contém nós externos (palavras-código) nesta árvore é 7, isto é, o Io, 3o, 4o, 6o, 7o, 9o e 10° niveis.
Com referência a Fig. 4, deixe η denotar o número de nós externos na árvore de codificação (e correspondentemente o número de palavras-código no código), deixe L denotar o comprimento da palavra-código mais longa, e deixe K denotar o número de niveis preenchidos com nós externos na árvore de codificação. A seguinte discussão usa notação-0 de P. Bachmann. Por exemplo, a expressão y(n)=0(x(nf) indica existência de
alguma constante M>0, tal que\y( ) <=M\x(n\ para todo η
suficientemente grande.
Para suportar o processo de codificação, um codificador ou decodificador, tal como a unidade de codificação por entropia 46 ou a unidade de decodificação por entropia 52, geralmente necessita armazenar uma árvore binária na memória de computador, tal como a memória 45 ou a memória 51. Além disso, os processos de encodificação e de decodificação devem envolver o atravessamento bit-por-bit (isto é, nó-por-nó) da árvore de codificação armazenada na memória. Dessa forma, tal implementação deve envolver o custo de armazenamento O (η) , e pode tomar até O(L) etapas. Não obstante, em alguns casos especiais, quando as árvores de codificação têm alguma estrutura particular, pode haver mais modos eficazes de armazenar tais estruturas do código e realizar as operações de encodificação ou decodificação. Por exemplo, considerando o código apresentado na árvore de codificação do exemplo da Fig. 4, pode-se observar que as palavras-código são não-decrescentes do comprimento, e que todas as palavras-código no mesmo nivel da árvore de codificação têm valores adjacentes. Por exemplo, as palavras-código no 4o nivel da árvore na Fig. 4 são mais longos do que as palavras-código no 3o nivel da árvore, isto é, 0001 contra 011, 010, 001 e 000. Além disso, as palavras-código no 3o nivel têm valores adjacentes de 011, 010, 011, 000. Dessa forma, em vez de armazenar todos os códigos, pode ser suficiente armazenar somente a menor ou maior palavra-código para cada nivel da árvore de codificação, isto é, como uma forma de palavra- código base que as palavras-código adjacentes possam ser computadas.
A observação acima é chave para entender técnicas para decodificar os códigos de comprimento variável baseados em sua conversão da assim chamada forma canônica, por exemplo, como descrito em A. Moffat e A. Turpin, On the Implementation of Minimum-Redundancy Prefix Codes, IEEE Trans. Communications, 45 (10) (1997) 1200-1207. Em termos simples, um código canônico : tem uma distribuição não- decrescente de comprimentos e mantém a ordem lexicográfica no que diz respeito aos índices atribuídos a seus nós. É razoavelmente simples mostrar que qualquer fonte dada pode ser reordenada tal que o código resultante tem as propriedades acima.
Por exemplo, o código ilustrado na árvore de codificação da Fig. 4 representa um código reordenado para uma fonte com uma distribuição não-monotônica, como indicado na TABELA 1 abaixo. Especificamente, a TABELA 1 é um exemplo de um código de comprimento variável canônico que foi reordenado. TABELA 1
Exemplo de código de comprimento variável canônico
SilBbolo Probabili- dade índice de símbolo após reordenação Comprimento de código Código 0 0.6561 15 ■ : vi; - 1 1 0.0729 12 . ■ ' '3 ' 011 2 0.0729 13 ' 3 010 3 0.0081 ; 5 7 . 0000101 4 0.0729 14 : λ 3 !-Λ 001 0.0081 ■ 6 ,· Y-η',- 0000100 6 0.0081 10 6 000011 7 0.0009 1 ,.;,,■:; ', 'VlO' ■ . 0000000001 8 : ; V ν;0.0739-;·:ρ 0001 9 0.0081 7 : :: 7 0000011 0.0081 8 7 00000to 11 0.0009 2 9 000000011 12 0.0081 9 , V 7 . 0000001 13 0.0009 3 9 000000010 14 0.0009 000000001 0.0001 0000000000
Na TABELA 1 acima, o símbolo 0 tem a probabilidade mais elevada, seguida por 1 e por 2. Entretanto, o símbolo 3 tem uma probabilidade mais baixa do que 4, e 4 e 8 têm a mesma probabilidade que 1 e 2. Após a reordenação, todas as probabilidades de símbolo estão aumentando monotonicamente (não-decrescente), e resultam no código canônico mostrado representado na árvore de codificação da Fig. 4. 0 algoritmo assim chamado de Moffat- Turpin, como descrito em A. Moffat e A. Turpin, On the Implementation of Minimum-Redundancy Prefix Codes, IEEE Trans. Communications, 45 (10) (1997) 1200-1207, fornece uma técnica para decodificar códigos canônicos. As técnicas descritas nesta revelação podem fornecer melhorias sobre o algoritmo de Moffat-Turpin. Outros algoritmos, tais como aqueles descritos em J.B. Connell, A Huffman-Shannon-Fano Code, Proc. IEEE, julho 1973, 1046-1047, e em A. Brodnik e S. Carlsson, Sublinear Decoding of Huffman Codes Almost in Place, DIMACS Workshop on Codes and Trees: Algorithmic and information Theoretic Approaches, outubro 1998, universidade de Rutgers, DIMACS Center, NJ, são similares ao algoritmo de Moffat-Turpin, e também podem ser melhoradas usando as técnicas divulgadas em uma forma similar.
O algoritmo de Moffat-Turpin para decodificação de códigos de comprimento variável é descrito abaixo. Supor que um alfabeto de entrada A contém η letras: A = {a0,... ,an_j] , reordenando i: A —» {θ, ... ,n — l] é aplicado tais que as probabilidades resultantes satisfazem:
P0 < P1 <... < pn_j . Então, um algoritmo Huffman ou outro de construção de redundância minima pode ser aplicado, que atribui comprimentos de palavras-código li para cada índice l<i<L, onde L é o comprimento da maior palavra-código. Como um resultado, "números de população" são produzidos como mi, isto é, o número de palavras-código de comprimento 1.
Usando estes parâmetros, os assim chamados valores "base" são computados para cada nível na árvore como se segue:
hase[í] =
2"
Estes valores de palavra-código base representam as menores palavras-código canônicas em cada nível da árvore. Dado um valor de palavra-código base de base[l], um pode agora computar o valor da j-l-la palavra-código dentre mi palavras- código de comprimento 1:
base [/] + j .
Para a operação de decodificador, é mais conveniente armazenar uma versão justificada a esquerda do valor de palavra-código base como se segue:
Ij _bade[l] = base[l]2w^ ,
onde W é o comprimento do armazenador de bit ou registrador usado para manter os bits mais recentes carregados a partir do fluxo de bits. É assumido que W>=L .
Finalmente, em adição aos valores de palavra- código base, o decodificador de Moffat-Turpin também armazena Índices de símbolos respectivos no arranjo reordenado. Estes índices são armazenados como valores offset[l] para cada nível preenchido na árvore. Toda a estrutura do exemplo mantida pelo algoritmo Moffat-Turpin para o código representado pela árvore da Fig. 4 é apresentada na TABELA 2 abaixo.
TABELA 2
2 0 Estrutura de decodif icador de Moffat-Turpin para código na
Fig. 4
i ";?'■' LjJbase [*] (W=16) Nivel fíj offset [i] 0 Iooo1PtftQppooorTO...; ■ 1 15 ; ι . .12 2 0001000000000000 4 Il 3 0000110.0 00 000 0.00. 6 10 4 : QOOOQOIQ ΟΏΟΟ 0;0 00 : 7 5 .ooooooopioοοθΰοο;^ 9 2 6 0000000000000000 10 0 O pseudo-código do exemplo para implementação do algoritmo de decodificação de Moffat-Turpin usando a estrutura da TABELA 2 é apresentado abaixo na TABELA 3.
TABELA 3
Algoritmo de decodificador de Moffat-Turpin
Linha Instrução Comentário 1 V = bitstream buffer; recebe os últimos W bits a partir do fluxo de bits 2 para (i=0; i<K; i++) { 3 se (lj base[i]<=V) buscar por nível 4 break; contendo palavra-código atual } 6 1 = nível[i] ; recebe comprimento 7 scroll bitstream(1); rola fluxo de bits por 1 bits 8 símbolo = offset[i] + ((V-base[i])»(W-I)); decodificar símbolo
A partir da TABELA 3 acima, pode ser visto que o processo de decodificação inteiro envolve até K (W-bits) comparações do buffer de fluxo de bits atual com valores de palavra- código base justificados a esquerda, seguido pela
computação direta simples de um índice de um símbolo decodificado. Pode ser também visto que o arranjo lj_base[] utilizado pela tal estrutura requer 0(K*W) bits de memória, que poderia ser um problema se palavras-código são longas, uma vez que W poderia ser usado tal que W >= 1.
No exemplo da TABELA 3, um decodificador recebe W
bits do fluxo de bits e como V, e compara V a palavras- código base (lj_base[i]) para níveis sucessivos i da árvore de codificação. Quando uma palavra-código base é encontrada que é menor ou igual a V, a busca para o nível da palavra- código termina. Então, o decodificador determina o comprimento associado com o nivel i, rola o fluxo de bits por 1 bits, e decodifica o símbolo. Em particular, o símbolo decodificado é determinado pela soma do valor de offset para o nível i e a diferença entre a palavra-código V do fluxo de bits e a palavra-código base para o nível i, pulado para a direita por W-I bits.
Em um ajuste geral, quando a decodificação de Moffat-Turpin for seguida, a consulta de mapeamento inversa Γ1 : {θ, ..., n-l] —» A. Neste caso, a última operação se torna a operação mais cara em memória, enquanto exige espaço 0(n). Em muitos casos práticos, entretanto, como situações envolvendo comprimentos de execução ou saídas de transformada ou preditores, as fontes que precisam ser encodifiçadas já estão ordenadas. Conseqüentemente, a memória usada pelo arranjo lj_base[] na estrutura de Moffat-Turpin transforma-se o fator principal no custo de armazenamento total.
De acordo com um primeiro aspecto geral, as técnicas descritas nesta revelação fornecem os refinamentos que permitem uma compressão adicional das estruturas de dados usadas no algoritmo de Moffat-Turpin, ou outros algoritmos, e suportam a decodificação incrementai de códigos de comprimento variável. Os refinamentos serão discutidos agora em maior detalhe. Em referência à TABELA 2, é evidente que os valores de lj_base[l] têm grandes quantidades de bits dianteiros da direita para a esquerda. Conseqüentemente, os valores parciais das palavras-código base representam a remoção de um número fixo de bits dianteiros das palavras-código base. Na maioria dos casos, os bits dianteiros que são removidos serão zero. Tais números de zero estão aumentando monotonicamente enquanto a árvore de codificação se estende a camadas mais profundas. Dessa forma, se os bits são decodificados seqüencialmente começando com a primeira camada da árvore de codificação e se movendo para baixo, é possível pular alguns dos bits zero dianteiros sem afetar a exatidão da decodificação. Pulando pelo menos alguns dos zeros dianteiros, as técnicas descritas nesta revelação permitem estruturas de dados muito comprimidas e decodificação incrementai de códigos de comprimento variável.
Quando os bits dianteiros são removidos, entretanto, é possível que alguns códigos legítimos em níveis inferiores da árvore de codificação possam se estender na faixa de bits dianteiros que são removidos. Portanto, para evitar perder tais códigos, uma tabela de indicadores de pulo é fornecida. 0 indicador de pulo instrui um decodificador para pular um número de bits em um fluxo de bits a ser decodificado antes de prosseguir a um nível selecionado da árvore de codificação. Em particular, o indicador de pulo pode instruir o decodificador para pular um número fixo de bits, por exemplo, 8 bits, no fluxo de bits da palavra-código antes de prosseguir ao nível selecionado da árvore de codificação. Desse modo, o valor parcial da palavra-código base no nível selecionado da árvore é baseado em um pulo da palavra-código base pelo número fixo de bits. Sem o pulo, a palavra-código base no nível selecionado da árvore se estenderia pelo menos parcialmente no número removido de bits dianteiros.
A TABELA 4 abaixo ilustra uma implementação do exemplo de um processo de codificação em que os zeros dianteiros são removidos, de acordo com um aspecto desta revelação, para comprimir mais a estrutura de dados usada para representar e processar as palavras-código. No exemplo da TABELA 4, os zeros dianteiros são removidos nos incrementos de 8, que é conveniente para o gerenciamento de buffer do fluxo de bits em computadores convencionais de 8 bits/byte. Para controlar a remoção de zeros dianteiros, uma tabela adicional dos indicadores (skip_8[i]) é fornecida, como descrita acima. Dessa forma, a TABELA 4 se conforma geralmente à TABELA 2, mas remove os zeros dianteiros de cada uma das palavras-código e adiciona a coluna de indicador de pulo.
TABELA 4
Estrutura de decodificador de Moffat-Turpin modificada
* 1 r JjJtowe [i] (W=8) skip_8 [1] r levei [1] offset li] 0 10000000 0 1 15 1 00100000 0 3 12 2 00010000 0 4 U 3 00001100 0 6 10 4 00000010 1 jJ 5 10000000 0 9-8=1 2 6 oooooooo 0 10-8-2 0
No exemplo da TABELA 4, o valor r_lj_base(i) representa o valor de palavra-código base em cada posição de índice, o valor r_level[i] indica o nível dentro da árvore de codificação para a posição de índice e o comprimento das palavras-código a esse nível, o valor offset[i] indica o número de zeros dianteiros da direita para a esquerda para o valor de palavra-código base, e o valor skip_8[i] indica se um decodificador deve pular 8 bits para o valor de palavra-código base seguinte, com o 1 designando um pulo e o 0 designando nenhum pulo. Esta operação de pulo renova periodicamente o buffer de bit em intervalos selecionados para permitir o decodificador de identificar as palavras-código que seriam perdidas de outra maneira quando os zeros dianteiros são removidos. Por exemplo, se os oito zeros dianteiros mais a direita de uma palavra-código justificada a esquerda são removidos, a palavra-código que se estende nos oito bits mais a direita seria perdida parcialmente ou completamente. Portanto, pular os oito bits mais a esquerda em resposta à indicação de pulo moveria a palavra-código na faixa de bits que não são removidos, preservando desse modo a palavra-código para uso na decodificação.
Dessa forma, o indicador de pulo sinaliza quando o decodificador deve pular adiante pelo incremento de pulo especificado para o nivel seguinte do código, por exemplo, 8 no exemplo da TABELA 4. Como uma ilustração, na TABELA 2, os valores de palavra-código base nas posições de indice 5 e 6 (niveis de árvore 9 e 10) são 0000000010000000 e 0000000000000000, respectivamente. Quando os oito zeros dianteiros mais a direita (justificados a esquerda) são removidos destes valores de palavra-código base, é necessário que o decodif icador pule adiante oito bits de modo que o valor de palavra-código base real (0000000010000000) não seja perdido ao remover oito zeros dianteiros. Em vez disso, o valor de palavra-código base real (0000000010000000) é convertido em um valor de palavra-código base diferente (10000000) pulando os primeiros oito bits (00000000) e então removendo os oito zeros - dianteiros mais a direita.
Devido à remoção dos zeros dianteiros, a largura do arranjo modificado lj_base[i] é muito menor. No código da TABELA 4, como um exemplo, a largura W do arranjo modificado lj_base[i] é W = 8, em vez de W= 16 no caso da TABELA 2. Um exemplo de uma implementação de um algoritmo que usa uma tabela de pulo extra para renovar periodicamente o buffer de bit é mostrado abaixo na TABELA 5. Um algoritmo construído como mostrado na TABELA 5 pode ser configurado para suportar palavras-código muito longas ou tabelas de valor de palavra-código base muito compactas (lj_base).
TABELA 5
Algoritmo de decodificador de Moffat-Turpin modificado
Linha Instrução Comentário 1 V = bitstream buffer; recebe os últimos W bits a partir do fluxo de bits 2 para (i=0; i<K; i++) { 3 se .(Ij base[i]<=V) busca por nível 4 break; contendo palavra-código atual se(skip B[i]) devemos pular próximos B bits? 6 V=Scroll bitstream(B); rola fluxo de bits por B bits 7 } 8 1 = nível[i]; recebe comprimento residual 9 scroll bitstream(1); rola fluxo de bits por 1 bits símbolo = offset[i] + ((V-base[i])»(W-I)); decodifica símbolo
Como mostrado na TABELA 5, o decodificador obtém os últimos W bits do fluxo de bits, representado pelo valor V = bitstream_buffer. O decodificador procurara então os niveis i da árvore de codificação por um valor de palavra- código base lj_base[i] que é inferior ou igual a palavra- código V do buffer de fluxo de bits. Se o nivel atual i da árvore corresponde a um nível de pulo (skip_B[i]), por exemplo, como indicado na TABELA 5, a seguir o decodificador rola o fluxo de bits para a direita pelos B bits, por exemplo, 8 bits em algumas implementações, de modo que a palavra-código no nível seguinte procurado pelo decodificador possa ser retida em vez de perdida pela remoção dos B zeros dianteiros mais a direita.
Quando da determinação do comprimento residual 1= nível[i] para as palavras-código no nível atual da árvore, por exemplo, como indicado na TABELA 5, o decodificador rola o fluxo de bits pelo comprimento 1. Então, o decodificador computa diretamente o índice de símbolo baseado na soma do offset para o nível atual i e a diferença entre os conteúdos do buffer de fluxo de bits V e a palavra-código base para o nível atual i, pulados para a direita por W-I bits.
O decodificador decodifica uma palavra-código do fluxo de bits de palavra-código usando a estrutura de dados armazenados especificando os valores parciais das palavras- código base, o indicador de pulo, os valores representados pela palavra-código base, e os comprimentos (isto é, número de bits) dos valores parciais das palavras-código base. Geralmente, um processador associado com um decodificador, tal como a unidade de decodificação por entropia 52, busca os níveis da árvore de codificação por valor selecionado dos valores parciais das palavras-código base que é inferior ou igual a palavra-código do fluxo de bits de palavra-código. O processador pula um número de bits no fluxo de bits de palavra-código antes de prosseguir a um nível selecionado da árvore de codificação em resposta ao indicador de pulo, e computa uma de uma pluralidade de valores que correspondem a palavra-código baseada em uma diferença entre o valor selecionado dentre os valores parciais das palavras-código base que é inferior ou igual a palavra-código e a palavra-código e um índice do valor selecionado dentre os valores parciais das palavras-código base que é inferior ou igual a palavra-código. O processador gera o resultado da decodificação para o armazenamento na memória, transmissão a uma unidade de processamento ou dispositivo diferente, ou apresentação a um usuário. Por exemplo, os resultados decodificados podem ser usados para acionar o dispositivo de display 28 para apresentar video ou imagem e/ou um dispositivo de saida de áudio para apresentar saida de áudio ou de fala.
No exemplo da TABELA 5, o decodificador realiza atualizações incrementais do buffer de fluxo de bits através da operação de pulo para reter as palavras-código que seriam perdidas de outra maneira quando os zeros dianteiros são removidos. Além disso, os valores de palavra-código base que o decodificador compara a cada nivel do código podem ser muito mais curtos. A quantidade potencial da redução no comprimento de valor de palavra- código base será discutida agora. A fim de analisar a faixa dinâmica de tais quantidades no algoritmo modificado descrito nesta revelação, a diferença entre 2 níveis adjacentes é considerada como se segue:
20
iW-l+i
= 2"+ΣΤ,*
Se i é o índice do nível seguinte não-vazio, então: Ij _ base[l] - Ij _ base[! + i] = 2W~! + mM 2r íí+/)
Aqui, a quantidade principal de interesse é: m1+12~l, que influencia esta diferença. Em um caso mais simples, quando i=l, é claro que esta diferença depende simplesmente do número de nós externos, e dessa forma, W pode ser escolhido tal que:
W > max Iog2 {m,) que na maioria dos casos práticos é uma quantidade significativamente menor do que L. Esta diferença deve ser particularmente grande para distribuições altamente desbalanceadas.
Por exemplo, se os símbolos de entrada são blocos
de m bits com probabilidades de Bernoulli pm{l — p)mk, então
o nível mais preenchido contém aproximadamente
,2r(P>
\Pm j
palavras-código, que significa que aproximadamente H{p)m bits deveriam ser usados para diferenciar entre palavras- código, onde H{p) é a função de entropia, por exemplo, como descrito em T. Cover e J. Thomas, Elements of Information Theory, Wiley, 1991.
Por outro lado, a palavra-código mais longa neste caso terá aproximadamente
( í Λ
L &-Iog min [pm (l-p)m~k\ =-log(pmin)m = Η_χ(ρ)ιη bits, onde é bem \ k J
sabido que para distribuições assimétricas: H_Jp)>H(p)
onde H_x(p)é um caso especial de entropia de Renyi, por exemplo, como descrito em W. Szpankowski, Average Case Analysis of Algorithms on Sequences. (new York, John Wiley & Sons, 2001). Esta diferença pode ser arbitrariamente grande com ρ - >0 ou ρ - >1.
Com base na discussão acima, segue que a técnica proposta deve ser eficaz em tratar grandes estruturas de código assimétricas. Tais estruturas são tradicionalmente difíceis de trabalhar com técnicas tradicionais/existentes de utilização, e em muitos casos engenheiros recorrem a usar as várias simplificações que afetam o desempenho de compressão de códigos para fazê-los mais práticos. Por exemplo, os códigos bem populares de Golomb, por exemplo, como descrito em S. Golomb, "Run-length coding", IEEE Trans. Inform. Theory, vol. IT-12, PP. 399- 401, Julho 1966, e R. Gallager e D. van Voorhis, "Optimal source codes for geometrically distributed integer alphabets", IEE Trans. Inform. Theory, vol. IT-21, PP. 228- 230, março 1975, representam códigos de comprimento variável com uma estrutura particularmente simples, mas eles são ótimos apenas para uma classe de distribuições geométricas e apenas para valores de parâmetros bem contabilmente de tais distribuições. Engenheiros tendem a usá-los mesmo para distribuições significativamente divergentes, motivados principalmente pelas considerações de complexidade. Tais soluções podem se tornar sub-ótimas e bem difíceis de se estender ou modificar devido a restrições de desempenho implícitas de tais códigos.
Uma outra solução associada com projeto de códigos Lynch-Davisson, como descrito em T.J. Lynch, Sequence time coding for data compression, Proc. IEEE (Lett.) 54 (1966) 1490-1491, e L. D. Davidsson, Comments on Sequence time coding for data compression, Proc. IEEE (Lett.), 54 (1966) 2010-2011, é dividido códigos em duas partes onde apenas uma primeira está sujeita a encodificação de comprimento variável, e a restante é transmitida como uma extensão usando um número fixo de bits. Infelizmente, existe uma perda de eficiência em tal divisão, algumas vezes tão grande quanto 1,5 a 2 bits por símbolos.
Uma versão mais elaborada da técnica de divisão de livro-código tem sido desenvolvida sob o nome de "agrupamento de alfabeto", por exemplo, como descrito em Boris Ryabko, Jaakko Astola, Karen Egiazarian, Fast Codes for Large Alphabets, Communications in Information and Systems, ν.3, η.2, PP. 139-152, e Boris Ryabko, Jorma Rissanen, Fast Adaptive Arithmetic Code for Large Alphabet Sources with Asymmetrical Distributions, IEEE
Communications Letters, v. 7, no. 1, 2003, PP. 33 a 35.
Entretanto, esta abordagem também vem à custa de alguma perda na eficiência de compressão.
Ao contrário das técnicas acima mencionadas, as técnicas descritas nesta revelação podem ser configuradas para preservar inteiramente a estrutura e otimização do código, e podem conseqüentemente ser uma ferramenta útil para uma grande variedade de aplicações práticas na compressão e na encodificação de dados, como na encodificação e decodificação de dados de video digital, imagem, áudio ou fala.
CODIFICAÇÃO DE BLOCO ADAPTATIVA BINARIA
Um exemplo de uma técnica de baixa complexidade para a codificação de comprimento variável adaptativa das seqüências binárias produzidas por fontes sem-memória, de acordo com um segundo aspecto geral desta revelação, será descrito agora em maior detalhe. Esta técnica divulgada pode implementar os códigos de bloco universais construídos para um conjunto de contextos identificados pelos números de bits diferentes de zero em bits precedentes em uma seqüência. Este segundo aspecto geral da revelação pode ser praticado ou fornecido independente ou conjuntamente com o primeiro aspecto geral descrito acima no que diz respeito à geração de estruturas de dados muito compactas. A estrutura de dados pode ser alguma de uma grande variedade de estruturas de dados, tais como tabelas, lista encadeada, árvores binárias, árvores de raiz, arquivos flat ou semelhantes, e pode ser armazenada em alguns de uma variedade de dispositivos de memória diferentes, tais como muitas formas de memória de acesso aleatório (RAM), memória somente de leitura (ROM), ou de ambas. A estrutura de dados pode ser armazenada em tal memória dentro de um encodificador ou de um decodificador. De acordo com este segundo aspecto geral, uma técnica para a encodificação e a decodificação adaptativa de baixa complexidade pode depender pelo menos em parte em uma fórmula para a redundância assintótica de tais códigos, que refina a estimativa descrita em R.E. Krichevsky e em V.K. Trofimov, The Performance of Universal Encoding, IEEE Trans. Information Theory, 27 (1981) 199-207.
Os algoritmos de compressão de dados convertem as seqüências de entrada de bits com alguma distribuição desconhecida em um fluxo de bits decodificável. A compressão de dados é usada, por exemplo, no projeto de codecs de imagem ou de video, encodificação (baseada em fatia de bit) de espectro escalonável em codecs de áudio, e outras aplicações. Na maioria de tais casos, os bits a serem encodifiçados são tomados a partir dos valores produzidos por várias ferramentas de processamento de sinais, como transformadas, filtros de predição, e semelhantes, .que significa que são já bem de- correlacionados, e que a suposição de ser sem-memória de tal fonte é justificada.
A maioria de implementações de uso geral de tais algoritmos adaptativos binários são baseadas tipicamente em códigos aritméticos, com algumas aproximações e atalhos aplicados para reduzir sua complexidade. Dois exemplos conhecidos de tais algoritmos são o algoritmo de codificador-Q descrito em W.B. Pennebaker, J.L. Mitchellf G.G. Langdonf Jr., R.B. Arps, An overview of the basic principies of the Q-Coder adaptive binary arithmetic coder, IBM J. Res. Dev., 32 (6) (1988) 717, que é usado no padrão de codificação de imagem JBIG, ou o algoritmo CABAC descrito em D. Marpe, H. Schwartz, e T. Wiegand, Context- Based Adaptive Binary Aruthmetic Coding in the H.264/AVC video compression standard, IEEE Trans. on CSVT, 13(7) : 620 636, julho 2003, que é usado nos padrões de ITU-T H.264/MPEG AVC para a compressão de video.
De acordo com este segundo aspecto geral da revelação, uma implementação alternativa usa uma disposição de códigos de Huffman projetados para diversas densidades estimadas e indexados pelos números de bits diferentes de zero em blocos precedentes (contextos) em uma seqüência. Em termos tanto de eficiência quanto de implementação, tal técnica pode conseguir o desempenho desejável de compressão usando mesmo blocos modestamente dimensionados de bits, por exemplo, n = 8,...,16r e utilização de quantidades correspondentes de memória, por exemplo, 1,5 kbytes,...,5 kbytes.
Esta técnica pode ser considerada no contexto de uma fonte sem-memória produzindo símbolos a partir de um alfabeto binário {0,1} com probabilidades p, e q = 1 - ρ correspondentemente. Se w é uma palavra de comprimento η produzida por esta fonte, a seguir sua probabilidade é:
Pr (w) = PkPn-* , (D
onde k denota o número de l's nesta palavra. 0 valor k pode também ser referido como o peso de w.
Um código de bloco φέ um mapeamento injetor
entre as palavras w de comprimento |w| = η e seqüências de
binário (ou palavras-código) ^(w):
φ : {0,1}" {0,1}S,
onde as palavras-código φ{}ν) representa um conjunto excepcionalmente decodificável, por exemplo, como descrito em Τ. Μ. Cover e J. Μ. Thomas, Elements of Information Theory, (John Wiley & Sons, New York, 1991).
Tipicamente, quando a fonte (isto é, sua probabilidade p) é conhecida, tal código é projetado para minimizar seu comprimento médio ou, em termos relativos, sua redundância média:
Rfap)= 1/η IivWWwJ-^W.
\w\=n
Na equação acima, H{p) = - ρ Iog ρ-q Iog q denota a entropia da fonte.
Os exemplos clássicos de códigos e os algoritmos
sugeridos para resolver este problema incluem códigos de Huffman, Shannon, Shannon-Fano, e Gilbert-Moore, e suas variações. 0 desempenho de tais códigos é bem estudado, e muitas técnicas práticas úteis de implementação para tais códigos foram também relatadas.
Quando a fonte não é conhecida, a melhor opção
disponível é projetar um código universal φ* que minimiza a redundância do pior caso para uma classe de fontes, por exemplo, como descrito em Β. M. Fitingof, Optimal Coding in the Case of Unknown and Changing Message Statistics, Probl'. Inform. Transm., 2, (2) (1965) 3 {11 (em russo) 1-7 (tradução para inglês), L. D. Davisson, Universal Noiseless Coding, IEEE Trans. Inform. Theory, 19 (6) (1973), 783-795, e R. E. Krichevsky e V. K. Trofimov, The Performance of Universal Encoding, IEEE Trans. Information Theory, 27 (1981) 199-207, e como indicado abaixo: R.(n) = infsup Rfa p)
Φ P
Um exemplo de tal código pode ser construído usando as seguintes estimativas de probabilidades de palavra:
ρ T(k + l/2) Y(n-k + l/2) κτ π T(n + 1) onde Γ (χ) é uma função-Γ, k é o peso da palavra w, e η é seu comprimento. A fórmula acima é descrita em R. E. Krichevsky e em V. K. Trofimov, The Performance of Universal Encoding, IEEE Trans. Information Theory, 27 (1981) 199-207, e assegura convergência uniforme (em p) em probabilidades verdadeiras conforme η se aproxima de infinito (n - > oo) .
Em uma situação em que o valor exato de um parâmetro da fonte não é conhecido, é possível acessar uma seqüência de símbolos u produzida por esta fonte no passado. Tal seqüência pode ser referida como uma amostra, e pode ser assumido |w|=/ bits de tamanho. A tarefa aqui é
projetar um conjunto de códigos φ*, indexado por valores diferentes desta amostra, tais que sua redundância média resultante do pior caso é mínima, como indicado abaixo:
R1; (n,t) = inf sup Yj Pr (u) R<K (n,p)
" (Φιι} P \u\=t
Tais códigos são chamados códigos de bloco universais adaptativos ou baseados em amostra. Nesta revelação, as implementações particulares de códigos de bloco adaptativos são descritas utilizando as seguintes estimativas de probabilidades de palavras w dadas uma amostra u:
„ , . , PKT(uw) T(k + s + l/2)T(n + t-k-s + l/2) T(t + 1)
Prr ( w \ u ) =-=-:--( 1)
KT PKT(u) T(s + l/2)T(t — s + 1/2) T(n + 1)
onde s é o peso de uma amostra u, e t é o seu comprimento. O conceito e análise de códigos baseados em
amostra utilizando a função de estimador (1) imediatamente acima é descrito por R. E. Krichevsky em R. E. Krichevsky, Universal Data Compression and Retrieval. (Kluwer, Norwell, MA, 19 93) . A taxa média de redundância de um código de bloco adaptativo é assintoticamente: R , (η, ί) ~ —— Iog ·—-—-— J 2η * t
(2)
onde η é um tamanho de bloco, e t é o tamanho de amostras.
Da equação (2) acima, é evidente que, usando amostras de comprimento t -θ{ρ), é possível abaixar a taxa de redundância de tais códigos para θ{ΐ / η), que combina a ordem de taxa de redundância de códigos de bloco para fontes conhecidas. Entretanto, a fim de ser capaz de compreender o potencial total de tais códigos, precisa-se conhecer uma . expressão mais exata para sua redundância, incluindo os termos afetados pela escolha do algoritmo de construção de código real, tal como Huffman, Shannon, ou semelhantes.
De acordo com este segundo aspecto geral, esta revelação oferece o seguinte refinamento do teorema 2 de Krichevsky. Em particular, o teorema 1 abaixo refina o teorema médio da taxa da redundância para um código de blocos adaptativos φ*υ como se segue:
Teorema 1: A taxa média de redundância de um código de bloco adaptativo φ*η tem o seguinte comportamento assintótico (n, t - > co) :
R<p*(n, t, p) = ^ Pr(U)Rip* (η, ρ) |H|=r
(3A)
_ 1
η
1 t + n
-log— t, p) +
1 —4pq η
24pq t(t + n) 1 - 3pq (n + 2t)n fl 1 , 2Ap2q2 t2(t + n)2 + onde η é um tamanho de bloco, e t é um tamanho de amostra p, q = 1-p são probabilidades de símbolos da fonte de entrada, e onde:
ΑΦΙ (η, ρ) = Yj Σ Pr{u)Pr{w)[^u{w)\ + IogPKT(w \ u)]
|a|=í Iwj=n
é a redundância média do código <f>*u no que diz respeito à distribuição estimada na equação (1) acima.
0 comportamento exato de Δφ* (n,t,p) é específico de algoritmo. Entretanto, para uma grande classe de técnicas de redundância mínima, que inclui códigos convencionais de Huffman e de Shannon, este termo é limitado no valor como se segue: |Δ(π, t,s)<l\,
e exibe comportamento de oscilação, que pode ou pode não ser convergente a alguma constante dependendo do valor do parâmetro p. Também, para valores curtos de t e de n, a redundância de tais códigos pode ser afetada pelo seguinte próximo termo:
1 — 4 pq η 24 pq t (/ + η)
que é uma função do parâmetro da fonte ρ. A Fig. 5 é um gráfico que ilustra a taxa de redundância de um código de bloco adaptativo com um comportamento assintótico, e traça esta quantidade. Para blocos/amostras curtos, o desempenho de tais códigos torna-se sensível à assimetria da fonte. A prova deste teorema pode ser encontrada, por exemplo, em Asymptotic average redundancy of adaptive block codes, Y.A. Reznik, W. Szpankowski, Proceedings of IEEE International Symposium on Information Theory (ISIT), 2003.
Os exemplos de algoritmos eficientes para implementar Os códigos descritos acima serão descritos agora. Em um modelo sem-memória, a probabilidade de uma palavra w (ou sua estimativa) depende somente de seu peso k, mas não de um padrão real de seus bits. Dessa forma, considerando um conjunto de todas as palavras possíveis de η bits, nós podemos dividir o conjunto em η + 1 grupos:
{0,1}" =WnfiUWnj ...UWHÁU...U Wnit contendo palavras do mesmo peso (k = 0,...,n), e a mesma
probabilidade. Os tamanhos de tais grupos são | Wni
ykj
Para uma conveniência mais adicional, é suposto que cada grupo Wnk armazena palavras em uma ordem lexicográfica. 0 valor Ink (w) denota o índice (posição) de uma palavra w em um grupo Wnk. A TABELA 6 abaixo é um exemplo de um código construído para 4 blocos de bit com probabilidades de Bernoulli : pkqn'k , ρ = 0,9 .
TABELA 6
Exemplo de código construído para blocos de 4 bits com
probabilidades de Bernoulli: pkq"~k,p = 0,9 BlocoW k In5k(W) Pr(w) Compri- código ΦΟ) Sub-grupo
0000 0 0 0.6561 1 1 0 0001 1 0 0.0729 3 001 1 0010 1 1 0.0729 3 010 1 0011 2 0 0.0081 6 000011 3 0100 1 2 0.0729 3 011 1 0101 2 1 0.0081 7 0000001 4 0110 2 2 0.0081 7 0000010 4 0111 3 0 0.0009 9 000000001 5 1000 1 3 0.0729 4 0001 2 1001 2 3 0.0081 7 0000011 4 1010 2 4 0.0081 7 0000100 4 1011 3 1 0.0009 9 000000010 5 1100 2 5 0.0081 7 0000101 4 1101 3 2 0.0009 9 000000011 5 1110 3 3 0.0009 10 0000000001 6 1111 4 0 0.0001 10 0000000000 7 O código do exemplo na TABELA 6 será usado para descrever a estrutura de um mapeamento proposto entre palavras no grupo Wnk e suas palavras-código, de acordo com determinados aspectos desta revelação. O código foi construído usando uma modificação de algoritmo Huffman, em que as etapas adicionais foram tomadas para se assegurar de que as palavras-código situadas no mesmo nivel tivessem a mesma ordem lexicográf ica que os blocos de entrada que elas representam. É conhecido que tal reordenação é possível sem nenhuma perda de eficiência de compressão. Os exemplos dos algoritmos prévios que usaram este conceito de reordenação incluem os códigos de Huffman-Shannon-Fano e os códigos canônicos descritos por Moffat e Turpin.
A Fig. 6 é um diagrama que ilustra uma árvore de codificação que descreve a estrutura do código de bloco do exemplo da TABELA 6. Como esperado, cada grupo Wnk consiste em no máximo dois subgrupos que contêm palavras-código do mesmo comprimento. Geralmente, a estrutura de código representada pela árvore de codificação da Fig. 6 e os códigos de bloco da TABELA 6 definem grupos de palavras- código, e primeiros e segundos subgrupos de palavras-código dentro de cada um dos grupos. Cada um dos grupos inclui as palavras-código que representam os valores que têm os mesmos pesos. 0 primeiro subgrupo inclui as palavras-código que têm um primeiro comprimento e o segundo subgrupo inclui as palavras-código que têm um segundo comprimento diferente do primeiro comprimento. As palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código para facilitar encodificar e decodificar pela computação direta. Um exemplo de um grupo é designado pelo numerai de referência 66 na FIG. 6. Os exemplos de primeiro e segundo subgrupos são designados pelos numerais de referência 68A, 68B, respectivamente na FIG. 6. Os grupos e os subgrupos similares são fornecidos cada peso dentro da árvore de codificação. Um grupo contém os blocos que têm o mesmo peso K. Um subgrupo contém os blocos que têm o mesmo peso e o mesmo nivel na árvore de codificação. Isto segue do fato de que todas as palavras em um grupo Wnk têm a mesma probabilidade e propriedade assim chamada irmã de códigos de Huffman. Esta observação também se mantém verdadeira para códigos de Shannon, códigos generalizados de Shannon, e possivelmente outros algoritmos. Como mencionado acima, um grupo Wnk inclui no máximo dois
subgrupos que contêm palavras-código do mesmo comprimento, e pode ser representado como:
JF =W ι \ W
. ,r η Jc rrn,kJKJtr njej+íf
onde í é o comprimento de código mais curto que pode ser atribuído aos blocos do grupo Wnjc . Além . disso, porque as palavras dentro do grupo Wnk seguem a ordem lexicográfica, a seguir a separação entre Wnkl e Wnkl+1é simplesmente:
e Wnje-Ilt
onde nk denota o tamanho de um subgrupo com palavras-código mais curtas. Dessa forma, se um primeiro subgrupo tem três 2 5 palavras-código com um comprimento de 3 e um segundo subgrupo no mesmo grupo tem uma palavra-código com um comprimento de 4, a seguir nk (o tamanho do subgrupo com as palavras-código mais curtas, isto é, o primeiro subgrupo) é igual a 3. Este exemplo corresponde aos subgrupos no grupo associado com os níveis 3 e 4 da árvore de codificação da Fig. 6, onde o subgrupo 68A tem as palavras-código 001, 010 e 011 com comprimentos de três cada, e o subgrupo 68B tem a palavra-código 0001 com um comprimento de quatro.
em cada subgrupo podem ser referidas como palavras-código base, por exemplo, como descrito acima no que diz respeito a um primeiro aspecto desta revelação, e podem ser representadas como:
onde Wi é o i-ésimo bloco no grupo Wnk. Observe que, como explicado acima, as palavras-código restantes em ambos os subgrupos podem ser computadas como se segue:
Como uma ilustração, é assumido que há um primeiro subgrupo 68A com três palavras-código de comprimento 3 e um segundo
2 0 subgrupo 68B com uma palavra-código de comprimento 4, por exemplo, como no exemplo dos níveis 3 e 4 da árvore de codificação da Fig. 6. Neste caso, se a posição de um bloco dado é i = 2, então / < nk {nk que é igual a 3) , e a palavra- código resultante é a palavra-código base aplicável +i.
Neste exemplo, a palavra-código base para o subgrupo é 001, e a palavra-código resultante é 001 + 2 = 011. Para os níveis 3 e 4 da árvore de codificação da Fig. 6, se a posição da palavra-código aplicável era i > = nk, então a palavra-
As menores palavras-código de forma lexicográfica
BnJcJ+V^tynj)*
sei <nk, sei > nk. código estaria no segundo subgrupo e seria igual a palavra- código base de 0000 + i - nk , que é igual a 0000 + 4 - 3 = 0001 .
As palavras-código base são definidas somente por subgrupos não-vazios, e o número de tais subgrupos S em uma árvore construída para blocos de η bits está dentro:
η + i < S < 2n ,
Além disso, os múltiplos subgrupos podem residir no mesmo nível e o número de tais subgrupos arranjados não pode ser maior do que η + 1 . No 10° nível da árvore na Fig. 6, por exemplo, há dois subgrupos que correspondem às palavras- código 1110 e 1111. Entretanto, estes subgrupos não pertencem ao mesmo grupo. Esta é uma diferença significativa de outros algoritmos, que atribuem palavras- código base exclusivas para cada nível mas por outro lado exige tabela de reordenação de tamanho θ(η2") a trabalhar com tais códigos. No caso atual, a estrutura inteira é de θ(η2) bits.
Geralmente, esta estrutura de código define grupos W e subgrupos S. Cada um dos grupos inclui as palavras-código que representam os valores possuindo os mesmos pesos. As palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código. Além disso, o primeiro subgrupo em cada grupo inclui as palavras-código que têm um primeiro comprimento e o segundo subgrupo inclui as palavras-código que têm um segundo comprimento diferente do primeiro comprimento. A estrutura de código pode ser representada por uma estrutura de dados que pode ser acessada por um encodificador para realizar a codificação de comprimento variável. A revelação contempla o uso de tal estrutura de código na encodificação ou decodificação de comprimento variável, assim como um meio legível por computador compreendendo uma estrutura de dados que defina tal estrutura de código. Dado a discussão acima, um algoritmo simples para
a computação direta de códigos de bloco será descrito agora. Suponha que parâmetros nk (β < k < n) são disponíveis, e que um nível 1 e palavra-código base Bnkl
podem ser obtidos para cada subgrupo não-vazio. Então, o processo de codificar um bloco w pode ser realizado essencialmente por um conjunto das seguintes etapas:
1. Dado um bloco w, obtenha seu peso k e índice
in,Aw)-
2. Se In k{yv) < nk, selecione o primeiro subgrupo Wnjcjr se não, selecione o segundo subgrupo Wnk 1+1 .
3. Então, recupere a palavra-código base (Bnkl ou Bn,k,i-i} para o subgrupo selecionado (Wnjcj ou WnJcJ+1 ) , e
computam o código pertinente de acordo com a seguinte equação:
Βηχι + i> se i<nk,
20
(13)
Bn,kt+1 + 1 ~nk' se ι >nk.
De acordo com a equação acima, se a posição i = Ink(w) do bloco w no subgrupo selecionado (Wnkl ou WnJcJ+1) é menor do que o número nk dos blocos no subgrupo, a seguir a palavra- código é Bn k j+i. Alternativamente, se a posição i do bloco 2 5 w no subgrupo selecionado (Wnkl ou Wnk]+1) é superior ou igual ao número nk dos blocos no subgrupo, a seguir a palavra-código é Bnjc 1+I + i - nk .
Como descrito previamente, como uma ilustração, para os niveis 3 e 4 da árvore de codificação da Fig. 6, o processo acima rende uma palavra-código de 011 quando a posição de um código de bloco dado é /' = 2 < nk, e uma palavra-código de 0001 quando a posição de um código de bloco dado é i = 3 > = nk. Neste exemplo, nk é 3, isto é, o número de palavras-código no primeiro subgrupo 68 A para o peso k= 1 . A ordem de posição i prossegue de forma lexicográfica começando com a palavra-código base, por exemplo, 0 a 3 no caso do peso k= 1 no exemplo da Fig. 6. Em particular, a posição 0 corresponde a palavra-código base 001, a posição 1 corresponde à palavra-código 010, a posição 2 corresponde a palavra-código 011, tudo no primeiro subgrupo 68A (i < nk) e a posição 3 corresponde a palavra-código 0001 no subgrupo 68B (z > = nk).
Este processo pode prontamente ser realizado assegurando-se de que as palavras-código situadas no mesmo nivel estejam reordenadas de modo que tenham a mesma ordem lexicográfica que os blocos de entrada que representam. Por exemplo, as palavras-código descritas acima seguem a ordem lexicográfica dos blocos de entrada 0001, 0010, 0100, e 1000. Então, as menores palavras-código de forma lexicográfica em cada subgrupo, por exemplo, 001 no subgrupo 68A ou 0001 no subgrupo 68B, podem ser usadas como palavras-código base para finalidades da computação de palavra-código descrita acima. O código de programação de linguagem C representando uma implementação exemplar de um processo para a construção direta de códigos de bloco como descrita acima é determinado na TABELA 7 abaixo. TABELA 7
Processo para construção de direção de códigos de
bloco
/* encoder structure; */ typedef struct {
unsigned short nk[N-f 1]; /* # of elements in first (n,k)
subgroup */
unsigned char sg[N+1][2]; /* (k,j) -> subgroup index mapping */ unsigned char len[S]; /* subgroup -> code length mapping */
unsigned int base[S]; /* subgroup -> base codeword
mapping */
} ENC;
/* block encoder; */
unsigned block_enc (unsigned w, ENC *enc, BITSTREAM *bs) {
unsigned i J, k, len, code;
k = weight(w); /* split w into (k,index) */
i = index(n,k,w);
if (i >= enc->nk[k]) { f* find subgroup containing w */
i — = enc->nk[k]; Γ* adjust index */
j = enc->sg[k][l]; } else
j = enc->sg[k][0]; code = enc->base[j] + i; í* generate code */ Ien = enc->len[j]; put_bits(code, len, bs); /* write code to bitstream */
return k;
}
No código de linguagem C acima, o valor k indica o peso de um bloco w, o valor i indica a posição (ln_k(yv)) do bloco dentro de um grupo com peso k, e nk[k] indica o número de palavras-código no primeiro subgrupo do grupo com o peso K. Se i é superior ou igual a nk[k] então i é decrementado para ajustar o índice, e o subgrupo é configurado ao segundo subgrupo (1) para o peso aplicável k. Este segundo subgrupo é identificado por j = sg \k\ [/]. Se i é menor do que nk[k], i não é decrementado e o subgrupo é configurado ao primeiro subgrupo (0) para o peso aplicável k. Este primeiro subgrupo é identificado por j = sg [&] [θ].
Então, a palavra-código é gerada como uma soma da palavra-código base para o subgrupo aplicável j{base\j\) e o valor de i. Para o exemplo da Fig. 6, se o valor de i é 2, a seguir o código seria a soma da palavra-código base 001 para o subgrupo 68A e o valor de i(2), que é igual a 001 + 010 = 011. Com referência à equação (13) acima, dependendo do subgrupo, a palavra-código base é ou o Bnkj ou BnJcl+1, e o valor de i é ou i-nk[k] . Dessa forma, o código acima corresponde geralmente ao resultado fornecido pela equação (13) . Quando da computação da palavra-código (code), o comprimento (Ien) da palavra-código é especificado como len[j], que é o comprimento de código para o subgrupo apropriado, onde o segundo subgrupo tem um comprimento de código que é um subgrupo maior do que o primeiro. Então, o processo de encodificação escreve os códigos ao fluxo de bits através da operação put_bits(code, len,bs), que escreve o valor de código e Ien ao fluxo de bits bs. O fluxo de bits é transmitido para decodificar por um outro dispositivo. O processo retorna o peso k para o cálculo da seguinte palavra-código.
O processo de encodificação delineado acima pode envolver selecionar um dos grupos baseados no peso do valor a ser encodifiçado, selecionar um dos subgrupos baseados na posição lexicográfica do valor a ser encodificado relativo ao número de palavras-código no primeiro subgrupo do grupo selecionado, selecionar uma das palavras-código no subgrupo selecionado baseado na palavra-código base para o subgrupo selecionado e na posição lexicográfica do valor a ser encodificado, e encodificar o valor a ser encodificado com a palavra-código selecionada. As palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, número de palavras-código dentro de cada um dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos podem ser armazenados em uma estrutura de dados que pode ser acessada por um encodificador para suportar a codificação de comprimento variável.
De um ponto de vista da memória, um processo como mostrado na TABELA 7 precisa somente de S palavras-código base (0{n) bits de tamanho), n + 1 valores nk (θ(η) bits de tamanho), S comprimentos de código (0(logn) bits de tamanho), e 2(n +1) Índices de subgrupo (θ(η) bits de tamanho). A redução adicional da memória é possível armazenando valores incrementais de palavras-código base como discutido em outra parte nesta revelação. Dado que S = θ{η), a estrutura de dados inteira precisa somente θ{η bits. Em uma implementação particular mostrada na TABELA 7, suponha, por exemplo, que η - 20 e S = 32, o tamanho desta estrutura de dados se torna 244 bytes. Isto é bem menos do que as 220 palavras que seriam necessárias para apresentar este código sob a forma de uma tabela direta. Para os blocos razoavelmente curtos, por exemplo, η < = 12... 16, computações de pesos e índices (funções peso(.) e índice(.,.) no processo da TABELA 7) podem ser uma questão de uma consulta simples. Neste caso, o processo de encodificação inteiro pode precisar no máximo de uma comparação, duas adições e quatro consultas.
Para blocos maiores, a seguinte fórmula combinatória conhecida pode ser usada:
' n-j ~
30
^W = ^jI
J=1
k=j onde Wj representa bits individuais da- palavra w, Λ
' η
suposto que l
= 0 para todo k>nk. A fim de implementar
esta fórmula, um coeficiente poderia ou pré-computar todos os coeficientes binários até o nível η no triângulo de Pascal, ou computá-los dinamicamente, usando as seguintes
identidades simples:
KKCl· rn=^:)·
A implementação baseada em coeficientes pré-computados exige η {n + l)/2 =θ(η2) palavras (θ(η3) bits) da memória, e 0(n) adições. A computação dinâmica de coeficientes exigirá 0(n) adições, multiplicações e divisõesEntretanto, todo o processo pode exigir somente alguns registradores e nenhuma memória estática. A discussão adicional :da complexidade de computação de Índice pode ser encontrada em T. Tjalkens, Implementation cost of the Huffman-Shannon-Fano code, em Proc. Data Compression Conference (DCC'05) (Snowbird, Utah,
março 29-31, 2005) 123-132.
Um exemplo do projeto de um decodificador que
implementa as técnicas acima será descrito agora. Como um
processo de encodificação como descrito acima, um processo
de decodificação pode fazer uso de parâmetros nk, palavras-
código base e comprimentos associados. Por conveniência, a
seguinte discussão dependerá de versões justificadas a
esquerda de valores de palavra-código base:
onde T é o comprimento de uma palavra de máquina (T > max 1). Então, um processo exemplar de decodificação pode ser
descrito como se segue:
1. Encontre o subgrupo do topo com B1^kj sendo
menos do que T bits no fluxo de bits; 10
2. Decodifique o indice de um bloco In:k(w) baseado
na equação (13) acima; e
3. Produza o bloco reconstruído usando o peso k e
o índice.
0 código de linguagem C representando uma implementação do exemplo de um processo de decodificação como descrito acima é fornecido na TABELA 8 abaixo.
TABELA 8
Decodificação de códigos de bloco
/* decoder stmcture: */ typedef struct {
unsigned short nk[N+l]; /* # of elements in first (n,k)
subgroup */
struct {unsigned char k:7,j:l;} kj[S]; /* subgroup -> (k,j) mapping */ unsigned char len[S]; /* subgroup -> code length mapping */
unsigned int lj_base[S]; /* subgroup -> left-justified
codewords */
} DEC;
/* block decoder: */
unsigned block_dec (unsigned *w, DEC *dec, BITSTREAM *bs) {
unsigned i, j, k, len, vai; vai = bitstream_buffer(bs);
for (j =0; dec->lj_base[j] >val; j + +); /* find a subgroup */
len = dec->len[j];
scro 11_bitstream(len, bs); /* skip decoded bits */
i = (vai - dec->lj_base[j]) » (32-len); k = dec- >kj [j ] .k; /* get weight */
j = dec->kj[j].j; /* get sub-group index */
if (J) /* reconstruct index */
i += dec->nk[k]; *w = word(n,k,i); /* generate i-th word in (n,k) group */
return k;
}
O processo de decodificação do exemplo mostrado na TABELA 8 faz uso das palavras-código base justificadas à esquerda Ij base[S]. Na operação, o processo de decodificação recebe o conteúdo vai do buffer de fluxo de bits e identifica um subgrupo dentro da árvore de codificação que tem uma palavra-código base correspondendo ao conteúdo vai do buffer de fluxo de bits. Por exemplo, o processo continua a atravessar para baixo através dos subgrupos em níveis diferentes na árvore de codificação contanto que as palavras-código base sejam maiores do que a palavra-código recebida vai. Quando um subgrupo com uma palavra-código base que é inferior ou igual a vai for alcançado, entretanto, aquele subgrupo é selecionado. Quando do encontro do subgrupo apropriado, o processo determina o comprimento de código para o subgrupo e rola então o fluxo de bits por esse comprimento para pular os bits decodificados, e isola a palavra-código. O processo de decodificação determina a posição i de índice da palavra- código dentro do subgrupo subtraindo o valor da palavra- código base do conteúdo de buffer de fluxo de bits.
Se a palavra-código é 011 e a palavra-código base é 010, por exemplo, a seguir o resultado desta diferença é 2, indicando que a palavra-código está na posição 2 entre as posições possíveis 0, 1, e 2 no subgrupo. Para o exemplo de um registrador de largura 32 bits, esta diferença pode ser pulada para a direita por 32 menos o comprimento de código len. 0 processo de decodificação recupera então o peso pertinente k e o índice de subgrupo j, e reconstrói o índice i. 0 processo gera então a i-ésima palavra no grupo selecionado como a palavra de código, e retorna o peso k. A expressão &/[/]·£ retorna o peso do subgrupo, e a expressão kj\j\ j retorna o índice do subgrupo como um 0 ou um 1, indicando o primeiro subgrupo (0) ou o segundo subgrupo (1) para o peso dado. Se o segundo subgrupo é selecionado tal que j=l, a seguir o índice i é ajustado adicionando o valor de nk[k] . Se não, o índice i não é ajustado se o primeiro subgrupo é selecionado. A função word() retorna a i-ésima palavra no n,k grupo conforme o valor de palavra decodificado, por exemplo, usando a equação (13) acima.
Geralmente, um encodificador pode realizar a
codificação de comprimento variável de acordo com a estrutura de código descrita acima, em que a estrutura de código define grupos e subgrupos. De novo, cada um dos grupos inclui as palavras-código que representam os valores que têm os mesmos pesos. As palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código. Além disso, o primeiro subgrupo em cada grupo inclui as palavras-código que têm um primeiro comprimento e o segundo subgrupo inclui as palavras-código que têm um segundo comprimento diferente do primeiro comprimento.
A estrutura de código pode ser representada por uma estrutura de dados que pode ser acessada por um encodificador ou por um decodificador para realizar a codificação de comprimento variável. Como descrito acima, a estrutura de dados pode especificar palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, um número de palavras-código dentro de cada um dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos. Esta estrutura de dados pode ser armazenada em uma memória associada com um dentre um encodificador de vídeo, um encodificador de imagem, um encodificador de áudio, um encodificador de fala, um decodificador de vídeo, um decodificador de imagem, e decodificador de áudio, ou de um decodificador de fala, e acessada conforme necessário para suportar operações de codificação. Como descrito acima, um decodificador tal como a unidade de decodificação por entropia 52 pode selecionar, em uma busca cima-baixo (de cima para baixo) da árvore de codificação, selecionar um primeiro subgrupo dos subgrupos com uma palavra-código base que é inferior ou igual a palavra-código a ser decodificada. Então, o decodificador pode determinar a posição da palavra-código a ser decodificada dentro do subgrupo selecionado, isto é, o índice de subgrupo, baseado em uma diferença entre a palavra-código a ser decodificada e a palavra-código base para o subgrupo selecionado. O decodificador determina o peso do valor representado pela palavra-código a ser decodificado com base no grupo em que o subgrupo selecionado reside, e determina a posição, isto é, índice de grupo, da palavra-código dentro do grupo em que o subgrupo selecionado reside com base em se o subgrupo selecionado é o primeiro subgrupo ou o segundo subgrupo para o grupo. 0 decodificador seleciona então um dos valores baseados no peso do valor representado pela palavra-código a ser decodificada e pela posição da palavra-código dentro do grupo em que o subgrupo selecionado reside, e decodificar a palavra-código a ser decodificada com o valor selecionado. O valor pode corresponder, por exemplo, a um dos códigos de bloco na TABELA 6.
A estrutura de código e a estrutura de dados contemplada de acordo com este aspecto da revelação podem suportar eficiência em termos de overhead, utilização de memória, e tempo de processamento computacionais. 0 processo de decodificação do exemplo da TABELA 8, por exemplo, exige entre IeS comparações e consultas para encontrar um subgrupo, uma ou duas adições, uma operação de pulo, uma comparação extra, e três consultas extras. O número de etapas necessário para encontrar um subgrupo pode ainda ser reduzido colocando as palavras-código base em uma árvore de busca binária ou usando uma tabela de consulta extra, mas em ambos os casos à custa de memória extra.
No fim do processo de decodif icação, como
descrito acima, o peso k e o indice In,k(w) para uma palavra-código são convertidos em valores reais (por exemplo, pela função word() na TABELA 8). Se os blocos são razoavelmente curtos, este pode ser realizado por uma consulta simples. Se não, a palavra pode ser sintetizada usando uma fórmula de enumeração, por exemplo, como descrita em D. A. Huffman, A method for the construction of minimum-redundancy codes. Proc. IRE, 40 (Set. 1952) 1098- 1101· De uma perspectiva de complexidade, este processo é similar à computação de indice no encodificador.
Usando processos de encodificação e decodificação descritos acima, um sistema para encodificação e decodificação adaptativa de blocos de dados pode ser definido. Para este exemplo, é assumido que os blocos de entrada podem ser codificados sob as seguintes condições:
1. Não há nenhum contexto, isto é, um código universal é implementado;
2. 0 contexto é dado por um bloco previamente observado, isto é, t = n; e
3. 0 contexto é dado por dois blocos previamente
observados, isto é, t = 2n.
Em vez de usar blocos reais como contextos, é suficiente (devido à natureza sem-memória da fonte) usar seus pesos. Isto significa que, para amostras de t-bits, é fornecido um arranjo de t + 1 estruturas de código posicionadas por seus pesos s. Para conservar mais espaço, a simetria de KT- distribuições no que diz respeito a s e k pode ser usada. Em particular, o processo pode substituir s = t - s e inverter bits (isto é, forçar k = η - k) todas as vezes em que s > t/2. Desse modo, é somente necessário definir t/2 + 1 tabelas. Neste exemplo, a quantidade total de memória necessária pelo código adaptativo se torna 1 + n/2 + 1 + η + 1 = l,5n + 3 tabelas. Estimativas especificas de memória para tamanhos de bloco η = 8...20, são mostradas na TABELA 9 abaixo.
TABELA 9
Estimativas de uso de memória (em bytes) para diferentes tamanhos de bloco
η max t max S Tamanho de uma tabela simples Tabelas para todos os contextos 8 16 14 102 1530 12 24 19 140 2940 16 32. 25 184 . 4968 40 29 216 7128
As tabelas acima foram geradas usando densidades estimadas em KT, e usando um algoritmo de construção de código Huffman modificado de acordo com esta revelação. É determinado abaixo um exemplo de código de computador para um programa que implementa um codificador de bloco adaptativo como descrito nesta revelação. /* bitstream.h: */
typedef struct _BITS TREAM BITSTREAM;
void bitstream_open(BITSTREAM *p, unsigned chax *pbs, unsigned bit__offset, int read);
void bitstream__close(BITSTREAM *p, unsigned chax **p_pbs, unsigned *p_bit_offset, int write);
void put_bits(unsigned bits, int len, BITSTREAM *pj;
unsigned bitstream__buífer(BITSTREAM *p);
void scroll_bitstream(int len, BITSTREAM *p);
/* blade.h: */
/* encoderfunctions: */
void blade_enc_init(void);
unsigned blade_enc_0 (unsigned block, BITSTREAM *bs);
unsigned blade_enc_l (unsigned block, unsigned cx, BITSTREAM *bs);
unsigned blade_enc_2(unsigned block, unsigned cxl, unsigned cx2, BITSTREAM *bs);
I* decoder functions: */
void blade_dec_init(void);
unsigned blade_dec_0(unsigned «block, BITSTREAM *bs);
unsigned blade_dec_l (unsigned *block, unsigned cx, BITSTREAM *bs);
unsigned blade_dec_2(unsigned *block, unsigned cxl, unsigned cx2, BITSTREAM *bs);
/* blade_12.c: implements 12-bit BLADE encoder/decoder */
#define N 12 /* block size */ #define SGS 19 /* max # of subgroups */ !* encoder structure: */ typedef struct {
unsigned short nk[N+l]; unsigned char len [SGS]; unsigned char sg [N+l][2];
unsigned int base [SGS]; /* suberouü -> base codeword mapping */
/* # of elements in fírst (n,k) subgroup */ /* subgroup -> code length mapping */ /* (k,j) -> subgroup index mapping */ /* subgroup -> base codeword mapping s
} BLADE_ENC;
/* w - > (k,index) mapping: */
static struct {unsigned short k:4, i:12;} w_ki[l«N];
/*
* BLADE encoder:
* Returns:
* # of bits set in encoded pattern */
unsigned blade_enc (unsigned w, BLADE_ENC *enc, BITSTREAM *bs) {
unsigned i, j, k, len, code; k = w_ki[w].k;
i = w_ki[w].i;
if(i >= enc->nk[k]){ i — = enc->nk[k]; j = enc->sg[k][i]; } else
j = enc->sg[k][0]; code = enc->base[j] + i; len = enc->len[j]; put_bits(code, len, bs); return k;
split w into (k,index) */
find subgroup containing w */ adjust index */
generate code }
/* decoder structure: */ typedef stxuct {
unsigned int sgs; /* number of subgroups */
unsigned short nk [N+l]; /* # of elements in frrst (n,k) subgroup */
unsigned char Ien [SGS]; /* subgroup -> code length mapping */ struct {unsigned char k:7,j:l;} kj [SGS]; /* subgroup -> (k,j) mapping *i unsigned int lj_base [SGS]; /* subgroup -> left-justified codewords */
} BLADE_DEC;
l* (k,index) -> w mapping:*/
static unsigned short *ki_w[N+l],_w[l<<N]; /*
* BLADE decoder:
* Returns:
* # of bits set in encoded pattern
*/
unsigned blade_dec (unsigned *w, BLADE_DEC *dec, BITSTREAM *bs)
{
unsigned i, j, k, len, vai; vai = bitstream_buffer(bs);
for (j=0; j<dec->sgs; j + +) /* fmd subgroup *I if (dec->lj_base[j] <= vai) break; len = dec->len[j];
scroll_bitstream(len, bs); /* skip decoded bits */
i = (vai — dec->lj_base[j]) >> (32-len); k = dec->kj[j].k; j = dec->kj[j].j;
if (j) /* convert to (n,k)-group's index */
i += dec->nk[k];
*w = ki_w[k][i]; /* produce reconstmcted block */
return k;
} * Pre-computed BLADE decoder tables:
staíic BLADE_DEC dec_t [1 +(N/2 + l) + (N+l)] = { { /* no context/ universal code: */ 15,
{1,12,66,92,495,792,924,792,495,122,66,12,1}, {3,3,7,7,10,10,11,11,12,12,13,13,14,14,14}, {{0,0},{12,0},{1,0},{11,0},{2,0},{10,0},{3,0},{9,0},{3,1},{9,1},{4,0},{8,0},{5,0},{6,0},{7,0}}, {ΟχΕΟΟΟΟΟΟΟ,ΟχΟΟΟΟΟΟΟΟ,ΟχΑδΟΟΟΟΟΟ,0x90000000,Ox7F800000,Ox6FOOOOOO,0x63800000,0x54400000, 0x4C400000,0x46200000,Οχ36Α8ΰΟΟΟ,0x27300000,0xlAD00000,0x0C600000,0x00000000} }, {/* (12,0): */ 17,
{1,8,66,64,495,792,924,792,334,220,66,11,1}, {1,5,6,9,12,13,15,17,19,20,21,22,22,23,23,24,24}, {{0)0},{1,0} ,{1,1},{2,0},{3,0} ,{3,1},{4,0},{5,0} ,{6,0} ,{7,0} ,{8,0} ,{8,1},{9,0},{10,0},{11,0},{11,1},{12,0}}, {0x80000000,0x40000000,0x30000000,OxOFOOOOOO,OxOBOOOOOO,0x06200000,0x02420000,0x00B60000, 0x00428000,0x00110000,0x00069000,0x00040000,0x00009C00,0x00001800,0x00000200,0x00000100,0x00000000} }, {/* (12,1): */ 16,
{1,12,17,220,495,792,924,340,495,220,66,10,1}, {2,5,8,9,11,13,15,16,17,18,18,19,19,19,19,20}, {{0,0},{1,0},{2,0},{2,1},{3,0},{4,0},{5,0},{6,0},{7,0},{7,1},{8,0},{9,0},{10,0},{11,0},{12,0},{11,1}}, {0xC0000000,0x60000000,Ox4FOOOOOO,0x36300000,ΟχΙΒΟΟΟΟΟΟ,ΟχΟΒΘδΟΟΟΟ,0x05590000,OxOIBCOOOO, 0x00112000,OxOOAl 0000,0x00254000,0x00090000,0x00018000,0x00004000,0x00002000,0x00000000}}, { /* (12,2): */ 15,
{1,12,66,211,495,792,924,792,486,220,66,12,1}, {3,6,8,10,11,12,14,15,16,16,17,17,17,17,17}, {{0,0},{1,0},{2,0},{3,0},{3,1},{4,0},{5,0},{6,0},{7,0},{8,0},{8,1},{9,0},{10,0},{11,0},{12,0}}, {ΟχΕΟΟΟΟΟΟΟ,ΟχΒΟΟΟΟΟΟΟ,ΟχάΕΟΟΟΟΟΟ,0x39400000,0x38200000,0x19300000,OxOODOOOOO,0x05980000, 0x02800000,0x009A0000,0x00958000,0x00278000,0x00068000,0x00006000,0x00000000} }, { /* (12,3): */ 16,
{1,12,30,220,495,792,924,792,19,220,6,12,1}, {4,6,6,9,10,12,13,14,14,14,14,14,14,15,15,15}, {{0,0},{1,0},{2,0},{2,1},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0},{10,0},{11,0},{12,0},{8,1},{10,1},{9,0}}, {OxFOOOOOOO,OxCOOOOOOO,OxA2000000,0x90000000,0x59000000,0x3A100000,0x21500000,0xl2E00000, 0x06800000,0x06340000,ΟχΟ6ΐαΧ)Ο0,Οχ05ΕΟΟΟΟΟ,ΟχΟ5Ε8ΟΟΟΟ,0x02300000,0x01B80000, OxOOOOOOOO}}, {/* (12,4): */ 16,
{1,12,66,220,495,303,924,792,495,219,66,4,1}, {5,7,9,10,12,12,12,12,13,13,13,13,13,13,14,14}, {{0,0},{1,0},{2,0},{3,0},{4,0},{5,0},{11,0},{12,0},{6,1},{11,1},{6,0},{7,0},{9,0},{10,0},{9,1},{8,0}}, {ΟχΡδΟΟΟΟΟΟ,ΟχΕΟΟΟΟΟΟΟ,ΟχΒΡΟΟΟΟΟΟ,0x88000000,0x69100000,0x56200000,0x55E00000,0x5 6D00000, 0x46890000,0x46480000,0x29680000,OxlOA80000,Ox09DOOOOO,Ox07COOOOO,Ox07BCOOOO,0x00000000} }, {/* (12,5): */ 15,
{1,12,66,220,495,792,509,792,350,220,66,12,1}, {6,8,10,10,11,11,12,12,12,12,12,12,13,13,13}, {{0,0},{1,0},{2,0},{12,0},{3,0},{11,0},{4,0},{5,0},{6,0},{8,0},{9,0},{10,0},{6,1},{8,1},{7,0}}, {OxFOOOOOOO,OxF0OO0OOO,OxDF8O0OOO,0xDF4OOOOO,OxC3 COOOOO ,0xC2400000,0xA3500000,0x7 IDOOOOO, 0x63000000,Ox3C200000,Ox2E600000,Ox2A400000,OxlD480000,Oxl 8C00000,0x00000000}}, {/* (12,6): */ 15,
{1,12,86,47,495,792,924,792,495,85,66,12,1}, {8,8,9,9,11,11,11,11,12,12,12,12,12,12,13}, {{0,0},{12,0},{1,0},{11,0},{2,0},{3,0},{9,0},{10,0},{3,1},{9,1},{4,0},{5,0},{7,0},{8,0},{6,0}}, {OxFFOOOOOO,OxFEOOOOOO,OxFSOOOO 00,0xF3 000000,OxEOOOOOOO,OxE3EOOOOO,OxD94000ÜO,OxD1000000, 0x06300000,OxBDCOOOOO,Ox9EDOOOOO,Ox6D500000iOx3BDOOOOO,OxlCEOOOOO,0x00000000} }, : : {/* (24,0): */19,
{1,12,25,220;487,791,924,787,494;220;66,11,1},{Í ,5,9,10,13,16,17,18,20,22,24,25,26,27,28,30,31^33,32}, :
{{0,0},{1,0}, {2,0},{2,1}, {3,0},{4,0},{4,1},·{5,0},{5,1},·{6,0},{7,0},{7,1},{8,0},{8,1},{9,0}, {10,0},{11,0},{11,1},{12,0}},
{0x80000000,0x30000000,0x13600000,0x09400000,0x03600000,0x00790000,0x00750000,0x00122000,0x00121000,
0xÍ!CJ "i3AO00,nxC)00f:8!>.O.<»xíir)O(;8A8liJ^x(H Oi::rrOÚ,r.xíKi:H .OxOOOl»".0(H>! },
{ /* (24,1): *f 17,
{1,7,66,220,495,326,924,792,495,4,66,11,1}, {1,5,6,9,12,15,17,18,20^22,23,24,25,26,27,28,28}, ν {{σ,0},{1,0},{1,1},{2,0},{3,0}^4,0}^:,σ},{5,1},{6,(Í;{7,0}^8,0}^,0}H9,1},{10,0},{11,0},{11;1},{12,0}}, · : {0x80000000,0x45000000,0x34000000,0x13000000,0x05400000,0x01620000,C»xOOBFOOOO,Ox004A8000, 0x0010C000,0x00046000,0x00008200,0x000O7E00,0x00001200,0x00000180,0x00000020,0x00000010,0x00000000}}, {/* (24,2): */ 17,
{1,12,47,220,495,792,924,1,495,220,58,11,1},{2,5,8,9,11,14,16,18,19,20,21,22,23,24,24,25,25}, {{0,0},{1,0},{2,0},{2,1},-{3,0},{4,0},{5,0},{6,0},{7,0},{7,1},{8,0},{9,0},{10,0},{10,1},{11,0},{11,1},{1 ' \ i {0x00000000,0x60000000,0x31000000,0x27600000,0x00000000,0x04440000,0x01200000,0x00450000, Ox0044EOOO,0x00137000,Ox0003F800,0x00008600,0x00001400,0x00000000,0x00000100,0x00000080,0x00000000}}, {/* (24,3): */ 17,
{1,6,66,1,495,4,924,792,495,220,66,7,1}, {2,5,6,8,10,11,13,14,15,16,18,19,20,21,21,22,22}, {{0,0},{1,0},{1,1},·{2,0},{3,0},{3,1},·{4,0},{5,0},{5,1},{6,0},{7,0},{8,0},{9,0},{10,0},{11,0},{11,1},{12 {0x00000000,0x90000000,0x78000000,0x36000000,0x35000000,bxlA600000,OxQAE60000,OxOAD80000, Ox04EOOOOO,0x01140000,Ox004EOOOO,0x00102000,0x00026000,0x00005000,0x00001800,0x00000400,0x00000000}}, {/* (24,4): */ 15,
{1,12,66,220,495,10,924,792,495,220,66,7,1}, {3,6,8,10,12,13,14,15,16,17,18,19,19,20,20}, {{0,0},{ 1,0} ,{2,0}.{3,0}.{4,0},{5,0},(5,1},{6,0},{7.0},[8,ü},{9.0!,{10,0),[ Il ,0j,{1 1,1},[ 12,0}}, {OxEOOOOOOO,OxB OOOOOOÕ,Ox6EOOOOOÜ,0x37000000,0x18100000,0x1:7000000,OxOB880000,0x04500000, 0x01380000,0x00408000,0x00098000,0x00014000,0x00006000,0x00001000,0x00000000}}, {/* (24,5): */ 16,
{1,1?,66,22(!,495,79?.451,792,2.220,66,! 1.'.}, {4.6,8.Ui,l 2.13,14,15.16,1 íi.l 7,i7,lH.l f{<).0] rí 1,11 j ,-f2.o! ,Í3.uj .-Í4,U}.Í5r(j}.{6,(.v.í6r 1 ] ,IT.OJ,!«,(}},[8.Ij,· 11J ,. 1 i, 1 j ,{12,t)}}. {OxFOOOOOOO,OxCOOOOOOO,Ox7EOQOOÒO,0x47000000,0x28100000,0x0F500000,0x08440000,0x04920000, OxO 17AO000,0xOl 780000,0x00818000,0x00138000,0x00030000,0x00004000,0x00002000,0X00000000} }, {/* (24,6) */ 17,
{1,8,65,220,2,792,924,792,495,220,59,12,1}, {4,6,7,8,9,10,11,12,13,14,15,16,16,16,17,17,17},
{{0,0},{1,0},{1,1},·{2,0},{2il},·{3,0},{4,0},{4,1},{5,0},·{6,0},{7,0}, {8,0},{9,0},{10,0},{10,1},{11,0},{12 {OxFOOOOOOO,OxDOOOOOOO,0x08000000,0x87000000,0x86800000,0x04F800000,0x4F400000,0x30700000, Oxl7BOOOOO,0x09400000,0x03100000,0x01210000,0x00450000,OxOOOAOOOO,0x00068000,0X00008000,0x00000000}}, {/* (24,7): */ 15,
{1,12,66,220,495,62,924,792,495,220,66,8,1}, {5,7,9,10,11,12,13,13,14,15,15,15,15,15,16}, {{0,0},{l,0},{2,0},{3,0},{4^Ü},{5,0}j{5,^ 1,0},{12,0},{Ϊ 1,1}},:
{OxF8000000,OxEOOOOOOO,OxBFOOOOOO,0x88000000,0x4A200000,0x46400000, Ox2F700000, ôx:1290000Q, 0\061(!0ί)(Ί0,0x0252fi000,0x009.'\0(i:;o,Ox():'il ()!)(ΐΟΟ.:)χΟι)060(ΊΟΟ,()χ(";0(Μ·:)ιΧ)(ΧΓ)χΟ<.)0('ιΟΟΟΟ}'], ■■ ! /* (24,8): ·.· l.\
{1,12.66,22(),287.792.924,792.495,220,02.12,1}, [6,8,9,10,11,12,12,13,14,14,14,14.14.14,151, {{0,0}.-} 1.«>},{2.(.:]1J,Í5.0;.-[C.::!.{7.0J,|8Γ0},{·Ϊ».(^1,{ 11 }}, : :: ;
{OxF600ÕOOO,OxFOOOOOOO,ÒxC:FOOOOOO,0x98000000,0x74200000,0x67200000, Ox35AOOOOO, 0x18000000, 0x00600000,Ox04A4000Ò,0x01340000,0x00300000,0x00000000,0x00080000,0x00000000}}, .{/» (24,9): */14,
{1,12,66,220,417,792,924,792,495,220,66,12,1}, {7,6,9,11,11,12,12,13,13,13,13,13,13,14}, í [< >.i)}T{ t.f.t}.í2-Cí},{3-«:;}},{fi.O},-!^',4'1 -\7-í»J.ÍH.ít},! 1 ; I .(:·).[!3,C.)J
{OxFEOOÒOOO,OxF2000000,OxDlCiOOOOO,OxBE8ÕOÕÕO,0x81600000,0x70800000,Ox4BQOOOÓO,Ox2E200000, 0x15600000,Ox05E80000,OxOâDSOOOO,0x03760000,0x03700000,0x00000000}}, {/* (24,10): */ 15,
{1,12,66,220,221,792,923,'792,495,220,66,12,1}, {7,9,10,11,11,12,12,12,12,12,12,13,13,13,13}, :{{0,0},{1,0},{2^
{0xFEOO0000,OxP8000000,0xE78000O0,OxCG00O0O0,0xB0660000,Ox9F4O |
0s2FFii00()<J,i)x21-\3O:)i)Chi,íix2F20U(J('O ,ι'κχ2Ι·160(l()0.i .1x16 }.
':·: {/* (24,11):*/ 14, V::
{1,12,23,220,495,792,924,792.495,22(1,66,1?, 1}. {8,1!;,10,11,11.11,11,12,12,12,12,12,12,13]. {{ο,οί,·! 1,0} .{2,01,{2,1 !.{3,()!.{ 11,(!},{! 2,0].{4.(Ι|,·;5,0] .{6,0}.{8,0},{9,0'„-[ l O,: i'„{7,0; j.
{OxFFOOOOOOjOxFCOOOOOO,OxF6400000,OxBOEÒO0ÕO,OxDS6OO0OO,OxD3EOOOOO,OxD3COOOOO,OxB4DOOOOO, 0x83500000,0x49900000,Ox2AAOO0OO,OxlCEOOOÓO,Oxl8COOOOO,0x00000000}},
{ /* (24,12): */ 14, .
{1,12,66,220,495,792,504,792,495,220,66,12,1},{10,10,10,10,11,11,12,12,12,12,12,12,12,13}, {{0,0},{1,0},{11,0},{12,0},{2,0}j{10i0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0},{9,0},{6,1}}, : {OxFFGOOOOO,OxFeGOOQOõ;o^9eOQÕOO,OxF9800ÒOO,OxFl:40QOOO,OxE9000000,OxDB400:QOÓ,OxBC5POOOO,: ΟχΒΛΒΟΐΗΐ()<λΠχ6Β5(ΐ(ΐΟΟΟ,Οχ390(ΧΐΟΟΟ.Οχ l AEOOO^ iOim] ],
}; ■ :·. ■:.< Γ'·"· ^ * ' '' ;
{ /* (24,5): */ 16,
{.1,12,66,220,495,792,451,792,2,220,66,11,1}, {4,6,8,10,12,13,14,15,16,16,17,17,18,18,19,19}, {{0,0},{1,0},{2,0},{3,0},{4,0},{5,0},{6,0},{6,1},{7,0},{8,0},{8,1},{9,0},{10,0},{11,0},{11,1},{12,0}}, {OxFOOOOOOO,OxCOOOOOOO,Ox7EOOOOOO,0x47000000,0x28100000,0x0F500000,0x08440000,0x04920000, 0x017A0000,0x01780000,0x00818000,0x00138000,0x00030000,0x00004000,0x00002000,0X00000000}}, { /* (24,6) */ 17,
{1,8,65,220,2,792,924,792,495,220,59,12,1}, {4,6,7,8,9,10,11,12,13,14,15,16,16,16,17,17,17}, {{0,0},{1,0},{1,1},{2,0},{2,1},{3,0},{4,0},{4,1},{5,0},{6,0},{7,0},{8,0},{9,0},{10,0},{10,1},{11,0},{12 {OxFOOOOOOO,OxDOOOOOOO,0x08000000,0x87000000,0x86800000,Ox04F800000,ftx4F400000,0x30700000, Oxl 7B00000,0x09400000,0x03100000,0x01210000,0x00450000,OxOOOAOOOO,0x00068000,0X00008000,0x00000000}},
{/* (24,7): */ 15,
{1,12,66,220,495,62,924,792,495,220,66,8,1}, {5,7,9,10,11,12,13,13,14,15,15,15,15,15,16},
{{0,0},{1,0},{2,0},{3,0},{4,0},{5,0},{5,1},{6,0},{7,0},{8,0},{9,0},{10,0},{11,0},{12,0},{11,1}}, {ΟχΡδΟΟΟΟΟΟ,ΟχΕΟΟΟΟΟΟΟ,ΟχΒΡΟΟΟΟΟΟ,0x88000000,Ox4A200000,0x46400000,Ox2F700000,0x12900000, 0x06300000,0x02520000,Ox009AOOOO,0x00160000,0x00060000,0x00040000,0x00000000}},
{/* (24,8): */15,
{1,12,66,220,287,792,924,792,495,220,62,12,1}, {6,8,9,10,11,12,12,13,14,14,14,14,14,14,15}, {{0,0},{1,0},{2,0},{3,0},{4,0},{4,1},{5,0},{6,0},{7,0},{8,0},{9,0},{10,0},{11,0},{12,0},{10,1}}, {OxF6000000,OxFOOOOOOO,OxCFOOOOOO,0x98000000,0x74200000,0x67200000,0x35A00000,0x18000000, 0x00600000,Ox04A40000,0x01340000,0x00300000,0x00000000,0x00080000,0x00000000}},
{/* (24,9): */ 14,
{1,12,66,220,417,792,924,792,495,220,66,12,1}, {7,6,9,11,11,12,12,13,13,13,13,13,13,14}, {{0,0},{1,0},{2,0},{3,0},{4,0},{4,1},{5,0},{6,0},{7,0},{8,0},{10,0},{11,0},{12,0},{9,0}},
{OxFEOOOOOO,OxF2000000,OxDlOOOOOO,ΟχΒΕβΟΟΟΟΟ,0x81600000,0x70800000,Ox4BOOOOOO,Ox2E200000, 0x15600000,Ox05E80000,Ox03D80000,0x03760000,0x03700000,0x00000000}}, {/* (24,10):*/15,
{1,12,66,220,221,792,923,792,495,220,66,12,1}, {7,9,10,11,11,12,12,12,12,12,12,13,13,13,13}, {{0,0},{1,0},{2,0},{3,0},{4,0},{4,1},{5,0},{6,0},{10,0},{11,0},{12,0},{6,1},{7,0},{8,0},{9,0}},
{0xFE000000,0xP8000000,0xE7800000,0xCO000000,0xB0660000,0x9F400000,0x6DC00000,0x34100000, 0x2FF00000,Ox2F300000,Ox2F200000,Ox2F160000,0x16580000,OxOÔEOOOOO,0x00000000} }, { /* (24,11):*/14, {1,12,23,220,495,792,924,792,495,220,66,12,1}, {8,10,10,11,11,11,11,12,12,12,12,12,12,13},
{{0,0},{1,0},{2,0},{2,1},{3,0},{11,0},{12,0},{4,0},{5,0},{6,0},{8,0},{9,0},{10,0},{7,0}},
{OxFFOOOOOO,OxFCOOOO 00,OxF6400000,0xF0E00000,0xD5600000,0xD3E00000,0xD3C00000,0xB4D00000, 0x83500000,0x49900000,Ox2AAOOOOO,OxlCEOOOOO,Oxl8COOOOO,0x00000000}},
{/* (24,12):*/ 14,
{1,12,66,220,495,792,504,792,495,220,66,12,1}, {10,10,10,10,11,11,12,12,12,12,12,12,12,13},
{{0,0},{1,0},{11,0},{12,0},{2,0},{10,0},{3,0},{4,0},{5,0},{6,0},{7,0},{8,0},{9,0},{6,1}},
{OxFFCOOOOO,OxFCCOOOOO,OxF9COOOOO,OxF9800000,QxF1400000,OxE9000000,OxDB400000,OxBC500000, OxBADOOOOO,Ox6B500000,Ox39DOOOOO,Oxl AEOOOOO ,0x0D200000,0x00000000} },
};
/* encoder tables (computed using decoder’s tables): */ static BLADE_ENC enc_t [1 + (N/2 + l) + (N+l)];
/* initialize encoder: */
void blade_enc_init()
{
unsigned int i[N+l], j, k, 1, w;
/* initenc[ ]: */
for(j=0;j<l+(N/2 + l)+(N+l);j + +){
for (k=0; k< =N; k+ +) enc_t[j].nk[k] = dec_t[j] .nk[k]; for (k=0; k< =SGS; k+ +) {
enc_tó].eg[dec_t[j].kj[k].k][dec_t[j].kj[k].j] = j; enc_t[j]jen[k] = dec__t[j].jen[k];
enc_t[j].base[k] = dec_t[j].jj_base[k] >> (32 — dec__t[j].jen[k]);
}
}
/* init w_ki[ ]: */
for (j=0; k<=N; k+ +) i[k] = 0; for (w=0; w<(l<<N); w+ +) {
for (k=0,j=0; j<N;j + +) if (w & (l«j)) k++; w_ki[w].k = k; w_ki[w].i = i[k]; i[k] ++;
}
}
/* initialize decoder: *í
void blade_dec_init()
{
static short b[N+l] = {1,12,66,220,495,792,924,792,495,220,66,12,1}; unsigned int i[N+l], j, k, w;
/* initki_w[ ]: */
for (j=0,k=0; k<=N;j + =b[k],k++){ki_w[k] = _w + j; i[k] — 0;} for (w=0; w<(l<<N); w+ +) {
for (k=0,j=0; j<N; j + +) if (w & (l<<j)) k++; ki_w[k][i[k]] = w; i[k]++;
}
}
/· encoder’s functions: */
unsigned blade_enc_0 (unsigned w, BITSTREAM *bs)
{
retum blade_enc (w, enc_t + 0, bs);
}
unsigned blade_enc_l (unsigned w, unsigned cx, BITSTREAM *bs)
{
unsigned r; if (cx > N/2)
i = N — blade_enc (w ~((1<<N) —1), enc__t + 1 + N — cx, bs); else
r = blade_enc (w, enc_t +1 + cx, bs); retum r;
} unsigned blade_enc_2 (unsigned w, unsigned cxl, unsigned cx2, BITSTREAM *bs)
{
unsigned cx — cxl + cx2, r; if (cx > N)
r = N — blade_enc (w ~((1<<N) — 1), enc_t + 1 + (N/2 + 1) + 2*N — cx, bs); else
r = blade__enc (w, enc_t + 1 +· (N/2 + 1) + cx, bs); retum r;
}
}
/* main.c - test program and demo: ·/
#define M 1000 /* max # of blocks in test sequence */
#defme Q 1000000 /* # of iterations */
/* test program: */ int main ()
{
/* in/out buffers: */
static unsigned cliar in_buffer [M*N/8]; static unsigned char out_buffer [M*N/8 + 1024]; static BITSTREAM in, out;
/* vars: */
unsigned char *pbs; int bit_offset; unsigned int w, cx, cxl = 0, cx2 = 0; inti,j,k, m; double p, h, c;
/* initBLADE-12 libraiy: */
blade_init ();
/* scan sources: */
for (p^O.Ol; p<=0.991; p + =0.01) {
/* estimate entropy: *1
h = - (p * log(p) + (l.-p) »log(l.-p))/log(2.); printf (“\np=%g, h=%g\n”, p, h);
/* try diíferent # of blocks: */ for (m = l); m<M; m++)
{
c = 0.;
/* reset generator: */ srand(l);
I* make Q runs: ·/ for (i=0; i<Q; i++) {
/* generate test sequence: */
memset(in_buffer, 0, sizeof in__buffer);
bitstream_open(&in, in__buffer, 0, 0);
for (j=0; j<N*m; j + +) {
/* get a next bit from a pseudo-Bernoulli source: */ k = ((double) rand() I (double) RAND_MAX) > (1. — p);
!* insert it in bitstream: */ put_bits(k, 1, &in);
}
bitstream_close (&in, &pbs, &bit_ofFset, 1);
/* start encoding: */
memset(out_bu£Fer, 0, sizeof out__buffer); bitstream_open(&out, out_buífer, 0, 0); bitstream_open(&in, in„_buffer, 0, 1);
/* run the encoder: *1 for (j=0; j<m;j I l){ /* blockto be encodèd: */
vv - (unsigiied)get.. bits (N, &üi);
/* choose context and encode: *1
^ü <n
cxl "· blade enc.. 0 (w, &out): /* no context */
cise if (j - 1)
cx2 = bladé_enc__l (w, cxl, &out); /* use cxl */ else {
cx = blade_çnc_2 (w, cxl, cx2, &out); /* use cxl and cx2 */
/* scroll contexts; ^/ cxl = cx 2: cx2 = cx:
}
}
/* close bitsfreatns: */
:: bitstream... close (&in, &pbs, &bit_ofifeet, 0); bitstream dose (&out. &pbs. &bit ofiset, 1);
/* compute coding cosi:: */
c + = (double)((pbs — out_„buffer) * 8 + bit_offset) / (double)(m*N),·
/* start decoding: */
bitst„ream__open (&in, in_buffer, 0, 1);
bits!.ream open (&ou1, out buffer, t}. 1);
/* run tlie decoder: */ ior(j - 0;j<rn;j : t){
/* choose the context and decode: ■*/. if (j —
cxl: — blade_dec_0: (&w, &out); /* no context */ :
cise if (j ~- \ )
cx2 ~ blade dec. J (&vv, cxl, &out): /* use cxl *7
.elSe {■:. ::
cx - blade dcc 2 (&vv, cxl, cx2, &out); .·* use cxl and cx2 */
/* scroll contexts: * cxl " cx2;
■ - cx2 · cx;
β, ./* Ji;'.- -Ji.
coinpare wilh the original block: *' if (vv ! get__.bits (N, &in)) { p.rintfi“?%d”,j); v
} Λ;ν·.:
}
/* close bitstrearris: *■'
bitst.reain.. close (<&in, &pbs, &bit offset, 0): bitstream_close (&out, &pbs, &bit_ offset, 0);
} ■
7* print results: */ c /' (double)Q,·
priiüf('‘[%d.%g], % m*N. (c h) 'h); fflush(stdout),·
} ■
}
retum 1;
}...
Os resultados experimentais da avaliação de
desempenho de um processo de codificação adaptativa como descrito aqui com tamanho de bloco n = 16 será agora descrito e comparado a outros algoritmos conhecidos. Em particular, o processo de codificação adaptativa é comparado ao algoritmo de codificador-Q descrito em W. B.
Pennebaker, J. L. Mitchell, G. G. Langdon, Jr., R. B. Arps, Na overview of the basic principies of the Q-Coder adaptive binary arithmetic coder, IBM J. Res. Dev., 32 (6) (1988) 717, que é usado no padrão de codificação de imagem JBIG, e o algoritmo CABAC descrito em D. Marpe, H. Schwartz, e T. 10 Wiegand, Context-Based Adapative Binary Arithmetic Coding no padrão de compressão de vídeo H.2 64/AVC, IEEE Trans. em CSVT, 13 (7): 620-636, julho 2003, que é usado nos padrões de H.264/MPEG AVC ITU-T para a compressão de vídeo.
A fim de conduzir os testes, as seqüências 15 geradas por computador de bits foram usadas para simular a saída de uma fonte de Bernoulli binária com probabilidade p. Comprimentos de tais seqüências na faixa de 16 a 1024 e, para cada comprimento particular, Q = 1000000 amostras de tais seqüências foram gerados. As taxas de redundância 20 relativas foram computadas como:
_____(soma de comprimentos de todos códigos produzidos para Q seqüências)/Q - H(p)
JL Ct/lCi —
H(p)
Para o processo de codificação adaptativa descrito nesta revelação, a seguinte estrutura de contextos foi usada:
1. primeiro bloco de 16 bits é encodificado sem contexto (código universal);
2. segundo bloco é encodificado usando primeiro bloco conforme seu contexto (código com t = 16); e
3. terceiro e todos os blocos subseqüentes são codificados usando dois blocos precedentes em uma seqüência
conforme os contextos (código baseado em amostra com t = 32) . As Figs. 7Α e 7Β são gráficos que ilustram a comparação de taxas de redundância de um código de bloco adaptativo para codificador-Q e técnicas CABAC com valores diferentes de p. A Fig. 7A mostra resultados para = 0,1 5 enquanto a Fig. 7B mostra resultados para p = 0,5. A Fig. 8 é um gráfico que ilustra a sensibilidade de redundância à assimetria de dados fonte para o código de bloco adaptativo, codificador-Q e técnicas CABAC. Os resultados do estudo experimental são mostrados nas Figs. 7A, 7B e 8. 10 Figs. 7A e 7B traçam o número de bits encodifiçados no eixo-x contra (comprimento médio de código Entropia)/Entropia no eixo-y.
A Fig. 8 traça a probabilidade no eixo-x contra (o comprimento médio de código - Entropia)/Entropy no eixo- y. Cada gráfico nas·Figs- 7A, 7B, e 8 mostra plotagens para o codificador-Q, codificação adaptativa e CABAC com rótulos correspondentes. Dos resultados experimentais, pode-se ver que o código' adaptativo descrito nesta revelação pode ter uma taxa muito mais rápida de convergência do que o codificador-Q e algoritmos de CABAC. 0 processo de codificação adaptativa maximiza o codificador-Q e algoritmos de CABAC para umas seqüências mais curtas, e torna-se comparável ao codificador-Q e aos algoritmos de CABAC quando o comprimento total de bits codificados se aproxima de 1024. Como mostrado ainda na Fig. 8, após 160 bits encodifiçados (ou então blocos de 16 bits), o processo de codificação adaptativa pode entregar uma redundância mais baixa comparada ao codificador-Q e aos algoritmos de CABAC. Este comportamento é consistente com o Teorema 1 discutido acima.
A Fig. 9 é um fluxograma que ilustra um método para construir a codificação de comprimento variável em memória eficiente para distribuições monotônicas de acordo com um primeiro aspecto geral desta revelação. O método pode ser implementado por um processador associado com um encodificador, decodificador, ou um outro dispositivo para construir códigos a serem utilizados por uma unidade de codificação por entropia 4 6 e pela unidade de decodificação por entropia 52, como mostrado nas Figs. 2 e 3, e podem suportar a compressão e a codificação de qualquer uma de uma variedade de dados, incluindo mas não limitados a dados de vídeo, imagem, fala e áudio. Tal processador pode ser fornecido, por exemplo, dentro de um encodificador ou de um decodificador, ou dentro de um sistema de computação de uso geral, por exemplo, para preparar uma estrutura de dados que define atributos de estrutura de código úteis na codificação de comprimento variável.
Como mostrado na Fig. 9, o processador obtém um alfabeto de símbolos de entrada a ser codificado (70). Os símbolos têm pesos respectivos indicando a probabilidade ou a freqüência de presença ou uso dos símbolos em um conjunto ou seqüência de dados. Quando da determinação dos pesos de símbolo pertinentes (72), o processo atribui índices aos símbolos baseados em seus pesos (74), e atribui códigos aos símbolos baseados nos índices e na ordem lexicográfica dos símbolos (76). Dessa forma, os símbolos que têm os mesmos pesos podem ser ordenados de forma lexicográfica para facilitar técnicas de codificação como descritos nesta revelação.
Os códigos podem ser organizados de acordo com uma estrutura de código representada por uma árvore de codificação binária. 0 processador identifica uma palavra- código base para cada nível na árvore de codificação (78). A palavra-código base é a menor palavra-código em um nível dado na árvore e corresponde ao símbolo de forma lexicográfica mais antigo entre os símbolos nesse nível na árvore. Para fornecer uma estrutura de dados compacta, o processador remove um número fixo B dos bits dianteiros das palavras-código base para produzir as palavras-código base parciais (80). As palavras-código base podem ser formuladas 5 como palavras-código justificadas a esquerdo, e os bits dianteiros podem ser os M bits dianteiros prossiguindo da direita para a esquerda nas palavras-código justificadas a esquerda. Em algumas implementações, o número de bits dianteiros que são removidos pode ser 8. Em outras 10 implementações, o número de bits dianteiros que são removidos pode ser menor ou maior do que 8.
Para muitos níveis da árvore de codificação, os M bits dianteiros serão zero. Em alguns níveis, entretanto, os bits dianteiros podem formar todo ou parte do código 15 base para o nível respectivo na árvore. Nestes níveis selecionados, o processador gera os indicadores de pulo (82). Os indicadores de pulo fornecem uma instrução para um decodif icador rolar o fluxo de bits por B bits de modo que o código base não seja perdido quando da remoção dos B bits 20 dianteiros. O processo pode armazenar, em uma estrutura de dados, nas palavras-código base parciais resultantes, comprimentos associados com as palavras-código em níveis respectivos da árvore de codificação, offsets indicando os índices de símbolos respectivos associados com as palavras- 25 código na árvore de codificação, e um ou mais indicadores de pulo que indicam quando o fluxo de bits deve ser rolado por B bits para impedir a perda de uma palavra-código base que caia pelo menos parcialmente dentro dos B bits dianteiros (84). A estrutura de dados pode ser fornecida à 30 unidade de codificação por entropia 4 6 e à unidade de decodificação por entropia 52 para ajudar em realizar as operações de encodificação e de decodificação por entropia com os códigos variáveis construídos. A estrutura de dados pode tomar uma variedade de formas que incluem uma ou mais tabelas de consulta simples ou multidimensionais, listas encadeadas, árvores binárias, árvores de raiz, arquivos flat, ou semelhantes.
A Fig. 10 é um fluxograma que ilustra um método para encodificar símbolos usando os códigos de comprimento variável construídos de acordo com o método da Fig. 9, de acordo com o primeiro aspecto geral desta revelação. Como mostrado na Fig. 10, a unidade de codificação por entropia
4 6 recebe um símbolo (8 6) , determina um índice para o símbolo (87), e compara o índice de símbolo a uma tabela de offset para identificar um nível correspondente na árvore de codificação. Em particular, a unidade de codificação por entropia 46 determina se o índice de símbolo é superior ou igual ao offset para um nível dado da árvore (88). 0 índice de símbolo representa a ordem do símbolo entre os outros símbolos, classificado em ordem de peso, com os símbolos do mesmo peso sendo ordenados de forma lexicográfica consistente com o alfabeto de símbolo. 0 offset é a diferença entre o comprimento do código ou códigos para o nível pertinente da árvore, e o comprimento máximo de código. Na árvore da Fig. 4, se o comprimento máximo de código é 16, por exemplo, e o comprimento de código no níyel ■ 3 da árvore é 3, então o offset pertinente para a palavra-código base é 12.
Se o índice de símbolo não excede o offset para o nível atual da árvore, a unidade de codificação por entropia 46 prossegue para baixo no nível seguinte (90) da árvore de codificação em uma busca de cima para baixo e repete a comparação do índice de símbolo com o offset para aquele nível seguinte (88). Quando a unidade de codificação por entropia 4 6 determina que o índice de símbolo é superior ou igual ao offset para um nível particular da árvore de codificação (88), a unidade de codificação por entropia computa a palavra-código apropriada para o simbolo. Em particular, a unidade de codificação por entropia 4 6 ajusta a palavra-código para o simbolo com a 5 soma da palavra-código base para o nivel atual da árvore mais a diferença entre o índice de símbolo e o offset para aquele nível (92).
Usando a árvore do exemplo da Fig. 4, se o índice de símbolo é 14, a unidade de codificação por entropia 46 determina que o código para o símbolo reside no nível 3 da árvore porque 14 é maior do que o offset de 12 atribuído à palavra-código base para aquele nível. A unidade de codificação por entropia 4 6 computa então a palavra-código como a palavra-código base (001) + (o índice de símbolo (14) - o offset (12)), isto é, 001 + 2 = 001 + 010 = 011. Quando do ajuste do código para o símbolo recebido (92), a unidade de codificação por entropia 46 emite a palavra- código ao fluxo de bits (94) para transmissão, por exemplo, a um dispositivo de recepção com unidade de decodificação por entropia 52. A unidade de codificação por entropia 4 6 repete então o processo para o símbolo seguinte na seqüência pertinente de dados.
A Fig. 11 é um diagrama de blocos que ilustra um método para decodificar os códigos de comprimento variável 25 construídos de acordo com o método da Fig. 9, de acordo com o primeiro aspecto geral desta revelação. 0 método mostrado na Fig. 11 pode ser realizado usando um algoritmo idêntico ou similar àquele mostrado na TABELA 5. Em uma implementação do exemplo, os códigos podem ser recebidos 30 pela unidade de decodificação por entropia 52, e ser encodifiçados por uma unidade de codificação por entropia
4 6 como descrito com referência a Fig. 10. 0 método ilustrado na Fig. 11 pode fazer uso de técnicas de decodificação em memória eficiente como descritas nesta revelação, e pode aproveitar-se da estrutura de dados compacta com que tais códigos podem ser construídos. Como mostrado na Fig. 11, a unidade de decodificação por entropia 52 recebe uma palavra-código de um fluxo de bits entrante (96). A palavra-código pode ser obtida de uma largura fixa W de bits recuperados de um buffer de fluxo de bits. A palavra-código pode ser justificado a esquerda ou convertida a um formato justificado a esquerda, e a largura W pode ser reduzida removendo os B bits dianteiros da palavra-código da direita para a esquerda.
A unidade de decodificação por entropia 52 compara a palavra-código com as palavras-código base para os diferentes níveis de uma árvore de codificação, partindo do nível superior e continuando mais profundamente na árvore em uma busca de cima para baixo até que uma palavra- código base apropriada seja encontrada. Em particular, a unidade de decodificação por entropia 52 pode determinar se a palavra-código base para o nível atual da árvore é inferior ou igual a palavra-código (98). Se não, a unidade de decodificação por entropia continua para baixo no nível seguinte da árvore (100) e repete a comparação (98) para a palavra-código base associada com o nível seguinte. Quando da continuação ao nível seguinte (100), entretanto, a unidade de decodificação por entropia 52 determina se uma indicação de pulo (102) está associada com o nível atual. Em caso afirmativo, a unidade de decodificação por entropia 52 rola o buffer do fluxo de bits por um incremento fixo (104) antes de prosseguir ao nível seguinte (100) . Em particular, a unidade de decodificação por entropia 52 pode rolar o buffer de fluxo de bits por M bits de modo que a palavra-código não seja perdida descartando os M bits dianteiros. Se não há nenhuma indicação de pulo (102), a unidade de decodificação por entropia 52 prossegue simplesmente ao nível seguinte (100).
Em um ou outro caso, a unidade de decodificação por entropia 52 compara outra vez a palavra-código com a palavra-código base para o nível atual (98). Quando a unidade de decodificação por entropia 52 encontra um nível em que a palavra-código base é inferior ou igual a palavra- código (98), a unidade de decodificação por entropia 52 determina o comprimento residual das palavras-código base no nível respectivo (106) e rola o fluxo de bits pelo comprimento residual (108). A unidade de decodificação por entropia 52 computa então o símbolo associado com a palavra-código (110) baseado no offset para o nível, e a diferença entre a palavra-código base e a palavra-código sendo decodificada.
Com referência à árvore da Fig. 4, por exemplo, se a palavra-código é 0110000000000000, então a palavra- código parcial, truncada com os 8 bits dianteiros descartados é 01100000. Neste caso, a unidade de 20 decodificação por entropia 52 identificará a palavra-código base parcial no nível 3 (00100000) como sendo inferior ou igual a palavra-código, e identificará um comprimento residual de 3. A unidade de decodificação por entropia 52 rola o fluxo de bits 3 bits adiante para receber a palavra- 25 código seguinte. Além disso, a unidade de decodificação por entropia 52 computa o símbolo para a palavra-código adicionando o offset para o nível 3 à diferença entre a palavra-código no buffer de fluxo de bits e a palavra- código base para o nível. Por exemplo, a unidade de 30 decodificação por entropia 52 computa o código como offset[3] = 12 mais a palavra-código 01100000 menos 00100000, que é equivalente a 12 mais 2 = 14. Neste caso,
14 é o índice do símbolo representado pelo código 011. O método ilustrado na Fig. 11 pode se aproveitar de uma estrutura de dados muito compacta e de uma eficiência significativa em memória, como descrita em outra parte nesta revelação. Em conseqüência, implementando tal método, a unidade de decodificação por entropia 52 pode apresentar a eficiência aumentada, incluindo overhead de processamento reduzido, utilização de memória reduzida, e velocidade de processamento aumentada, todos esses podem ser desejáveis para um dispositivo de video de decodificação, ou outros dispositivos configurados para a descompressão e decodificação de dados.
A Fig. 12 é um fluxograma que ilustra um método para construir códigos de bloco adaptativo de acordo com o segundo aspecto geral desta revelação. O método da Fig. 12 pode ser implementado dentro de um processador dentro de um dispositivo de codificação ou de um processador de uso geral para suportar a construção eficiente, direta de códigos de bloco adaptativo. Como mostrado na Fig. 12, o processador obtém um conjunto de palavras (112) a ser codificadas. Uma estrutura de dados que representa a estrutura de código resultante pode ser armazenada na memória dentro de um dispositivo de encodificação, dispositivo de decodificação, ou de ambos. As palavras podem . ser blocos de códigos binários. Quando da determinação de pesos das palavras (114), o processador atribui grupos de palavra-código às palavras baseadas nos pesos (116). Os grupos de palavra-código incluem palavras- código para palavras do mesmo peso k e podem abranger dois níveis adjacentes de uma árvore de codificação, por exemplo, como mostrado na Fig. 6.
Como mostrado ainda na Fig. 12, o processador atribui subgrupos às palavras nos mesmos grupos baseados nos comprimentos das palavras (118) . Em particular, um grupo pode incluir um primeiro subgrupo e um segundo subgrupo. 0 primeiro subgrupo contém uma ou mais palavras- código que têm o mesmo comprimento e o mesmo peso. Do mesmo modo, o segundo subgrupo contém uma ou mais palavras-código que têm o mesmo comprimento e o mesmo peso. Entretanto, o comprimento das palavras-código no primeiro subgrupo é menor do que o comprimento das palavras-código no .segundo subgrupo. Dessa forma, cada subgrupo inclui palavras-código do mesmo peso e no mesmo nível na árvore de codificação.
0 processador identifica uma palavra-código base para cada subgrupo (120). A palavra-código base é a menor palavra-código em um subgrupo. No exemplo da Fig. 6, a palavra-código base para o subgrupo 68A é 001. Entretanto, o subgrupo 68A ainda inclui as palavras-código 010 e 011, além da palavra-código base de 001. Neste exemplo, as palavras-código em um subgrupo são ordenadas nos termos da ordem ,lexicográfica das palavras que representam, tais que os códigos podem, ser computados prontamente e diretamente dada uma quantia relativamente pequena de computação.
O número de elementos no primeiro subgrupo de cada grupo pode ser usado para computar as palavras-código. Com tal fim, o processador armazena o número de elementos no primeiro subgrupo de cada grupo (122), e também armazena um mapeamento de um índice de grupo (124), um mapeamento de comprimento de código de subgrupo (12 6) e um mapeamento de palavra-código base de subgrupo (128). O mapeamento de índice de grupo pode identificar a posição de uma palavra- código para uma palavra em um grupo em que a palavra-código reside. 0 mapeamento de comprimento de código de subgrupo pode identificar o comprimento dos códigos dentro de um subgrupo particular. O mapeamento de palavra-código base de subgrupo pode identificar a palavra-código base associada com cada subgrupo. Geralmente, um código pode ser construído a partir da palavra-código base para um subgrupo particular dado o índice da palavra dentro do grupo. A informação armazenada pode ser armazenada em uma estrutura de dados que pode ser acessada por um encodificador, por um 5 decodificador ou por ambos.
A Fig. 13 é um fluxograma que ilustra um método para encodificar blocos usando códigos de comprimento variável construídos de acordo com o método da Fig. 12, e de acordo com o segundo aspecto geral desta revelação. 0 10 método da Fig. 13 pode ser implementado, por exemplo, dentro de uma unidade de encodificação por entropia tal como a unidade de codificação por entropia 46 da FIG. 2. O método mostrado na Fig. 13 pode ser implementado usando um algoritmo idêntico ou similar àquele mostrado na TABELA 7. 15 Como mostrado na Fig. 13, para encodificar uma palavra dada, a unidade de codificação por entropia 4 6 obtém seu. peso (130) e índice de grupo (132) . Usando o peso da palavra, a unidade de codificação por entropia 46 determina o índice de grupo para a palavra (132) dentro de uma árvore 20 de codificação aplicável. O índice de grupo In,k(w) especifica o índice (posição) de uma palavra w em um grupo Wnk que armazena palavras em uma ordem lexicográfica.
A unidade de codificação por entropia 4 6 compara o índice de grupo ao número de elementos nk no primeiro 25 subgrupo do grupo em que a palavra-código para a palavra de entrada reside. Em particular, a unidade de codificação por entropia 4 6 determina se o índice de grupo é superior ou igual ao número de elementos no primeiro subgrupo (134). Em caso afirmativo, a unidade de codificação por entropia 46 30 seleciona o segundo subgrupo (138), isto é, subgrupo 1, no grupo, e decrementa o valor de índice de grupo (140). Em particular, o valor de índice de grupo é decrementado pelo número de elementos no primeiro subgrupo nk. Se o índice de grupo não é superior ou igual ao número de elementos no primeiro subgrupo (134), a unidade de codificação por entropia 46 seleciona o primeiro subgrupo (136), isto é, 5 subgrupo 0. Cada subgrupo tem sua própria palavra-código base. A unidade de codificação por entropia 46 obtém a palavra-código base para o subgrupo selecionado (142) e computa a palavra-código baseada na soma da palavra-código base e do valor de índice de grupo (144) .
Com referência à árvore de codificação do exemplo
da Fig. 6, como uma ilustração, se é assumido que o peso da palavra a ser encodificada é 2, o valor de índice de grupo é 2, e o número de elementos no primeiro subgrupo é 3, por exemplo, correspondendo ao grupo em níveis 3 e 4 da árvore 15 de codificação. Neste caso, a unidade de codificação por entropia 4 6 seleciona o primeiro subgrupo (subgrupo 0) porque o valor de índice de grupo (2) é menor do que o número de elementos (3) no primeiro subgrupo. Como um resultado, a palavra-código base é 001. Para encodificar a 20 palavra, a unidade de codificação por entropia 4 6 adiciona
o valor de índice de grupo de 2 a palavra-código base de
001, resultando em uma palavra-código de 011.
Para o mesmo grupo, se o valor de índice de grupo era 3, a unidade de codificação por entropia 4 6 25 selecionaria o segundo subgrupo (subgrupo 1). Entretanto, a unidade de. codificação por entropia 46 decrementeria pelo valor de índice de grupo pelo número nk de elementos no primeiro subgrupo (subgrupo 0) . Neste caso, o valor de índice de grupo de 3 seria reduzido por 3 a zero, e a 30 palavra-código seria computada como a palavra-código base de 0001 para o segundo subgrupo mais o valor de índice de grupo de 0, resultando em uma palavra-código de 0001. Além de computar a palavra-código para a palavra de entrada, a unidade de codificação por entropia 46 pode obter o comprimento dos códigos no subgrupo selecionado (14 6) . No exemplo acima, para o subgrupo 0 no nível 3, o comprimento dos códigos seria 3. A unidade de codificação por entropia emite a palavra-código computada e o comprimento de código de subgrupo ao fluxo de bits para o armazenamento e/ou transmissão a um outro dispositivo, tal como um dispositivo de decodificação que inclui uma unidade de decodif icação por entropia tal como a unidade de decodificação por entropia 52.
A Fig. 14 é um diagrama de blocos que ilustra um método para decodificar os códigos de comprimento variável construídos de acordo com os métodos da Fig. 12 e da Fig.
13, e de acordo com o segundo aspecto geral desta revelação. O método mostrado na Fig. 14 pode ser realizado usando um algoritmo idêntico ou similar àquele mostrado na TABELA 8. Os códigos de comprimento variável podem ser recebidos, de um dispositivo de encodif icação tal como um dispositivo de encodificação que inclui a unidade de codificação por entropia 46. Os códigos de comprimento variável podem ser recebidos e decodificados pela unidade de decodificação por entropia 52. Como mostrado na Fig. 14, a unidade de decodificação por entropia 52 recebe uma palavrã-código do fluxo de bits entrante (150) e compara, a palavra-código com uma palavra-código base de subgrupo. Em particular, a unidade de decodificação por entropia 52 pode procurara uma árvore de codificação aplicável para identificar uma palavra-código base de subgrupo justificada a esquerda que é inferior ou igual aos conteúdos de palavra-código obtidos de um buffer de fluxo de bits (152) .
Se a palavra-código base de subgrupo em um subgrupo em nível dado na árvore não é inferior ou igual a palavra-código (152), a seguir a unidade de decodificação por entropia 52 prossegue ao subgrupo seguinte no nível seguinte (154) na árvore e repete a comparação. Este processo continua em uma base iterativa contanto que a 5 palavra-código base permanece maior do que a palavra-código recebida a partir do fluxo de bits, isto é, até que a unidade de decodificação por entropia 52 alcance um nível em que a palavra-código base de subgrupo é inferior ou igual a palavra-código. Em comparar a palavra-código e as 10 palavras-código base, a unidade de decodificação por entropia 52 pode usar valores parciais, valores incrementais de palavras-código base para a redução adicional de memória de acordo com o primeiro aspecto desta revelação. Em particular, um número de bits dianteiros pode 15 ser descartado para melhorar a eficiência em memória como descrito previamente.
Quando alcança um nível da árvore de codificação em que uma palavra-código base de subgrupo é inferior ou igual a palavra-código, a unidade de decodificação por 20 entropia 52 determina o comprimento de código para o subgrupo (156) e rola o fluxo de bits por aquele comprimento para pular os bits decodificados e isolar a palavra de código. A unidade de decodificação por entropia 52 pode determinar a posição da palavra-código no subgrupo 25 que usa a palavra-código base (158). Por exemplo, a unidade de decodificação por entropia 52 pode subtrair a palavra- código de fluxo de bits da palavra-código base para produzir a diferença posicionai entre a palavra-código e a palavra-código base.
Como um exemplo, em referência à árvore de
codificação da Fig. 6, se a palavra-código entrante é 0110000000000000, a unidade de decodificação por entropia 52 identificará a palavra-código base 0010000000000000 como a palavra-código base de subgrupo do topo que é inferior ou igual a palavra-código. Esta palavra-código base é associada com o primeiro subgrupo no grupo nos níveis 3 e
4. Quando da determinação do comprimento de código (3) do subgrupo associado com a palavra-código base, a unidade de decodificação por entropia 52 pode rolar o fluxo de bits para pular os bits decodificados. A unidade de decodificação por entropia 52 pode determinar o índice de grupo da palavra-código subtraindo a palavra-código base da palavra-código do fluxo de bits. Neste exemplo, 011 menos
001 dá 010, que produz um valor de índice de grupo de 2.
A unidade de decodificação por entropia 52 também pode determinar o peso da palavra-código (160), por exemplo, baseado no nível do subgrupo dentro da árvore de codificação. Além disso, a unidade de decodificação por entropia 52 pode determinar o índice de subgrupo (162), isto é, o índice de subgrupo selecionado dentro da árvore de codificação. Usando o peso, o índice de posição e de subgrupo, unidade de decodificação por entropia 52 determina o índice de palavra (164), decodificando desse modo a palavra-código a partir do fluxo de bits para produzir a palavra representada pela palavra-código. Mais uma vez, em algumas implementações, o método de decodificação realizado pela unidade de decodificação por entropia 52 pode corresponder ao processo mostrado na TABELA 8.
Aqueles versados na técnica compreenderiam que as informações e os sinais podem ser representados usando algumas de uma variedade de tecnologias e técnicas diferentes. Por exemplo, dados, instruções, comandos, informações, sinais, bits, símbolos, e chips que podem ser referenciados por toda descrição acima podem ser representados por tensões, correntes, ondas eletromagnéticas, campo ou partículas magnéticos, campos ou partículas óticos, ou qualquer combinação desses.
Aqueles versados apreciariam ainda que os vários blocos, módulos, circuitos, e etapas de algoritmo lógicos 5 ilustrativos descritos em relação ã revelação aqui podem ser implementados como hardware eletrônico, software de computador, ou combinações de ambos. Para ilustrar claramente esta permutabilidade de hardware e de software, os vários componentes ilustrativos, blocos, módulos, 10 circuitos, e as etapas foram descritos acima em geral nos termos de sua funcionalidade. Se tal funcionalidade é implementada como hardware ou software depende da aplicação particular e de restrições de projeto impostas no sistema como um todo. Os versados na técnica podem implementar a 15 funcionalidade descrita em várias maneiras para cada aplicação particular, mas tais decisões de implementação não devem ser interpretadas como a causa de um afastamento do escopo da presente revelação.
As técnicas descritas aqui podem ser implementadas em hardware, software, firmware, ou qualquer combinação desses. Tais técnicas podem ser implementadas em qualquer uma de uma variedade de dispositivos tais como computadores de uso geral, handsets de dispositivo de comunicação sem fio, ou dispositivos de circuito integrado que têm múltiplos usos incluindo a aplicação nos handsets de dispositivo de comunicação sem fio e nos outros dispositivos. Todas as características descritas como módulos ou componentes podem ser implementadas junto em um dispositivo de lógica integrada ou separadamente como dispositivos de lógica discreta mas interoperáveis. Se implementado em software, as técnicas podem ser realizadas pelo menos em parte por um meio de armazenamento de dados legível por computador compreendendo o código de programa que inclui instruções que, quando executadas, realiza um ou mais dos métodos descritos acima. O meio de armazenamento de dados legível por computador pode fazer parte de um produto de programa de computador. 0 meio legível por computador pode compreender a memória de acesso aleatório (RAM) tal como a memória de acesso aleatório dinâmico síncrona (SDRAM), a memória apenas de leitura (ROM), a memória de acesso aleatório não-volátil (NVRAM), a memória apenas de leitura programável eletricamente apagável (EEPROM), memória Flash, os meios de armazenamento de dados magnéticos ou óticos, e semelhantes. As técnicas adicionalmente, ou alternativamente, podem ser realizadas pelo menos em parte por um meio de comunicação legível por computador que carrega ou comunica o código de programa sob a forma de instruções ou de estruturas de dados e que pode ser acessado, lido, e/ou executado por um computador, tal como sinais ou ondas de propagação.
0 código de programa pode ser executado por um ou mais processadores, tais como um ou mais processadores de sinal digital (DSPs), microprocessadores de uso geral, circuitos integrados de aplicação específica (ASICs), arranjos de portas programáveis em campo (FPGAs), ou outros circuitos de lógica integrada ou discreta equivalentes. Um processador de uso geral pode ser um microprocessador, mas na alternativa, o processador pode ser qualquer processador, controlador, microcontrolador, ou máquina de estado convencional. Um processador pode também ser implementado como uma combinação de dispositivos de computação, por exemplo, uma combinação de um DSP e de um microprocessador, uma pluralidade de microprocessadores, um ou mais microprocessadores conjuntamente com um núcleo de DSP, ou qualquer outra tal configuração. Portanto, o termo "processador" como usado aqui pode se referir a alguma da estrutura antecedente ou de qualquer outra estrutura apropriada para implementação das técnicas descritas aqui. Além disso, em alguns aspectos, a funcionalidade descrita aqui pode ser fornecida dentro dos módulos de software 5 dedicados ou dos módulos de hardware configurados para a codificação e a decodificação, ou incorporada em um encodificador-decodificador (CODEC) de vídeo combinado.
Várias modalidades da revelação foram descritas. Estas e outras modalidades estão dentro do escopo das seguintes reivindicações.

Claims (82)

1. Um método compreendendo: realizar codificação de comprimento variável de acordo com uma estrutura de código, em que a estrutura de código define: grupos de palavras-código em uma árvore de codificação, cada um dos grupos inclui palavras-código que representam valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e primeiro e segundo subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui palavras-código possuindo um segundo comprimento diferente do primeiro comprimento; e gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
2. 0 método, de acordo com a reivindicação 1, em que realizar codificação de comprimento variável compreende: acessar uma estrutura de dados que especifica palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, um número de palavras-código dentro de cada um dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos; e realizar a codificação de comprimento variável usando a estrutura de dados.
3. 0 método, de acordo com a reivindicação 2, em que a estrutura de dados é armazenada em uma memória associada com um dentre um encodificador de vídeo, um encodificador de imagem, um encodificador de áudio, um encodificador de fala, um decodificador de vídeo, um decodificador de imagem, e decodificador de áudio, ou de um decodificador de fala.
4. 0 método, de acordo com a reivindicação 2, em que cada uma das palavras-código base é uma palavra-código menor de forma lexicográfica dentro do respectivo subgrupo.
5. 0 método, de acordo com a reivindicação 2, em que realizar a codificação de comprimento variável compreende encodificar um dos valores usando a estrutura de dados, em que encodificar compreende: selecionar um dos grupos com base no peso do valor a ser encodificado; selecionar um dos subgrupos com base na posição lexicográfica do valor a ser encodificado relativo ao número de palavras-código no primeiro subgrupo do grupo selecionado; selecionar uma das palavras-código no subgrupo selecionado com base na palavra-código base para o subgrupo selecionado e a posição lexicográfica do valor a ser encodificado; e encodificar o valor a ser encodificado com a palavra-código selecionada.
6. 0 método, de acordo com a reivindicação 5, compreendendo adicionalmente transmitir o valor encodificado a um.decodificador.
7. 0 método, de acordo com a reivindicação 1, em que realizar a codificação de comprimento variável compreende decodificar uma das palavras-código usando a estrutura de dados, em que decodificar compreende: em uma busca de cima para baixo da árvore de codificação, selecionar um primeiro subgrupo dos subgrupos com uma palavra-código base que é inferior ou igual a palavra-código a ser decodificada; determinar a posição da palavra-código a ser decodificada dentro do subgrupo selecionado com base em uma diferença entre a palavra-código a ser decodificada e a palavra-código base para o subgrupo selecionado; determinar o peso do valor representado pela palavra-código a ser decodificada com base no grupo em que o subgrupo selecionado reside; determinar a posição da palavra-código dentro do grupo em que o subgrupo selecionado reside com base em se o subgrupo selecionado é o primeiro subgrupo ou o segundo subgrupo para o grupo; selecionar um dentre os valores de peso do valor representado pela palavra-código a ser decodificada e pela posição da palavra-código dentro do grupo em que o subgrupo selecionado reside; e decodificar a palavra-código a ser decodificada com o valor selecionado.
8.0 método, de acordo com a reivindicação 7, compreendendo adicionalmente apresentar saída a um usuário com base pelo menos em parte no valor selecionado.
9. 0 método, de acordo com a reivindicação 1, em que os valores representados pelas palavras-código representam pelo menos um dentre dados de vídeo, dados de imagem, dados de fala ou dados de áudio.
10. Um dispositivo compreendendo: mecanismos para realizar codificação de comprimento variável de acordo com uma estrutura de código, em que a estrutura de código define: grupos de palavras-código em uma árvore de codificação, cada um dos grupos inclui palavras-código que representam valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e primeiro e segundo subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui palavras-código possuindo um segundo comprimento diferente do primeiro comprimento; e mecanismos para gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário. :
11. O dispositivo, de acordo com a reivindicação 10, em que os mecanismos para realizar codificação de comprimento variável compreendem: mecanismos para acessar uma estrutura de dados que especifica palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, um número de palavras-código dentro de cada um 20 dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos; e mecanismos para realizar a codificação de : comprimento variável usando a estrutura de dados.
12. 0 dispositivo, de acordo com a reivindicação 11, compreendendo adicionalmente mecanismos para armazenar a estrutura:de, dados em uma memória associada com um dentre um encodificador de video, um encodificador de imagem, um encodificador de áudio, um encodificador de fala, um decodificador de vídeo, um decodificador de imagem, e decodificador de áudio, ou um decodificador de fala.
13. 0 dispositivo, de acordo com a reivindicação 11, em que cada uma das palavras-código base é uma palavra- código menor de forma lexicográfica dentro do respectivo subgrupo.
14. 0 dispositivo, de acordo com a reivindicação 11, em que os mecanismos para realizar codificação de comprimento variável compreendem mecanismos para encodificar um dos valores usando a estrutura de dados, os mecanismos para encodificar compreendendo: mecanismos para selecionar um dos grupos com base no peso do valor a ser encodificado; mecanismos para selecionar um dos subgrupos com base na posição lexicográfica do valor a ser encodificado relativo ao número de palavras-código no primeiro subgrupo do grupo selecionado; mecanismos para selecionar uma das palavras- código no subgrupo selecionado com base na palavra-código base para o subgrupo selecionado e a posição lexicográfica do valor a ser encodificado; e mecanismos para encodificar o valor a ser encodificado com a palavra-código selecionada.
15. O dispositivo, de acordo com a reivindicação 14, compreendendo adicionalmente mecanismos para transmitir o valor encodificado a um decodificador.
16. 0 dispositivo, de acordo com a reivindicação 11, em que os mecanismos para realizar codificação de comprimento variável compreendem mecanismos para decodificar uma das palavras-código usando a estrutura de dados, os mecanismos para decodificar compreendendo: mecanismos para, em uma busca de cima para baixo da árvore de codificação, selecionar um primeiro subgrupo dos subgrupos com uma palavra-código base que é inferior ou igual a palavra-código a ser decodificada; mecanismos para determinar a posição da palavra- código a ser decodificada dentro do subgrupo selecionado com base em uma diferença entre a palavra-código a ser decodificada e a palavra-código base para o subgrupo selecionado; mecanismos para determinar o peso do valor representado pela palavra-código a ser decodificada com base no grupo em que o subgrupo selecionado reside; mecanismos para determinar a posição da palavra- código dentro do grupo em que o subgrupo selecionado reside com base em se o subgrupo selecionado é o primeiro subgrupo ou o segundo subgrupo para o grupo; mecanismos para selecionar um dentre os valores de peso do valor representado pela palavra-código a ser decodificada e pela posição da palavra-código dentro do grupo em que o subgrupo selecionado reside; e mecanismos para decodificar a palavra-código a ser decodificada com o valor selecionado.
17. O dispositivo, de acordo com a reivindicação16, compreendendo adicionalmente mecanismos para apresentar saida a um usuário com base pelo menos em parte no valor selecionado.
18. O dispositivo, de acordo com a reivindicação10, em que os valores representados pelas palavras-código representam pelo menos um dentre dados de vídeo, dados de imagem, dados de fala ou dados de áudio.
19. Um meio legível por computador tangível compreendendo instruções para fazer um processador: realizar codificação de comprimento variável de acordo com uma estrutura de código, em que a estrutura de código define: grupos de palavras-código em uma árvore de codificação, cada um dos grupos inclui palavras-código que representam valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e primeiro e segundo subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui palavras-código possuindo um segundo comprimento diferente do primeiro comprimento; e gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
20. 0 meio legível por computador, de acordo com a reivindicação 19, compreendendo adicionalmente instruções para fazer o processador: acessar uma estrutura de dados que especifica palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, um número de palavras-código dentro de cada um dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos; e realizar a codificação de comprimento variável usando a estrutura de dados.
21. 0 meio legível por computador, de acordo com a reivindicação 20, compreendendo adicionalmente instruções para fazer o processador armazenar a estrutura de dados em uma memória associada com um dentre um encodificador de vídeo, um encodificador de imagem, um encodificador de áudio, um encodificador de fala, um decodificador de vídeo, um decodificador de imagem, e decodificador de áudio, ou de um decodificador de fala.
22. O meio legível por computador, de acordo com a reivindicação 20, em que cada uma das palavras-código é uma palavra-código menor de forma lexicográfica dentro do respectivo subgrupo.
23. O meio legível por computador, de acordo com a reivindicação 21, compreendendo adicionalmente instruções para fazer o processador encodificar um dos valores usando a estrutura de dados para realizar a codificação de comprimento variável, em que as instruções fazem o processador: selecionar um dos grupos com base no peso do valor a ser encodificado; selecionar um dos subgrupos com base na posição lexicográfica do valor a ser encodificado relativo ao número de palavras-código no primeiro subgrupo do grupo selecionado; selecionar uma das palavras-código no subgrupo selecionado com base na palavra-código base para o subgrupo selecionado e a posição lexicográfica do valor a ser encodificado; e encodificar o valor a ser encodificado com a palavra-código selecionada.
24. O meio legível por computador, de acordo com a reivindicação 23, compreendendo adicionalmente instruções para fazer o. processador controlar um transmissor para transmitir o valor encodificado a um decodificador.
25. 0 meio legível por computador, de acordo com a reivindicação 21, compreendendo adicionalmente instruções para fazer o processador decodificar uma das palavras- código usando a estrutura de dados para realizar a codificação de comprimento variável, em que as instruções fazem o processador: em uma busca de cima para baixo da árvore de codificação, selecionar um primeiro subgrupo dos subgrupos com uma palavra-código base que é inferior ou igual a palavra-código a ser decodificada; determinar a posição da palavra-código a ser decodificada dentro do subgrupo selecionado com base em uma diferença entre a palavra-código a ser decodificada e a palavra-código base para o subgrupo selecionado; determinar o peso do valor representado pela palavra-código a ser decodificada com base no grupo em que o subgrupo selecionado reside; determinar a posição da palavra-código dentro do grupo em que o subgrupo selecionado reside com base em se o subgrupo selecionado é o primeiro subgrupo ou o segundo subgrupo para o grupo; selecionar um dentre os valores de peso do valor representado pela palavra-código a ser decodificada e pela posição da palavra-código dentro do grupo em que o subgrupo selecionado reside; e decodificar a palavra-código a ser decodificada com o valor selecionado.
26. O meio legivel por computador, de acordo com a reivindicação 25, compreendendo adicionalmente instruções para fazer o processador controlar um dispositivo de saída para apresentar saída a um usuário com base pelo menos em parte no valor selecionado.
27. O meio legível por computador, de acordo com a reivindicação 19, em que os valores representados pelas palavras-código representam pelo menos um dentre dados de vídeo, dados de imagem, dados de fala ou dados de áudio.
28. Um dispositivo compreendendo: um processador configurado para realizar codificação de comprimento variável de acordo com uma estrutura de código, em que a estrutura de código define: grupos de palavras-código em uma árvore de codificação, cada um dos grupos inclui palavras-código que representam valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e primeiro e segundo subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui palavras-código possuindo um segundo comprimento diferente do primeiro comprimento; e em que o processador é configurado para gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
29. 0 dispositivo, de acordo com a reivindicação28, em que o processador acessa uma estrutura de dados que especifica palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, um número de palavras-código dentro de cada um dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos, e realiza a codificação de comprimento variável usando a estrutura de dados.
30. 0 dispositivo, de acordo com a reivindicação29, em que a estrutura de dados é armazenada em uma memória associada com um dentre um encodificador de video, um encodificador de imagem, um encodificador de áudio, um encodificador de fala, um decodificador de vídeo, um decodificador de imagem, e decodificador de áudio, ou de um decodificador de fala.
31. 0 dispositivo, de acordo com a reivindicação 29, em que cada uma das palavras-código base é uma palavra- código menor de forma lexicográfica dentro do respectivo subgrupo.
32. 0 dispositivo, de acordo com a reivindicação 29, em que o processador encodifica um dos valores usando a estrutura de dados para realizar a codificação de comprimento variável, e em que o processador seleciona um dos grupos com base no peso do valor a ser encodificado, seleciona um dos subgrupos com base na posição lexicográfica do valor a ser encodificado relativo ao número de palavras-código no primeiro subgrupo do grupo selecionado, seleciona uma das palavras-código no subgrupo selecionado com base na palavra-código base para o subgrupo selecionado e a posição lexicográfica do valor a ser encodificado, e encodifica o valor a ser encodificado com a palavra-código selecionada.
33. 0 dispositivo, de acordo com a reivindicação 32, compreendendo adicionalmente um transmissor que transmite o valor encodificado a um decodificador.
34. O dispositivo, de acordo com a reivindicação29, em que o processador decodifica uma das palavras-código usando a estrutura de dados para realizar a codificação de comprimento variável, e em que o processador, em uma busca de cima para baixo da árvore de codificação, seleciona um primeiro subgrupo dos subgrupos com uma palavra-código base que é inferior ou igual a palavra-código a ser decodificada, determina a posição da palavra-código a ser decodificada dentro do subgrupo selecionado com base em uma diferença entre a palavra-código a ser decodificada e a palavra-código base para o subgrupo selecionado, determina o peso do valor representado pela palavra-código a ser decodificada com base no grupo em que o subgrupo selecionado reside, determina a posição da palavra-código dentro do grupo em que o subgrupo selecionado reside com base em se o subgrupo selecionado é o primeiro subgrupo ou o segundo subgrupo para o grupo, seleciona um dentre valores de peso do valor representado pela palavra-código a ser decodificada e pela posição da palavra-código dentro do grupo em que o subgrupo selecionado reside, e decodifica a palavra-código a ser decodificada com o valor selecionado. 34, compreendendo adicionalmente um dispositivo de saída que apresenta saída a um usuário com base pelo menos em parte no.valor selecionado. 28, em que os valores representados pelas palavras-código representam pelo menos um dentre dados de vídeo, dados de imagem, dados de fala ou dados de áudio.
35. 0 dispositivo, de acordo com a reivindicação
36. 0 dispositivo, de acordo com a reivindicação
37. Um método compreendendo: para uma estrutura de código definindo: grupos de palavras-código em uma árvore de codificação especificando palavras-código de comprimento variável, em que cada um dos grupos inclui palavras-código que representam valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e primeiro e segundo subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui palavras-código possuindo um segundo comprimento diferente do primeiro comprimento; realizar codificação de comprimento variável usando palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, um número de palavras-código dentro dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos; e gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
38. 0 método, de acordo com a reivindicação 37, em que realizar codificação de comprimento variável compreende encodificar pelo menos alguns dos valores, e o resultado da codificação de comprimento variável é uma ou mais palavras-código.
39. 0 método, de acordo com a reivindicação 38, em que encodificar compreende: selecionar um dos grupos com base no peso do valor a ser encodificado; selecionar um dos subgrupos com base na posição lexicográfica do valor a ser encodificado relativo ao número de palavras-código no primeiro subgrupo do grupo selecionado; selecionar uma das palavras-código no subgrupo selecionado com base na palavra-código base para o subgrupo selecionado e a posição lexicográfica do valor a ser encodificado; e encodificar o valor a ser encodificado com a palavra-código selecionada.
40. O método, de acordo com a reivindicação 37, em que realizar codificação de comprimento variável compreende decodificar pelo menos algumas das palavras- código, e o resultado da codificação de comprimento variável é um ou mais valores.
41. O método, de acordo com a reivindicação 40, em que decodificar compreende: em uma busca de cima para baixo da árvore de codificação, selecionar um primeiro subgrupo dos subgrupos com uma palavra-código base que é inferior ou igual a palavra-código a ser decodificada; determinar a posição da palavra-código a ser decodificada dentro do subgrupo selecionado com base em uma diferença entre a palavra-código a ser decodificada e a palavra-código base para o subgrupo selecionado; determinar o peso do valor representado pela palavra-código a ser decodificada com base no grupo em que o subgrupo selecionado reside; determinar a posição da palavra-código dentro do grupo em que o subgrupo selecionado reside com base em se o subgrupo selecionado é o primeiro subgrupo ou o segundo subgrupo para o grupo; selecionar um dentre os valores de peso do valor representado pela palavra-código a ser decodificada e pela posição da palavra-código dentro do grupo em que o subgrupo selecionado reside; e decodificar a palavra-código a ser decodificada com o valor selecionado.
42. O método, de acordo com a reivindicação 37, em que cada uma das palavras-código base é uma palavra- código menor de forma lexicográfica dentro do respectivo subgrupo.
43. O método, dé acordo com a reivindicação 37, em que os valores representados pelas palavras-código representam pelo menos um dentre dados de vídeo, dados de imagem, dados de fala ou dados de áudio.
44. Um dispositivo compreendendo: para uma estrutura de código, mecanismos para definir: grupos de palavras-código em uma árvore de codificação especificando palavras-código de comprimento variável, em que cada um dos grupos inclui palavras-código que representam valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e primeiro e segundo subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui palavras-código possuindo um segundo comprimento diferente do primeiro comprimento; mecanismos para realizar codificação de comprimento variável usando palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, um número de palavras-código dentro de cada um dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos; e mecanismos para gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
45. O dispositivo, de acordo com a reivindicação 44, em que os mecanismos para realizar codificação de comprimento variável compreendem mecanismos para encodificar pelo menos alguns dos valores, e o resultado da codificação de comprimento variável é uma ou mais palavras- código .
46. 0 dispositivo, de acordo com a reivindicação 45, em que os mecanismos para encodificar compreendem: mecanismos para selecionar um dos grupos com base no peso do valor a ser encodificado; mecanismos para selecionar um dos subgrupos com base na posição lexicográfica do valor a ser encodificado relativo ao número de palavras-código no primeiro subgrupo do grupo selecionado; mecanismos para selecionar uma das palavras- código no subgrupo selecionado com base na palavra-código base para o subgrupo selecionado e a posição lexicográfica do valor a ser encodificado; e mecanismos para encodificar o valor a ser encodificado com a palavra-código selecionada.
47. 0 dispositivo, de acordo com a reivindicação 44, em que os' mecanismos para realizar codificação de comprimento variável compreendem mecanismos para decodificar pelo menos algumas das palavras-código, e o resultado da codificação de comprimento variável é um ou mais valores.
48. 0 dispositivo, de acordo com a reivindicação 47, em que os mecanismos para decodificar compreendem: mecanismos para, em uma busca de cima para baixo da árvore de codificação, selecionar um primeiro subgrupo dos subgrupos com uma palavra-código base que é inferior ou igual a palavra-código a ser decodificada; mecanismos para determinar a posição da palavra- código a ser decodificada dentro do subgrupo selecionado com base em uma diferença entre a palavra-código a ser decodificada e a palavra-código base para o subgrupo selecionado; mecanismos para determinar o peso do valor representado pela palavra-código a ser decodificada com base no grupo em que o subgrupo selecionado reside; mecanismos para determinar a posição da palavra- código dentro do grupo em que o subgrupo selecionado reside com base em se o subgrupo selecionado é o primeiro subgrupo ou o segundo subgrupo para o grupo; mecanismos para selecionar um dentre os valores de peso do valor representado pela palavra-código a ser decodificada e pela posição da palavra-código dentro do grupo em que o subgrupo selecionado reside; e mecanismos para decodificar a palavra-código a ser decodificada com o valor selecionado.
49. O dispositivo, de acordo com a reivindicação44, em que cada uma das palavras-código base é uma palavra- código menor de forma lexicográfica dentro do respectivo subgrupo.
50. O dispositivo, de acordo com a reivindicação44, em que os valores representados pelas palavras-código representam pelo menos um dentre dados de vídeo, dados de imagem, dados de fala ou dados de áudio.
51. Um meio legível por computador tangível compreendendo instruções para fazer um processador: para uma estrutura de código, definir: grupos de palavras-código em uma árvore de codificação especificando palavras-código de comprimento variável, em que cada um dos grupos inclui palavras-código que representam valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e primeiro e segundo subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui palavras-código possuindo um segundo comprimento diferente do primeiro comprimento; realizar codificação de comprimento variável usando palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, um número de palavras-código dentro dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos; e gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
52. 0 meio legivel por computador, de acordo com a reivindicação 51, em que as instruções fazem o processador encodificar pelo menos alguns dos valores, e o resultado da codificação de comprimento variável é uma ou mais palavras-código.
53. 0 meio legivel por computador, de acordo com a reivindicação 52, em que as instruções fazem o processador: selecionar um dos grupos com base no peso do valor a ser encodificado; selecionar um dos subgrupos com base na posição lexicográfica do valor a ser encodificado relativo ao número de palavras-código no primeiro subgrupo do grupo selecionado; selecionar uma das palavras-código no subgrupo selecionado com base na palavra-código base para o subgrupo selecionado e a posição lexicográfica do valor a ser encodificado; e encodificar o valor a ser encodificado com a palavra-código selecionada.
54. 0 meio legível por computador, de acordo com a reivindicação 51, em que as instruções fazem o processador decodificar pelo menos algumas das palavras- código, e o resultado da codificação de comprimento variável é um ou mais valores.
55. 0 meio legível por computador, de acordo com a reivindicação 54, em que as instruções fazem o processador: em uma busca de cima para baixo da árvore de codificação, selecionar um primeiro subgrupo dos subgrupos com uma palavra-código base que é inferior ou igual a palavra-código a ser decodificada; determinar a posição da palavra-código a ser decodificada dentro do subgrupo selecionado com base em uma diferença entre a palavra-código a ser decodificada e a palavra-código base para o subgrupo selecionado; determinar o peso do valor representado pela palavra-código a ser decodificada com base no grupo em que o subgrupo selecionado reside; determinar a posição da palavra-código dentro do grupo em que o subgrupo selecionado reside com base em se o subgrupo selecionado é o primeiro subgrupo ou o segundo subgrupo para o grupo; selecionar um dentre os valores de peso do valor representado pela palavra-código a ser decodificada e pela posição da palavra-código dentro do grupo em que o subgrupo selecionado reside; e decodificar a palavra-código a ser decodificada com o valor selecionado.
56. 0 meio legível por computador, de acordo com a reivindicação 51, em que cada uma das palavras-código base é uma palavra-código menor de forma lexicográfica dentro do respectivo subgrupo.
57. 0 meio legível por computador, de acordo com a reivindicação 51, em que os valores representados pelas palavras-código representam pelo menos um dentre dados de vídeo, dados de imagem, dados de fala ou dados de áudio.
58. Um dispositivo compreendendo: para uma estrutura de código definindo: grupos de palavras-código em uma árvore de codificação especificando palavras-código de comprimento variável, em que cada um dos grupos inclui palavras-código que representam valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e primeiro e segundo subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui palavras-código possuindo um segundo comprimento diferente do primeiro comprimento; um processador configurado para realizar codificação de comprimento variável usando palavras-código base para cada um dos subgrupos, posições de palavras- código dentro de cada um dos grupos, um número de palavras- código dentro dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos, e gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
59. O dispositivo, de acordo com a reivindicação 58, em que o processador encodifica pelo menos alguns dos valores, e o resultado da codificação de comprimento variável é uma ou mais palavras-código.
60. 0 dispositivo, de acordo com a reivindicação 59, em que o processador seleciona um dos grupos com base no peso do valor a ser encodificado, seleciona um dos subgrupos com base na posição lexicográfica do valor a ser encodificado relativo ao número de palavras-código no primeiro subgrupo do grupo selecionado, seleciona uma das palavras-código no subgrupo selecionado com base na palavra-código base para o subgrupo selecionado e a posição lexicográfica do valor a ser encodificado, e encodifica o valor a ser encodificado com a palavra-código selecionada.
61. 0 dispositivo, de acordo com a reivindicação 58, em que o processador decodifica pelo menos algumas das palavras-código, e o resultado da codificação de comprimento variável é um ou mais valores.
62. 0 dispositivo, de acordo com a reivindicação 61, em que o processador, em uma busca de cima para baixo da árvore de codificação, seleciona um primeiro subgrupo dos subgrupos com uma palavra-código base que é inferior ou igual a palavra-código a ser decodificada, determina a posição da palavra-código a ser decodificada dentro do subgrupo selecionado com base em uma diferença entre a palavra-código a ser decodificada e a palavra-código base para o subgrupo selecionado, determina o peso do valor representado pela palavra-código a ser decodificada com base no grupo em que o subgrupo selecionado reside, determina a posição da palavra-código dentro do grupo em que o subgrupo selecionado reside com base em se o subgrupo selecionado é o primeiro subgrupo ou o segundo subgrupo para o grupo, seleciona um dentre os valores de peso do valor representado pela palavra-código a ser decodificada e pela posição da palavra-código dentro do grupo em que o subgrupo selecionado reside, e decodifica a palavra-código a ser decodificada com o valor selecionado.
63. O dispositivo, de acordo com a reivindicação 58, em que cada uma das palavras-código base é uma palavra- código menor de forma lexicográfica dentro do respectivo subgrupo.
64. O dispositivo, de acordo com a reivindicação58, em que os valores representados pelas palavras-código representam pelo menos um dentre dados de vídeo, dados de imagem, dados de fala ou dados de áudio.
65. Um meio legível por computador tangível compreendendo uma estrutura de dados para codificação de comprimento variável usando uma estrutura de código de comprimento variável que define: grupos de palavras-código em uma árvore de codificação, cada um dos grupos inclui palavras-código que representam valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e primeiro e segundo subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui palavras-código possuindo um segundo comprimento diferente do primeiro comprimento.
66. O meio legivel por computador, de acordo com a reivindicação 65, em que a estrutura de dados especifica palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, um número de palavras-código dentro dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos.
67. Um aparelho telefônico de comunicação sem fio compreendendo: um processador configurado para realizar codificação de comprimento variável de acordo com uma estrutura de código, em que a estrutura de código define: grupos de palavras-código em uma árvore de codificação, cada um dos grupos inclui : palavras-código que representam valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e primeiro e segundo subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui palavras-código possuindo um segundo comprimento diferente do primeiro comprimento, e em que o processador é configurado para gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
68. O aparelho telefônico, de acordo com a reivindicação 67, em que o processador acessa uma estrutura de dados que especifica palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, um número de palavras-código dentro dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos, e realiza a codificação de comprimento variável usando a estrutura de dados.
69. 0 aparelho telefônico, de acordo com a reivindicação 68, compreendendo adicionalmente uma memória, em que a estrutura de dados é armazenada na memória, e a memória é associada com um dentre um encodificador de vídeo, um encodificador de imagem, um encodificador de áudio, um encodificador de fala, um decodificador de vídeo, um decodificador de imagem, e decodificador de áudio, ou de um decodificador de fala no aparelho telefônico.
70. O aparelho telefônico, de acordo com a reivindicação 68, em que cada uma das palavras-código base é uma palavra-código menor de forma lexicográfica dentro do respectivo subgrupo.
71. 0 aparelho telefônico, de acordo com a reivindicação 68, em que o processador encodifica um dos valores usando a estrutura de dados para realizar a codificação de comprimento variável, e em que o processador seleciona um dos grupos com base no peso do valor a ser encodificado, seleciona um dos subgrupos com base na posição lexicográfica do valor a ser encodificado relativo ao número de palavras-código no primeiro subgrupo do grupo selecionado, seleciona uma das palavras-código no subgrupo selecionado com base na palavra-código base para o subgrupo selecionado e a posição lexicográfica do valor a ser encodificado, e encodifica o valor a ser encodificado com a palavra-código selecionada.
72. 0 aparelho telefônico, de acordo com a reivindicação 71, compreendendo adicionalmente um transmissor para transmitir o valor encodificado a um decodificador.
73. 0 aparelho telefônico, de acordo com a reivindicação 68, em que o processador decodifica uma das palavras-código usando a estrutura de dados para realizar a codificação de comprimento variável, e em que o processador, em uma busca de cima para baixo da árvore de codificação, seleciona um primeiro subgrupo dos subgrupos com uma palavra-código base que é inferior ou igual a palavra-código a ser decodificada, determina a posição da palavra-código a ser decodificada dentro do subgrupo selecionado com base em uma .diferença entre a palavra- código a ser decodificada e a palavra-código base para o subgrupo selecionado, determina o peso do valor representado pela palavra-código a ser decodificada com base no grupo em que o . subgrupo selecionado reside, determina a posição da palavra-código dentro do grupo em que o subgrupo selecionado reside com base em se o subgrupo selecionado é o primeiro subgrupo ou o segundo subgrupo para o grupo, seleciona um dentre os valores de peso do valor representado pela palavra-código a ser decodificada e pela posição da palavra-código dentro do grupo em que o subgrupo selecionado reside, e decodifica a palavra-código a ser decodificada com o valor selecionado.
74. O aparelho telefônico, de acordo com a reivindicação 73, compreendendo adicionalmente um dispositivo de saída que apresenta saída a um usuário com base pelo menos em parte no valor selecionado.
75. 0 aparelho telefônico, de acordo com a reivindicação 67, em que os valores representados pelas palavras-código representam pelo menos um dentre dados de vídeo, dados de imagem, dados de fala ou dados de áudio.
76. Um dispositivo circuito integrado compreendendo: um processador configurado para realizar codificação de comprimento variável de acordo com uma estrutura de código, em que a estrutura de código define: grupos de palavras-código em uma árvore de codificação, cada um dos grupos inclui palavras-código que representam valores possuindo os mesmos pesos e as palavras-código em cada um dos grupos são ordenadas de forma lexicográfica no que diz respeito aos valores representados pelas palavras-código, e primeiro e segundo subgrupos de palavras-código dentro de cada um dos grupos, em que o primeiro subgrupo inclui palavras-código possuindo um primeiro comprimento e o segundo subgrupo inclui palavras-código possuindo um segundo comprimento diferente do primeiro comprimento, e em que o processador é configurado para gerar um resultado da codificação de comprimento variável para pelo menos um dentre armazenamento em memória, transmissão a um dispositivo, ou apresentação a um usuário.
77. 0 dispositivo, de acordo com a reivindicação 76, em que o processador acessa uma estrutura de dados que especifica palavras-código base para cada um dos subgrupos, posições de palavras-código dentro de cada um dos grupos, um número de palavras-código dentro dos primeiros subgrupos, e comprimentos das palavras-código dentro de cada um dos subgrupos, e realiza a codificação de comprimento variável usando a estrutura de dados.
78.0 dispositivo, de acordo com a reivindicação 77, compreendendo adicionalmente uma memória, em que a estrutura de dados é armazenada na memória, e a memória é associada com um dentre um encodificador de video, um encodificador de imagem, um encodificador de áudio, um encodificador de fala, um decodificador de video, um decodificador de imagem, e decodificador de áudio, ou de um decodificador de fala no aparelho telefônico.
79. 0 dispositivo, de acordo com a reivindicação 77, em que cada uma das palavras-código base é uma palavra- código menor de forma lexicográfica dentro do respectivo subgrupo.
80. 0 dispositivo, de acordo com a reivindicação 77, em que o processador encodifica um dos valores usando a estrutura de dados para realizar a codificação de comprimento variável, e em que o processador seleciona um dos grupos com base no peso do valor a ser encodificado, seleciona um dos subgrupos com base na posição lexicográfica do valor a ser encodificado relativo ao número de palavras-código no primeiro subgrupo do grupo selecionado, seleciona uma das palavras-código no subgrupo selecionado com base na palavra-código base para o subgrupo selecionado e a posição lexicográfica do valor a ser encodificado, e encodifica o valor a ser encodificado com a palavra-código selecionada.
81. O dispositivo, de acordo com a reivindicação 77, em que o processador decodifica uma das palavras-código usando a estrutura de dados para realizar a codificação de comprimento variável, e em que o processador, em uma busca de cima para baixo da árvore de codificação, seleciona um primeiro subgrupo dos subgrupos com uma palavra-código base que é inferior ou igual a palavra-código a ser decodificada, determina a posição da palavra-código a ser decodificada dentro do subgrupo selecionado com base em uma diferença entre a palavra-código a ser decodificada e a palavra-código base para o subgrupo selecionado, determina o peso do valor representado pela palavra-código a ser decodificada com base no grupo em que o subgrupo selecionado reside, determina a posição da palavra-código dentro do grupo em que o subgrupo selecionado reside com base em se o subgrupo selecionado é o primeiro subgrupo ou o segundo subgrupo para o grupo, seleciona um dentre os valores de peso do valor representado pela palavra-código a ser decodificada e pela posição da palavra-código dentro do grupo em que o subgrupo selecionado reside, e decodifica a palavra-código a ser decodificada com o valor selecionado.
82. O dispositivo, de acordo com a reivindicação 76, em que os valores representados pelas palavras-código representam pelo menos um dentre dados de vídeo, dados de imagem, dados de fala ou dados de áudio.
BRPI0718628-2A 2006-11-14 2007-11-14 Codificação de bloco adaptativa em memória eficiente. BRPI0718628A2 (pt)

Applications Claiming Priority (7)

Application Number Priority Date Filing Date Title
US86582706P 2006-11-14 2006-11-14
US60/865,827 2006-11-14
US86708106P 2006-11-22 2006-11-22
US60/867,081 2006-11-22
US11/840,406 US7573407B2 (en) 2006-11-14 2007-08-17 Memory efficient adaptive block coding
US11/840,406 2007-08-17
PCT/US2007/084682 WO2008061143A2 (en) 2006-11-14 2007-11-14 Memory efficient adaptive block coding

Publications (1)

Publication Number Publication Date
BRPI0718628A2 true BRPI0718628A2 (pt) 2013-11-26

Family

ID=39267977

Family Applications (1)

Application Number Title Priority Date Filing Date
BRPI0718628-2A BRPI0718628A2 (pt) 2006-11-14 2007-11-14 Codificação de bloco adaptativa em memória eficiente.

Country Status (11)

Country Link
US (1) US7573407B2 (pt)
EP (1) EP2095511B1 (pt)
JP (1) JP4897888B2 (pt)
KR (1) KR101095335B1 (pt)
CN (1) CN101542911B (pt)
AT (1) ATE485634T1 (pt)
BR (1) BRPI0718628A2 (pt)
CA (1) CA2668229A1 (pt)
DE (1) DE602007010034D1 (pt)
TW (1) TWI353120B (pt)
WO (1) WO2008061143A2 (pt)

Families Citing this family (64)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8120515B2 (en) * 2006-09-29 2012-02-21 Agiledelta, Inc. Knowledge based encoding of data with multiplexing to facilitate compression
US8189683B2 (en) * 2006-11-28 2012-05-29 General Instrument Corporation Method and system for providing single cycle context weight update leveraging context address look ahead
US8411734B2 (en) 2007-02-06 2013-04-02 Microsoft Corporation Scalable multi-thread video decoding
JP2008227946A (ja) * 2007-03-13 2008-09-25 Toshiba Corp 画像復号装置
US20080247459A1 (en) * 2007-04-04 2008-10-09 General Instrument Corporation Method and System for Providing Content Adaptive Binary Arithmetic Coder Output Bit Counting
US8213499B2 (en) * 2007-04-04 2012-07-03 General Instrument Corporation Method and apparatus for context address generation for motion vectors and coefficients
US9648325B2 (en) 2007-06-30 2017-05-09 Microsoft Technology Licensing, Llc Video decoding implementations for a graphics processing unit
US8228991B2 (en) * 2007-09-20 2012-07-24 Harmonic Inc. System and method for adaptive video compression motion compensation
US8106797B2 (en) * 2007-11-30 2012-01-31 Comtech Ef Data Corporation Assigning codes to and repairing Huffman trees
US7663512B2 (en) * 2008-07-21 2010-02-16 Hon Hai Precision Industry Co., Ltd. Decoder and method for decoding a message using an arbitrary-side growing Huffman tree
WO2010027324A1 (en) * 2008-09-08 2010-03-11 Scalado Ab Method for indexing images and for reading an index of an image
US8671327B2 (en) 2008-09-28 2014-03-11 Sandisk Technologies Inc. Method and system for adaptive coding in flash memories
EP2335245B1 (en) * 2008-09-28 2015-01-07 Ramot at Tel-Aviv University Ltd. Method and system for adaptive coding in flash memories
US8503527B2 (en) 2008-10-03 2013-08-06 Qualcomm Incorporated Video coding with large macroblocks
US8335256B2 (en) * 2008-11-14 2012-12-18 General Instrument Corporation Motion compensation in video coding
KR101118089B1 (ko) * 2008-12-10 2012-03-09 서울대학교산학협력단 가변장 복호화 장치 및 방법
US9076239B2 (en) * 2009-04-30 2015-07-07 Stmicroelectronics S.R.L. Method and systems for thumbnail generation, and corresponding computer program product
EP2530937B1 (en) * 2009-06-18 2015-03-18 Kabushiki Kaisha Toshiba Video encoding apparatus and video decoding apparatus
US9628794B2 (en) 2009-06-18 2017-04-18 Kabushiki Kaisha Toshiba Video encoding apparatus and a video decoding apparatus
KR101675118B1 (ko) * 2010-01-14 2016-11-10 삼성전자 주식회사 스킵 및 분할 순서를 고려한 비디오 부호화 방법과 그 장치, 및 비디오 복호화 방법과 그 장치
US8063801B2 (en) * 2010-02-26 2011-11-22 Research In Motion Limited Encoding and decoding methods and devices using a secondary codeword indicator
US7990297B1 (en) * 2010-02-26 2011-08-02 Research In Motion Limited Encoding and decoding methods and devices employing dual codesets
US8233534B2 (en) * 2010-04-09 2012-07-31 Newport Media, Inc. Frame buffer compression and memory allocation in a video decoder
US8761240B2 (en) 2010-07-13 2014-06-24 Blackberry Limited Methods and devices for data compression using context-based coding order
EP2599227B1 (en) 2010-07-28 2020-04-01 BlackBerry Limited Method and device for compression of binary sequences by grouping multiple symbols
US8879634B2 (en) 2010-08-13 2014-11-04 Qualcomm Incorporated Coding blocks of data using one-to-one codes
US8885704B2 (en) * 2010-10-01 2014-11-11 Qualcomm Incorporated Coding prediction modes in video coding
JP2012094959A (ja) * 2010-10-25 2012-05-17 Sony Corp 画像処理装置と画像処理方法およびプログラム
US9172963B2 (en) * 2010-11-01 2015-10-27 Qualcomm Incorporated Joint coding of syntax elements for video coding
US8885729B2 (en) 2010-12-13 2014-11-11 Microsoft Corporation Low-latency video decoding
US9706214B2 (en) 2010-12-24 2017-07-11 Microsoft Technology Licensing, Llc Image and video decoding implementations
US8755620B2 (en) 2011-01-12 2014-06-17 Panasonic Corporation Image coding method, image decoding method, image coding apparatus, image decoding apparatus, and image coding and decoding apparatus for performing arithmetic coding and/or arithmetic decoding
US8687904B2 (en) 2011-01-14 2014-04-01 Panasonic Corporation Image coding method, image coding apparatus, image decoding method, image decoding apparatus, and image coding and decoding apparatus which include arithmetic coding or arithmetic decoding
KR101955374B1 (ko) * 2011-06-30 2019-05-31 에스케이 텔레콤주식회사 고속 코딩 단위(Coding Unit) 모드 결정을 통한 부호화/복호화 방법 및 장치
CA2840427C (en) 2011-06-30 2018-03-06 Microsoft Corporation Reducing latency in video encoding and decoding
WO2013006386A1 (en) * 2011-07-01 2013-01-10 General Instrument Corporation Motion vector prediction design simplification
US9338456B2 (en) * 2011-07-11 2016-05-10 Qualcomm Incorporated Coding syntax elements using VLC codewords
US8731067B2 (en) 2011-08-31 2014-05-20 Microsoft Corporation Memory management for video decoding
WO2013067440A1 (en) 2011-11-04 2013-05-10 General Instrument Corporation Motion vector scaling for non-uniform motion vector grid
US9819949B2 (en) 2011-12-16 2017-11-14 Microsoft Technology Licensing, Llc Hardware-accelerated decoding of scalable video bitstreams
WO2013162283A1 (ko) * 2012-04-24 2013-10-31 엘지전자 주식회사 비디오 신호 처리 방법 및 장치
US9172970B1 (en) 2012-05-29 2015-10-27 Google Inc. Inter frame candidate selection for a video encoder
US11317101B2 (en) 2012-06-12 2022-04-26 Google Inc. Inter frame candidate selection for a video encoder
US9491461B2 (en) * 2012-09-27 2016-11-08 Qualcomm Incorporated Scalable extensions to HEVC and temporal motion vector prediction
WO2014047881A1 (en) * 2012-09-28 2014-04-03 Intel Corporation Inter-layer intra mode prediction
WO2014053517A1 (en) 2012-10-01 2014-04-10 Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. Scalable video coding using derivation of subblock subdivision for prediction from base layer
US9503746B2 (en) 2012-10-08 2016-11-22 Google Inc. Determine reference motion vectors
US9485515B2 (en) 2013-08-23 2016-11-01 Google Inc. Video coding using reference motion vectors
JP5872513B2 (ja) * 2013-09-17 2016-03-01 株式会社東芝 符号化装置、復号化装置およびデータ処理システム
US9337862B2 (en) * 2014-06-09 2016-05-10 Tidal Systems, Inc. VLSI efficient Huffman encoding apparatus and method
US20160092492A1 (en) * 2014-09-27 2016-03-31 Qualcomm Incorporated Sharing initial dictionaries and huffman trees between multiple compressed blocks in lz-based compression algorithms
WO2016074147A1 (en) 2014-11-11 2016-05-19 Mediatek Singapore Pte. Ltd. Separated coding tree for luma and chroma
US10873437B2 (en) * 2016-08-11 2020-12-22 Sharp Kabushiki Kaisha Systems and methods for frequency-division duplex transmission time interval operation
US10547869B2 (en) 2017-12-08 2020-01-28 Google Llc Template-based entropy coding of quantized transform coefficients
US10609421B2 (en) 2018-07-12 2020-03-31 Google Llc Context derivation for coefficient coding
RU2701711C1 (ru) * 2019-01-09 2019-09-30 федеральное государственное автономное образовательное учреждение высшего образования "Национальный исследовательский ядерный университет МИФИ" (НИЯУ МИФИ) Устройство для упаковки данных
US11275568B2 (en) 2019-01-14 2022-03-15 Microsoft Technology Licensing, Llc Generating a synchronous digital circuit from a source code construct defining a function call
US11113176B2 (en) 2019-01-14 2021-09-07 Microsoft Technology Licensing, Llc Generating a debugging network for a synchronous digital circuit during compilation of program source code
US11106437B2 (en) * 2019-01-14 2021-08-31 Microsoft Technology Licensing, Llc Lookup table optimization for programming languages that target synchronous digital circuits
US11144286B2 (en) 2019-01-14 2021-10-12 Microsoft Technology Licensing, Llc Generating synchronous digital circuits from source code constructs that map to circuit implementations
US11093682B2 (en) 2019-01-14 2021-08-17 Microsoft Technology Licensing, Llc Language and compiler that generate synchronous digital circuits that maintain thread execution order
US11362671B2 (en) * 2019-03-25 2022-06-14 Ariel Scientific Innovations Ltd. Systems and methods of data compression
TWI714184B (zh) * 2019-07-25 2020-12-21 中華電信股份有限公司 多階層網路樣式比對方法
US11722148B2 (en) 2019-12-23 2023-08-08 Ariel Scientific Innovations Ltd. Systems and methods of data compression

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0311883A (ja) * 1989-06-09 1991-01-21 Hitachi Ltd 可変長符号の復号化方式とファクシミリ装置、および静止画像伝送システム
US5226082A (en) * 1992-07-02 1993-07-06 At&T Bell Laboratories Variable length decoder
JP3278297B2 (ja) * 1994-07-20 2002-04-30 富士通株式会社 データ圧縮方法及びデータ復元方法並びにデータ圧縮装置及びデータ復元装置
JP3220598B2 (ja) * 1994-08-31 2001-10-22 三菱電機株式会社 可変長符号テーブルおよび可変長符号化装置
US5696507A (en) 1996-05-31 1997-12-09 Daewoo Electronics Co., Inc. Method and apparatus for decoding variable length code
US6188797B1 (en) 1997-05-27 2001-02-13 Apple Computer, Inc. Decoder for programmable variable length data
JP2003273746A (ja) * 2002-03-18 2003-09-26 Mitsubishi Electric Corp 可変長符号復号装置

Also Published As

Publication number Publication date
TWI353120B (en) 2011-11-21
DE602007010034D1 (de) 2010-12-02
US20080111722A1 (en) 2008-05-15
WO2008061143A3 (en) 2008-07-10
CA2668229A1 (en) 2008-05-22
JP2010509895A (ja) 2010-03-25
TW200835175A (en) 2008-08-16
CN101542911B (zh) 2012-11-07
ATE485634T1 (de) 2010-11-15
KR20090089414A (ko) 2009-08-21
JP4897888B2 (ja) 2012-03-14
EP2095511A2 (en) 2009-09-02
KR101095335B1 (ko) 2011-12-16
WO2008061143A2 (en) 2008-05-22
EP2095511B1 (en) 2010-10-20
US7573407B2 (en) 2009-08-11
CN101542911A (zh) 2009-09-23

Similar Documents

Publication Publication Date Title
BRPI0718628A2 (pt) Codificação de bloco adaptativa em memória eficiente.
US7545293B2 (en) Memory efficient coding of variable length codes
JP5313362B2 (ja) 可変長固定長コードの高速パーシング
JP2010509893A5 (pt)
JP2010509895A5 (pt)
RU2413360C1 (ru) Эффективное по использованию памяти адаптивное блочное кодирование
JP5770311B2 (ja) ビデオコーディングにおけるサブスライス
JP2022123096A (ja) エントロピー符号化におけるコンテキスト初期化
BR112021003315A2 (pt) redução de compartimento codificado regular para codificação de coeficiente com o uso de limite e parâmetro de rice
US7626522B2 (en) Data compression using variable-to-fixed length codes
TW201731224A (zh) 熵編碼及解碼方案

Legal Events

Date Code Title Description
B08L Patent application lapsed because of non payment of annual fee [chapter 8.12 patent gazette]

Free format text: REFERENTE AO NAO RECOLHIMENTO DAS 5A E 6A ANUIDADES.

B08I Publication cancelled [chapter 8.9 patent gazette]

Free format text: ANULADA A PUBLICACAO CODIGO 8.12 NA RPI NO 2277 DE 26/08/2014 POR TER SIDO INDEVIDA.

B08F Application dismissed because of non-payment of annual fees [chapter 8.6 patent gazette]

Free format text: REFERENTE AS 5A, 6A, 7A, 8A, 9A, 10A, 11A E 12A ANUIDADES.

B08K Patent lapsed as no evidence of payment of the annual fee has been furnished to inpi [chapter 8.11 patent gazette]

Free format text: EM VIRTUDE DO ARQUIVAMENTO PUBLICADO NA RPI 2602 DE 17-11-2020 E CONSIDERANDO AUSENCIA DE MANIFESTACAO DENTRO DOS PRAZOS LEGAIS, INFORMO QUE CABE SER MANTIDO O ARQUIVAMENTO DO PEDIDO DE PATENTE, CONFORME O DISPOSTO NO ARTIGO 12, DA RESOLUCAO 113/2013.