# SmartDecimate

## Abstrato

autor: SmartDecimate por Kevin Atkinson
versão: v0.23 (C plugin, para ser carregado com LoadCPlugin)
dowload: http://www.avisynth.org/warpenterprises/
categoria: Remoção de Desentrelaçamento & Pulldown
requisitos: YV12 & YUY2 Colorspace

Smart Decimate remove o telecine combinando campos de telecine e dizimando ao mesmo tempo, que é diferente da aproximação tradicional de igualar quadros de telecine e então removendo duplicatas. A mais recente versão do "Smart Decimate" pode ser achado em http://kevin.atkinson.dhs.org/tel/.

## Tabela de Conteúdos

- Uso Básico
- Guia para o Uso
- Referência de Filtro
- Entendendo como SmartDecimate Trabalha
- Afinando o T_Max
- Usando um Pós Desentrelaçador
- Decimate inteligente vs Decomb
- Outras Coisas para Tentar com Smart Decimate
- Avisos
- Compilando
- Palavras Finais
- Log de Mudanças

## Uso Básico

    LoadPlugin("...\avisynth_c.dll")
    LoadCPlugin("...\SmartDecimate.dll")
    AssumeTFF() # ou AssumeBFF()
    SmartDecimate()

Note que o segundo plugin é LoadCPlugin e não LoadPlugin. (Tem um C depois de Load)

É MUITO IMPORTANTE QUE A ORDEM DE CAMPO SEJA CORRETA.

## Guia para o Uso

Para este guia assumirei que seu material é pulldown 3:2 com algum possível vídeo misturado dentro. Porém, SmartDecimate pode controlar alguma relação de dizimação fixa.

Para usar este filtro, você tem que primeiro determinar a ordem de campo correta. Se a ordem de campo estiver errada, meu filtro não trabalhará corretamente. Para determinar a ordem de campo:

    AviSource(...)
    AssumeTFF()
    Bob()

Agora preveja o vídeo e procure movimento para trás. Se não ver, então você deve usar "assumetff()". Se vê algum, tente:

    AviSource(...)
    AssumeBFF()
    Bob()

E mais uma vez procure movimento para trás. Se não vê nenhum desta vez, você deve usar "assumebff()"

Agora é hora de montar meu filtro:

    LoadPlugin("...\avisynth_c.dll")
    LoadCPlugin("...\smartdecimate.dll") # note o C em loadCplugin
    AviSource(...)
    AssumeTFF() # ou AssumeBFF() como determinado acima
    SmartDecimate()

Se você estiver satisfeito com o resultado, então isso é tudo que é necessário. Se não, prossiga lendo.

Se seu material for anime com muitos quadros repetidos, então você deve tentar:

    SmartDecimate(tel=0.60)

Isto deve evitar qualquer subir e descer (tremer) em seqüências longas sem movimento.

O valor "tel" controla a agressividade do filtro ao comparar os campos. O valor padrão é 0.50.

Se você tiver um vídeo misturado com uma grande quantia de vídeo verdadeiro, então você pode abaixar "tel" para baixo tanto quanto 0.25. Isto arriscará o subir e descer (tremer) alguns quadros progressivos, mas não deve entrelaçar verdadeiros quadros de vídeo que podem deixar artefatos pentes.

Se você tem um vídeo de puro pulldown 3:2 com muitos poucos quadros de vídeo verdadeiro, então pode tentar aumentar "tel" para 0.75. Isto fará SmartDecimate ser realmente agressivo ao comparar campos progressivos. Porém, acabará deixando para trás sérios artefatos pentes se houver qualquer vídeo puro no clipe.

Se tiver um vídeo realmente ruidoso, então vai precisar elevar o fator de ruído como:

    SmartDecimate(noise=0.80)

O valor padrão é 0.50. Deixe em padrão a menos que seu clipe seja muito ruidoso. Valores mais altos de ruídos freqüentemente deixarão por trás mais artefatos pentes para quadros de vídeo puros.

Se você tem um clipe realmente limpo e nota alguns artefatos pentes em quadros de vídeo puros, então pode abaixar o fator de ruído. Mas cuidado: se for muito baixo, SmartDecimate não poderá comparar os campos progressivos e assim poderá tremê-los.

Finalmente, se você tem um vídeo híbrido (pulldown 3:2 misturado e verdadeiro vídeo), deve considerar substituir o estúpido "bob" com algo como DgBob ou SmoothDeinterlace. Para fazer isso, use a opção "bob". Por exemplo:

    SmartDecimate(bob=DgBob(...))

Isto melhorará grandemente a qualidade dos quadros de vídeo puros. Note que a fonte do "bob" só afeta os quadros renderizados. Não é usado para comparar campos. Nem é usado por qualquer outra parte de SmartDecimate.

## Referência de Filtro

O filtro trabalhará com entradas YUY2 ou YV12.

O uso é:

`SmartDecimate` ([numr, denm], options)

O numerador e o denominador são para a relação de dizimação para o vídeo depois de separado em campos. O padrão é 24 e 60 respectivamente para numr e denm.

As opções seguintes podem ser usadas para direcionar SmartDecimate:

bob

uma fonte alternativa de quadros desentrelaçados por "bob". O padrão é "Bob()" que é filtro "bob" interno bobo AviSynths. Para resultados melhores, use um "bob" inteligente como DgBob ou SmoothDeinterlace. As fontes "bob" sãos usadas sempre que SmartDecimate determina que um campo não é parte de um quadro progressivo.

weave
uma fonte alternativa de quadros entrelaçados. O padrão é "DoubleWeave()".

tel
um número entre 0 e 1 que controla a agressividade do filtro ao comparar campos. 0.50 (padrão) trabalhará bem com a maioria dos clipes. Quanto mais alto o valor, maior o risco de deixar artefatos pentes em material entrelaçado verdadeiro. Quanto baixo o valor, maior o risco para tremer (ou em caso extremo saltar ou duplicar) quadros de Telecine.

Atualmente tel pina várias opções internas que dependem ao qual é fixado, mas há inversores para: 0.45, 0.55, 0.65 e 0.72.

noise
O fator de ruído. O valor padrão, 0.50, deve trabalhar na maioria dos casos.

t_max
Um método alternado de fixar o fator de ruído. Você precisa entender como meu filtro trabalha para usar.

cpu
Força a CPU a um tipo particular. Normalmente é auto detectado. Para ver se é detectado corretamente "turn logging on". A primeira linha da saída exibirá o tipo de CPU. Valores válidos atuais para este valor são: 0 - Genérico, 2 - Inteiro SSE, 3 - SSE, 4 - SSE2.

unaligned
Permite leitura de dados não alinhados. Normalmente SmartDecimate pode ignorar alguns píxeis no início ou fim de cada linha, de forma que as leituras sejam bem alinhadas. Fixando este valor em true previne isso.

As opções seguintes podem ser usadas para controlar a impressão de informação útil:

log_level

A verbosidade da informação imprimida. O padrão é 2.

log_file
Se fixo, toda a saída irá ao arquivo especificado.

console
Se fixo em true, então uma janela de console aparecerá e toda a saída será enviada a ela.

debug_print
Se fixo, então toda a produção que usa a chamada de sistema OutputDebugString será impressa. Você pode ver essa saída com um utilitário como DebugView.

O significado da informação imprimida é como segue:

- "Reseting to NUM" significa que as variáveis internas são reajustadas e qualquer padrão é reajustado. Isto acontecerá sempre que o vídeo é acessado de um modo não linear.
- "FRAME 3 = [3, 4]" indica como o quadro número 3 (por exemplo) está sendo renderizado. Aqui 3 indica o campo da fonte primária que é escolhida. Se o quadro for renderizado entrelaçando dois campos juntos, os números em [ ] indicam quais campos de fonte são escolhidos. Se o quadro for desentrelaçado "bob" os em [ ] serão ao invés "BOB".
- "Diff NUM: WHAT DIFF" indica a diferença entre o campo de fonte NUM e NUM+1. QUE é a classificação da diferença com 0 significando o mesmo, 1 semelhante e 2 diferente. DIFF é a diferença numérica.

As opções seguintes podem ser usadas para afinar parâmetros internos. Para entender o que eles fazem, você precisará olhar para a fonte. Eles podem ser mudados entre os lançamentos.

- max_last_set - inteiro positivo
- t1_def, t2_def, t1_max, t2_max - flutuante entre 0.0 e 1.0
- floor - flutuante entre 0.0 e 1.0
- floor_adj = flutuante maior que 0.0
- sml_peak, lrg_peak - flutuante mais largo que 1.0
- sml_tail_diff, lrg_tail_diff - flutuante mais largo que 0.0

## Entendendo como o SmartDecimate Trabalha

Esta discussão assume que o leitor está familiarizado com vídeo entrelaçado e sabe o significado de tais condições como quadro, campo, campo de topo, campo de fundo, BFF, TFF, telecide, telecine, pulldown 3:2, etc..

Outros filtros telecide geralmente removem telecine em um processo de dois passos. Os primeiros campos de telecine são comparados, mas a taxa de quadro não é mudada, então quadros duplicados são retirados. SmartDecimate não trabalha deste modo. SmartDecimate ao invés, combina campos de telecine e dizima a taxa de quadro ao mesmo tempo.

A mesma primeira coisa que SmartDecimate faz é usar "SeparateFields()", que dividirá o vídeo em campos individuais que também dobrarão a taxa de quadro. Então o campo número 9 realmente é o campo de fundo do quadro 4 (assume que o vídeo é TFF) antes de separá-lo em campos. Para simplicidade, eu vou me referir sempre deste modo aos campos do vídeo fonte.

SmartDecimate seleciona campos então em um padrão regular, tentando evitar selecionar campos duplicados. Mais precisamente, deixa N ser o número de quadro do destino e R ser a relação que para pulldown 3:2 será 24/60 = 2/5, então SmartDecimate escolhe entre floor(N/R de campo) e floor(N/R) + 1. Por exemplo, para quadro de destino número 5, usando pulldown 3:2 típico, SmartDecimate vai escolher o campo 12 ou 13. Qual escolhe é bem complicado e algo que eu não terei aqui.

Depois que um campo fonte for escolhido, precisa decidir como renderizar. SmartDecimate escolhe entre: 1) comparando com o campo prévio, 2) comparando com o próximo campo, ou 3) com desentrelaçamento bob. Como escolher é baseado na semelhança com o campo prévio ou com o próximo campo. Se o campo é igual ao prévio ou ao próximo campo, comparará com aquele campo entrelaçando os dois campos. Se não puder achar um campo igual, desentrelaça o campo atual com "bob". SmartDecimate realmente não faz a renderização final. Ao invés usa o filtro "anther" do AviSynth para fazer este trabalho. No caso de entrelaçar, usará DoubleWeave() e no caso de "tremer", usará Bob() ou um filtro "bob" inteligente se houver.

## Afinando T_Max

Para descobrir quais campos são diferentes e quais são iguais, SmartDecimate procura picos em diferença de string. São determinados três valores que representam a diferença entre quatro campos sucessivos A B C D, se AC (i.e. a diferença entre B e C) > AB e BC > CD e AB e CD são próximos em valor com os campos A e B, provável que sejam os mesmos, campos B e C provável que sejam diferentes e campos C e D provável que sejam os mesmos.

Porém, este método não é perfeito e às vezes pode classificar cenas de grande movimento quando valores de diferença semelhantes entre quadros (que AB e CD são os semelhantes) como sendo o mesmo. Assim, para controlar isso, SmartDecimate simplesmente assume todos os campos com uma diferença maior que um percentual fixo não pode ser possivelmente o mesmo. Infelizmente não há nenhum ótimo valor por este percentual, assim é fixo um valor razoável que deve ser bom para a maioria dos clipes que não sejam extremamente ruidosos. Porém, este valor geralmente deixará alguns campos diferentes pelo qual conduzirá a artefatos pentes. Para evitar isto, o percentual "t_max", deve ser fixado o mais baixo possível.

Para descobrir qual o melhor valor para "t_max" para um clipe em particular, você precisará saber quais as diferenças entre os quadros. O modo mais fácil para fazer isto é fixar a opção "log_file " (com o nível de log em 2 ou mais alto) e rodar SmartDecimate em uma boa porção do clipe. Uma vez feito, você deve ver algo como o seguinte no arquivo log:

    ...
    Diff 827: 0 6.11586e-008
    FRAME 331 = [828,827]
    Diff 828: 2 8.21554e-005
    Diff 829: 0 3.69098e-008
    Diff 830: 0 3.27322e-008
    FRAME 332 = [830,831]
    Diff 831: 2 0.000124936
    Diff 832: 0 6.48069e-008
    FRAME 333 = [832,833]
    Diff 833: 2 0.000102379
    Diff 834: 0 3.54472e-008
    ...

As linhas que você está interessado são as que começam com "Diff....". O primeiro número depois de Diff é o número do campo fonte. O segundo número é a classificação da diferença, com 0 significando o mesmo, 1 semelhante e 2 diferente. O número final é a diferença atual. O que você está interessado é a diferença de quadros classificada como a mesma. Você quer fixar t_max para ligeiramente acima do valor máximo de todas as diferenças classificadas como as mesmas. Para este clipe 7.0e-8 pode ser um bom valor. Mas desde que eu só olhei uma pequena porção do clipe, ele pode precisar ser mais alto, porque as diferenças podem variar a uma quantia grande. É melhor olhar o valor por várias áreas diferentes do clipe para ter um valor seguro. Assumindo que 7.0e-8 é um valor bom eu posso usar isto:

    SmartDecimate(t_max=0.000000070)

Eu escrevi 0.000000070 em vez de 7.0e-8 porque AviSynth parece não suportar notação científica. Para estar seguro que converteu o número corretamente, fixe o nível de log para 3 ou mais alto e procure uma linha assim:

    t1_max = 7.00000e-008  t2_max = 2.10000e-007  max_last_set = 13

O valor que você interessa é t1_max é 7e-8. Assim, converti o número corretamente. Os outros valores são para outros percentuais internos.

Uma vez que você pensa ter achado um bom valor para t_max, rode de novo seu clipe, apesar de SmartDecimate ter um log de nível fixo em 3 ou mais alto, para ter certeza que não o fixou muito baixo. Se você o fixa baixo, um número excessivo de quadros fica tremido (bobbed) e você verá mensagens como:

    2001: T1 Maxed Out at 2.00000e-008

Estas mensagens são normais para as verdadeiras partes do vídeo, mas não devem ser vistas nas partes de telecine do clipe. Se você os ver, significa que t_max é muito pequeno e precisa ser elevado. O valor exato pode ser descoberto olhando as diferenças dos quadros em volta. Por exemplo:

    ...
    Diff 1999: 2 3.08506e-008
    Diff 2000: 1 4.03734e-008
    Diff 2001: 2 8.89810e-006
    Diff 2002: 1 2.93221e-008
    ...

indica que t_max deve ser pelo menos 4.04e-8, mas 4.5e-8 é um valor mais seguro.

Finalmente, note que "t_max" e "noise" controlam o mesmo parâmetro interno que é "t1_max". Eles apenas fazem isso de modo diferente. "t_max" fixa-o diretamente enquanto "noise" fixa indiretamente, baseado em uma fórmula exponencial. Como no SmartDecimate 0.21 esta fórmula é:

    t1_max = exp(17.65*noise - 20.71)

Mas os parâmetros exatos podem mudar entre os lançamentos. A idéia é que um valor "noise" de 0.50 (padrão) deve trabalhar bem com a maioria dos clipes enquanto que 0.80 pode ser usado em clipes realmente ruidosos, etc.

## Como Usar um Pós Desentrelaçador

Idealmente, os campos renderizados por SmartDecimate não precisariam ser desentrelaçados se os parâmetros são afinados corretamente. Realisticamente, um pós desentrelaçador poderia ser útil. Porém, desde que SmartDecimate trabalha em campo em lugar de nível de quadro, há algumas coisas para estar atento.

A maioria dos desentrelaçadores trabalha sempre escolhendo o campo do topo (ou talvez do fundo) como o campo de domínio e seletivamente jogando a informação no outro campo e então interpolando ou misturando. Para 30 fps normal (ou 25 fps PAL) esta é a coisa correta a fazer. Porém, para a saída de SmartDecimate, isto não é correto porque o campo dominante não é sempre o mesmo. Dependerá em qual campo SmartDecimate escolhe originalmente do vídeo de fonte e pode ser o campo de topo ou de fundo. Assim, um desentrelaçador tradicional pode jogar o campo errado. Isto pode nem mesmo ser notado, mas você deve estar atento.

Autores de filtros desentrelaçadores podem corrigir este problema prestando atenção à paridade do quadro. SmartDecimate sempre informará a paridade do campo original escolhida como a paridade do quadro final renderizado. Se a paridade for true, então o campo de topo deve ser escolhido. Se é false, o campo de fundo. Também estarei disposto a passar sugestões para o desentrelaçador indicar quais campos estão tremidos se alguém me falar como.

## Relacionamento com Movimentos Indesejáveis

Usando a opção weave, você pode usar clipes diferentes para a entrada e saída. Isto é útil para lidar com subtítulos ou outro movimento que você não quer considerar ao comparar quadros. Por exemplo, ao aparar subtítulos você pode tentar.

    b = Bob()
    w = DoubleWeave()
    CropBottom(64)
    SmartDecimate(bob = b, weave = w)

Então, o vídeo produzido não será aparado, mas as últimas 64 linhas não serão vistas por SmartDecimate. Se você usar este método, a fonte "bob" também deve ser especificada. Se você não especificar, então tentará usar o clipe de entrada para "Bob()". Mas o clipe resultante não terá as mesmas dimensões como a fonte weave.

## Decimate inteligente vs Decomb

Antes de Decomb 5 de Donald Graft (aka Neuron2), os filtros telecine tradicionais (que trabalham comparando primeiro os campos de telecine e dizimando e removendo quadros duplicados) teve uma tendência em duplicar quadros. Com Decomb 5 parece que Donald resolveu o problema. Não obstante, a aproximação SmartDecimate tem várias vantagens sobre aproximação Decomb e vice-versa. Então nenhum dos dois é necessariamente melhor que o outro. Qual o filtro que você deve usar, depende da fonte do material e a taxa de quadro designada.

### Material de Pulldown 3:2 Limpo

Ambos Smart Decimate e Decomb trabalham bem. Decomb ainda pode deixar algumas duplicatas de quadros para material de pulldown 3:2 altamente irregular. Smart Decimate por outro lado, pela forma de trabalhar, geralmente não, mas pode acabar tremendo alguns quadros, o que não deveria. Em meus testes informais Smart Decimate é ligeiramente mais rápido que Decomb quando o seu pós processamento é desativado. Com o pós processamento Smart Decimate é muito mais rápido.

### Vídeo Pulldown e Entrelaçado Híbrido 3:2

Se por qualquer razão você desejar deixar o vídeo com 30 fps, então use Decomb. Smart Decimate poderá comparar quadros de telecine ao ir de 60 - > 30 fps mas também duplicará quadros. Decomb tem um modo especial para lidar com isto velando quadros, que podem dar movimento mais suave.

Se sua taxa de quadros designada for 24 fps, então a escolha fica baseada ao gosto pessoal, pois ambos, Smart Decimate e Decomb controlam a situação completamente diferente e com resultados muito diferentes.

Smart Decimate controlará o vídeo selecionando quadros de uma fonte tremida (duas vezes a taxa de quadro) em um padrão 3:2. Quer dizer, vai de 60 - > 24 fps. Isto conduz a movimento bastante suave sem ter que recorrer a toldar quadros juntos. Porém, o vídeo ainda é ligeiramente sacudido. Em minha experiência, o sacudido leve não é geralmente perceptível exceto quando há texto rolando. Por exemplo, ao dizimar rolando créditos, os resultados são terríveis. Desde que quadros tremidos são usados, você também terá alguns artefatos tremidos. Os resultados não serão muito bons a menos que um "bob" inteligente seja usado.

Por outro lado, Decomb tentará dizimar o vídeo verdadeiro indo de uma fonte 30 fps desentrelaçada para 24 fps. Faz de dois modos. A primeira coisa que pode fazer é tirar um de cada 5 quadros. Esta aproximação levará a resultados extremamente aos trancos. A outra coisa que pode fazer é misturar os quadros. Esta aproximação conduzirá a vídeo mais suave que a aproximação Smart Decimate, mas com artefatos indesejáveis. Áreas móveis da imagem geralmente serão borradas. Com muito movimento, pode aparecer imagens duplas que pode ser difícil seguir o movimento. Quadros borrados também afetam negativamente a compressão porque faz o movimento mais difícil.

### Híbrido Progressivo com 30 fps

Se o vídeo tiver uma quantia decente de verdadeiro material progressivo 30 fps, então é melhor com Decomb. Pela natureza do meu filtro trabalhar, tirará um quadro a cada 5 ao converter a 24 fps.

Decomb por outro lado, vê vídeo entrelaçado e progressivo 30 fps como a mesma coisa e poderá assim velar quadros para suavizar movimentos. Se o clipe é principalmente vídeo progressivo 30 fps com um pulldown 3:2, Decomb também pode manter em 30 fps e misturar o material pulldown com melhores resultados.

### Padrões de Telecine Diferentes

Se seu padrão de telecine não é pulldown 3:2 (ou 25 fps progressivo no caso de PAL) e você quer tentar restabelecer à sua taxa de quadros original, deve tentar ambos Smart Decimate ou Decomb e ver qual trabalha melhor. Eu não tenho nenhuma experiência nesta área, assim eu realmente não sei.

## Outras Coisas para Tentar como Smart Decimate

Aqui estão algumas outras coisas que você pode tentar com Smart Decimate, que não podem ser feitas com telecine tradicional como filtros Decomb.

### Bob Melhor de Material de Telecine

Se seu material contém materiais de telecine e você quer desentrelaçar tremidos para obter 60 fps deve tentar:

    SmartDecimate(1,1, tel=0.25, bob=DgBob(...))

que conduzirá a melhores resultados que usando só DgBob (ou mais outros filtros "bob" inteligentes), desde que os quadros de telecine são duplicados em lugar de desentrelaçados tremidos. Isto pode fazer uma grande diferença com anime.

### Lidando com Telecine com Quadros Borrados

Se você estiver lidando com muitos quadros borrados, aqui há algo a tentar. Use SmartDecimate(1,1) e tente escolher os quadros não borrados e que sejam duplicados, pelo menos uma vez. Você pode fazer o passo posterior com Dizime() do pacote Decomb ou MultiDecimate. Eu não tenho idéia se isto trabalhará bem e também nunca tentei, mas eu mencionaria isso caso alguém tenha interesse.

## Avisos

Quando a otimização de MMX/SSE é usada SmartDecimate pode ignorar até 6 (14 para SSE2) píxeis no início ou fim de cada linha, de forma que as leituras de memória fiquem alinhadas. Se isso lhe aborrece, então fixe "unaligned" para true, que forçará SmartDecimate a usar o código não otimizado ao ler dados de quadro.

SmartDecimate advertirá sobre quaisquer píxeis ignorados se o nível "logging" for fixo a nível 0 ou mais alto.

## Compilando

Para compilar SmartDecimate você precisará instalar Gcc e Nasm e talvez GNU Make. Eu usei MinGW (2.0.0-3) com MSYS 1.09, Gcc 3.3.1, e Nasm 0.98.37. Com exceção de Nasm, todas as utilidades exigidas podem ser achadas na página MinGW Download. Outras configurações devem trabalhar, mas você vai precisar editar o Makefile. Uma vez que todas as ferramentas adequadas estão instaladas e no caminho, simplesmente digite:

    make

da interface MSYS e isso é tudo o que é requerido.

## Palavras Finais

Avaliação mais que apreciada. Por favor envie a kevin.tel no atkinson.dhs.org.

## Log das Mudanças

0.23 (16 de Setembro de 2003)

- Bug consertado.
- Melhorado ligeiramente o campo que compara algoritmo.

0.22 (12 de Setembro de 2003)

- Bugs consertados.
- Consertados os tipos na documentação graças ao Tom Daniel.

0.21 (7 de Setembro de 2003)

- Documentação grandemente ampliada para dar aos usuários uma melhor idéia de como o SmartDecimate trabalha e como usar seu potencial máximo.
- O tipo da CPU é agora auto detectada. Suporte ao SSE2 também é dado.
- Bugs consertados, especialmente ao trabalhar com dados desalinhados.
- Não ignora mais o último par de linhas (em alguns casos 11) de cada quadro.
- Agora usa DoubleWeave() para renderizar quadros entrelaçados em vez de ele mesmo fazer isso.
- Ao passar pelo vídeo, pode-se agora voltar atrás 60 quadros ou mais sem causar reajuste do padrão.
- Outras mudanças secundárias.

0.20 (29 de Agosto de 2003)

- Documentação expandida com um pequeno guia para usar SmartDecimate.
- Usa um campo melhorado que compara algoritmo.
- Conserto do bug na versão não aperfeiçoada ao lidar com entradas yv12.

0.12 (22 de Agosto de 2003)

- Agora pode controlar a saída que ia para o console nas versões anteriores.
- Agora pode modificar alguns parâmetros internos.
- Uma versão SSE aperfeiçoada é fornecida agora.

0.11 (18 de Agosto de 2003)

- Algoritmo de classificação grandemente melhorado.

0.10 (16 de Agosto de 2003)

- Lançamento inicial

`$Date: 2006/03/26 18:11:54 $ Portuguese translation by RoLon`