diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-07-09 22:10:38 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-07-09 22:40:12 +0200 |
commit | f8911b987de4a84ff8ae92f41ff492ece4acadb9 (patch) | |
tree | 0ebda51a6ba23d790da30a7168870928954da395 /libavfilter/fifo.c | |
parent | bf5386385dc504a076453ad58f61f808677be747 (diff) | |
parent | 5467742232c312b7d61dca7ac57447f728d8d6c9 (diff) | |
download | ffmpeg-streaming-f8911b987de4a84ff8ae92f41ff492ece4acadb9.zip ffmpeg-streaming-f8911b987de4a84ff8ae92f41ff492ece4acadb9.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
mss3: use standard zigzag table
mss3: split DSP functions that are used in MTS2(MSS4) into separate file
motion-test: do not use getopt()
tcp: add initial timeout limit for incoming connections
configure: Change the rdtsc check to a linker check
avconv: propagate fatal errors from lavfi.
lavfi: add error handling to filter_samples().
fate-run: make avconv() properly deal with multiple inputs.
asplit: don't leak the input buffer.
af_resample: fix request_frame() behavior.
af_asyncts: fix request_frame() behavior.
libx264: support aspect ratio switching
matroskadec: honor error_recognition when encountering unknown elements.
lavr: resampling: add support for s32p, fltp, and dblp internal sample formats
lavr: resampling: add filter type and Kaiser window beta to AVOptions
lavr: Use AV_SAMPLE_FMT_NONE to auto-select the internal sample format
lavr: mix: validate internal sample format in ff_audio_mix_init()
Conflicts:
ffmpeg.c
ffplay.c
libavcodec/libx264.c
libavfilter/audio.c
libavfilter/split.c
libavformat/tcp.c
tests/fate-run.sh
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavfilter/fifo.c')
-rw-r--r-- | libavfilter/fifo.c | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/libavfilter/fifo.c b/libavfilter/fifo.c index bc9c8fa..34db5ec 100644 --- a/libavfilter/fifo.c +++ b/libavfilter/fifo.c @@ -72,13 +72,25 @@ static av_cold void uninit(AVFilterContext *ctx) avfilter_unref_buffer(fifo->buf_out); } -static void add_to_queue(AVFilterLink *inlink, AVFilterBufferRef *buf) +static int add_to_queue(AVFilterLink *inlink, AVFilterBufferRef *buf) { FifoContext *fifo = inlink->dst->priv; fifo->last->next = av_mallocz(sizeof(Buf)); + if (!fifo->last->next) { + avfilter_unref_buffer(buf); + return AVERROR(ENOMEM); + } + fifo->last = fifo->last->next; fifo->last->buf = buf; + + return 0; +} + +static void start_frame(AVFilterLink *inlink, AVFilterBufferRef *buf) +{ + add_to_queue(inlink, buf); } static void queue_pop(FifoContext *s) @@ -210,15 +222,13 @@ static int return_audio_frame(AVFilterContext *ctx) buf_out = s->buf_out; s->buf_out = NULL; } - ff_filter_samples(link, buf_out); - - return 0; + return ff_filter_samples(link, buf_out); } static int request_frame(AVFilterLink *outlink) { FifoContext *fifo = outlink->src->priv; - int ret; + int ret = 0; if (!fifo->root.next) { if ((ret = ff_request_frame(outlink->src->inputs[0])) < 0) @@ -238,7 +248,7 @@ static int request_frame(AVFilterLink *outlink) if (outlink->request_samples) { return return_audio_frame(outlink->src); } else { - ff_filter_samples(outlink, fifo->root.next->buf); + ret = ff_filter_samples(outlink, fifo->root.next->buf); queue_pop(fifo); } break; @@ -246,7 +256,7 @@ static int request_frame(AVFilterLink *outlink) return AVERROR(EINVAL); } - return 0; + return ret; } AVFilter avfilter_vf_fifo = { @@ -261,7 +271,7 @@ AVFilter avfilter_vf_fifo = { .inputs = (const AVFilterPad[]) {{ .name = "default", .type = AVMEDIA_TYPE_VIDEO, .get_video_buffer= ff_null_get_video_buffer, - .start_frame = add_to_queue, + .start_frame = start_frame, .draw_slice = draw_slice, .end_frame = end_frame, .rej_perms = AV_PERM_REUSE2, }, |