You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
lavfi: add helpers to consume frames from link FIFOs.
This commit is contained in:
@@ -1501,6 +1501,58 @@ int ff_inlink_acknowledge_status(AVFilterLink *link, int *rstatus, int64_t *rpts
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ff_inlink_check_available_frame(AVFilterLink *link)
|
||||||
|
{
|
||||||
|
return ff_framequeue_queued_frames(&link->fifo) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ff_inlink_check_available_samples(AVFilterLink *link, unsigned min)
|
||||||
|
{
|
||||||
|
uint64_t samples = ff_framequeue_queued_samples(&link->fifo);
|
||||||
|
av_assert1(min);
|
||||||
|
return samples >= min || (link->status_in && samples);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void consume_update(AVFilterLink *link, const AVFrame *frame)
|
||||||
|
{
|
||||||
|
ff_inlink_process_commands(link, frame);
|
||||||
|
link->dst->is_disabled = !ff_inlink_evaluate_timeline_at_frame(link, frame);
|
||||||
|
link->frame_count_out++;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe)
|
||||||
|
{
|
||||||
|
AVFrame *frame;
|
||||||
|
|
||||||
|
*rframe = NULL;
|
||||||
|
if (!ff_inlink_check_available_frame(link))
|
||||||
|
return 0;
|
||||||
|
frame = ff_framequeue_take(&link->fifo);
|
||||||
|
consume_update(link, frame);
|
||||||
|
*rframe = frame;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max,
|
||||||
|
AVFrame **rframe)
|
||||||
|
{
|
||||||
|
AVFrame *frame;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
av_assert1(min);
|
||||||
|
*rframe = NULL;
|
||||||
|
if (!ff_inlink_check_available_samples(link, min))
|
||||||
|
return 0;
|
||||||
|
if (link->status_in)
|
||||||
|
min = FFMIN(min, ff_framequeue_queued_samples(&link->fifo));
|
||||||
|
ret = take_samples(link, min, link->max_samples, &frame);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
consume_update(link, frame);
|
||||||
|
*rframe = frame;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe)
|
int ff_inlink_make_frame_writable(AVFilterLink *link, AVFrame **rframe)
|
||||||
{
|
{
|
||||||
AVFrame *frame = *rframe;
|
AVFrame *frame = *rframe;
|
||||||
|
@@ -54,6 +54,48 @@ int ff_inlink_process_commands(AVFilterLink *link, const AVFrame *frame);
|
|||||||
*/
|
*/
|
||||||
int ff_inlink_evaluate_timeline_at_frame(AVFilterLink *link, const AVFrame *frame);
|
int ff_inlink_evaluate_timeline_at_frame(AVFilterLink *link, const AVFrame *frame);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test if a frame is available on the link.
|
||||||
|
* @return >0 if a frame is available
|
||||||
|
*/
|
||||||
|
int ff_inlink_check_available_frame(AVFilterLink *link);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test if enough samples are available on the link.
|
||||||
|
* @return >0 if enough samples are available
|
||||||
|
* @note on EOF and error, min becomes 1
|
||||||
|
*/
|
||||||
|
int ff_inlink_check_available_samples(AVFilterLink *link, unsigned min);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Take a frame from the link's FIFO and update the link's stats.
|
||||||
|
*
|
||||||
|
* If ff_inlink_check_available_frame() was previously called, the
|
||||||
|
* preferred way of expressing it is "av_assert1(ret);" immediately after
|
||||||
|
* ff_inlink_consume_frame(). Negative error codes must still be checked.
|
||||||
|
*
|
||||||
|
* @note May trigger process_command() and/or update is_disabled.
|
||||||
|
* @return >0 if a frame is available,
|
||||||
|
* 0 and set rframe to NULL if no frame available,
|
||||||
|
* or AVERROR code
|
||||||
|
*/
|
||||||
|
int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Take samples from the link's FIFO and update the link's stats.
|
||||||
|
*
|
||||||
|
* If ff_inlink_check_available_samples() was previously called, the
|
||||||
|
* preferred way of expressing it is "av_assert1(ret);" immediately after
|
||||||
|
* ff_inlink_consume_samples(). Negative error codes must still be checked.
|
||||||
|
*
|
||||||
|
* @note May trigger process_command() and/or update is_disabled.
|
||||||
|
* @return >0 if a frame is available,
|
||||||
|
* 0 and set rframe to NULL if no frame available,
|
||||||
|
* or AVERROR code
|
||||||
|
*/
|
||||||
|
int ff_inlink_consume_samples(AVFilterLink *link, unsigned min, unsigned max,
|
||||||
|
AVFrame **rframe);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make sure a frame is writable.
|
* Make sure a frame is writable.
|
||||||
* This is similar to av_frame_make_writable() except it uses the link's
|
* This is similar to av_frame_make_writable() except it uses the link's
|
||||||
|
Reference in New Issue
Block a user