[FFmpeg-soc] Libavfilter RFC: problem with ffmpeg.c/ffplay.c integration
Bobby Bingham
uhmmmm at gmail.com
Wed Jan 2 16:00:26 CET 2008
On Wed, 02 Jan 2008 12:49:24 +0100
Vitor Sessak <vitor1001 at gmail.com> wrote:
> Hi all,
>
> I've spotted a problem with the ffmpeg.c integration using the command
>
> ffmpeg -vfilters fps=1 -i input.avi output.avi
>
> In the way the integration is done in ffmpeg.c (my fault, I know),
> the filter infrastructure expects one input frame for every output
> frame. But that is not right for all filters. FFplay is also affected
> by this problem (although it's harder to reproduce, I didn't found a
> test case), it has a video queue and a filter will not work properly
> if the queue is empty.
>
> The root of the problem is that in the way libavfilter is designed,
> libavfilter must ask ffmpeg.c/ffplay.c every time it wants a frame,
> no matter how (if any) frame was outputted by the filter chain.
>
> I've thought in a few solutions:
>
> Solution 1 (the closest to the actual code):
>
> In the patch in soc svn, a input filter is defined in ffmpeg.c. A
> solution would be to move the call to av_read_frame and
> avcodec_decode_video to the request_frame method of the input filter,
> so it'll decode a video frame from the file each time the filter asks
> for one.
>
> Problem: Messy, ugly to handle audio and -vcodec copy, makes ffmpeg.c
> even more complex than it is already, scare people away of using
> libavfilter in other applications.
>
> Solution 2 (threading and queuing):
>
> Make ffmpeg.c have a thread for audio decoding, another one for video
> and another for filtering. The video thread will add frames to a
> video queue and the filtering thread will sleep and wait for frames
> is the video queue is empty.
>
> Problem: May introduce bugs, big patch, gives the impression that it
> is impossible to use libavfilter in a single-threaded application.
> There may also be corner cases where the queues gets too big and uses
> gigs of ram.
>
> Solution 3 (change libavfilter):
>
> Allow avfilter_request_frame to give a positive value if it outputs a
> frame, a negative one if error or end of video and zero if it has no
> frame to output be may have one latter. Then make a small video queue
> and just make the request_frame of the input filter return 0 if the
> queue is empty. The advantage is that it'll be easier to use it as a
> library and will not increase too much the complexity of
> ffmpeg.c/ffplay.c.
>
> Problem: Every video filter will have to handle the case where the
> previous filter do not have a frame now but may have latter...
>
> What is your opinion on that?
I'll take a closer look at this tonight, but I think solution 3 sounds
reasonable.
>
> -Vitor
--
Bobby Bingham
Never trust atoms. Or anything made of atoms.
このメールは再利用されたバイトでできている。
More information about the FFmpeg-soc
mailing list