summaryrefslogtreecommitdiff
path: root/libavfilter/avfilter.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavfilter/avfilter.c')
-rw-r--r--libavfilter/avfilter.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c
index 2911b48fd8..cdb47f7f3e 100644
--- a/libavfilter/avfilter.c
+++ b/libavfilter/avfilter.c
@@ -178,9 +178,20 @@ int avfilter_link_get_channels(AVFilterLink *link)
return link->channels;
}
+void ff_avfilter_link_set_in_status(AVFilterLink *link, int status, int64_t pts)
+{
+ ff_avfilter_link_set_out_status(link, status, pts);
+}
+
+void ff_avfilter_link_set_out_status(AVFilterLink *link, int status, int64_t pts)
+{
+ link->status = status;
+ ff_update_link_current_pts(link, pts);
+}
+
void avfilter_link_set_closed(AVFilterLink *link, int closed)
{
- link->closed = closed;
+ ff_avfilter_link_set_out_status(link, closed ? AVERROR_EOF : 0, AV_NOPTS_VALUE);
}
int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt,
@@ -346,8 +357,8 @@ int ff_request_frame(AVFilterLink *link)
int ret = -1;
FF_TPRINTF_START(NULL, request_frame); ff_tlog_link(NULL, link, 1);
- if (link->closed)
- return AVERROR_EOF;
+ if (link->status)
+ return link->status;
if (link->srcpad->request_frame)
ret = link->srcpad->request_frame(link);
else if (link->src->inputs[0])
@@ -358,8 +369,8 @@ int ff_request_frame(AVFilterLink *link)
ret = ff_filter_frame_framed(link, pbuf);
}
if (ret < 0) {
- if (ret == AVERROR_EOF)
- link->closed = 1;
+ if (ret != AVERROR(EAGAIN) && ret != link->status)
+ ff_avfilter_link_set_in_status(link, ret, AV_NOPTS_VALUE);
}
return ret;
}
@@ -1005,9 +1016,9 @@ static int ff_filter_frame_framed(AVFilterLink *link, AVFrame *frame)
AVFilterCommand *cmd= link->dst->command_queue;
int64_t pts;
- if (link->closed) {
+ if (link->status) {
av_frame_free(&frame);
- return AVERROR_EOF;
+ return link->status;
}
if (!(filter_frame = dst->filter_frame))