summaryrefslogtreecommitdiff
path: root/libavcodec/ratecontrol.c
diff options
context:
space:
mode:
authorCorey Hickey <bugfood-ml@fatooh.org>2006-09-05 15:46:06 +0000
committerCorey Hickey <bugfood-ml@fatooh.org>2006-09-05 15:46:06 +0000
commit577cd173e3881cbb5f7e5386c04d5384a7bf9408 (patch)
tree760be2152edd42e4a46a1c10f90ab0a9e17fc8c7 /libavcodec/ratecontrol.c
parent157cba3bdbb238f1511be52d06a41ade2d878556 (diff)
second pass encoding changes:
- warn rather than fail when specified bitrate need not be used - fail with a useful message when specified bitrate is too low - print potentially useful information if verbose patch based mostly on suggestions from Michael Niedermayer and Loren Merritt Originally committed as revision 6176 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/ratecontrol.c')
-rw-r--r--libavcodec/ratecontrol.c45
1 files changed, 39 insertions, 6 deletions
diff --git a/libavcodec/ratecontrol.c b/libavcodec/ratecontrol.c
index 91cf37c497..02108248ec 100644
--- a/libavcodec/ratecontrol.c
+++ b/libavcodec/ratecontrol.c
@@ -790,7 +790,7 @@ static int init_pass2(MpegEncContext *s)
{
RateControlContext *rcc= &s->rc_context;
AVCodecContext *a= s->avctx;
- int i;
+ int i, toobig;
double fps= 1/av_q2d(s->avctx->time_base);
double complexity[5]={0,0,0,0,0}; // aproximate bits at quant=1
uint64_t const_bits[5]={0,0,0,0,0}; // quantizer idependant bits
@@ -801,7 +801,7 @@ static int init_pass2(MpegEncContext *s)
//int last_i_frame=-10000000;
const int filter_size= (int)(a->qblur*4) | 1;
double expected_bits;
- double *qscale, *blured_qscale;
+ double *qscale, *blured_qscale, qscale_sum;
/* find complexity & const_bits & decide the pict_types */
for(i=0; i<rcc->num_entries; i++){
@@ -825,6 +825,7 @@ static int init_pass2(MpegEncContext *s)
qscale= av_malloc(sizeof(double)*rcc->num_entries);
blured_qscale= av_malloc(sizeof(double)*rcc->num_entries);
+ toobig = 0;
for(step=256*256; step>0.0000001; step*=0.5){
expected_bits=0;
@@ -878,14 +879,46 @@ static int init_pass2(MpegEncContext *s)
expected_bits += bits;
}
-// printf("%f %d %f\n", expected_bits, (int)all_available_bits, rate_factor);
- if(expected_bits > all_available_bits) rate_factor-= step;
+ /*
+ av_log(s->avctx, AV_LOG_INFO,
+ "expected_bits: %f all_available_bits: %d rate_factor: %f\n",
+ expected_bits, (int)all_available_bits, rate_factor);
+ */
+ if(expected_bits > all_available_bits) {
+ rate_factor-= step;
+ ++toobig;
+ }
}
av_free(qscale);
av_free(blured_qscale);
- if(fabs(expected_bits/all_available_bits - 1.0) > 0.01 ){
- av_log(s->avctx, AV_LOG_ERROR, "Error: 2pass curve failed to converge\n");
+ /* check bitrate calculations and print info */
+ qscale_sum = 0.0;
+ for(i=0; i<rcc->num_entries; i++){
+ /* av_log(s->avctx, AV_LOG_DEBUG, "[lavc rc] entry[%d].new_qscale = %.3f qp = %.3f\n",
+ i, rcc->entry[i].new_qscale, rcc->entry[i].new_qscale / FF_QP2LAMBDA); */
+ qscale_sum += clip(rcc->entry[i].new_qscale / FF_QP2LAMBDA, s->avctx->qmin, s->avctx->qmax);
+ }
+ assert(toobig <= 40);
+ av_log(s->avctx, AV_LOG_DEBUG,
+ "[lavc rc] requested bitrate: %d bps expected bitrate: %d bps\n",
+ s->bit_rate,
+ (int)(expected_bits / ((double)all_available_bits/s->bit_rate)));
+ av_log(s->avctx, AV_LOG_DEBUG,
+ "[lavc rc] estimated target average qp: %.3f\n",
+ (float)qscale_sum / rcc->num_entries);
+ if (toobig == 0) {
+ av_log(s->avctx, AV_LOG_INFO,
+ "[lavc rc] Using all of requested bitrate is not "
+ "necessary for this video with these parameters.\n");
+ } else if (toobig == 40) {
+ av_log(s->avctx, AV_LOG_ERROR,
+ "[lavc rc] Error: bitrate too low for this video "
+ "with these parameters.\n");
+ return -1;
+ } else if (fabs(expected_bits/all_available_bits - 1.0) > 0.01) {
+ av_log(s->avctx, AV_LOG_ERROR,
+ "[lavc rc] Error: 2pass curve failed to converge\n");
return -1;
}