Newsgroup: it.comp.software.divx
Titolo: Help Malfunzionamento Codec Xvid 2 pass

Premesso che codifico da svariati anni in Xvid ed ho buona padronanza dei 
filtri avisynth che do' in pasto a Virtualdubmod dopo aver processato i 
video col Gordian Knot, da qualche settimana sono purtroppo in grave 
difficolta'.
I problemi sono iniziati dopo che ho installato nel sistema il famigerato 
Matroska Pack (ver. 1.1.2 exe) e, a seguire il CCCP Total Pack.
In pratica la codifica in Xvid da allora prende un bitrate totalmente 
diverso da quello che imposto x avere il file della lunghezza richiesta 
sulla 2nd pass, in genere ne esce uno di piu' di 100 mb piu grande, ma e' 
capitato anche di avere un files di dimensioni dimezzate.
Va da se' che ho gia' disinstallato i pack incriminati e visto che il 
problema non si risolveva anche gli ffdshow.
Per ultimo ho anche disinstallato e reinstallato Virtualdubmod e GK, 
quest'ultimo ovviamente senza installare altri codec che non siano Dvix e 
Xvid.
Purtroppo il problema persiste anche dopo accurata pulizia con regcleaner e 
cccleaner di eventuali chiavi di registro rimaste.
A questo punto ho scaricato qualche utility per vedere i codec presenti 
immaginando un incasinamento di questi nel sistema ed ho tolto il toglibile, 
ma ancora non basta.
Il problema sembra presentarsi solo con Xvid e se vengono impostate le 2 
pass, usando il codec Dvix 2 pass i files escono della lunghezza giusta, e 
cosi pare anche con l'Xvid se imposto solo 1 pass.
Non so veramente piu' che cosa fare, pena un rabbrividente formattone.
Ringrazio sin da ora chiunque mi possa fornire un'idea di quanto successo ed 
un consiglio x ovviare all'inconveniente.
Q.

 ed un consiglio x ovviare all'inconveniente.
forse, in qualche modo, hai impostato un "profilo".
XviD ha un insieme di "profili" predefiniti
(esempio: dxnhtpal = DXN home theater PAL profile).
Questi influiscono solo sulla seconda passata, e tipicamente fanno
ottenere filmati di dimensione diversa da quella desiderata (al fine di
rispettare i vincoli del profilo, che tipicamente consistono nel non
superare un preciso limite per il bitrate locale; questo e' cio' che
viene controllato da avinaptic impostando un profilo e chiedendo
l'analisi drf, le violazioni vengono riportate come "buffer underflow"
nel rapporto). Se e' cosi', prova a disabilitare il profilo...
comunque possono essere utili...
Esistono versioni modificate di XviD che implementano il rispetto dei
vincoli in maniera diversa
-- 
Home page di Frank: 
http://fsinapsi.altervista.org
Home page di Giubbe e FAQ: 
http://giubbe.altervista.org

 vincoli in maniera diversa
E' una delle cose che ho pensato, ma dove lo trovo?
Uso l'ultima versione stable, cioe' la 1.1.3 e non mi sembra ci sia 
l'opzione "profilo" in questa, magari nelle prime versioni del codec.
Questo cmq e' il rapporto completo di avinaptic, e del file che piu' si e' 
avvicinato alla dimensione richiesta, gli altri son anche piu' lunghi:
[ Info sul file ]
Nome: E4.avi
Data: 19/10/2008 03:15:00
Dimensione: 762,734,592 bytes (727.4 MB)
[ Info generiche ]
Durata: 00:49:33 (2973.12 s)
Tipo di contenitore: AVI OpenDML
Streams totali: 2
Tipo stream n. 0: video
Tipo stream n. 1: audio
Audio streams: 1
ISFT: VirtualDubMod 1.5.10.2 (build 2540/release)
JUNK: VirtualDubMod build 2540/release
[ Dati rilevanti ]
Risoluzione: 512 x 384
Larghezza: multipla di 32
Altezza: multipla di 32
DRF medio: 1.661365
Deviazione standard: 0.473245
Media pesata dev. std.: 0.017217
[ Traccia video ]
FourCC: xvid/XVID
Risoluzione: 512 x 384
Frame aspect ratio: 4:3 = 1.333333
Pixel aspect ratio: 1:1 = 1
Display aspect ratio: 4:3 = 1.333333
Framerate: 25 fps
Frames totali: 74328
Stream size: 711,550,621 bytes
Bitrate: 1914.623347 kbps
Qf: 0.389531
Key frames: 356 (0; 169; 469; 769; 1069; ... 74274)
Null frames: 0
Min key int: 1
Max key int: 300
Key int medio: 208.786516
Ritardo: 0 ms
[ Traccia audio ]
Audio tag: 0x55 (MP3)
Bitrate (contenitore): 128 kbps CBR
Canali (contenitore): 2
Frequenza (contenitore): 48000 Hz
Chunks: 74313
Stream size: 47,567,616 bytes
Preload: 504 ms
Max A/V diff: 520 ms
Tipo: MPEG-1 Layer III
MPEG frames: 123874
Durata: 00:49:33 (2972.976 s)
Chunk-aligned: Sě
Emphasis: none
Mode: joint stereo
Ritardo: 0 ms
[ Info sulla codifica MPEG4 ]
User data: XviD0046
Packed bitstream: No
QPel: No
GMC: No
Interlaced: No
Aspect ratio: Square pixels
Quant type: H.263
Frames totali: 74328
Drop/delay frames: 0
Frames corrotti: 0
I-VOPs:   356 (  0.479 %)
P-VOPs: 24880 ( 33.473 %) ########
B-VOPs: 49092 ( 66.048 %) #################
S-VOPs:     0 (  0.000 %)
N-VOPs:     0 (  0.000 %)
Max consecutive B-VOPs: 2
    1 consec:   480 (  1.937 %)
    2 consec: 24306 ( 98.063 %) #########################
[ Analisi DRF ]
DRF medio: 1.661365
Deviazione standard: 0.473245
DRF max: 2
DRF=1: 25170 ( 33.863 %) ########
DRF=2: 49158 ( 66.137 %) #################
DRF>2:     0 (  0.000 %)
I-VOPs DRF medio: 1
I-VOPs deviazione std.: 0
I-VOPs DRF max: 1
P-VOPs DRF medio: 1.002652
P-VOPs deviazione std.: 0.051436
P-VOPs DRF max: 2
B-VOPs DRF medio: 2
B-VOPs deviazione std.: 0
B-VOPs DRF max: 2
[ Profile compliancy ]
Profilo da testare: MTK PAL 6000
Risoluzione: Ok
Framerate: Ok
Min buffer fill: 77%
Rapporto generato da AVInaptic (18-11-2007) in data 26 ott 2008, h 12:45:34

 B-VOPs DRF max: 2
a me pare che tu abbia codificato impostando vincoli sui quantizers:
al riguardo XviD ha queste opzioni:
       min_iquant=<0-31>
              minimum I-frame quantizer (default: 2)
       max_iquant=<0-31>
              maximum I-frame quantizer (default: 31)
       min_pquant=<0-31>
              minimum P-frame quantizer (default: 2)
       max_pquant=<0-31>
              maximum P-frame quantizer (default: 31)
       min_bquant=<0-31>
              minimum B-frame quantizer (default: 2)
       max_bquant=<0-31>
              maximum B-frame quantizer (default: 31)
non ti far confondere dal fatto che l'interfaccia di XviD che stai
usando chiami queste opzioni in modo diverso; di fatto la libreria
ha questi parametri, che a me pare nel tuo caso essere impostati a
valori 1-1 per I-frame, 1-2 per i P, 2-2 per i B.
Possono aver influito anche altre opzioni, ad esempio:
 bquant_ratio=<0-1000>
    quantizer  ratio between B- and non-B-frames, 150=1.50 (default:
    150)
 bquant_offset=<-1000-1000>
    quantizer offset between B- and non-B-frames, 100=1.00 (default:
    100)
Ovviamente sarebbe molto utile vedere tutte le opzioni che usi
per la codifica, ma usando un'interfaccia forse non le vedi tutte...


 per la codifica, ma usando un'interfaccia forse non le >vedi tutte...
Presto detto. Sempre : profile level-->unrestricted
poi ci sono opzioni che cambio di volta in volta a seconda della fonte da 
maneggiare (in genere reg. televisive)
in questo caso ho usato:
matrice: H263
b-vop : 2-1-1, vhq enabled
quantizer: 1-31 su tutti
no trellis, no adaptive
E' tutto. 

 no trellis, no adaptive
"b-vop : 2-1-1" dovrebbe significare max_bframes=2, ratio=1, offset=1...
Questi mi sembrano valori accettabili. Se i quantizer sono 1-31, in
teoria dovrebbe aumentare i quantizer per raggiungere il target bitrate.
Cosa che invece non e' successa, perche', se ho capito bene, nel
filmato di cui ieri hai postato il rapporto, tu avevi impostato una
dimensione di 700 MB, mentre hai ottenuto invece un file di 727 MB.
Ho capito bene?
Certo, e' strano che XviD abbia scelto per tutti i quantizer i valori
1 e 2. Come si puo' spiegare?
Una potrebbe essere che, per qualche motivo, non viene calcolato bene
il target bitrate; in altre parole, a XviD e' stato chiesto un target
bitrate non superiore a 1914 kbps (quello che lui ha ottenuto).
Altrimenti avrebbe scalato i quantizer... Vediamo...
Scarico i sorgenti di XviD dell'attuale versione di sviluppo:
cvs -z9 -d:pserver:anon...@cvs.xvid.org:/xvid checkout -P xvidcore
Il file che ci interessa si chiama:
xvidcore/src/plugins/plugin_2pass2.c
(VBR 2 pass bitrate controller implementation)
Questo mi sembra che non sia cambiato negli ultimi anni :-) .
La funzione da guardare e' rc_2pass2_create; questa legge il file di
testo generato nella prima passata (funzione statsfile_load)
ed ecco la parte che ci interessa:
/* If we have a user bitrate, it means it's an internal curve scaling */
if (rc->param.bitrate) {
       /* Perform internal curve scaling */
       first_pass_scale_curve_internal(rc);
}
se rc->param.bitrate e' non nullo, vuol dire che l'utente ha
impostato un target bitrate (e' il tuo caso), e allora viene fatto
uno scaling della curva di compressione.
La funzione first_pass_scale_curve_internal calcola il fattore di
scala (scaler) da applicare ai frames al fine di rispettare il
target...
Ora qui le cose si fanno un po' troppo complesse, perche' lo
scaling puo' essere influenzato da molti fattori, e inoltre viene in
seguito chianata una funzione scaled_curve_apply_advanced_parameters
che puo' ancora cambiare le cose (questa interviene ad esempio se
e' stata usata l'opzione keyframe_boost che sposta bitrate verso
i keyframe). E infine c'e' il controllo dei vincoli VBV
(funzione scale_curve_for_vbv_compliancy) che puo' alzare i
quantizer dei frame nelle zone a rischio "buffer underflow"
(ed eventualmente abbassare quelli delle zone non a rischio, se
avanza del bitrate), pero' quest'ultima parte viene eseguita solo
in questo caso:
  /* vbv_size==0 switches VBV check off */
  if (rc->param.vbv_size > 0)  {
nel tuo caso vbv_size deve essere 0, perche' hai settato come
profile/level "unrestricted", e quindi il controllo dei vincoli VBV
non viene fatto...
A questo punto le possibilita' mi sembrano queste:
- per qualche motivo non viene calcolato bene il target bitrate;
- c'e' un'incompatibilita' tra "interfacce" e "libreria" che stai
  usando (la libreria XviD nuda e cruda ha un'ottantina di parametri,
  e tipicamente si   accede alla libreria tramite interfacce che
  nascondono all'utente un mucchio di dettagli)
Il fatto pero' che dici che codificando in singola passata ottieni
la dimensione desiderata, dovrebbe escludere un errore nel calcolo
del bitrate...
Boh, non so che dirti. Magari io farei qualche prova con le versioni
di XviD a riga di comando (xvid_encraw) per accertarmi se il problema
sta in XviD o nell'interfaccia che lo chiama con parametri sballati...


 sta in XviD o nell'interfaccia che lo chiama con parametri sballati...
Credo che il problema, NON ancora risolto, dipenda appunto dal fatto che le 
librerie non fungano piu andando in conflitto con altri codec installati.
Se chiamo il file da GSpot mi dice appunto:
Codec Misconfigured
e se clicco nei dettagli "codec non registered"
Xvid Mpeg-4 Codec
C:\WINDOWS\system32\xvidvfw.dll
Possibile che non mi restri altra strada che il formattone?

 Possibile che non mi restri altra strada che il formattone?
No, ci dev'essere il modo di registrare nel sistema tale codec.
Non ricordo bene come, forse tramite il registro di configurazione,
oppure tramite il tasto destro sul file denominato con estensione .ax o
qualcosa del genere. Scusa, ma non ricordo meglio.
-- 
Saluti, Kap - 
www.lordkap.it
 - AVINaptic: 
http://fsinapsi.altervista.org
FAQ del newsgroup: 
http://giubbe.altervista.org
Rayna Kapec: "What is loneliness?" Flint: "It is a thirst... it is a
flower, dying in a desert." - Star Trek TOS