FDecimate

Abstrato

autor: Donald A. Graft
versão: 1.0.1
download: http://neuron2.net/mine.html
categoria: Remoção de Desentrelaçamento & Pulldown 
requisitos: YV12 & YUY2 Colorspace

Introdução

O filtro FDecimate()não provê capacidades de dizimação estendidas disponíveis do Decimate(). Pode remover quadros de um clipe para alcançar a taxa de quadro desejada, retendo sincronização de áudio/vídeo. Remove preferencialmente quadros duplicados onde possível. (FDecimate significa "Free Decimate" e implica que a taxa de quadro produzida pode ser escolhida livremente e não é limitada em dizimação 1-in-N).

Constantemente estamos vendo aplicações onde dizimação tradicional 1-in-N não é suficiente. Quatro delas se salientam em particular.

Primeiro, televisão digital de Alta Definição (HD) entrega freqüentemente uma taxa de quadro dobrada, por exemplo, 59.94 fps for ATSC. Um filme progressivo com uma taxa de quadro nativo de 24 fps pode ser convertido a taxas de HD duplicando quadros em um padrão. Por exemplo para obter de 24 fps a 60 fps, podemos usar este padrão:

A A A B B C C C D D E E E F F ...

Nós podemos chamar este 3232... um padrão de duplicação de quadro. Outro exemplo é 25 fps a 60 conversão de fps que usa um padrão 3232232322.... A conversão de 60 fps à taxa de radiodifusão de 59.94 fps pode ser alcançada reduzindo a velocidade do vídeo e ajustando o áudio para igualar isso, ou excluindo uma das duplicatas a cada 1000 quadros. Em qualquer caso, nosso fluxo final tem muitas duplicatas e a aproximação tradicional 1-in-N de dizimação já não pode ser aplicada diretamente. Às vezes, sucessivas dizimações 1-in-N podem ser aplicadas, mas isto é incômodo. E enquanto Decimate(mode=2) é útil com muitas duplicatas, nem sempre tem êxito nesse respeito.

Segundo, anime é feito freqüentemente a 12 fps e convertido a 29.97 fps duplicando quadros, até certo ponto semelhante ao descrito acima. O resultado é o mesmo: um fluxo com muitas duplicatas que não são enviadas confiantemente pela dizimação 1-in-N.

Terceiro, muitos filmes mudos são transferidos a DVD incluindo duplicatas em padrões incomuns, porque as taxas de quadros originais não são 24 fps. Não é incomum ver clipes que requerem dizimação estranhas como 20 em 43. Às vezes estas dizimações estranhas podem ser atingidas, ou quase, por aplicação repetida de Decimate()  usando ciclos diferentes, mas isso é uma aproximação incômoda que nem sempre pode atingir as relações de dizimações exatas requeridas. FDecimate() permite a especificação de taxas de quadros arbitrárias e é então útil para recuperar as taxas originais destes filmes silenciosos.

Quarto, às vezes são feitos clipes a 120 fps para apresentar corretamente híbridos de filme e vídeo. Se desejarmos voltar às taxas de quadro normais, precisamos remover muitas duplicatas.

O filtro FDecimate() ajuda nestas situações. Um filtro mais antigo, MultiDecimate(), também tentou ajudar mas é uma implementação de dois passos que requer um programa externo adicional e é então incômodo. Também podia dessincronizaar o áudio se não usado com muito cuidado. Eu considero FDecimate()uma aproximação superior.

Por favor note que, enquanto FDecimate() pode ser usado para dizimação tradicional 1-in-N, é provavelmente preferível ficar com Decimate() para essas aplicações, porque não requer a colocação de um percentual  para detecção de duplicata quando usado em mode=0.

Esta versão suporta YUY2 e YV12 para Avisynth 2.5.

Se você está desejando saber como FDecimate() difere do filtro interno ChangeFPS() do Avisynth, a resposta é que FDecimate() pode preferencialmente entregar quadros únicos, evitando duplicatas onde possível.


Como Usar FDecimate()

Para alcançar bons resultados, é importante fixar corretamente a taxa de quadros e o percentual designados para detecção de duplicata. Primeiro consideremos a taxa de quadro designada.

Determinando a Taxa de Quadros Designada  - Se quiser só alcançar uma taxa de quadros designada conhecida, você pode prosseguir e fixar o parâmetro 'rate' para aquela taxa. Por exemplo, você pode saber que a fonte originada como filme 24 de fps. Mas freqüentemente temos um clipe com um padrão irregular de duplicatas e não sabemos que taxa de quadros deve ser designada. Este é freqüentemente o caso ao processar filmes silenciosos antigos.

A taxa de quadro adequada pode ser determinada com o seguinte procedimento. Ache uma seção do clipe que seja longo aproximadamente dez segundos e com movimento constante. Passe o vídeo sem dizimação e registre o padrão de duplicatas. Por exemplo, eu posso ver isto:

quadro novo seguido por uma duplicata
quadro novo 
quadro novo seguido por uma duplicata
quadro novo
quadro novo seguido por uma duplicata
quadro novo
...

Eu poderia registrar isso abreviado como: 212121... Agora precisamos determinar a relação do número dos quadros únicos ao número dos quadros totais. Para uma repetição do padrão 212121nós teríamos uma relação de 2/3. Você pode não ver uma repetição do padrão, mas não importa. Apenas conte o número de quadros únicos no período dos dez segundos e divida pelo número total de quadros naquele período.

A seguir, multiplicamos a relação determinada acima pela taxa de quadro do clipe não dizimado. Isto dá a taxa de quadro designada a ser usada se todas as duplicatas serão removidas. Você pode obter uma taxa de quadro estranha que não é normal. Se seu dispositivo de exibição designado for o monitor do computador, pode escolher usar aquela taxa estranha, porque o computador pode exibir àquela taxa. Mas se sua exibição designada for uma televisão, você deverá arredondar a taxa à mais próxima taxa normal. Veja a próxima seção, "Por que FDecimate() não Pode Ser Perfeito e o que Podemos Fazer Sobre Isso", para algumas sugestões adicionais sobre selecionar a taxa de quadro designada.

Determinando o Percentual para Detecção de Duplicata Se seu clipe não tem nenhuma duplicata e você quer simplesmente dizimar a uma taxa de quadro mais lenta, então este passo não se aplica e você pode fixar o parâmetro 'threshold' para zero (threshold=0). Se seu clipe tiver duplicatas e você as quer remover, então FDecimate() precisa de um modo para determinar quais são as duplicatas.

O processo é como segue. Aplique o filtro FDecimate() com o peso habilitado:

FDecimate(metrics=true)

Isto exibirá a diferença métrica para cada quadro (dizimação não é executada se metrics=true). Inspecione o métrico para os quadros duplicados. Você precisa achar um número tal que o métrico (peso) para todas as duplicatas está abaixo disto, enquanto o métrico para os quadros novos está acima disto. Esse número é o percentual para o qual deve ser fixado o parâmetro 'threshold'. Tem normalmente aproximadamente 1.0-2.5, mas pode diferir dependendo em como ruidoso é o clipe. É importante obter um bom valor para este percentual, portanto faça isso com muito cuidado, inspecionando várias seções do clipe.

Produzindo a Saída Dizimada Uma vez que a taxa de quadro designada e o percentual duplicado foi determinado, é fácil produzir o final dizimado. Assumindo que a nossa taxa de quadro designada é 20.8 fps, e nosso percentual duplicado é 2.1, nós usaremos esta chamada FDecimate():

FDecimate(rate=20.8,threshold=2.1)


Por que FDecimate() não Pode Ser Perfeito e o que Podemos Fazer Sobre Isso

Você pode achar que FDecimate() não opera perfeitamente em alguns clipes. Por exemplo, pode saltar uma quadro, ou pode deixar passar um quadro duplicado. Supomos que as coisas deveriam ser perfeitas, mas depois de pensar cuidadosamente nisso, podemos ver que a perfeição não é possível se precisarmos manter sincronia de áudio/vídeo.

A idéia que os perfeccionistas propõem é simplesmente descartar todos os quadros duplicados. Este processo tem êxito, a sincronia de áudio/vídeo é mantida se o padrão duplicado é consistente. Mas se o padrão é incompatível e freqüentemente não é, então a sincronia é comprometida. Para ver por que, considere este padrão duplicado (de fato visto num clipe no HD):

...3232323232321222212232323232...

A maioria do tempo, o clipe é 323232...que implica uma taxa de 24 fps para o clipe com as duplicatas removidas (a taxa de quadros fonte é 59.94 fps). Mas no meio do padrão, o número de duplicatas cai um tempo, o que implica uma taxa de quadros básica mais rápida. Se apenas derrubamos todas as duplicatas e mantemos os quadros únicos, estaremos tocando esta meia seção muito lenta a 24 fps. Esteja atento ao áudio sincronizado ao padrão antes da dizimação, porque tocando durante algum tempo assim lento conduzirá à assincronia de áudio/vídeo. Na realidade, o padrão acima sairá da sincronia antes de 200 milissegundos aproximadamente, o que é forte. Alguns golpes assim seguidos podem se livrar do áudio por bons segundos!

(Outro problema com a idéia de só eliminar todas as duplicatas é que clipes freqüentemente têm seções estáticas onde não há nenhum movimento. E não queremos jogá-los fora! É concebível detectar e tentar poupá-los mas é uma complicação adicional. O problema sério é o assunto de sincronização descrito acima).

Assim nós podemos ver isso na presença de variações das taxas de quadro subjacentes devido a padrões irregulares de duplicatas, perderemos a sincronia de áudio/vídeo se tentarmos usar a aproximação "perfeita". Tudo que nós realmente podemos fazer é forçar a taxa especificada, preferindo tentar a entrega de quadros únicos às duplicatas onde possível. FDecimate() usa esta estratégia.

Se temos tal clipe, no qual há seções fortuitas onde o número de duplicatas é reduzido, podemos saltar os quadros bons quando dizimarmos. Isto causa sacudidas perceptíveis na saída. O que podemos fazer sobre isso? Podemos tirar proveito do fato de que as duplicatas extras são menos visíveis que quadros excluídos. Se fixarmos a taxa de quadro designada mais alto, reteremos mais quadros da fonte, reduzindo assim as chances de saltar quadros. Claro que isto reterá mais duplicatas, também, mas isso é menos condenável. Para o exemplo do clipe do HD acima, pude fixar uma taxa de quadro de 30 fps em vez de 24 fps e assim alcancei resultados razoáveis e ainda produzi uma taxa de quadro normal.

Para completar eu incluo esta nota extra. É possível que as variações de taxa notadas acima poderiam ser bipolar, i.e, algumas reduzem a taxa subjacente e outras a aumentam. Aqui um exemplo:

32323232222222323232323333333332323232323...

Teoricamente poderíamos tentar dizimar perfeitamente (como descrito acima) e ficar atento à assincronia de áudio/vídeo resultante. Contanto que a assincronia permaneça dentro de limites aceitáveis, podemos produzir resultados "perfeitos". Se a assincronia mover-se para fora dos limites, teríamos que saltar ou duplicar um quadro. O problema com esta aproximação é que na prática nós nunca vemos tal clipe. O que vemos são clipes com uma taxa básica subjacente pontuada fortuitamente por um aumento dessa taxa (i.e., períodos curtos onde não há tantas duplicatas quanto esperadas pelo padrão).

Eu acredito assim que não há uma solução perfeita para clipes com variações de taxa de base fortuitas. Porém, eu sou receptivo a qualquer nova idéia que poderia melhorar as coisas. Por favor sinta-se à vontade para me contatar se tiver qualquer idéia para melhorar FDecimate().


Parâmetros do FDecimate()

A seguir a sintaxe para FDecimate() (substitua parameter_list com sua lista de parâmetros nomeados separada por vírgula):

FDecimate(parameter_list)

Aqui um exemplo:

FDecimate(rate=23.976,threshold=0.8,show=true)


rate (flutuante, padrão 23.976) Este parâmetro fixa a taxa de quadro de saída desejada. Serão removidas quadros do vídeo para alcançar esta taxa de quadro, mantendo áudio e vídeo em sincronia.

threshold (flutuante, padrão 1.0) Este parâmetro fixa a diferença do percentual métrico para detecção de duplicata. Se a diferença métrica entre dois quadros excede este limiar, é considerado que os dois quadros são diferentes e não duplicatas. Dirija-se ao "Como Usar FDecimate()" acima para uma explicação de como fixar este percentual corretamente.

metrics (true/false, padrão false) Este parâmetro é usado para determinar o próprio percentual para usar para detecção de duplicata. Quando é fixado true, nenhuma dizimação acontece e a diferença métrica para cada quadro é mostrada sobre o vídeo e na produção de DebugView. Dirija-se ao "Como Usar FDecimate()" acima para uma explicação de como fixar este percentual corretamente.

show (true/false, padrão false) Este parâmetro habilita informação a ser exibida no quadro. Também exibe a versão do software.

debug (true/false, padrão false) Este parâmetro habilita a informação a ser impressa por OutputDebugString(). Uma utilidade chamada DebugView está disponível para pegar essas strings. A informação exibida é igual à mostrada pela opção show acima.


Mudando os Padrões dos Parâmetros de FDecimate()

Se você não gosta dos padrões documentados acima, pode fixar os seus próprios padrões normais. Para anular os padrões, crie um arquivo deles no diretório de plugins do Avisynth. Por exemplo, para fixar o padrão threshold=2.0 para FDecimate(), faça um arquivo chamado FDecimate.def e ponha esta linha nele:

threshold=2.0

Você pode listar tantas tarefas de parâmetros quanto quiser, uma por linha. Esses não especificados assumem os valores de padrões documentados acima. Claro que, você sempre pode anular os padrões em seus escritos quando invocar as funções. NOTA: As linhas no arquivo padrão não devem conter qualquer espaço ou abas.


Copyright (C) 2004, Donald A. Graft, Todos os direitos reservados.

Para atualizações e outros filtros / ferramentas, visite meu web site:
http://neuron2.net/

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