467 |
|
|
468 |
/* vbv_size==0 switches VBV check off */ |
/* vbv_size==0 switches VBV check off */ |
469 |
if (rc->param.vbv_size > 0) { |
if (rc->param.vbv_size > 0) { |
470 |
const double fps = (double)create->fbase/(double)create->fincr; |
const float fps = (float)((double)create->fbase/(double)create->fincr); |
471 |
int status = check_curve_for_vbv_compliancy(rc, fps); |
int status = check_curve_for_vbv_compliancy(rc, fps); |
472 |
|
|
473 |
if (status) { |
if (status) { |
1361 |
if (rc->count[i] == 0 || rc->pb_iboost_tax_ratio == 0) { |
if (rc->count[i] == 0 || rc->pb_iboost_tax_ratio == 0) { |
1362 |
rc->avg_length[i] = 1; |
rc->avg_length[i] = 1; |
1363 |
} else { |
} else { |
1364 |
rc->avg_length[i] = rc->tot_scaled_length[i]; |
rc->avg_length[i] = (double)rc->tot_scaled_length[i]; |
1365 |
|
|
1366 |
if (i == (XVID_TYPE_IVOP-1)) { |
if (i == (XVID_TYPE_IVOP-1)) { |
1367 |
/* I Frames total has to be added the boost total */ |
/* I Frames total has to be added the boost total */ |
1446 |
* aren't...) |
* aren't...) |
1447 |
* |
* |
1448 |
* DivX profiles have 2 criteria: VBV as in MPEG standard |
* DivX profiles have 2 criteria: VBV as in MPEG standard |
1449 |
* a limit on peak bitrate for any 3 seconds |
* a limit on peak bitrate for any 1 second |
1450 |
* |
* |
1451 |
* But if VBV is fulfilled, peakrate is automatically fulfilled in any profile |
* But if VBV is fulfilled, peakrate is automatically fulfilled in any profile |
1452 |
* define so far, so we check for it (for completeness) but correct only VBV |
* defined so far, so we check for it (for completeness) but correct only VBV |
1453 |
* |
* |
1454 |
*****************************************************************************/ |
*****************************************************************************/ |
1455 |
|
|
1456 |
#define VBV_COMPLIANT 0 |
#define VBV_COMPLIANT 0 |
1457 |
#define VBV_UNDERFLOW 1 /* video buffer runs empty */ |
#define VBV_UNDERFLOW 1 /* video buffer runs empty */ |
1458 |
#define VBV_OVERFLOW 2 /* doesn't exist for VBR encoding */ |
#define VBV_OVERFLOW 2 /* doesn't exist for VBR encoding */ |
1459 |
#define VBV_PEAKRATE 4 /* peak bitrate (within 3s) violated */ |
#define VBV_PEAKRATE 4 /* peak bitrate (within 1s) violated */ |
1460 |
|
|
1461 |
static int |
static int |
1462 |
check_curve_for_vbv_compliancy(rc_2pass2_t * rc, const float fps) |
check_curve_for_vbv_compliancy(rc_2pass2_t * rc, const float fps) |
1464 |
/* We do all calculations in float, for higher accuracy, |
/* We do all calculations in float, for higher accuracy, |
1465 |
* and in bytes for convenience. |
* and in bytes for convenience. |
1466 |
* |
* |
1467 |
* typical values from DivX Home Theater profile: |
* typical values from e.g. Home profile: |
1468 |
* vbv_size= 384*1024 (384kB) |
* vbv_size= 384*1024 (384kB) |
1469 |
* vbv_initial= 288*1024 (75% fill) |
* vbv_initial= 288*1024 (75% fill) |
1470 |
* maxrate= 4854000 (4.854MBps) |
* maxrate= 4854000 (4.854MBps) |
1471 |
* peakrate= 8000000 (8MBps) |
* peakrate= 8000000 (8MBps) |
1472 |
* |
* |
1473 |
* PAL: offset3s = 75 (3 seconds of 25fps) |
* PAL: offset1s = 25 (1 second of 25fps) |
1474 |
* NTSC: offset3s = 90 (3 seconds of 29.97fps) or 72 (3 seconds of 23.976fps) |
* NTSC: offset1s = 30 (1 second of 29.97fps) or 24 (1 second of 23.976fps) |
1475 |
*/ |
*/ |
1476 |
|
|
1477 |
const float vbv_size = (float)rc->param.vbv_size/8.f; |
const float vbv_size = (float)rc->param.vbv_size/8.f; |
1482 |
const float peakrate = (float)rc->param.vbv_peakrate; |
const float peakrate = (float)rc->param.vbv_peakrate; |
1483 |
const float r0 = (int)(maxrate/fps+0.5)/8.f; |
const float r0 = (int)(maxrate/fps+0.5)/8.f; |
1484 |
|
|
1485 |
int bytes3s = 0; |
int bytes1s = 0; |
1486 |
int offset3s = (int)(3.f*fps+0.5); |
int offset1s = (int)(1.f*fps+0.5); |
1487 |
int i; |
int i; |
1488 |
|
|
1489 |
/* 1Gbit should be enough to inuitialize the vbvmin |
/* 1Gbit should be enough to inuitialize the vbvmin |
1491 |
vbvmin = 1000*1000*1000; |
vbvmin = 1000*1000*1000; |
1492 |
|
|
1493 |
for (i=0; i<rc->num_frames; i++) { |
for (i=0; i<rc->num_frames; i++) { |
1494 |
/* DivX 3s peak bitrate check */ |
/* DivX 1s peak bitrate check */ |
1495 |
bytes3s += rc->stats[i].scaled_length; |
bytes1s += rc->stats[i].scaled_length; |
1496 |
if (i>=offset3s) |
if (i>=offset1s) |
1497 |
bytes3s -= rc->stats[i-offset3s].scaled_length; |
bytes1s -= rc->stats[i-offset1s].scaled_length; |
1498 |
|
|
1499 |
/* ignore peakrate constraint if peakrate is <= 0.f */ |
/* ignore peakrate constraint if peakrate is <= 0.f */ |
1500 |
if (peakrate>0.f && 8.f*bytes3s > 3*peakrate) |
if (peakrate>0.f && 8.f*bytes1s > peakrate) |
1501 |
return(VBV_PEAKRATE); |
return(VBV_PEAKRATE); |
1502 |
|
|
1503 |
/* update vbv fill level */ |
/* update vbv fill level */ |
1544 |
const float vbv_size = (float)rc->param.vbv_size/8.f; |
const float vbv_size = (float)rc->param.vbv_size/8.f; |
1545 |
const float vbv_initial = (float)rc->param.vbv_initial/8.f; |
const float vbv_initial = (float)rc->param.vbv_initial/8.f; |
1546 |
|
|
1547 |
const float maxrate = 0.9*rc->param.vbv_maxrate; |
const float maxrate = 0.9f*rc->param.vbv_maxrate; |
1548 |
const float vbv_low = 0.10f*vbv_size; |
const float vbv_low = 0.10f*vbv_size; |
1549 |
const float r0 = (int)(maxrate/fps+0.5)/8.f; |
const float r0 = (int)(maxrate/fps+0.5)/8.f; |
1550 |
|
|