[FFmpeg-trac] #3079(FFmpeg:open): libavfilter caches and drops frames with multiple desynched input streams

FFmpeg trac at avcodec.org
Fri Oct 25 12:01:36 CEST 2013


#3079: libavfilter caches and drops frames with multiple desynched input streams
------------------------------------+----------------------------------
             Reporter:  richardpl   |                    Owner:
                 Type:  defect      |                   Status:  open
             Priority:  normal      |                Component:  FFmpeg
              Version:  git-master  |               Resolution:
             Keywords:  bounty      |               Blocked By:
             Blocking:              |  Reproduced by developer:  1
Analyzed by developer:  1           |
------------------------------------+----------------------------------

Comment (by Cigaes):

 I believe you misunderstood part of the problem. lavfi already have the
 required infrastructure to select the best input to get the data flowing.
 The problem is that ffmpeg does not respect that selection.

 More precisely, here is what happens:

 * Try to overlay 0:v on top of 1:v, muxed with audio from 1:a.

 * ffmpeg decides it needs a video packet, it requests a packet from the
 overlay filter graph.

 * overlay needs a frame on 0:v to progress, it does not have one, it marks
 it as needed.

 * ffmpeg tries to read from 0:v, '''XXX''' but 0:v is not ready.

 * ffmpeg marks the output video stream as temporarily unavailable and
 moves to the next stream: audio.

 * ffmpeg wants a frame for 1:a, so it reads from 1, possibly getting a
 frame for 1:v instead.

 * Repeat.

 The problem is in '''XXX''': if it happens occasionally due to thread
 scheduling randomness, it is not a problem because it is absorbed by the
 various buffers and ffmpeg catches up later.

 But if '''XXX''' happens repeatedly because 0 is slower than 1, then it
 becomes a problem, because decoded frames from 1:v will accumulate in
 overlay's input.

 But it has really nothing to do with lavfi and multiple inputs, the exact
 same happens if you just want to mux 0:v with 1:a, except this times it's
 encoded audio packets that accumulate in the muxer's queue, and that eats
 much less memory. But still, try this:
 {{{
 ./ffmpeg_g -f lavfi -i testsrc=s=10240x7680,scale=320:240 -f s16le -i
 /dev/zero -f framecrc -
 }}}
 {{{
 Error while decoding stream #1:0: Cannot allocate memory
 }}}

 IMHO, the good solution in this case is to stop being greedy: if ffmpeg
 decided it needs to read from input #‌0, then let it wait fro input #‌0;
 the demuxing threads are there to take care of input #‌1 in the meantime
 if necessary.

 I have sent a patch to that effect to the devel mailing-list, I suggest we
 continue the discussion there, with a decent user interface.

-- 
Ticket URL: <https://ffmpeg.org/trac/ffmpeg/ticket/3079#comment:20>
FFmpeg <http://ffmpeg.org>
FFmpeg issue tracker


More information about the FFmpeg-trac mailing list