Mercurial > libavcodec.hg
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 |