Browse Source

vsrc_buffer: allow using a NULL buffer to signal EOF.

tags/n0.11
Anton Khirnov 13 years ago
parent
commit
7ae7c41413
2 changed files with 20 additions and 1 deletions
  1. +1
    -0
      libavfilter/buffersrc.h
  2. +19
    -1
      libavfilter/vsrc_buffer.c

+ 1
- 0
libavfilter/buffersrc.h View File

@@ -32,6 +32,7 @@
* *
* @param buf buffer containing frame data to be passed down the filtergraph. * @param buf buffer containing frame data to be passed down the filtergraph.
* This function will take ownership of buf, the user must not free it. * This function will take ownership of buf, the user must not free it.
* A NULL buf signals EOF -- i.e. no more frames will be sent to this filter.
*/ */
int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf); int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf);




+ 19
- 1
libavfilter/vsrc_buffer.c View File

@@ -35,6 +35,7 @@ typedef struct {
enum PixelFormat pix_fmt; enum PixelFormat pix_fmt;
AVRational time_base; ///< time_base to set in the output link AVRational time_base; ///< time_base to set in the output link
AVRational pixel_aspect; AVRational pixel_aspect;
int eof;
} BufferSourceContext; } BufferSourceContext;


#define CHECK_PARAM_CHANGE(s, c, width, height, format)\ #define CHECK_PARAM_CHANGE(s, c, width, height, format)\
@@ -50,6 +51,12 @@ int av_vsrc_buffer_add_frame(AVFilterContext *buffer_filter, AVFrame *frame,
AVFilterBufferRef *buf; AVFilterBufferRef *buf;
int ret; int ret;


if (!buf) {
c->eof = 1;
return 0;
} else if (c->eof)
return AVERROR(EINVAL);

if (!av_fifo_space(c->fifo) && if (!av_fifo_space(c->fifo) &&
(ret = av_fifo_realloc2(c->fifo, av_fifo_size(c->fifo) + (ret = av_fifo_realloc2(c->fifo, av_fifo_size(c->fifo) +
sizeof(buf))) < 0) sizeof(buf))) < 0)
@@ -79,6 +86,12 @@ int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf)
BufferSourceContext *c = s->priv; BufferSourceContext *c = s->priv;
int ret; int ret;


if (!buf) {
c->eof = 1;
return 0;
} else if (c->eof)
return AVERROR(EINVAL);

if (!av_fifo_space(c->fifo) && if (!av_fifo_space(c->fifo) &&
(ret = av_fifo_realloc2(c->fifo, av_fifo_size(c->fifo) + (ret = av_fifo_realloc2(c->fifo, av_fifo_size(c->fifo) +
sizeof(buf))) < 0) sizeof(buf))) < 0)
@@ -160,6 +173,8 @@ static int request_frame(AVFilterLink *link)
AVFilterBufferRef *buf; AVFilterBufferRef *buf;


if (!av_fifo_size(c->fifo)) { if (!av_fifo_size(c->fifo)) {
if (c->eof)
return AVERROR_EOF;
av_log(link->src, AV_LOG_ERROR, av_log(link->src, AV_LOG_ERROR,
"request_frame() called with no available frame!\n"); "request_frame() called with no available frame!\n");
return AVERROR(EINVAL); return AVERROR(EINVAL);
@@ -177,7 +192,10 @@ static int request_frame(AVFilterLink *link)
static int poll_frame(AVFilterLink *link) static int poll_frame(AVFilterLink *link)
{ {
BufferSourceContext *c = link->src->priv; BufferSourceContext *c = link->src->priv;
return !!av_fifo_size(c->fifo);
int size = av_fifo_size(c->fifo);
if (!size && c->eof)
return AVERROR_EOF;
return size/sizeof(AVFilterBufferRef*);
} }


AVFilter avfilter_vsrc_buffer = { AVFilter avfilter_vsrc_buffer = {


Loading…
Cancel
Save