lavfi: add helpers to consume frames from link FIFOs.
This commit is contained in:
		
							parent
							
								
									2e5af443c3
								
							
						
					
					
						commit
						d360ddf03b
					
				@ -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
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user