[FFmpeg-devel] lavfi: request_frame() return value.

Michael Niedermayer michaelni at gmx.at
Sat Mar 16 20:26:34 CET 2013


On Sat, Mar 16, 2013 at 12:25:32AM +0100, Nicolas George wrote:
> Hi. A few words about the API contract of request_frame().
> 
> Here is the current situation:
> 
> * If request_frame() succeeds, it returns 0; it happens if and only if
>   request_frame() pushed (successfully) at least a frame on the same link.
> 
> * If request_frame() can not succeed for temporary external reasons (e.g. a
>   source needs input), it returns AVERROR(EAGAIN).
> 
> * It can always return an error code for other reasons (including EOF, which
>   is not an error); I will omit this case in the rest of this message.
> 
> The problem with these rules is this: if a filter does not produce always at
> least one output frame for each input frame (for example: select can skip
> frames, fps too if the output frame rate is lower than the input, tile needs
> n input frames to produce one output frame), then it needs to implement some
> kind of communication so that filter_frame() can inform request_frame() it
> is done. Something like this:
> 
>     int filter_frame(inlink, frame) {
> 	...
> 	if (can_produce_output) {
> 	    ff_filter_frame(outlink, out_frame);
> 	    self->request_fulfilled = 1;
> 	}
> 	return 0;
>     }
> 
>     int request_frame(outlink) {
> 	self->request_fulfilled = 0;
> 	while (!self->request_fulfilled)
> 	    ff_request_frame(inlink);
> 	return 0;
>     }
> 
> Add to that all error checks and EOF handling, and it can become somewhat
> messy.
> 
> A special case of this is filters that use the min/max_samples feature: in
> that case, the filter before the link thinks it has successfully pushed a
> frame, and therefore returns 0, but the filter after the link did not
> receive it yet.
> 
> I see several solutions for this:
> 
> 0. Leave things as it is. The problem of the min/max_samples can be solved
>    by making it the responsibility of the filter: if a filter sets
>    min/max_samples on its input, it must implement a non-trivial
>    request_frame() as above to make sure a frame was actually received.
> 
> It works, but all in all that makes a lot of code, and there is room for
> simplification. I see two main options that could make things easier:
> 
> 1. Change the semantic of the return value 0: instead of "success, at least
>    one frame has been sent", it can become "success, some progress has been
>    made (a frame has been pushed, or I have accumulated more data to push a
>    frame later, or filters before me did)".
> 
>    This is a change of API, but since all these functions are internal, it
>    only concerns the sinks and people maintaining private trees and forks
>    with additional filters.
> 
> 2. Move the "while (!request_fulfilled) ff_request_frame(inlink);" logic to
>    the framework, namely ff_request_frame(). The request_fulfilled would
>    then be just a private field of AVFilterLink.
> 
> I see small pros and cons for each solution, but I do not see a real problem
> with either. I wonder if people have an advice before considering
> implementing one of them.

IMHO:
the min/max handling should be moved to a seperate filter and this
filter should be auto inserted where needed/requested. This new filter
would have a request_frame that returns correct data/no data
information

this is actually orthogonal to your suggestions and can be implemented
with or without them

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

If a bugfix only changes things apparently unrelated to the bug with no
further explanation, that is a good sign that the bugfix is wrong.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130316/ba928549/attachment.asc>


More information about the ffmpeg-devel mailing list