mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-13 21:28:01 +02:00
lavfi/buffersrc: remove fifo.
The frame is immediately pushed, the fifo has never more than one.
This commit is contained in:
parent
03eb96f9b7
commit
9ea7e68907
@ -25,9 +25,9 @@
|
||||
|
||||
#include <float.h>
|
||||
|
||||
#include "libavutil/avassert.h"
|
||||
#include "libavutil/channel_layout.h"
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/fifo.h"
|
||||
#include "libavutil/frame.h"
|
||||
#include "libavutil/imgutils.h"
|
||||
#include "libavutil/internal.h"
|
||||
@ -43,7 +43,7 @@
|
||||
|
||||
typedef struct BufferSourceContext {
|
||||
const AVClass *class;
|
||||
AVFifoBuffer *fifo;
|
||||
AVFrame *queued_frame;
|
||||
AVRational time_base; ///< time_base to set in the output link
|
||||
AVRational frame_rate; ///< frame_rate to set in the output link
|
||||
unsigned nb_failed_requests;
|
||||
@ -228,11 +228,6 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
|
||||
|
||||
}
|
||||
|
||||
if (!av_fifo_space(s->fifo) &&
|
||||
(ret = av_fifo_realloc2(s->fifo, av_fifo_size(s->fifo) +
|
||||
sizeof(copy))) < 0)
|
||||
return ret;
|
||||
|
||||
if (!(copy = av_frame_alloc()))
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
@ -246,15 +241,11 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
|
||||
}
|
||||
}
|
||||
|
||||
if ((ret = av_fifo_generic_write(s->fifo, ©, sizeof(copy), NULL)) < 0) {
|
||||
if (refcounted)
|
||||
av_frame_move_ref(frame, copy);
|
||||
av_frame_free(©);
|
||||
return ret;
|
||||
}
|
||||
|
||||
av_assert0(s->queued_frame == NULL);
|
||||
s->queued_frame = copy;
|
||||
if ((ret = ctx->output_pads[0].request_frame(ctx->outputs[0])) < 0)
|
||||
return ret;
|
||||
av_assert0(s->queued_frame == NULL);
|
||||
|
||||
if ((flags & AV_BUFFERSRC_FLAG_PUSH)) {
|
||||
ret = push_frame(ctx->graph);
|
||||
@ -284,9 +275,6 @@ static av_cold int init_video(AVFilterContext *ctx)
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
if (!(c->fifo = av_fifo_alloc(sizeof(AVFrame*))))
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d pixfmt:%s tb:%d/%d fr:%d/%d sar:%d/%d sws_param:%s\n",
|
||||
c->w, c->h, av_get_pix_fmt_name(c->pix_fmt),
|
||||
c->time_base.num, c->time_base.den, c->frame_rate.num, c->frame_rate.den,
|
||||
@ -367,9 +355,6 @@ static av_cold int init_audio(AVFilterContext *ctx)
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
if (!(s->fifo = av_fifo_alloc(sizeof(AVFrame*))))
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
if (!s->time_base.num)
|
||||
s->time_base = (AVRational){1, s->sample_rate};
|
||||
|
||||
@ -384,13 +369,8 @@ static av_cold int init_audio(AVFilterContext *ctx)
|
||||
static av_cold void uninit(AVFilterContext *ctx)
|
||||
{
|
||||
BufferSourceContext *s = ctx->priv;
|
||||
while (s->fifo && av_fifo_size(s->fifo)) {
|
||||
AVFrame *frame;
|
||||
av_fifo_generic_read(s->fifo, &frame, sizeof(frame), NULL);
|
||||
av_frame_free(&frame);
|
||||
}
|
||||
av_assert0(s->queued_frame == NULL);
|
||||
av_buffer_unref(&s->hw_frames_ctx);
|
||||
av_fifo_freep(&s->fifo);
|
||||
}
|
||||
|
||||
static int query_formats(AVFilterContext *ctx)
|
||||
@ -463,26 +443,23 @@ static int request_frame(AVFilterLink *link)
|
||||
AVFrame *frame;
|
||||
int ret;
|
||||
|
||||
if (!av_fifo_size(c->fifo)) {
|
||||
if (!c->queued_frame) {
|
||||
if (c->eof)
|
||||
return AVERROR_EOF;
|
||||
c->nb_failed_requests++;
|
||||
return AVERROR(EAGAIN);
|
||||
}
|
||||
av_fifo_generic_read(c->fifo, &frame, sizeof(frame), NULL);
|
||||
|
||||
frame = c->queued_frame;
|
||||
c->queued_frame = NULL;
|
||||
ret = ff_filter_frame(link, frame);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int poll_frame(AVFilterLink *link)
|
||||
{
|
||||
BufferSourceContext *c = link->src->priv;
|
||||
int size = av_fifo_size(c->fifo);
|
||||
if (!size && c->eof)
|
||||
return AVERROR_EOF;
|
||||
return size/sizeof(AVFrame*);
|
||||
av_assert0(c->queued_frame == NULL);
|
||||
return c->eof ? AVERROR_EOF : 0;
|
||||
}
|
||||
|
||||
static const AVFilterPad avfilter_vsrc_buffer_outputs[] = {
|
||||
|
Loading…
Reference in New Issue
Block a user