------------------------------------------------------------------------------
jump3r (codificador de MP3 embutido no LexSigner)
------------------------------------------------------------------------------

O LexSigner grava MP3 usando o jump3r, que e o codificador LAME portado para
Java por Ken Handel. Ele vai compilado dentro do LexSigner.jar, nos pacotes
"mp3" e "mpg", e substitui a dependencia de um FFmpeg do sistema com o
codificador libmp3lame.

O jump3r e software livre, distribuido sob a GNU Lesser General Public
License, versao 2 ou posterior (LGPL-2.0-or-later). O texto completo da
licenca acompanha esta distribuicao em COPYING-jump3r.txt.

LAME (do qual o jump3r e um porte) e distribuido sob a mesma licenca:
  Copyright (c) 1999-2011 The LAME Project
  Copyright (c) 1999-2008 Mark Taylor
  Copyright (c) 1998 Michael Cheng
  Copyright (c) 1995, 1996, 1997 Michael Hipp

COMO OBTER O CODIGO-FONTE
-------------------------
A LGPL da a quem recebe este programa o direito de obter o codigo-fonte da
biblioteca e de substitui-la por uma versao propria. O codigo-fonte do jump3r
usado nesta compilacao acompanha o LexSigner e pode ser pedido a:

    LexSigner — suporte@lexsigner.com.br

O QUE FOI MODIFICADO
--------------------
Uma unica alteracao dentro do pacote "mp3", em mp3/Lame.java: o metodo

    int lame_encode_buffer(LameGlobalFlags, short[], short[], int, byte[], int, int)

era privado e passou a ser publico. Nenhuma linha do algoritmo foi tocada.

Razao: a unica entrada publica do porte e lame_encode_buffer_int, que recebe
int[] e — ao contrario da funcao de MESMO NOME na API em C do LAME — NAO
divide por 2^16. Em C:

    in_buffer[0][i] = buffer_l[i] * (1.0 / (1L << (8*sizeof(int)-16)));

No porte, apenas:

    in_buffer[0][i] = buffer_l[i];

Quem seguir a documentacao do LAME e entregar amostras em escala de 32 bits
grava audio saturado sem receber erro nenhum. Medido com um seno de 1 kHz a
-1 dBFS, 192 kbps: pico +67,34 dB, 94,15% das amostras no talo, THD+N de
166.117%. Com a entrada short[] o erro deixa de ser possivel, porque o tipo
carrega a faixa.

O resto dos pacotes "mp3" e "mpg" vai como esta no jump3r.

A classe de conveniencia "lowlevel.LameEncoder", que acompanha o jump3r, NAO
e usada e nao vai embutida. Ela contem um defeito na montagem das amostras de
16 bits — os dois bytes entram mascarados com 0xff, o que destroi o sinal de
toda amostra negativa, e o valor ainda e deslocado 16 bits alem da faixa que o
nucleo espera. O resultado e audio saturado, gravado sem nenhum erro. O
LexSigner fala direto com o nucleo do LAME, em CodificadorMp3.java.
