diff options
author | Nicolas George <george@nsup.org> | 2015-09-24 10:07:42 +0200 |
---|---|---|
committer | Nicolas George <george@nsup.org> | 2015-12-22 16:04:30 +0100 |
commit | 108b4de5529a75b06da72b974b26625a8067001f (patch) | |
tree | c38c0fc0600038a55116cbc3246e8158c491df89 /libavfilter/avfilter.c | |
parent | 39a09e995d32d16e4f8c87a6ff5273cb9d98146e (diff) | |
download | ffmpeg-108b4de5529a75b06da72b974b26625a8067001f.tar.gz |
lavfi: replace link.closed by link.status.
The status field can carry any error code instead of just EOF.
Also only update it through a wrapper function and provide a timestamp.
Update the few filters that used it directly.
Diffstat (limited to 'libavfilter/avfilter.c')
-rw-r--r-- | libavfilter/avfilter.c | 25 |
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)) |