CAPÍTULO 5 : As Rotinas De Implementação
5.2 O Procedimento de CABA
5.2.2 Rotinas e Fluxogramas de Codificação
Em cada plano de bits, o procedimento do CAA é executado para cada pixel do fluxo PIX, cada valor correspondente de CX e cada valor típico de predição VTP. Três rotinas principais utilizadas pelo procedimento de CAA são:
• A rotina INITC: usada para inicialização de operação, sendo que ela é chamada quando se inicia o processo de codificação.
• A rotina CODIF: essa rotina é utilizada para a codificação dos dados da imagem pixel-a-pixel, ou melhor, bit-a-bit.
• A rotina FIMC: é chamada quando o processo da codificação termina de codificar os dados, sendo ela usada para se encerrar a operação de CAA.
A Figura (5.1) mostra o fluxograma do codificador CAA. Em todas as vezes, o procedimento de CAA faz questão de testar se já foi atingido o fim dos dados dos planos de bits. Se foi atingido, o procedimento passa para a rotina FIMC. Caso contrário, segue para ler o próximo pixel do fluxo PIX a ser codificado, um novo contexto CX e o valor típico de predição VTP. Em seguida, o algoritmo faz o teste de valor do VTP. Os pixels que não sejam tipicamente previsíveis são codificados, chamando-se a rotina CODIF.
1) A Rotina INITC
A função dessa rotina é colocar os valores iniciais em cada registrador bem como em cada posição de memória.
Capítulo 5 - As Rotinas de Implementação 63 INITC SIM Ler PIX, CX e VTP CODIF NÃO SIM FIMC NÃO Fim dos planos VTP é típico PARE
Fig. (5.1)- Fluxograma do codificador CAA.
A seguir descrevem-se mais detalhes da função de cada rotina:
Uma exigência da ITU-T “International Telecommunication Union – Telecommunication Standardization Sector” (antiga CCITT) é que toda página ou documento deve começar com um pixel de valor branco “0”. Então, para todos os valores possíveis do CX deve-se inicializar uma variável VMPS[CX] de um bit (o bit MSB da variável ST[CX]) com o valor “0” a fim de se iniciar o processo de codificação,
sendo que os estados de estimação de probabilidade são inicializados com o valor “0” (os primeiros bits da variável ST[CX]).
O registrador IC é inicializado com o valor ‘0X10000”; o registrador C com o valor
“0”; o contador CT com o valor 11 (um byte de p e 3 bits de ss, conforme Tabela (5.1)) e o contador de pilha SC com o valor “0”. A Figura (5.2) mostra o fluxograma da rotina INITC. Para todos os CX ST[CX] = 0 VMPS[CX] = 0 C = 0 IC = 0x10000 CT = 11 SC = 0
Fig. (5.2)- Fluxograma da rotina INITC.
2) A Rotina CODIF
Essa rotina tem como função verificar se o pixel corrente do fluxo PIX a ser codificado é igual ou não ao valor de pixel de maior ocorrência VMPS[CX]. Nesse caso, a verificação é feita todas as vezes que o CAA ler um pixel do fluxo PIX de entrada. Caso sejam iguais, internamente, essa rotina solicita a chamada da rotina MPSCOD para codificar o pixel de maior ocorrência. Caso contrário, a rotina prepara-se para
Capítulo 5 - As Rotinas de Implementação 65
executar a LPSCOD a fim de gerar o processo de CAA onde se codifica o pixel de menor ocorrência. A Figura (5.3) mostra o fluxograma de rotina CODIF.
SIM LPSCOD NÃO PIX = VMPS[CX] MPSCOD
Fig. (5.3)- Fluxograma da rotina CODIF.
3) A Rotina MPSCOD
Basicamente, a função dessa rotina é codificar qualquer pixel com maior ocorrência dentro do fluxo de dados binários PIX de entrada.
O processo começa realizando uma operação de redução de tamanho do intervalo IC como ilustrado anteriormente na equação (3.2), produzindo-se o intervalo IN
(MPS). Se o valor do tamanho do intervalo IN (MPS) for superior ao limite “0x8000”,
nada acontece e a rotina é terminada. Caso o limite for inferior a “0x8000”, uma verificação é feita para saber se o valor do intervalo IN (MPS) é menor do que o valor do
sub-intervalo LPS (LSZ[ST[CX]]). Caso isso seja verdade, uma troca condicional (MPS/LPS) é feita e o sub-intervalo LPS será codificado em vez do sub-intervalo MPS. A rotina calcula o valor da base CN (LPS) usando a equação (3.3) e o tamanho do sub-
estado de estimativa de probabilidade do valor do CX particular relativo ao sub-intervalo IN (MPS), utilizando a tabela de estimação de probabilidade [Apêndice A2], tanto para
esse caso quanto para o caso em que o intervalo IN (MPS) é maior do que LSZ[ST[CX]].
Finalmente, a rotina MPSCOD chama a rotina RENORMCOD para renormalizar os registradores IC e C. A Figura (5.4) mostra o fluxograma da rotina MPSCOD.
SIM IC = IC – LSZ[ST[CX]] RENORMCOD NÃO SIM NÃO IC < 0x8000 IC < LSZ C = C + IC IC = LSZ[ST[CX]] ST[CX] = NMPS[ST[CX]]
Capítulo 5 - As Rotinas de Implementação 67
4) A Rotina LPSCOD
A função básica dessa rotina é codificar qualquer pixel com menor ocorrência do fluxo PIX de entrada.
O início dessa rotina é semelhante ao da rotina MPSCOD para a determinação do valor do sub-intervalo MPS. Em seguida, compara-se o intervalo IN (MPS) com o
sub-intervalo LPS. Caso o intervalo IN (MPS) seja maior, então o intervalo IN (MPS) é
somado com sua base CN (MPS) para produzir a base CN (LPS) do sub-intervalo LPS
conforme a equação (3.3).
O intervalo IN (LPS) é ajustado para o valor LSZ[ST[CX]] através da equação
(3.1). Após isso, tanto para esse caso quanto para o caso contrário (equivalente de MPS/LPS), a rotina utiliza a tabela de estimação de probabilidade [Apêndice A2] para verificar o valor do SWTCH[ST[CX]] do estado do valor do CX que está sendo codificado. O SWTCH é um sinal de aviso indicando que o valor do pixel com maior ocorrência tem mudado.
O pixel com maior ocorrência é o que está na variável VMPS[CX]). Se SWTCH[ST[CX]] = 1, sendo que a rotina converte o valor “0” ( ou “1”) da variável VMPS[CX] para o valor “1” (ou “0”), e fica sem fazer nada caso SWTCH[ST[CX]] = 0.
A rotina continua para consultar o novo estado de estimação de probabilidade do valor de CX relativo ao sub-intervalo IN (LPS) utilizando-se a tabela de estimação de
probabilidade [Apêndice A2].
No passo seguinte, a rotina RENORMCOD é chamada. A Figura (5.5) mostra o fluxograma da rotina LPSCOD.
SIM IC = IC – LSZ[ST[CX]] RENORMCOD NÃO SIM NÃO IC < LSZ SWTCH = 1 C = C + IC IC = LSZ[ST[CX]] VMPS[CX] = 1 - VMPS[CX] ST[CX] = NLPS[ST[CX]]
Fig. (5.5)- Fluxograma da rotina LPSCOD.
5) A Rotina RENORMCOD
Essa rotina é chamada pelas rotinas MPSCOD e LPSCOD para renormalizar os registradores IC e C. A rotina realiza um deslocamento do conteúdo dos registradores
para a esquerda. Enquanto o valor do registrador IC for inferior ao limite “0x8000”, a
rotina volta novamente para renormalizar os dois registradores. Durante esse tempo, o conteúdo do contador CT é subtraído de um valor igual a “1”. Em seguida, a rotina faz questão de testar o conteúdo de contador CT. Se for igual a “0”, a rotina BYTEOUT é chamada para transmitir ou armazenar um byte de palavra código PC. O fluxograma da rotina RENORMCOD está mostrado na Figura (5.6).
Capítulo 5 - As Rotinas de Implementação 69 NÃO BYTEOUT SIM SIM NÃO CT = 0 IC < 0x8000 IC = IC << 1 C = C << 1 CT = CT - 1
Fig. (5.6)- Fluxograma da rotina RENORMCOD.
6) A Rotina BYTEOUT
Essa rotina é chamada pela rotina RENORMCOD. Ela tem uma variável temporária TEMP para armazenar um byte (no lado MSB) do registrador C (os bits de p, conforme Tabela (5.1)) juntando-se o bit de “carry” (o bit de c na Tabela (5.1)) a fim de se fazer o teste de “carry-over”.
O processo começa com o deslocamento do conteúdo do registrador C, 19 vezes para a direita. O resultado é transferido para a variável TEMP. Em seguida, a rotina testa o conteúdo de TEMP, ou seja, testa a ocorrência do “carry-over”. Existem três casos para teste conforme estão descritos a seguir:
1. Se o conteúdo for maior do que o valor “0xff”, isso significa que há “carry-over”. Esse “carry-over” deve ser somado com a saída recente de dados que está no
BUF. Após isso, a rotina transmite ou armazena o conteúdo do BUF. Em seguida, a rotina transmite o valor “0x00” SC vezes, em outras palavras, transmite SC bytes de valor “0x00”. Assim, zera-se o conteúdo do contador SC. No último passo, uma nova tentativa de dados de saída é determinada colocando-se o conteúdo de TEMP no BUF sem nenhum “carry”;
2. Se o conteúdo for menor do que o valor “0xff”, isso significa que o problema do “carry-over” está resolvido. A rotina transmite ou armazena o conteúdo de BUF. Logo, em seguida, transmite o valor “0xff” SC vezes, e o conteúdo do contador SC é zerado. O novo valor é armazenado no BUF e é igual ao valor de TEMP;
3. Se o conteúdo for igual ao valor “0xff”, não se transmite nenhum dado de saída e o conteúdo do contador SC é incrementado de um valor igual a “1”.
Finalmente, após o procedimento de teste, a rotina ajusta o valor do registrador C. O conteúdo será os fracionais do valor de base de intervalo IC (os bits de b, conforme
Tabela (5.1)) mais os bits de “carry-over” (os bits de s). O conteúdo do contador CT é ajustado para o valor 8. A Figura (5.7) mostra o fluxograma da rotina BYTEOUT.
Capítulo 5 - As Rotinas de Implementação 71 SIM TEMP = C >> 19 NÃO SIM NÃO TEMP > 0xff SC = SC + 1 Write BUF Write 0xff SC vezes SC = 0 BUF = TEMP TEMP = 0xff C = C & 0x7ffff C T = 8
Write (BUF = BUF + 1) Write 0x00 SC vezes
SC = 0 BUF = TEMP & 0xff
BUF < 0 NÃO BUF < 0 NÃO SIM SIM
Fig. (5.7)- Fluxograma da rotina BYTEOUT.
7) A Rotina FIMC
Essa rotina internamente chama duas rotinas. A primeira é a rotina ZERARBITS e a segunda é a rotina ESCREVFIM, como mostra a Figura (5.8).
ZERARAFIM
ESCREVFIM
8) A Rotina ZERARBITS
O conteúdo do registrador C é ajustado para um valor dentro do intervalo [C, C + IC – 1] com o maior número, de bits “0”, possível [6]. A Figura (5.9) mostra o fluxograma
dessa rotina. SIM TEMP = (IC – 1 + C) NÃO TEMP < C C = TEMP C = TEMP + 0x8000
TEMP = TEMP & 0xffff0000
Fig. (5.9)- Fluxograma da rotina ZERARBITS.
9) A Rotina ESCREVFIM
A função dessa rotina é resolver o problema de “carry-over”. É semelhante a rotina BYTEOUT. A rotina testa a ocorrência do “carry-over”. Se ocorrer, um teste do conteúdo do BUF é feito. Se o conteúdo for maior ou igual a “0”, envia-se o conteúdo do BUF somado de um valor igual a “1” para a saída e em seguida, o valor “0x00” é enviado SC vezes. Se não ocorrer “carry-over”, a rotina faz também um teste do conteúdo do BUF. Se for maior ou igual a “0”, o conteúdo do BUF é enviado para a saída e seguido pelo valor “0xff” SC vezes. Finalmente, 2 bytes do registrador C são
Capítulo 5 - As Rotinas de Implementação 73
transmitidos sendo que isso serve também se o conteúdo do BUF for menor do que “0”. A Figura (5.10) mostra o fluxograma dessa rotina.
SIM C = C << CT NÃO SIM NÃO C > 0x7ffffff BUF < 0 Write BUF + 1 Write 0x00 SC vezes NÃO BUF < 0 Write BUF Write 0xff SC vezes Write (C >> 19) & 0xff Write (C >> 11) & 0xff
Fig. (5.10)- Fluxograma da rotina ESCREVFIM.