mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2024-12-21 23:10:13 +00:00
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);
|
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))
|
if (!(filter_samples = dst->filter_samples))
|
||||||
filter_samples = default_filter_samples;
|
filter_samples = default_filter_samples;
|
||||||
|
|
||||||
|
@ -159,6 +159,11 @@ void avfilter_link_free(AVFilterLink **link)
|
|||||||
av_freep(link);
|
av_freep(link);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void avfilter_link_set_closed(AVFilterLink *link, int closed)
|
||||||
|
{
|
||||||
|
link->closed = closed;
|
||||||
|
}
|
||||||
|
|
||||||
int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt,
|
int avfilter_insert_filter(AVFilterLink *link, AVFilterContext *filt,
|
||||||
unsigned filt_srcpad_idx, unsigned filt_dstpad_idx)
|
unsigned filt_srcpad_idx, unsigned filt_dstpad_idx)
|
||||||
{
|
{
|
||||||
@ -325,6 +330,8 @@ int ff_request_frame(AVFilterLink *link)
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
FF_TPRINTF_START(NULL, request_frame); ff_tlog_link(NULL, link, 1);
|
FF_TPRINTF_START(NULL, request_frame); ff_tlog_link(NULL, link, 1);
|
||||||
|
|
||||||
|
if (link->closed)
|
||||||
|
return AVERROR_EOF;
|
||||||
if (link->srcpad->request_frame)
|
if (link->srcpad->request_frame)
|
||||||
ret = link->srcpad->request_frame(link);
|
ret = link->srcpad->request_frame(link);
|
||||||
else if (link->src->inputs[0])
|
else if (link->src->inputs[0])
|
||||||
@ -335,6 +342,8 @@ int ff_request_frame(AVFilterLink *link)
|
|||||||
ff_filter_samples_framed(link, pbuf);
|
ff_filter_samples_framed(link, pbuf);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
if (ret == AVERROR_EOF)
|
||||||
|
link->closed = 1;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -697,6 +697,18 @@ struct AVFilterLink {
|
|||||||
* by the filters.
|
* by the filters.
|
||||||
*/
|
*/
|
||||||
AVFilterBufferRef *cur_buf_copy;
|
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);
|
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.
|
* 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);
|
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))
|
if (!(start_frame = dst->start_frame))
|
||||||
start_frame = default_start_frame;
|
start_frame = default_start_frame;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user