[FFmpeg-devel] [PATCH 07/12] ratecontrol: fix stuffing bits for 30000/1001 fps one frame vbv
Baptiste Coudurier
baptiste.coudurier at gmail.com
Thu Jul 5 18:23:24 EEST 2018
Hi Michael
On Thu, Jul 5, 2018 at 3:43 AM, Michael Niedermayer <michael at niedermayer.cc>
wrote:
> On Wed, Jul 04, 2018 at 11:35:09AM -0700, Baptiste Coudurier wrote:
> > ---
> > libavcodec/ratecontrol.c | 12 ++++++------
> > 1 file changed, 6 insertions(+), 6 deletions(-)
> >
> > diff --git a/libavcodec/ratecontrol.c b/libavcodec/ratecontrol.c
> > index 49d169ba25..28bdddbad1 100644
> > --- a/libavcodec/ratecontrol.c
> > +++ b/libavcodec/ratecontrol.c
> > @@ -705,16 +705,16 @@ int ff_vbv_update(MpegEncContext *s, int
> frame_size)
> > rcc->buffer_index += av_clip(left, min_rate, max_rate);
> >
> > if (rcc->buffer_index > buffer_size) {
> > - int stuffing = ceil((rcc->buffer_index - buffer_size) / 8);
> > + int stuffing = rcc->buffer_index - buffer_size;
> >
> > - if (stuffing < 4 && s->codec_id == AV_CODEC_ID_MPEG4)
> > - stuffing = 4;
> > - rcc->buffer_index -= 8 * stuffing;
> > + if (stuffing < 32 && s->codec_id == AV_CODEC_ID_MPEG4)
> > + stuffing = 32;
> > + rcc->buffer_index -= stuffing;
> >
> > if (s->avctx->debug & FF_DEBUG_RC)
> > - av_log(s->avctx, AV_LOG_DEBUG, "stuffing %d bytes\n",
> stuffing);
> > + av_log(s->avctx, AV_LOG_DEBUG, "stuffing %d bytes\n",
> stuffing>>3);
> >
> > - return stuffing;
> > + return stuffing>>3;
> > }
>
> This would break VBV for most codecs
> buffer_index is a double, the if() condition is triggered if the current
> frame
> is too small. All the rounding has to be up as in the ceil() that was
> there.
> The stuffing that is added, is minimal, so a decrease would be expected to
> break cases occasionally
>
> Can you explain how this code fails, in what exact case
> (max/min rate/ buffer_size/fps) ?
>
Basically It doesn't work for IMX50, requiring exact frame size of 208541
bytes at 30000/1001 fps
and vbv delay of 3003
--
Baptiste Coudurier
More information about the ffmpeg-devel
mailing list