| 716 | } |
| 717 | |
| 718 | int 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 | |
| 762 | static double predict_size(Predictor *p, double q, double var) |
| 763 | { |
no test coverage detected