[FFmpeg-devel] [PATCH] lavfi: add interleave filters
Stefano Sabatini
stefasab at gmail.com
Thu Apr 18 23:00:51 CEST 2013
On date Saturday 2013-04-13 14:02:02 +0200, Stefano Sabatini encoded:
> On date Wednesday 2013-04-10 17:11:33 +0200, Nicolas George encoded:
> > Le primidi 21 germinal, an CCXXI, Stefano Sabatini a écrit :
> > > >From f88d1af608f99ed4f4fe7e1f9e2489049ade04f8 Mon Sep 17 00:00:00 2001
> > > From: Stefano Sabatini <stefasab at gmail.com>
> > > Date: Mon, 8 Apr 2013 15:16:06 +0200
> > > Subject: [PATCH] lavfi: add splice filters
> > >
> > > TODO: bump minor, add changelog entry
> > > ---
> > > doc/filters.texi | 43 +++++++
> > > libavfilter/Makefile | 2 +
> > > libavfilter/allfilters.c | 2 +
> > > libavfilter/f_splice.c | 293 ++++++++++++++++++++++++++++++++++++++++++++++
> > > 4 files changed, 340 insertions(+)
> > > create mode 100644 libavfilter/f_splice.c
> [...]
> > > +static int request_frame(AVFilterLink *outlink)
> > > +{
> > > + AVFilterContext *ctx = outlink->src;
> > > + SpliceContext *splice = ctx->priv;
> > > + int i, queue_idx = -1;
> > > + int64_t pts_min = INT64_MAX;
> > > + AVFrame *frame;
> > > +
> > > + splice->req_fulfilled = 0;
> > > + /* check if all the queues have available frames */
> >
> > > + for (i = 0; i < ctx->nb_inputs; i++) {
> > > + struct FFBufQueue *q = &splice->queues[i];
> > > +
> > > + while (!ctx->inputs[i]->closed && !q->available &&
> > > + !splice->req_fulfilled) {
> > > + int ret = ff_request_frame(ctx->inputs[i]);
> > > + if (ret < 0 && ret != AVERROR_EOF)
> > > + return ret;
> > > + }
> > > +
> > > + if (splice->req_fulfilled)
> > > + return 0;
> > > +
> > > + if (q->available) {
> > > + frame = ff_bufqueue_peek(q, 0);
> > > + if (frame->pts < pts_min) {
> > > + pts_min = frame->pts;
> > > + queue_idx = i;
> > > + }
> > > + }
> > > + }
> > > +
> > > + if (queue_idx < 0)
> > > + return AVERROR_EOF;
> > > +
> > > + /* send out oldest frame */
> > > + return push_frame(ctx, queue_idx);
> >
>
> > Suggestion: move the "find oldest input" loop to push_frame, and let it
> > return in an additional parameter the empty input that is preventing it from
> > progressing. I suspect you will reduce much code duplication.
>
> Changed this, but I can't get the "additional parameter" stuff.
>
> What works:
> ffplay -f lavfi "color=c=red:d=5[l1]; color=c=blue[l2]; [l1][l2] interleave" -framedrop
> ffmpeg -i ~/s/matrixbench_mpeg2.mpg -f lavfi -i testsrc=s=720x576,setsar=1/1 -filter_complex "[0:v]setsar=1/1, [1:v]interleave" -y out.nut
>
> But if I set the duration in the second input I get:
> ffmpeg -i ~/s/matrixbench_mpeg2.mpg -f lavfi -i testsrc=s=720x576:d=2,setsar=1/1 -filter_complex "[0:v]setsar=1/1, [1:v]interleave" -y out.nut
> [...]
> Failed to inject frame into filter network: End of file
>
> Updated patch in attachment.
> --
> FFmpeg = Frightening and Fascinating Mere Pure Extensive Gadget
> From b64c4166e28fa433d73d1690ec2f127fba3ae41b Mon Sep 17 00:00:00 2001
> From: Stefano Sabatini <stefasab at gmail.com>
> Date: Mon, 8 Apr 2013 15:16:06 +0200
> Subject: [PATCH] lavfi: add interleave filters
>
> TODO: bump minor, add changelog entry
> ---
> doc/filters.texi | 48 +++++++++
> libavfilter/Makefile | 2 +
> libavfilter/allfilters.c | 2 +
> libavfilter/f_interleave.c | 255 ++++++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 307 insertions(+)
> create mode 100644 libavfilter/f_interleave.c
Updated, pending problems addressed.
--
FFmpeg = Friendly and Fabulous Mastering Portentous Eccentric Game
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0004-lavfi-add-interleave-filters.patch
Type: text/x-diff
Size: 13307 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130418/ce8cfb2c/attachment.bin>
More information about the ffmpeg-devel
mailing list