MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / ff_vbv_update

Function ff_vbv_update

libavcodec/ratecontrol.c:718–760  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

716}
717
718int ff_vbv_update(MPVMainEncContext *m, int frame_size)
719{
720 MPVEncContext *const s = &m->s;
721 RateControlContext *const rcc = &m->rc_context;
722 AVCodecContext *const avctx = s->c.avctx;
723 const double fps = get_fps(avctx);
724 const int buffer_size = avctx->rc_buffer_size;
725 const double min_rate = avctx->rc_min_rate / fps;
726 const double max_rate = avctx->rc_max_rate / fps;
727
728 ff_dlog(avctx, "%d %f %d %f %f\n",
729 buffer_size, rcc->buffer_index, frame_size, min_rate, max_rate);
730
731 if (buffer_size) {
732 int left;
733
734 rcc->buffer_index -= frame_size;
735 if (rcc->buffer_index < 0) {
736 av_log(avctx, AV_LOG_ERROR, "rc buffer underflow\n");
737 if (frame_size > max_rate && s->c.qscale == avctx->qmax) {
738 av_log(avctx, AV_LOG_ERROR, "max bitrate possibly too small or try trellis with large lmax or increase qmax\n");
739 }
740 rcc->buffer_index = 0;
741 }
742
743 left = buffer_size - rcc->buffer_index - 1;
744 rcc->buffer_index += av_clip(left, min_rate, max_rate);
745
746 if (rcc->buffer_index > buffer_size) {
747 int stuffing = ceil((rcc->buffer_index - buffer_size) / 8);
748
749 if (stuffing < 4 && s->c.codec_id == AV_CODEC_ID_MPEG4)
750 stuffing = 4;
751 rcc->buffer_index -= 8 * stuffing;
752
753 if (avctx->debug & FF_DEBUG_RC)
754 av_log(avctx, AV_LOG_DEBUG, "stuffing %d bytes\n", stuffing);
755
756 return stuffing;
757 }
758 }
759 return 0;
760}
761
762static double predict_size(Predictor *p, double q, double var)
763{

Callers 3

set_bframe_chain_lengthFunction · 0.85
ff_mpv_encode_pictureFunction · 0.85
init_pass2Function · 0.85

Calls 3

get_fpsFunction · 0.85
av_logFunction · 0.85
ceilFunction · 0.85

Tested by

no test coverage detected