diff options
author | Nicolas George <nicolas.george@normalesup.org> | 2012-04-27 20:02:52 +0200 |
---|---|---|
committer | Nicolas George <nicolas.george@normalesup.org> | 2012-05-03 19:55:28 +0200 |
commit | 3985ec0ee68564c213cb0862c8854899690f4321 (patch) | |
tree | de41cf6ce79e8b5aafa718fd4cabc3d3690f0196 | |
parent | 77c0b361b03354621a1ca640d5fb7762e4c9496c (diff) | |
download | ffmpeg-3985ec0ee68564c213cb0862c8854899690f4321.tar.gz |
src_buffer: introduce av_buffersrc_add_ref().
This function merges the features of
av_vsrc_buffer_add_video_buffer_ref() and
av_buffersrc_buffer().
-rw-r--r-- | libavfilter/buffersrc.h | 26 | ||||
-rw-r--r-- | libavfilter/src_buffer.c | 44 |
2 files changed, 46 insertions, 24 deletions
diff --git a/libavfilter/buffersrc.h b/libavfilter/buffersrc.h index 918a54faee..32ef29b16e 100644 --- a/libavfilter/buffersrc.h +++ b/libavfilter/buffersrc.h @@ -27,6 +27,32 @@ #include "avfilter.h" +enum { + + /** + * Do not check for format changes. + */ + AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT = 1, + + /** + * Do not copy buffer data. + */ + AV_BUFFERSRC_FLAG_NO_COPY = 2, + +}; + +/** + * Add video buffer data in picref to buffer_src. + * + * @param buffer_src pointer to a buffer source context + * @param picref a buffer reference, or NULL to mark EOF + * @param flags a combination of AV_BUFFERSRC_FLAG_* + * @return >= 0 in case of success, a negative AVERROR code + * in case of failure + */ +int av_buffersrc_add_ref(AVFilterContext *buffer_src, + AVFilterBufferRef *picref, int flags); + /** * Add a buffer to the filtergraph s. * diff --git a/libavfilter/src_buffer.c b/libavfilter/src_buffer.c index 7873c0aebd..85d03b0289 100644 --- a/libavfilter/src_buffer.c +++ b/libavfilter/src_buffer.c @@ -69,8 +69,8 @@ typedef struct { return AVERROR(EINVAL);\ } -int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, - AVFilterBufferRef *picref, int flags) +int av_buffersrc_add_ref(AVFilterContext *buffer_filter, + AVFilterBufferRef *picref, int flags) { BufferSourceContext *c = buffer_filter->priv; AVFilterLink *outlink = buffer_filter->outputs[0]; @@ -88,6 +88,8 @@ int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, sizeof(buf))) < 0) return ret; + if (!(flags & AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT)) { + /* TODO reindent */ if (picref->video->w != c->w || picref->video->h != c->h || picref->format != c->pix_fmt) { AVFilterContext *scale = buffer_filter->outputs[0]->dst; AVFilterLink *link; @@ -132,7 +134,11 @@ int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, if ((ret = link->srcpad->config_props(link)) < 0) return ret; } + } + if (flags & AV_BUFFERSRC_FLAG_NO_COPY) { + buf = picref; + } else { buf = avfilter_get_video_buffer(outlink, AV_PERM_WRITE, picref->video->w, picref->video->h); av_image_copy(buf->data, buf->linesize, @@ -140,8 +146,11 @@ int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, picref->format, picref->video->w, picref->video->h); avfilter_copy_buffer_ref_props(buf, picref); + } + if ((ret = av_fifo_generic_write(c->fifo, &buf, sizeof(buf), NULL)) < 0) { - avfilter_unref_buffer(buf); + if (buf != picref) + avfilter_unref_buffer(buf); return ret; } c->nb_failed_requests = 0; @@ -149,29 +158,16 @@ int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, return 0; } -int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf) +int av_vsrc_buffer_add_video_buffer_ref(AVFilterContext *buffer_filter, + AVFilterBufferRef *picref, int flags) { - BufferSourceContext *c = s->priv; - int ret; - - if (!buf) { - c->eof = 1; - return 0; - } else if (c->eof) - return AVERROR(EINVAL); - - if (!av_fifo_space(c->fifo) && - (ret = av_fifo_realloc2(c->fifo, av_fifo_size(c->fifo) + - sizeof(buf))) < 0) - return ret; - -// CHECK_PARAM_CHANGE(s, c, buf->video->w, buf->video->h, buf->format); - - if ((ret = av_fifo_generic_write(c->fifo, &buf, sizeof(buf), NULL)) < 0) - return ret; - c->nb_failed_requests = 0; + return av_buffersrc_add_ref(buffer_filter, picref, 0); +} - return 0; +int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf) +{ + return av_buffersrc_add_ref(s, buf, AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT | + AV_BUFFERSRC_FLAG_NO_COPY); } #if CONFIG_AVCODEC |