View Full Version : xvid_encraw ignoring imin/imax values when ...


Selur
6th April 2007, 09:20
over in the german Doom9/Gleitz board we got the following problem:


#globale Xvid Settings (for all)
XVID0: -max_bframes 0 -max_key_interval 10 -overhead 0 -vbvmax 4854000 -vbvsize 3145728 -vhqmode 4 -frames 24

#just for 1st pass
XVID1: -full1pass -pass1 pass.log

#just for 2nd pass
XVID2: -pass2 pass.log -imin 1 -imax 1 -pmin 1 -pmax 3


___________________________________________

1PASS:
xvid_encraw.exe -type 2 -i VTS03_comp_test.avs XVID0 XVID1

0: key=2, time= 15, len= 15966 | type=I, quant= 2, len= 15966
1: key=0, time= 110, len= 11336 | type=P, quant= 2, len= 11336
2: key=0, time= 141, len= 9699 | type=P, quant= 2, len= 9699
3: key=0, time= 313, len= 10059 | type=P, quant= 2, len= 10059
4: key=0, time= 266, len= 10511 | type=P, quant= 2, len= 10511
5: key=0, time= 125, len= 9854 | type=P, quant= 2, len= 9854
6: key=0, time= 141, len= 10226 | type=P, quant= 2, len= 10226
7: key=0, time= 297, len= 11042 | type=P, quant= 2, len= 11042
8: key=0, time= 125, len= 10971 | type=P, quant= 2, len= 10971
9: key=0, time= 94, len= 12091 | type=P, quant= 2, len= 12091
10: key=2, time= 15, len= 17095 | type=I, quant= 2, len= 17095
11: key=0, time= 125, len= 11953 | type=P, quant= 2, len= 11953
12: key=0, time= 94, len= 10134 | type=P, quant= 2, len= 10134
13: key=0, time= 110, len= 11292 | type=P, quant= 2, len= 11292
14: key=0, time= 141, len= 12293 | type=P, quant= 2, len= 12293
15: key=0, time= 125, len= 11608 | type=P, quant= 2, len= 11608
16: key=0, time= 250, len= 12973 | type=P, quant= 2, len= 12973
17: key=0, time= 125, len= 11781 | type=P, quant= 2, len= 11781
18: key=0, time= 141, len= 11130 | type=P, quant= 2, len= 11130
19: key=0, time= 109, len= 12682 | type=P, quant= 2, len= 12682
20: key=2, time= 47, len= 11003 | type=I, quant= 2, len= 11003
21: key=0, time= 313, len= 10067 | type=P, quant= 2, len= 10067
22: key=0, time= 172, len= 9779 | type=P, quant= 2, len= 9779
23: key=0, time= 172, len= 8982 | type=P, quant= 2, len= 8982

Tot: enctime(ms) =3566.00, length(bytes) = 274527
Avg: enctime(ms) = 148.58, fps = 6.73, length(bytes) = 11438
I frames: 3 frames, size = 14688/ 44064, quants = 2 / 2.00 / 2
P frames: 21 frames, size = 10974/ 230463, quants = 2 / 2.00 / 2
___________________________________________

2PASS: -bitrate 900
xvid_encraw.exe -type 2 -i VTS03_comp_test.avs XVID0 -bitrate 900 XVID2


0: key=2, time= 16, len= 15966 | type=I, quant= 2, len= 15966
1: key=0, time= 109, len= 7252 | type=P, quant= 3, len= 7252
2: key=0, time= 94, len= 6103 | type=P, quant= 3, len= 6103
3: key=0, time= 125, len= 6536 | type=P, quant= 3, len= 6536
4: key=0, time= 94, len= 6764 | type=P, quant= 3, len= 6764
5: key=0, time= 109, len= 6204 | type=P, quant= 3, len= 6204
6: key=0, time= 125, len= 6427 | type=P, quant= 3, len= 6427
7: key=0, time= 156, len= 6918 | type=P, quant= 3, len= 6918
8: key=0, time= 140, len= 6925 | type=P, quant= 3, len= 6925
9: key=0, time= 109, len= 7623 | type=P, quant= 3, len= 7623
10: key=2, time= 16, len= 17095 | type=I, quant= 2, len= 17095
11: key=0, time= 94, len= 7479 | type=P, quant= 3, len= 7479
12: key=0, time= 110, len= 6193 | type=P, quant= 3, len= 6193
13: key=0, time= 93, len= 7040 | type=P, quant= 3, len= 7040
14: key=0, time= 140, len= 7898 | type=P, quant= 3, len= 7898
15: key=0, time= 140, len= 7280 | type=P, quant= 3, len= 7280
16: key=0, time= 125, len= 8219 | type=P, quant= 3, len= 8219
17: key=0, time= 219, len= 7479 | type=P, quant= 3, len= 7479
18: key=0, time= 109, len= 6972 | type=P, quant= 3, len= 6972
19: key=0, time= 110, len= 8155 | type=P, quant= 3, len= 8155
20: key=2, time= 16, len= 11003 | type=I, quant= 2, len= 11003
21: key=0, time= 281, len= 6329 | type=P, quant= 3, len= 6329
22: key=0, time= 171, len= 6105 | type=P, quant= 3, len= 6105
23: key=0, time= 156, len= 5686 | type=P, quant= 3, len= 5686

Tot: enctime(ms) =2857.00, length(bytes) = 189651
Avg: enctime(ms) = 119.04, fps = 8.40, length(bytes) = 7902
I frames: 3 frames, size = 14688/ 44064, quants = 2 / 2.00 / 2
P frames: 21 frames, size = 6932/ 145587, quants = 3 / 3.00 / 3
___________________________________________

2PASS: -bitrate 2000
xvid_encraw.exe -type 2 -i VTS03_comp_test.avs XVID0 -bitrate 2000 XVID2


0: key=2, time= 15, len= 32979 | type=I, quant= 1, len= 32979
1: key=0, time= 157, len= 11880 | type=P, quant= 2, len= 11880
2: key=0, time= 109, len= 9801 | type=P, quant= 2, len= 9801
3: key=0, time= 110, len= 6326 | type=P, quant= 3, len= 6326
4: key=0, time= 110, len= 10842 | type=P, quant= 2, len= 10842
5: key=0, time= 125, len= 5984 | type=P, quant= 3, len= 5984
6: key=0, time= 141, len= 10525 | type=P, quant= 2, len= 10525
7: key=0, time= 109, len= 6685 | type=P, quant= 3, len= 6685
8: key=0, time= 125, len= 11342 | type=P, quant= 2, len= 11342
9: key=0, time= 125, len= 7425 | type=P, quant= 3, len= 7425
10: key=2, time= 62, len= 35150 | type=I, quant= 1, len= 35150
11: key=0, time= 125, len= 7558 | type=P, quant= 3, len= 7558
12: key=0, time= 110, len= 10693 | type=P, quant= 2, len= 10693
13: key=0, time= 110, len= 6839 | type=P, quant= 3, len= 6839
14: key=0, time= 93, len= 7838 | type=P, quant= 3, len= 7838
15: key=0, time= 109, len= 12010 | type=P, quant= 2, len= 12010
16: key=0, time= 110, len= 8073 | type=P, quant= 3, len= 8073
17: key=0, time= 110, len= 7483 | type=P, quant= 3, len= 7483
18: key=0, time= 109, len= 11604 | type=P, quant= 2, len= 11604
19: key=0, time= 125, len= 7931 | type=P, quant= 3, len= 7931
20: key=2, time= 16, len= 26903 | type=I, quant= 1, len= 26903
21: key=0, time= 125, len= 6275 | type=P, quant= 3, len= 6275
22: key=0, time= 157, len= 6110 | type=P, quant= 3, len= 6110
23: key=0, time= 156, len= 5695 | type=P, quant= 3, len= 5695

Tot: enctime(ms) =2643.00, length(bytes) = 273951
Avg: enctime(ms) = 110.13, fps = 9.08, length(bytes) = 11414
I frames: 3 frames, size = 31677/ 95032, quants = 1 / 1.00 / 1
P frames: 21 frames, size = 8519/ 178919, quants = 2 / 2.62 / 3


Problem is xvid_encraw is ignoring the imin/imax = 1 if the datarate is to low. (900kBit example, works fine with 2000kBit)

Is this a wanted reaction or a bug?

I personally assumed the imin/imax should weight heavier than the bitrate selection.

side notes:
- frames=24 and max iframe interval to 10 were jsut selected to show the effect and not having to post extrem long logs. The effect also occurs when selecting normal values for these
- removing the vbv restrictions doesn't help
- changing overflow handling setting doesn't help

Cu Selur

Ps.: Link to the regarding thread in german: http://forum.gleitz.info/showthread.php?p=327495

squid_80
6th April 2007, 12:47
I put the same settings in using the vfw config and virtualdub and got the same result. It seems to be something in xvid's rate control rather than a problem with xvid_encraw, I will investigate more tomorrow.

Selur
6th April 2007, 18:44
Yup, checked too and it really seams to be a xvid bug. :)

plugh
10th April 2007, 21:39
I suspect you are encountering an "intentional feature".
...from 2pass2.c
/* Let's compute a linear scaler in order to perform curve scaling */
scaler = (double)(target - total_invariant) / (double)(rc->tot_weighted);

#ifdef SMART_OVERFLOW_SETTING
if (scaler > 0.9) {
rc->param.max_overflow_degradation *= 5;
rc->param.max_overflow_improvement *= 5;
rc->param.overflow_control_strength *= 3;
} else if (scaler > 0.6) {
rc->param.max_overflow_degradation *= 2;
rc->param.max_overflow_improvement *= 2;
rc->param.overflow_control_strength *= 2;
} else {
rc->min_quant = 2;
}
#endif
note the last clause in the if statement

if the ratio computed for your first pass size relative to your 2nd pass target size falls below 0.6, a global min quant of 2 is set.

fwiw, I've had problems with that whole "smart overflow setting" 'feature' in the past, which is why I disable it in my personal builds.

Since you are using encraw, get the squid80 build with my 'alternate second pass' logic (which is focused on fixing the vbv constraint code) - this is disabled in that version.

Selur
11th April 2007, 07:59
@plugh: got a link to the build you are refering to?

Personally I would vote for killing the last else-statement in general. ;)

Cu Selur

plugh
11th April 2007, 12:29
xvid_encraw - Patched with AviSynth input support (http://forum.doom9.org/showthread.php?p=917121#post917121)

Check the version you are currently using to see if it has the "-altpass2" switch (use instead of "-pass2"). For info on changes in this version (and more comments on 'smart overflow setting (http://forum.doom9.org/showthread.php?p=906753#post906753)) or if you want an xvidvfw version

vbv constraint vs undersize avoidance (http://forum.doom9.org/showthread.php?t=118419)

and fyi - constraining max quant ties the vbv code's hands. If you don't let the vbv code increase quant for frames that violate the specified vbv constraint, then you are forcing it to generate streams that violate that constraint!

Selur
17th April 2007, 06:42
@plugh: thx