[FFmpeg-devel] libavcodec memory usage

Ronald S. Bultje rsbultje at gmail.com
Tue Jan 3 19:26:59 EET 2017


Hi,

On Tue, Jan 3, 2017 at 12:16 PM, Matthieu Beghin <
matthieu.beghin at garagecube.com> wrote:

>
> > On 03 Jan 2017, at 17:55, Ronald S. Bultje <rsbultje at gmail.com> wrote:
> >
> > Hi,
> >
> > On Tue, Jan 3, 2017 at 11:44 AM, Matthieu Beghin <
> > matthieu.beghin at garagecube.com> wrote:
> >
> >>> I'm assuming that you're talking about 8K H264 with pixfmt=yuv420p10?
> 8K
> >> yuv420p10 frames are 100MB
> >>
> >> Correct
> >>
> >>> 32 plus delayed output and current_pic gives H264_MAX_PICTURE_COUNT =
> 36
> >> without threading: 36*100=3.6GB.
> >>
> >> What do you mean by "delayed output” ? Can you link me to a document ?
> >
> >
> > Out-of-order coded P-frames, they are buffered internally but not counted
> > (and thus extra) on top of the max_refs value. I believe the spec calls
> > this dpb (delayed pic buffer).
> >
> >> Or maybe consider ditching 32bit support?
> >>
> >> Unfortunately, that’s 10 years old app using OSX Carbon library (not 64
> >> bits), and rewriting that part would be too much work.
> >>
> >
> > I'm frowning at you. Really badly.
> >
> > As an alternative, is there a way to know how much bytes are buffered ?
> >> Iterating buffered frames ?
> >
> >
> > What are you hoping to accomplish by knowing how many bytes are buffered?
> > It doesn't solve the problem? But anyway, check
> > H264Context->short/long_ref[]; delayed_pic[] gives you the delayed
> output.
> >
>
> I’m trying to let people use 8k movies if it will fit, but in case it
> would use more than 1 GB, refuse to load the file. My application is a live
> application, it cannot crash, and actually, it can...
>
> So to know how much bytes livavcodec is using, I have to know the number
> of frames / field, if it is interlaced and the number of delayed frames,
> that's correct ?
>
> How can I know the number of frames / field ?
> To know if it’s interlaced: AVFrame::interlaced_frame
> Number of delayed frames ?
>
> Another solution is to start playing the movie and to check the buffered
> data amount each time I decode a frame, then stop the movie if it uses more
> than 1 GB...
> In this case, just iterating H264Context->short/long_ref[]; delayed_pic[]
> would be enough ?
> How can I get the H264Context ?


You can't access H264Context outside libavcodec without hacks...

Does something in libavcodec crash if you use too much mem? (If so: what?
We want to fix this...) Or something else?

The idea is that on OOM, libavcodec mallocs fail and we return gracefully.
If that doesn't happen, we want to fix it.

Ronald


More information about the ffmpeg-devel mailing list