Newsgroup: it.comp.software.divx
Titolo: Ancora sottotitoli

Prima di tutto, ringrazio tutto il ng, ad iniziare da Giubbe, per aver
tentato di aiutarmi per far vedere i sottotitoli SSA al mio lettore
stand alone.
Ho deciso a malincuore di procedere alla ricompressione dell'avi con
virtualdub + textsub. E qui mi rivolgo direttamente a Giubbe per
chiedergli come mai, nella sua utilissima guida, consiglia di
effettuare una doppia passata per il passaggio da avi ad avi.
Quando, mesi fa, mi ero domandato se in casi come questi fosse meglio
la doppia passata, avevo trovato con google che era assolutamente
sconsigliato farlo, nel caso mpeg4 -> mpeg4, che non avrebbe portato
alcun beneficio e che, anzi, si rischiava pure di peggiorare il
risultato. Si diceva infine che la doppia passata porta benefici
evidenti solo nel caso mpeg2 -> mpeg4.
Ora, mi piacerebbe indicarvi dove ho letto tutte queste belle cose, il
fatto è che, con google, non riesco più a trovarle (però sono sicuro
di averle lette, eh!).  :-)
Allora mi chiedo: chi ha ragione? Grazie in anticipo per le risposte.

 Allora mi chiedo: chi ha ragione?
secondo me non c'e' una regola, quando si ricodifica possono esserci
casi in cui due passate danno una migliore qualita', e casi in cui
fanno peggio di una singola passata.
Forse una semplice regola potrebbe essere questa: com'e' la qualita'
del divx che vuoi ricodificare? E' alta? E' uniforme? Per "uniforme"
intendo che non ci sono scene di qualita' inferiore alla media, con
artefatti.
Supposto che il filmato sia passato attraverso una sola codifica
mpeg-4, un modo per valutare l'uniformita' della qualita' e' di
falro analizzare a DRFanalyzer: se la deviazione standard e' minore
di 1, forse la qualita' e' abbastanza uniforme; se e' maggiore di 1,
e' probabile che era stato codificato in mpeg-4 mediante una singola
passata a target bitrate e che ci sono sequenze a qualita' inferiore
alla media.
Se la qualita' e' buona e uniforme, dovrebbe convenire una ricodifica
in due passate; se non e' uniforme, possono esserci casi in cui una
doppia passata ti da' risultati inferiori rispetto a una singola
passata. Infatti, se una singola passata tende a ridistribuire il
bitrate in modo disuniforme (in modo simile al divx da cui parti),
una doppia passata potrebbe cercare di assegnare piu' bitrate alle
sequenze di bassa qualita', sottraendone a quelle migliori; in altre
parole, si ha un inutile spreco di bitrate per cercare di restare
piu' fedeli a sequenze alle quali non vale la pena essere molto
fedeli, a svantaggio delle parti che avevano una qualita' migliore...

 evidenti solo nel caso mpeg2 -> mpeg4.
Io non conosco l'articolo, nè l'articolasta, ma mi piacerebbe scambiarci le
opinioni.
Io ti dico come funziona la passata multipla (puoi trovare tale spiegazione
anche nella documentazione del divx), così puoi trarre le tue conclusioni.
Il metodo che dà migliori risultati intermini di qualità è utilizzare la
compressione a quantizer fisso impostato a 2 (c'è anche 1, in verità, ma
non si notano grandi differenze se non in termini di spazio occupato).
Puoi vedere il quantizer come un indice di compressione, più è basso
migliore sarà l'immagine, maggiore sarà lo spazio occupato.
Il metodo a singolo passo controllato dal bitrate invece utilizza il
bitrate impostato solo nell'intorno del blocco di frame che sta
analizzando. Se quella scena è movimentata o luminosa o in altri termini
complessa utilizzerà il bitrate impostato o poco più, in altri casi
utilizzerà bitrate impostato o poco meno. Non potrà però, usare bitrate
troppo diversi da quello impostato perchè deve mantenere la media e non
conosce le scene che vengono dopo.
Impostando un bitrate a 1000 se fino ad un certo momento ha usato bitrate
950 quando troverà una scena complessa utilizzerà 1050 anche se serve 1500
perchè non può sapere che la scena dopo c'è il buio e quindi lì potrebbe
abbassare il bitrate fino a 700 per ritornare in media.
Il metodo a due passi si comporta come il metodo a singolo passo (bitrate)
salvo conoscere completamente la struttura delle scene del filmato. Questo
perchè nel primo passo non comprime nulla, ma si limita a "sondare il
terreno", amalizza e tiene traccia dei vettori di movimento della
luminosità e quant'altro può comportare un maggiore o minore uso uso del
bitrate.
Riprendendo l'esempio precedente, quando il codec arriva alla scena che
richiede più bitrate è in grado di usare 1500 perchè sa benissimo che dopo
potrà diminuire.
Questo comportamento, a detta dei creatori di XviD, fa si che il codec
tenda all'utilizzo del quantizer impostato a 2.
Ora venendo al problema dei sottotitoli e sapendo quando esposto sopra mi
risulta alquanto difficile credere che sia dannoso il secondo passo. Come
potrebbe sbagliare i conti e utilizzare minor bitrate laddove ne servirebbe
di più?
Al limite potrebbe essere un inutile perdita di tempo, ma dubito anche di
questo perchè in sottotitoli alterano la complessità della scena e quindi
modificano il bitrate necessario a comprimerla.
Per fare una prova potresti comprimere il filmato in Q=2 (quantizer) e poi
con il bitrate impostato (anche con un solo passo). Se la differenza in
termini di spazio occupato è poco allora i due passi sono inutili,
altrimenti significa che c'è ancora un ampio margine di miglioramento e i
due passi diventano fondamentali.
bye, giubbe
-- 
HomePage e FAQ: 
http://giubbe.altervista.org
Inutile scrivere in privato, non ricevo le email

 fanno peggio di una singola passata.
perchč?
grazie, giubbe


 perchč?
perche' il codec non percepisce la qualita' dei frame che gli arrivano
in ingresso.
Se gli arriva un frame che e' difficile da comprimere e richiede piu'
bit per essere rappresentato in modo fedele, lui non sa se quel frame
e' un'immagine di buona qualita' ma molto complessa e ricca di dettagli
oppure se e' un frame "difettoso" (con artefatti), la cui complessita'
e' dovuta al fatto che la codifica precedente era stata fatta male
(cioe', era stata fatta in singola passata, con qualita' disuniforme).
Quindi, facendo la doppia passata, tendera' a privilegiare quei frame
difettosi, usando quantizer piu' bassi e sprecando preziosi bit per
rendere al meglio dettagli che non sono "veri dettagli" ma difetti
della precedente codifica. Dato che riserva piu' bit alle scene
difettose, ne sottrae a quelle migliori (usera' quantizzatori piu'
grandi), quindi alla fine otterra' un risultato inferiore a una
sola passata, la quale, invece, usando una distribuzione abbastanza
uniforme del bitrate, tende a ottenere una "distribuzione di qualita'"
simile al filmato da cui si parte.

sequenze di bassa qualita', sottraendone a quelle migliori; 
è esattamente questa la spiegazione che avevo letto la volta scorsa.
Grazie, allora! D'ora in poi so come regolarmi e, in questo
particolare caso, credo proprio che userò la passata singola (non è
una questione di risparmio di tempo)

 tenda all'utilizzo del quantizer impostato a 2.
su tutto il resto sono d'accordo, ma questo punto non mi torna: perche'
impostato a 2.
Io direi cosi':
"Questo comportamento, a detta dei creatori di XviD, fa si che il codec
tenda all'utilizzo del quantizer impostato a un valore costante."
Un modo alternativo per dire la stessa cosa e' questo:
La doppia passata tende ad abbassare la deviazione standard (rispetto
al quantizer medio) dell'insieme di quantizer usati nella codifica.
In una codifica a quantizer costante (non solo a valore 2, ma a
qualsiasi valore), la deviazione standard e' 0, per definizione.
La codifica a doppia passata tende a riprodurre una codifica a
quantizer costante (deviazione standard bassa, tendente a 0), ma
non e' detto che il valore del quantizer medio sia 2, in genere
e' piu' alto.

due passi diventano fondamentali.
farò la prova, sono curioso...

 è esattamente questa la spiegazione che avevo letto la volta scorsa.
non ricordi dove? Era in inglese o in italiano?
In ogni caso ti conviene provare sul tuo caso specifico.

 oppure se e' un frame "difettoso" (con artefatti),
Non mi trovi molto d'accordo perchè il frame con poco bitrate in genere non
è difettoso, ha solo dei macroblocchi uniformi e questi aumentano la
comprimibilità, non la riducono. Nella sostanza tale frame risulterebbe più
comprimibile del suo "originale".
Le scene con alto indice di movimento e luminose saranno codificate male
quindi avranno già dei macroblocchi e queste saranno quindi molto
comprimibili, mentre le scene statiche avranno solo meno dettaglio e quindi
non cambia la loro comprimibilità (anzi migliora un pochino) e comunque la
differenza tra doppia passata e singola non è così evidente.
In pratica, in questo caso, usare il doppio passo è inutile, ma non
dannoso. Discorso diverso sarebbe se invece dei macroblocchi avessimo del
rumore, ma in genere questo si evidenzia solo in alcuni punti della scena e
non in tutte (pr esempio, intorno alle finestre, negli angoli, su delle
scritte) e quindi non influenza più di tanto il codec.
Se leggi nelle FAQ, infatti, non troverai mai un mio consiglio di usare i
due passi se devi semplicemente ricomprimere, ma se devi modificare la
struttura del filmato allora si.
Quando aggiungi un sottotitolo, tutto l'intorno della scritta nella scena
cambia. Se usi il singolo passo rischi di aggiungere rumore intorno alle
scritte proprio perchè il codec non distribuisce bene il bitrate.
Comunque è facile provare. Basta comprimere in bassa qualità un filmato a
partire dal mpeg2, ottenendo un filmato divx A.
Poi aggiungere i sottotitoli e ricomprimere il filmato A usando lo stesso
bitrate con singolo passo. Al termine si ricomprime il filmato A usando,
però, i quantizer, se la differenza è minima allora non abbiamo concluso
nulla (se quanto esposto non ti convince), se la differanza è non
indifferente allora ho ragione.
bye


 tenda all'utilizzo del quantizer impostato a un valore costante."
Bhè, l'avevano detto loro che tende a due. Nel senso che il codec fa di
tutto per utilizzare il valore 2, ma ovviamente non sempre ci riesce.
bye


 indifferente allora ho ragione.
no, e' proprio il metodo che proponi che contesto! :-)
Lo so anch'io che codificando a quantizer costante viene differente
rispetto alla singola passata in questi casi, ma questo perche' la
codifica a quantizer costante, pur dando comunque la miglior
qualita', lo fa sprecando bit per rendere delle sequenze che non
lo meritano!
Pensa all'esempio che ti ho fatto sopra con la JPEG:
se parti da una JPEG che occupa 169543 bytes, l'encoder non si
accorge che quella immagine non merita uno spazio superiore,
e infatti lui crea una nuova jpeg di 276842, che non e' certo
migliore della prima, eppure occupa inutilmente piu' spazio.

 grande.
mi pare che il punto piu' rilevante della questione e' che
l'encoder prende in ingresso non la JPEG, ma l'immagine ottenuta
decomprimendo la JPEG. Quando calcola i coefficienti DCT dei
blocchi dell'immagine in ingresso, per vari motivi (filtri di
deblocking incorporati nei decoders, leggere differenze di
implementazione) essi non sono proprio identici a quelli
memorizzati nella JPEG. Se venissero fuori proprio gli stessi
esatti coefficienti, allora sarebbe come dicevi te, cioe', a
quel punto sarebbero gia' quantizzati e sarebbe inutile
quantizzarli con quantizzatori inferiori perche' resterebbero
invariati, e comprimendoli occuperebbero esattamente lo stesso
spazio della JPEG in ingresso. Sembra pero' che questa situazione
ideale sia solo teorica, in pratica succede che l'encoder, se
lasciato a "briglia sciolta", tenda a concedere piu' spazio del
dovuto.
Ed e' lo stesso che accade quando codifichi un filmato a
quantizer costante (diciamo q=2): anche in questo caso e'
come se lasciassi l'encoder a "briglia sciolta" e lui,
quando si trova un caso come la JPEG dell'esempio, gli
concede piu' spazio di quello che meriterebbe.

 concede piu' spazio di quello che meriterebbe.
Come sai io sono piutosto "duro" ed č meglio vedere con i miei occhi.
Ho quindi fatto un esperimento e ho dedotto che avete ragione voi. Devo
correggere le FAQ.
Adesso vado di fretta, ti riporto solo la sintesi del SSIM, poi, se vuoi,
ti indico come ho fatto.
I valori sono medi.
orig   0.924761
multi: 0.908348
one:   0.913637
multi_sub: 0.892751
one_sub: 0.898084


 ti indico come ho fatto.
credo di avere capito.
Comunque una sola prova non e' sufficiente per trarre conclusioni
generali.
Se avessi ottenuto il risultato opposto, un unico esempio non
sarebbe bastato per dire che il fenomeno non si presenta mai.
Viceversa, con questi pochi esempi non si puo' affermare che,
ricodificando un filmato che in origine era stato fatto in
singola passata (tirchiando sul bitrate) convenga in tutti i
casi fare una singola passata.

[...]
Io sostenevo che la doppia passata al limite è inutile, ma non dannosa. Con
questa promessa basta trovare un controesempio per dichiararla errata. 
E in effeti l'ho trovato.
Se vogliamo un po' drastico (ho usato bitrate a 400Kb/s...), ma se avessi
avuto ragione io non si sarebbero dovute notare differenze.
C'è da dire che a vista i due filmati sembrano identici, tranne intorno
alle scritte dove il rumore intorno alle scritte sembra più accentuato nel
file ottenuto con un solo passo.
Devo provare a codificare il filmato a 800 e (ragionevole per un pass) e
1400 se è come penso consiglierò l'unico passo in caso di filmato
codificato male e due negli altri.
Appena posso farò le prove.


 codificato male e due negli altri.
una generalizzazione che si puo' fare e' che, se il filmato di partenza
e' di buona qualita' (era stato codificato a doppia passata e bitrate
adeguato), allora sicuramente la doppia passata da' un risultato
migliore.
Se il filmato di partenza era stato codificato male, non e' detto che la
doppia passata fara' peggio della singola...
In realta' credo che esista un metodo facile (senza dover calcolare SSIM)
per sapere se siamo in un caso critico in cui la codifica ha fatto danni:
si osservano i grafici dei "bitrate medi parziali" dei due filmati: se
questi sono molto simili, la codifica non ha fatto danni; se sono diversi,
qualcosa e' andato storto.
I casi in cui sono diversi dovrebbero essere solo due (se non mi sfugge
qualcosa):
uno e' quando si codifica in singola passata un filmato che andrebbe
fatto in due passate, l'altro e' quando il grafico del filmato di
partenza e' molto simile a una linea retta costante (cio' indica che
era stato codificato a una sola passata) e il grafico del filmato
ricodificato presenta qualche frastagliatura; in tale caso il codec e'
tratto in inganno, perche' non ha senso che assegni piu' spazio a delle
sequenze rispetto ad altre, dal momento che nel filmato da cui si parte
hanno tutte lo stesso spazio. Dato che il grafico di una codifica a
singola passata e' sempre simile a una linea retta costante, e che
quello di una codifica a doppia passata tende ad avere la stessa forma
di quello a quantizer costante (e' proprio quello l'obiettivo della
doppia passata), questo e' il fatidico caso in cui una singola passata
risulta migliore della doppia.
Rileggendo la frase sopra mi rendo conto che non e' tanto chiaro...
Se pero' prima guardi un po' di grafici, dovresti farti una buona
idea di cio' che intendo.
Per generare un grafico dei bitrate parziali da un AVI/DivX bastano
pochi secondi (io guardo tutti quelli che mi capitano tra le mani :-)).
Ce l'hai un programma per generarli o visualizzarli? Se no, ce n'e'
uno scaricabile dalla mia pagina, ma e' compilato solo per linux (si
appoggia ai pacchetti "GNU Plotutils" e "XFig"). Se ti interessa
fammi sapere.