#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.
*
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];
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;
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,
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;
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