lavfi: add a closed field to AVFilerLink.
It will help forward errors and maintain consistency.
This commit is contained in:
parent
ac07f941ae
commit
beeba9161a
@ -172,6 +172,11 @@ int ff_filter_samples_framed(AVFilterLink *link, AVFilterBufferRef *samplesref)
|
||||
|
||||
FF_TPRINTF_START(NULL, filter_samples); ff_tlog_link(NULL, link, 1);
|
||||
|
||||
if (link->closed) {
|
||||
avfilter_unref_buffer(samplesref);
|
||||
return AVERROR_EOF;
|
||||
}
|
||||
|
||||
if (!(filter_samples = dst->filter_samples))
|
||||
filter_samples = default_filter_samples;
|
||||
|
||||
|
@ -159,6 +159,11 @@ void avfilter_link_free(AVFilterLink **link)
|
||||
av_freep(link);
|
||||
}
|
||||
|
||||
void avfilter_link_set_closed(AVFilterLink *link, int closed)
|
||||
{
|
||||
link->closed = closed;
|
||||
}
|
||||
|
||||
int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt,
|
||||
unsigned filt_srcpad_idx, unsigned filt_dstpad_idx)
|
||||
{
|
||||
@ -325,6 +330,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->srcpad->request_frame)
|
||||
ret = link->srcpad->request_frame(link);
|
||||
else if (link->src->inputs[0])
|
||||
@ -335,6 +342,8 @@ int ff_request_frame(AVFilterLink *link)
|
||||
ff_filter_samples_framed(link, pbuf);
|
||||
return 0;
|
||||
}
|
||||
if (ret == AVERROR_EOF)
|
||||
link->closed = 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -697,6 +697,18 @@ struct AVFilterLink {
|
||||
* by the filters.
|
||||
*/
|
||||
AVFilterBufferRef *cur_buf_copy;
|
||||
|
||||
/**
|
||||
* True if the link is closed.
|
||||
* If set, all attemps of start_frame, filter_samples or request_frame
|
||||
* will fail with AVERROR_EOF, and if necessary the reference will be
|
||||
* destroyed.
|
||||
* If request_frame returns AVERROR_EOF, this flag is set on the
|
||||
* corresponding link.
|
||||
* It can be set also be set by either the source or the destination
|
||||
* filter.
|
||||
*/
|
||||
int closed;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -716,6 +728,11 @@ int avfilter_link(AVFilterContext *src, unsigned srcpad,
|
||||
*/
|
||||
void avfilter_link_free(AVFilterLink **link);
|
||||
|
||||
/**
|
||||
* Set the closed field of a link.
|
||||
*/
|
||||
void avfilter_link_set_closed(AVFilterLink *link, int closed);
|
||||
|
||||
/**
|
||||
* Negotiate the media format, dimensions, etc of all inputs to a filter.
|
||||
*
|
||||
|
@ -248,6 +248,11 @@ int ff_start_frame(AVFilterLink *link, AVFilterBufferRef *picref)
|
||||
|
||||
FF_TPRINTF_START(NULL, start_frame); ff_tlog_link(NULL, link, 0); ff_tlog(NULL, " "); ff_tlog_ref(NULL, picref, 1);
|
||||
|
||||
if (link->closed) {
|
||||
avfilter_unref_buffer(picref);
|
||||
return AVERROR_EOF;
|
||||
}
|
||||
|
||||
if (!(start_frame = dst->start_frame))
|
||||
start_frame = default_start_frame;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user