comparison ratecontrol.c @ 1684:19e781619e3f libavcodec

stuffing to stay above min_bitrate
author michael
date Fri, 12 Dec 2003 21:30:47 +0000
parents 043b6d933fc6
children cdc3d4106fb6
comparison
equal deleted inserted replaced
1683:043b6d933fc6 1684:19e781619e3f
193 av_log(NULL, AV_LOG_ERROR, "bits<0.9\n"); 193 av_log(NULL, AV_LOG_ERROR, "bits<0.9\n");
194 } 194 }
195 return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ bits; 195 return rce->qscale * (double)(rce->i_tex_bits + rce->p_tex_bits+1)/ bits;
196 } 196 }
197 197
198 static void update_rc_buffer(MpegEncContext *s, int frame_size){ 198 int ff_vbv_update(MpegEncContext *s, int frame_size){
199 RateControlContext *rcc= &s->rc_context; 199 RateControlContext *rcc= &s->rc_context;
200 const double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base; 200 const double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base;
201 const double buffer_size= s->avctx->rc_buffer_size; 201 const double buffer_size= s->avctx->rc_buffer_size;
202 const double min_rate= s->avctx->rc_min_rate/fps; 202 const double min_rate= s->avctx->rc_min_rate/fps;
203 const double max_rate= s->avctx->rc_max_rate/fps; 203 const double max_rate= s->avctx->rc_max_rate/fps;
214 214
215 left= buffer_size - rcc->buffer_index - 1; 215 left= buffer_size - rcc->buffer_index - 1;
216 rcc->buffer_index += clip(left, min_rate, max_rate); 216 rcc->buffer_index += clip(left, min_rate, max_rate);
217 217
218 if(rcc->buffer_index > s->avctx->rc_buffer_size){ 218 if(rcc->buffer_index > s->avctx->rc_buffer_size){
219 av_log(s->avctx, AV_LOG_ERROR, "rc buffer overflow\n"); 219 int stuffing= ceil((rcc->buffer_index - s->avctx->rc_buffer_size)/8);
220 rcc->buffer_index= s->avctx->rc_buffer_size; 220
221 } 221 if(stuffing < 4 && s->codec_id == CODEC_ID_MPEG4)
222 } 222 stuffing=4;
223 rcc->buffer_index -= 8*stuffing;
224
225 if(s->avctx->debug & FF_DEBUG_RC)
226 av_log(s->avctx, AV_LOG_DEBUG, "stuffing %d bytes\n", stuffing);
227
228 return stuffing;
229 }
230 }
231 return 0;
223 } 232 }
224 233
225 /** 234 /**
226 * modifies the bitrate curve from pass1 for one frame 235 * modifies the bitrate curve from pass1 for one frame
227 */ 236 */
617 rce->qscale = FF_QP2LAMBDA * 2; 626 rce->qscale = FF_QP2LAMBDA * 2;
618 rce->f_code = s->f_code; 627 rce->f_code = s->f_code;
619 rce->b_code = s->b_code; 628 rce->b_code = s->b_code;
620 rce->misc_bits= 1; 629 rce->misc_bits= 1;
621 630
622 if(picture_number>0)
623 update_rc_buffer(s, s->frame_bits);
624
625 bits= predict_size(&rcc->pred[pict_type], rce->qscale, sqrt(var)); 631 bits= predict_size(&rcc->pred[pict_type], rce->qscale, sqrt(var));
626 if(pict_type== I_TYPE){ 632 if(pict_type== I_TYPE){
627 rce->i_count = s->mb_num; 633 rce->i_count = s->mb_num;
628 rce->i_tex_bits= bits; 634 rce->i_tex_bits= bits;
629 rce->p_tex_bits= 0; 635 rce->p_tex_bits= 0;
812 RateControlEntry *rce= &rcc->entry[i]; 818 RateControlEntry *rce= &rcc->entry[i];
813 double bits; 819 double bits;
814 rce->new_qscale= modify_qscale(s, rce, blured_qscale[i], i); 820 rce->new_qscale= modify_qscale(s, rce, blured_qscale[i], i);
815 bits= qp2bits(rce, rce->new_qscale) + rce->mv_bits + rce->misc_bits; 821 bits= qp2bits(rce, rce->new_qscale) + rce->mv_bits + rce->misc_bits;
816 //printf("%d %f\n", rce->new_bits, blured_qscale[i]); 822 //printf("%d %f\n", rce->new_bits, blured_qscale[i]);
817 update_rc_buffer(s, bits); 823 bits += 8*ff_vbv_update(s, bits);
818 824
819 rce->expected_bits= expected_bits; 825 rce->expected_bits= expected_bits;
820 expected_bits += bits; 826 expected_bits += bits;
821 } 827 }
822 828