[FFmpeg-devel] Evolution of lavfi's design and API

Paul B Mahol onemda at gmail.com
Sun Aug 28 23:49:12 EEST 2016


Hi,

On Thu, Oct 30, 2014 at 1:59 PM, Michael Niedermayer <michaelni at gmx.at>
wrote:

> On Thu, Oct 30, 2014 at 11:50:46AM +0100, Stefano Sabatini wrote:
> > Sorry for the slow reply.
> >
> > On date Wednesday 2014-10-22 23:45:42 +0200, Nicolas George encoded:
> > > [ CCing Anton, as most that is written here also apply to libav too,
> and
> > > this would be a good occasion to try a cross-fork cooperation; if that
> is
> > > not wanted, please let us know so we can drop the cc. ]
> > >
> > > 1. Problems with the current design
> > >
> > >   1.1. Mixed input-/output-driven model
> > >
> > >     Currently, lavfi is designed to work in a mixed input-driven and
> > >     output-driven model. That means the application needs sometimes to
> add
> > >     input to buffersources and sometimes request output to
> buffersinks. This
> > >     is a bit of a nuisance, because it requires the application to do
> it
> > >     properly: adding input on the wrong input or requesting a frame on
> the
> > >     wrong output will cause extra memory consumption or latency.
> > >
> > >     With the libav API, it can not work at all since there is no
> mechanism
> > >     to determine which input needs a frame in order to proceed.
> > >
> > >     The libav API is clearly designed for a more output-driven
> > >     implementation, with FIFOs anywhere to prevent input-driven frames
> to
> > >     reach unready filters. Unfortunately, since it is impossible from
> the
> > >     outside to guess what output will get a frame next, that can cause
> > >     frames to accumulate anywhere in the filter graph, eating a lot of
> > >     memory unnecessarily.
> > >
> > >     FFmpeg's API has eliminated FIFOs in favour of queues in filters
> that
> > >     need it, but these queues can not be controlled for unusual filter
> > >     graphs with extreme needs. Also, there still is an implicit FIFO
> inside
> > >     buffersink.
> > >
> > >   1.2. Recursive implementation
> > >
> > >     All work in a filter graph is triggered by recursive invocations
> of the
> > >     filters' methods. It makes debugging harder. It also can lead to
> large
> > >     stack usage and makes frame- and filter-level multithreading
> harder to
> > >     implement. It also prevents some diagnosis from working reliably.
> > >
> > >   1.3. EOF handling
> > >
> > >     Currently, EOF is propagated only through the return value of the
> > >     request_frame() method. That means it only works in an
> output-driven
> > >     scheme. It also means that it has no timestamp attached to it;
> this is
> > >     an issue for filters where the duration of the last frame is
> relevant,
> > >     like vf_fps.
> > >
> > >   1.4. Latency
> > >
> > >     Some filters need to know the timestamp of the next frame in order
> to
> > >     know when the current frame will stop and be able to process it:
> > >     overlay, fps are two examples. These filters will introduce a
> latency of
> > >     one input frame that could otherwise be avoided.
> > >
> > >   1.5. Timestamps
> > >
> > >     Some filters do not care about timestamps at all. Some check and
> have a
> > >     proper handling of NOPTS values. Some filters just assume the
> frames
> > >     will have timestamps, and possibly make extra assumptions on that:
> > >     monotony, consistency, etc. That is an inconsistent mess.
> > >
> > >   1.6. Sparse streams
> > >
> > >     There is a more severe instance of the latency issue when the input
> > >     comes from an interleaved sparse stream: in that case, waiting for
> the
> > >     next frame in order to find the end of the current one may require
> > >     demuxing a large chunk of input, in turn provoking a lot of
> activity on
> > >     other inputs of the graph.
> >
> > Other issues.
> >
>
> > S1. the filtergraph can't properly readapt to mid-stream
> > changes involving assumed invariants (aspect ratio, size, timebase,
> > pixel format, sample_rate). Indeed the framework was designed as
> > though some of these properties (the ones defined by query_formats)
> > were not allowed to change.
>
> no, no and no :)
> the filtergraph should be able adapt to some changes like aspect,
> resolution and pixel / sample format. These are not invariants, some
> of this definitly worked when i tried it long ago
> i posted a (incomplete) patchset that fixes bugs in this relation
> long ago There are filters that can perfectly well handle changes in
> resolution, aspect, formats, ...
> and there are filters which are buggy but could when they are fixed
> also equally well support such changes
> and there are filters which fundamentally do not support some changes,
> these need to either be reinited and loose state/history or a
> scale/aresample be inserted before them when changes on their input
> occur
> for some filters reinit is not appropriate, examples are things that
> are intended to collect global statistics
> Also scale / aresample filters can serve as
> "parameter change barriers", filters afterwards do not need to deal
> with such changes
>
>
> >
> > S2. Another problem is that we initialize the filter before the
> > filtergraph, so for example the single filter can't readapt to the
> > filtergraph topology. For example it would be useful to have the split
> > filter to change the number of outputs depending on the number of
> > outputs specified, but this can't be easily achieved. (That's in my
> > opinion a minor problem though).
> >
>
> > S3. It is not possible to direct commands towards a specific
> > filter. For this we can add an ID to each filter instance. We could
> > have something has:
> > color:left_color=c=red   [left]
> > color:right_color=c=blue [right]
> >
> > then you can send commands (e.g. with zmq) with:
> > echo left_color c yellow | tools/zmqsend
>
> c sends to all filters
> C sends to a specific filter
> What problem is there with C ?
>
>
> [...]
> > > 2. Proposed API changes
> > >
> > >   To fix/enhance all these issues, I believe a complete rethink of the
> > >   scheduling design of the library is necessary. I propose the
> following
> > >   changes.
> > >
> > >   Note: some of these changes are not 100% related to the issues I
> raised,
> > >   but looked like a good idea while thinking on an API rework.
> > >
> > >   2.1. AVFrame.duration
> > >
> > >     Add a duration field to AVFrame; if set, it indicates the duration
> of
> > >     the frame. Thus, it becomes unnecessary to wait for the next frame
> to
> > >     know when the current frame stops, reducing the latency.
> > >
> > >     Another solution would be to add a dedicated function on buffersrc
> to
> > >     inject a timestamp for end or activity on a link. That would avoid
> the
> > >     need of adding a field to AVFrame.
> >
> > Currently we have pkt_duration in AVFrame. The main problem is that we
> > would need to rescale the duration accordingly in all filters when we
> > change the timebase.
> >
> > Alternatively we should add a timebase value to AVFrame. Currently
> > that information is stored externally, and this was never easy to
> > handle. For example the timestamp in a filter is currently interpreted
> > according to the input link time base. Unfortunately this will
> > introduce redundancy.
>
> yes, also theres a somewhat related patch:
> Benoit Fouet    (4.5K) [FFmpeg-devel] [PATCH] libavu: add pkt_timebase to
> AVFrame.
>
> also speaking of patches, comments for
> [FFmpeg-devel] [PATCH] avutil/avstring: support asymmetric escaping in
> av_get_token()
> are welcome
> i cant just apply it as its not 100% compatible with past formating
> though its 99.9% and mayb 100% for actual used strings
> so this patch really needs comments from people ...
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> While the State exists there can be no freedom; when there is freedom there
> will be no State. -- Vladimir Lenin
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
>
Nicolas, what is status of this?

I'm currently interested in frame multithreading in lavfi.


More information about the ffmpeg-devel mailing list