Newsgroup: it.comp.software.divx
Titolo: Allucinante: Xvid non rispetta piu' il bitrate con lo stesso script avisynth

Avevo postato una settimana fa, avevo il problema che non riuscivo piu' ad 
ottenere l'avi della lunghezza che voglio impostando come codec Xvid 2 pass 
(versione 1.1.3)
Come programma esterno ho sempre usato VirtualDubMod, ultima versione.
Pensavo fosse un conflitto tra vari codec e invece...
Com'e' possibile che usando gli stessi settaggi abbia sempre ottenuto files 
della lunghezza esatta quasi al millimetro ed ora non piu'???
Ne sto uscendo pazzo...
Dopo il formattone ho reinstallato solamente Gordian Knot (che mi serve per 
misurare il bitrate e fare il dv2avi, che poi do' in pasto al VDubMod 
indicandogli i settaggi ed il bitrate), Vdub stesso e il codec Xvid.
Null'altro.
Il bello e' che se faccio uno script semplice semplice (quello creato dal 
Gordian, senza mettere che un filtro denoiser di default ed un resize a 
caso) i files escono ancora esatti, sia su 1 che su 2 pass.
Invece se uso uno script che uso da anni, il codec impazzisce anche sulla 
macchina appena formattata.
Io vorrei ad esemio un file di 260 mb per un telefilm di 22 minuti e il 
gordian mi da' un bitrate di 1648 (senza audio).
Se metto i quantizer a 1-31-1-31-1-31 esce un file di 300 mb (ben 40 in 
piu).
Se li setto a 2-31-2-31-2-31, ne esce invece uno ben piu piccolo, 180 mb!!
Gli altri settaggi son sempre gli stessi: b-frames a 2-1-1 , vhq e chroma 
motion spuntati.
A questo punto mi domando che cosa non vada nello script, visto che finora 
aveva sempre funzionato.
Ve lo posto:
----------------------------------------------------------
# Creato con Gordian Knot
#
# 
http://gknot.doom9.org
#  PLUGINS
LoadPlugin("C:\PROGRA~1\GORDIA~1\DGMPGDec\DGDecode.dll")
LoadPlugin("C:\PROGRA~1\GORDIA~1\AviSynthPlugins\SimpleResize.dll")
LoadPlugin("C:\PROGRA~1\GORDIA~1\AviSynthPlugins\Deen.dll")
LoadPlugin("C:\PROGRA~1\GORDIA~1\AviSynthPlugins\DctFilter.dll")
LoadPlugin("C:\PROGRA~1\GORDIA~1\AviSynthPlugins\UnDot.dll")
LoadPlugin("C:\PROGRA~1\GORDIA~1\AviSynthPlugins\Decomb.dll")
LoadPlugin("C:\PROGRA~1\GORDIA~1\AviSynthPlugins\Convolution3d.dll")
LoadPlugin("C:\PROGRA~1\GORDIA~1\AviSynthPlugins\ColorMatrix.dll")
LoadPlugin("C:\PROGRA~1\GORDIA~1\AviSynthPlugins\DeGrainMedian.dll")
LoadPlugin("C:\PROGRA~1\GORDIA~1\AviSynthPlugins\MaskTools-v1.5.8\MaskTools.dll")
LoadPlugin("C:\PROGRA~1\GORDIA~1\AviSynthPlugins\RepairS.dll")
LoadPlugin("C:\PROGRA~1\GORDIA~1\AviSynthPlugins\warpsharp.dll")
LoadPlugin("C:\PROGRA~1\GORDIA~1\AviSynthPlugins\RemoveGrain.dll")
Import("C:\PROGRAMMI\GORDIA~1\QMF V4.avs")
Import("C:\PROGRAMMI\GORDIA~1\DeHalo_alpha.avs")
#  SOURCE
mpeg2source("G:\DVD_VIDEO\hitch2.d2v", idct=0)
crop(10,10,684,560)
DeGrainMedian(2,3,2)
XSharpen()
FieldDeinterlace(blend=false)
ColorMatrix()
DeHalo_alpha(2.5,2.5,0.5)
function Filter_Motion_Nil(clip c)
{
c = BicubicResize(c,512,384,0,0.7)
return c
}
function Filter_Motion_Very_Min(clip c)
{
c = Convolution3d(c,"moviehq")
c = BicubicResize(c,512,384,0,0.6)
return c
}
function Filter_Motion_Min(clip c)
{
c = Convolution3d(c,"moviehq")
c = BicubicResize(c,512,384,0,0.4)
return c
}
function Filter_Motion_Mid(clip c)
{
c = Convolution3d(c,"moviehq")
c = BicubicResize(c,512,384,0.333,0.333)
return c
}
function Filter_Motion_High(clip c)
{
c = Deen(c,"c3d",1,6,6,8)
c = BilinearResize(c,512,384)
return c
}
function Filter_Motion_Very_High(clip c)
{
c = Deen(c,"c3d",1,6,6,8)
c = BilinearResize(c,512,384)
c = DctFilter(c,1,1,1,1,1,1,.5,0)
return c
}
QMF(1,1.5,2,3.2,7,4,debug=false)
----------------------------------------------------------
Per favore, se c'e' un genio tra voi, si faccia avanti perche' sono 
veramente al limite della pazzia!
q.

 q.
Ciao,
   Walter

 Volevo provare il tuo script, ma non ho trovato i 2 avs >precedenti.
il dehalo lo trovi qua:
http://forum.doom9.org/showthread.php?p=777956#post777956
copia in un file di testo e poi rinomina in avs
stessa cosa per la QMF
copia in un file di testo e rinomina in avs quanto segue:
-------------------------------------------------------
# Quantified Motion Filter V.4
# Made by Bistecc1 (5/9/2005)
# Updated by Turco (3/4/2006)
function Motion()
{
# Modifica: Variabile differenza: differenza tra il valore di moto 
dell'attuale frame e di quello successivo.
global differenza = (diff-next)
# Modifica: Confronto con i threshold modificato. Se la variabile differenza 
supera il limite di Scene Change c'è un cambio di scena.
global motion_level = (differenza >= threshold_sc && next < threshold_0m) ? 
6 : (differenza >= threshold_sc && next >= threshold_0m && next < 
threshold_1m) ? 7 : (differenza >= threshold_sc && next >= threshold_1m && 
next < threshold_2m) ? 8 : (differenza >= threshold_sc && next >= 
threshold_2m && next < threshold_3m) ? 9 : (differenza >= threshold_sc && 
next >= threshold_3m && next < threshold_4m) ? 10 : (differenza >= 
threshold_sc && next >= threshold_4m) ? 11 : (diff < threshold_0m) ? 0 : 
(diff >= threshold_0m && diff < threshold_1m) ? 1 : (diff >= threshold_1m && 
diff < threshold_2m) ? 2 : (diff >= threshold_2m && diff < threshold_3m ) ? 
3 : (diff >= threshold_3m && diff < threshold_4m ) ? 4 : (diff >= 
threshold_4m) ? 5 : motion_level
}
function QMF(clip c, float "threshold_0m", float "threshold_1m", float 
"threshold_2m", float "threshold_3m", float "threshold_4m", float 
"threshold_sc", bool "debug")
{
# Limite di Movimento Nullo
global threshold_0m = default(threshold_0m, 1.5)
# Limite di Movimento Molto Basso
global threshold_1m = default(threshold_1m, 3)
# Limite di Movimento Basso
global threshold_2m = default(threshold_2m, 4.5)
# Limite di Movimento Medio
global threshold_3m = default(threshold_3m, 6)
# Limite di Movimento Alto
global threshold_4m = default(threshold_4m, 7.5)
# Limite di Scene Change
global threshold_sc = default(threshold_sc, 5)
debug = default(debug, false)
global motion_level = 0
global clip = c
c1 = ConditionalFilter(c,Filter_Motion_Nil( c ), Filter_Motion_Nil( c ), 
"motion_level", "=", "0")
c2 = ConditionalFilter(c,Filter_Motion_Very_Min( c ), c1, "motion_level", 
"=", "1")
c3 = ConditionalFilter(c,Filter_Motion_Min( c ), c2, "motion_level", "=", 
"2")
c4 = ConditionalFilter(c,Filter_Motion_Mid( c ), c3, "motion_level", "=", 
"3")
c5 = ConditionalFilter(c,Filter_Motion_High( c ), c4, "motion_level", "=", 
"4")
c6 = ConditionalFilter(c,Filter_Motion_Very_High( c ), c5, "motion_level", 
"=", "5")
c7 = ConditionalFilter(c,Filter_Motion_Nil( c ), c6, "motion_level", "=", 
"6")
c8 = ConditionalFilter(c,Filter_Motion_Very_Min( c ), c7, "motion_level", 
"=", "7")
c9 = ConditionalFilter(c,Filter_Motion_Min( c ), c8, "motion_level", "=", 
"8")
c10 = ConditionalFilter(c,Filter_Motion_Mid( c ), c9, "motion_level", "=", 
"9")
c11 = ConditionalFilter(c,Filter_Motion_High( c ), c10, "motion_level", "=", 
"10")
c12 = ConditionalFilter(c,Filter_Motion_Very_High( c ), c11, "motion_level", 
"=", "11")
c12 = (debug == true) ? ScriptClip(c10, "Debug()") : c12
c12 = FrameEvaluate(c12, "Motion()")
c12 = FrameEvaluate(c12, "global next = 0.50 * YDifferenceToNext(clip) + 
0.24 * UDifferenceToNext(clip) + 0.26 * VDifferenceToNext(clip)")
c12 = FrameEvaluate(c12, "global diff = 0.50 * YDifferenceFromPrevious(clip) 
+ 0.26 * UDifferenceFromPrevious(clip) + 0.24 * 
VDifferenceFromPrevious(clip)")
return c12
}
function Debug(clip c)
{
c = Subtitle(c, "Questo Frame: "  + string(diff),        x=25, y=75, 
font="courier new",size=24)
c = Subtitle(c, "Successivo: "    + string(next),        x=25, y=100, 
font="courier new",size=24)
c = Subtitle(c, "Differenza: "    + string(differenza),  x=25, y=125, 
font="courier new",size=24,text_color=$FFFFFE)
c = Subtitle(c, "Motion Level: "  + string(motion_level),x=25, y=150, 
font="courier new",size=24,text_color=$FFFFFF)
c = (motion_level == 0) ? Subtitle(c, "Zero Motion Frame", x=25, y=200, 
font="courier new", size=32, text_color=$FFFFFF) : c
c = (motion_level == 1) ? Subtitle(c, "Very Low Motion Frame", x=25, y=200, 
font="courier new", size=32, text_color=$FFFFFF) : c
c = (motion_level == 2) ? Subtitle(c, "Low Motion Frame", x=25, y=200, 
font="courier new", size=32, text_color=$FFFFFF) : c
c = (motion_level == 3) ? Subtitle(c, "Medium Motion Frame", x=25, y=200, 
font="courier new", size=32, text_color=$FFFFFF) : c
c = (motion_level == 4) ? Subtitle(c, "High Motion Frame", x=25, y=200, 
font="courier new", size=32, text_color=$FFFFFF) : c
c = (motion_level == 5) ? Subtitle(c, "Very High Motion Frame", x=25, y=200, 
font="courier new", size=32, text_color=$FFFFFF) : c
c = (motion_level == 6) ? Subtitle(c, "Scene Change (Zero)", x=25, y=200, 
font="courier new", size=32, text_color=$FFFFFF) : c
c = (motion_level == 7) ? Subtitle(c, "Scene Change (Very Low)", x=25, 
y=200, font="courier new", size=32, text_color=$FFFFFF) : c
c = (motion_level == 8) ? Subtitle(c, "Scene Change (Low)", x=25, y=200, 
font="courier new", size=32, text_color=$FFFFFF) : c
c = (motion_level == 9) ? Subtitle(c, "Scene Change (Medium)", x=25, y=200, 
font="courier new", size=32, text_color=$FFFFFF) : c
c = (motion_level == 10) ? Subtitle(c, "Scene Change (High)", x=25, y=200, 
font="courier new", size=32, text_color=$FFFFFF) : c
c = (motion_level == 11) ? Subtitle(c, "Scene Change (Very High)", x=25, 
y=200, font="courier new", size=32, text_color=$FFFFFF) : c
return c
}
----------------------------------------------------------
ciao
Q. 

 Q.
ciao
    Walter 


Prova effettuata.
Avevo impostato come dimensione del solo video 600000kB
(600.000 x 1024 = 614.400.000).
Da avinaptic ottengo:
---------------------------------------
[ Traccia video ]
FourCC: xvid/XVID
Risoluzione: 512 x 384
...
Framerate: 25 fps
Frames totali: 112129
Stream size: 611,584,879 bytes                          <========
Bitrate: 1090.859419 kbps
Qf: 0.221935
Key frames: 1248 (0; 250; 500; 750; 1000; ... 111953)
Null frames: 0
Min key int: 1
Max key int: 250
Key int medio: 89.846955
---------------------------------------
La differenza, circa 2750kB (614.400.000-611.584.879=2.815.121),
non mi sembra cosě importante (errore < 0.5%), ed č paragonabile ad altre
conversioni che ho effettuato senza uno script cosě pesante.
Ho usato:
- avisinth 2.58 (17 may 2008)
- virtualdubmod 1.5.10.2
- Xvid (use croma motion; 2-9, 2-9, 2-18; AS @ L5; H263; Adaptive 
Quantization; B-VOPs, 2 1.5 1)
per entrambe le passate.
Ho voluto effettuare questa prova per cimentarmi con una conversione con uno 
script cosě elaborato, per i miei standard.
Da questo si arguisce che non sono un esperto.
La prova che ho effettuato spero ti dia alcuni spunti.
Se ti servono altre informazioni, chiedi.
Ciao,
    Walter 

 conversioni che ho effettuato senza uno script così pesante.
Se non ricordo male, se il codec riesce a fare le stesse cose senza
usare tutta la dimensione impostata, fa il file più piccolo.
-- 
Saluti, Kap - 
www.lordkap.it
 - AVINaptic: 
http://fsinapsi.altervista.org
FAQ del newsgroup: 
http://giubbe.altervista.org
Chi non cerca trova. - Arthur Bloch

 usare tutta la dimensione impostata, fa il file piů piccolo.
Per cui,questo significa che potevo richiedere una compressione piu' 
"spinta"...
Interessante; non ci avevo pensato.
Pero' mi sorge un dubbio: alla fine della prima passata, il valore medio del
bitrate era 1414kbps, mentre quello della seconda passata vale circa
1091kbps; c'era quindi un ulteriore margine da poter sfruttare.
Tutto cio', ovviamente, in linea teorica, perche' penso che la differenza
possa esser dovuta ad errori di approssimazione effettuati dal codec
sui 112129 frame.
Walter 

 usare tutta la dimensione impostata, fa il file più piccolo.
ricordi bene.
Ma Quanah ha il problema opposto: tipicamente ottiene file abbastanza
piu' grandi di quelli desiderati.
Tempo fa aveva postato un rapporto da cui risultava che xvid aveva
usato esclusivamente quantizer 1 per gli I-frame, 2 per i B-frame
e 1 e 2 per i P.
Questo e' molto strano, perche' la dimensione desiderata era piu' bassa
di quella ottenuta e non c'erano problemi ad alzare un po' i quantizer
per ottenere la dimensione giusta.
Io penso che XviD non c'entri nulla (a meno che non stia usando una
versione bacata). Ci sara' invece un problema di "interfacciamento"
tra le varie componenti del sistema che usa; dovrebbe controllare
le informazioni che riporta xvid durante l'encoding, e guardare il
file delle statistiche generato nella prima passata, assicurandosi
che venga letto correttamente all'inizio della seconda e che gli
vengano passati i parametri corretti
-- 
Home page di Frank: 
http://fsinapsi.altervista.org
Home page di Giubbe e FAQ: 
http://giubbe.altervista.org

 vengano passati i parametri corretti
Ricordi bene, ad ogni modo penso di avere risolto.
Facendo una prova di compressione col 5% del video risulta un valore di 104, 
cioe' troppo alto.
Il che consente di alzare la risoluzione da 512 addirittura fino a 640, 
valora col quale il file dopo la codifica torna all'esatto valore impostato 
e desiderato.
Strano pero' che nessuno l'abbia mai rilevato su qualsiasi forum tematico...
Q.