[x264-devel] commit: Improve 2-pass bitrate prediction (Jason Garrett-Glaser )
git at videolan.org
git at videolan.org
Thu Jul 15 04:08:45 CEST 2010
x264 | branch: stable | Jason Garrett-Glaser <darkshikari at gmail.com> | Sat Jun 19 01:41:07 2010 -0700| [f7ca49910a4663fd743734f288ea88079e09deeb] | committer: Jason Garrett-Glaser
Improve 2-pass bitrate prediction
Adapt based on distance to the end in bits, not in frames.
Helps in videos with absurdly simple end sections, e.g. black frames.
> http://git.videolan.org/gitweb.cgi/x264.git/?a=commit;h=f7ca49910a4663fd743734f288ea88079e09deeb
---
encoder/ratecontrol.c | 12 +++++++++---
1 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/encoder/ratecontrol.c b/encoder/ratecontrol.c
index aef5083..16afbf0 100644
--- a/encoder/ratecontrol.c
+++ b/encoder/ratecontrol.c
@@ -2034,9 +2034,6 @@ static float rate_estimate_qscale( x264_t *h )
double lmax = rcc->lmax[pict_type];
int64_t diff;
int64_t predicted_bits = total_bits;
- /* Adjust ABR buffer based on distance to the end of the video. */
- if( rcc->num_entries > h->i_frame )
- abr_buffer *= 0.5 * sqrt( rcc->num_entries - h->i_frame );
if( rcc->b_vbv )
{
@@ -2062,6 +2059,15 @@ static float rate_estimate_qscale( x264_t *h )
predicted_bits += (int64_t)(h->i_thread_frames - 1) * rcc->bitrate / rcc->fps;
}
+ /* Adjust ABR buffer based on distance to the end of the video. */
+ if( rcc->num_entries > h->i_frame )
+ {
+ double final_bits = rcc->entry[rcc->num_entries-1].expected_bits;
+ double video_pos = rce.expected_bits / final_bits;
+ double scale_factor = sqrt( (1 - video_pos) * rcc->num_entries );
+ abr_buffer *= 0.5 * X264_MAX( scale_factor, 0.5 );
+ }
+
diff = predicted_bits - (int64_t)rce.expected_bits;
q = rce.new_qscale;
q /= x264_clip3f((double)(abr_buffer - diff) / abr_buffer, .5, 2);
More information about the x264-devel
mailing list