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 */ |