lavfi/buffersrc: push frame directly.
This allows to remove the queued frame entirely.
This commit is contained in:
		
							parent
							
								
									02daafb45c
								
							
						
					
					
						commit
						f09ae7309d
					
				@ -43,7 +43,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
typedef struct BufferSourceContext {
 | 
					typedef struct BufferSourceContext {
 | 
				
			||||||
    const AVClass    *class;
 | 
					    const AVClass    *class;
 | 
				
			||||||
    AVFrame          *queued_frame;
 | 
					 | 
				
			||||||
    AVRational        time_base;     ///< time_base to set in the output link
 | 
					    AVRational        time_base;     ///< time_base to set in the output link
 | 
				
			||||||
    AVRational        frame_rate;    ///< frame_rate to set in the output link
 | 
					    AVRational        frame_rate;    ///< frame_rate to set in the output link
 | 
				
			||||||
    unsigned          nb_failed_requests;
 | 
					    unsigned          nb_failed_requests;
 | 
				
			||||||
@ -241,11 +240,11 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    av_assert0(s->queued_frame == NULL);
 | 
					    ret = ff_filter_frame(ctx->outputs[0], copy);
 | 
				
			||||||
    s->queued_frame = copy;
 | 
					    if (ret < 0) {
 | 
				
			||||||
    if ((ret = ctx->output_pads[0].request_frame(ctx->outputs[0])) < 0)
 | 
					        av_frame_free(©);
 | 
				
			||||||
        return ret;
 | 
					        return ret;
 | 
				
			||||||
    av_assert0(s->queued_frame == NULL);
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if ((flags & AV_BUFFERSRC_FLAG_PUSH)) {
 | 
					    if ((flags & AV_BUFFERSRC_FLAG_PUSH)) {
 | 
				
			||||||
        ret = push_frame(ctx->graph);
 | 
					        ret = push_frame(ctx->graph);
 | 
				
			||||||
@ -369,7 +368,6 @@ static av_cold int init_audio(AVFilterContext *ctx)
 | 
				
			|||||||
static av_cold void uninit(AVFilterContext *ctx)
 | 
					static av_cold void uninit(AVFilterContext *ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    BufferSourceContext *s = ctx->priv;
 | 
					    BufferSourceContext *s = ctx->priv;
 | 
				
			||||||
    av_assert0(s->queued_frame == NULL);
 | 
					 | 
				
			||||||
    av_buffer_unref(&s->hw_frames_ctx);
 | 
					    av_buffer_unref(&s->hw_frames_ctx);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -443,16 +441,10 @@ static int request_frame(AVFilterLink *link)
 | 
				
			|||||||
    AVFrame *frame;
 | 
					    AVFrame *frame;
 | 
				
			||||||
    int ret;
 | 
					    int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!c->queued_frame) {
 | 
					    if (c->eof)
 | 
				
			||||||
        if (c->eof)
 | 
					        return AVERROR_EOF;
 | 
				
			||||||
            return AVERROR_EOF;
 | 
					    c->nb_failed_requests++;
 | 
				
			||||||
        c->nb_failed_requests++;
 | 
					    return AVERROR(EAGAIN);
 | 
				
			||||||
        return AVERROR(EAGAIN);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    frame = c->queued_frame;
 | 
					 | 
				
			||||||
    c->queued_frame = NULL;
 | 
					 | 
				
			||||||
    ret = ff_filter_frame(link, frame);
 | 
					 | 
				
			||||||
    return ret;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static const AVFilterPad avfilter_vsrc_buffer_outputs[] = {
 | 
					static const AVFilterPad avfilter_vsrc_buffer_outputs[] = {
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user