O que é codificação de entropia?
A codificação de entropia é uma compressão sem perdas que usa, em média, menos bits para símbolos mais prováveis e mais bits para os menos prováveis. A codificação de Huffman e a codificação aritmética são métodos comuns.
Como funciona a codificação de entropia
Primeiro, um codec converte as informações de origem em símbolos cuja distribuição estatística pode ser modelada; em seguida, uma etapa de codificação de entropia representa as sequências prováveis de forma compacta. O decodificador precisa conhecer ou reconstruir as mesmas tabelas de códigos, contextos e estado para reverter essa representação. Essa etapa difere da quantização: ela pode reduzir a quantidade de bytes, mas não descarta intencionalmente os valores dos símbolos. Ela costuma ocorrer perto do final de um codificador de imagem, áudio ou vídeo e perto do início do respectivo decodificador.
Informações essenciais
- Um código de Huffman atribui a cada símbolo codificado sua própria palavra de código de comprimento variável, portanto não pode gastar menos de um bit em um símbolo, por mais previsível que ele seja. A codificação aritmética não tem esse limite mínimo. A especificação do VP8, cujo codificador booleano é uma variante de um codificador aritmético, desenvolve um exemplo em que um resultado tem probabilidade de 1/1024 e a menor taxa possível é de aproximadamente um centésimo de bit por valor. O ganho é maior em dados com distribuição muito desigual e desaparece quando ambos os resultados são igualmente prováveis, caso em que o mesmo texto apresenta um limite inferior de um bit.
- A codificação de entropia pode ser refeita sem alterar a qualidade. O
jpegtrando libjpeg-turbo reorganiza os coeficientes DCT comprimidos de um JPEG sem decodificar totalmente a imagem, e sua documentação descreve como sem perdas as mudanças para parâmetros de entropia otimizados, varreduras progressivas ou codificação aritmética. Paracjpeg, a mesma documentação informa que-optimizegeralmente deixa o arquivo um pouco menor e mantém inalteradas a qualidade da imagem e a velocidade de descompressão, enquanto o codificador fica um pouco mais lento e precisa de muito mais memória;jpegtranaceita a mesma opção. Ojpegtrannão pode alterar a configuração de qualidade e pode remover metadados: seu padrão,-copy comments, mantém os marcadores de comentário e descarta os outros metadados, portanto passe-copy allpara manter os dados Exif, um perfil ICC e outros marcadores extras. - Um codificador de entropia mais eficiente só ajuda se todos os decodificadores de destino o implementarem. No padrão JPEG, o processo sequencial básico usa codificação de Huffman, e a codificação aritmética está disponível apenas nos processos estendidos e sem perdas. A documentação do libjpeg-turbo alerta que o JPEG com codificação aritmética não é amplamente implementado e que muitos decodificadores não conseguem ler esse tipo de arquivo. Verifique os decodificadores aos quais você precisa oferecer suporte antes de habilitar um modo de entropia diferente do padrão.
- O decodificador precisa reproduzir exatamente as tabelas e o estado de probabilidade do codificador, portanto os danos se propagam além dos bytes corrompidos. A documentação do libjpeg-turbo informa que, sem marcadores de reinício, danos em um JPEG geralmente arruínam a imagem do ponto do erro até o final; com eles, os danos geralmente ficam restritos à parte que vai até o próximo marcador, e os marcadores ocupam espaço adicional. O JPEG redefine sua predição DC e suas estimativas de probabilidade aritmética a cada intervalo de reinício, o que permite retomar a decodificação nesse ponto. O
jpegtrannão emite marcadores de reinício por padrão, mesmo quando o arquivo de origem os contém, e não preserva o intervalo da origem:-restart Ninsere novos marcadores a cada N linhas de MCU, portanto escolha N explicitamente para manter essa proteção. Sua documentação lista-restartentre as opções que definem a representação codificada e classifica suas transformações como sem perdas, portanto um arquivo sem danos é decodificado para a mesma imagem com ou sem marcadores.
Quando a codificação de entropia é importante
Os desenvolvedores de codecs aplicam a codificação de entropia a coeficientes quantizados, resíduos de predição e outros valores estruturados, e sua eficiência depende de quanto o modelo de probabilidade corresponde aos dados. As demais pessoas a encontram como uma configuração do codificador: ferramentas JPEG oferecem tabelas de Huffman otimizadas ou codificação aritmética, e codificadores H.264 oferecem CAVLC ou CABAC. A etapa em si não descarta nada, portanto, para uma dada quantização, essas configurações equilibram o tamanho do arquivo, o custo de codificação e o suporte dos decodificadores.
Fontes
- Recomendação ITU-T T.81 (JPEG): definições de codificação de entropia, alternativas de Huffman e aritmética (seção 4.6), intervalos de reinício
- RFC 6386: formato de dados e guia de decodificação do VP8, seção 7 (decodificador booleano de entropia)
- Documentação de uso do libjpeg-turbo: cjpeg -optimize, -arithmetic, -restart e transformações sem perdas do jpegtran
- Documentação de codecs do FFmpeg: opção coder do libx264 (CABAC ou CAVLC)