1 |
/****************************************************************************** |
/****************************************************************************** |
2 |
* |
* |
3 |
* XviD Bit Rate Controller Library |
* Xvid Bit Rate Controller Library |
4 |
* - VBR 2 pass bitrate controller implementation - |
* - VBR 2 pass bitrate controller implementation - |
5 |
* |
* |
6 |
* Copyright (C) 2002 Foxer <email?> |
* Copyright (C) 2002 Benjamin Lambert <foxer@hotmail.com> |
7 |
* 2002 Dirk Knop <dknop@gwdg.de> |
* 2002 Dirk Knop <dknop@gwdg.de> |
8 |
* 2002-2003 Edouard Gomez <ed.gomez@free.fr> |
* 2002-2003 Edouard Gomez <ed.gomez@free.fr> |
9 |
* 2003 Pete Ross <pross@xvid.org> |
* 2003 Pete Ross <pross@xvid.org> |
10 |
* |
* |
11 |
* This curve treatment algorithm is the one originally implemented by Foxer |
* This curve treatment algorithm is the one originally implemented by Foxer |
12 |
* and tuned by Dirk Knop for the XviD vfw frontend. |
* and tuned by Dirk Knop for the Xvid vfw frontend. |
13 |
* |
* |
14 |
* This program is free software; you can redistribute it and/or modify |
* This program is free software; you can redistribute it and/or modify |
15 |
* it under the terms of the GNU General Public License as published by |
* it under the terms of the GNU General Public License as published by |
219 |
*--------------------------------*/ |
*--------------------------------*/ |
220 |
double desired_total; |
double desired_total; |
221 |
double real_total; |
double real_total; |
222 |
|
|
223 |
|
int scaled_frames; |
224 |
} rc_2pass2_t; |
} rc_2pass2_t; |
225 |
|
|
226 |
|
|
346 |
|
|
347 |
rc->fq_error = 0; |
rc->fq_error = 0; |
348 |
rc->min_quant = 1; |
rc->min_quant = 1; |
349 |
|
rc->scaled_frames = 0; |
350 |
|
|
351 |
/* Count frames (and intra frames) in the stats file, store the result into |
/* Count frames (and intra frames) in the stats file, store the result into |
352 |
* the rc structure */ |
* the rc structure */ |
460 |
if (rc->param.vbv_size==0) { |
if (rc->param.vbv_size==0) { |
461 |
rc->param.vbv_size = 3145728; |
rc->param.vbv_size = 3145728; |
462 |
rc->param.vbv_initial = 2359296; |
rc->param.vbv_initial = 2359296; |
463 |
rc->param.vbv_maxrate = 4000000; |
rc->param.vbv_maxrate = 4854000; |
464 |
rc->param.vbv_peakrate = 10000000; |
rc->param.vbv_peakrate = 8000000; |
465 |
} |
} |
466 |
#endif |
#endif |
467 |
|
|
797 |
rc->last_quant[s->type-1] = data->quant; |
rc->last_quant[s->type-1] = data->quant; |
798 |
|
|
799 |
/* Don't forget to force 1st pass frame type ;-) */ |
/* Don't forget to force 1st pass frame type ;-) */ |
800 |
|
if (rc->scaled_frames) |
801 |
data->type = s->type; |
data->type = s->type; |
802 |
|
|
803 |
|
rc->scaled_frames++; |
804 |
return 0; |
return 0; |
805 |
} |
} |
806 |
|
|
959 |
/* We are done with the file */ |
/* We are done with the file */ |
960 |
fclose(f); |
fclose(f); |
961 |
|
|
962 |
return(0); |
if (!rc->num_keyframes) return (-1); /* No keyframes? Then something is wrong */ |
963 |
|
else return(0); |
964 |
} |
} |
965 |
|
|
966 |
/* open stats file(s) and read into rc->stats array */ |
/* open stats file(s) and read into rc->stats array */ |
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= 4000000 (4MBps) |
* maxrate= 4854000 (4.854MBps) |
1471 |
* peakrate= 10000000 (10MBps) |
* 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 |
if (8.f*bytes3s > 3*peakrate) |
/* ignore peakrate constraint if peakrate is <= 0.f */ |
1500 |
|
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 */ |