summaryrefslogtreecommitdiff
path: root/libavfilter/fifo.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-07-09 22:10:38 +0200
committerMichael Niedermayer <michaelni@gmx.at>2012-07-09 22:40:12 +0200
commitf8911b987de4a84ff8ae92f41ff492ece4acadb9 (patch)
tree0ebda51a6ba23d790da30a7168870928954da395 /libavfilter/fifo.c
parentbf5386385dc504a076453ad58f61f808677be747 (diff)
parent5467742232c312b7d61dca7ac57447f728d8d6c9 (diff)
downloadffmpeg-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.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/libavfilter/fifo.c b/libavfilter/fifo.c
index bc9c8fa580..34db5ecbee 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, },