summaryrefslogtreecommitdiff
path: root/libavfilter/src_buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavfilter/src_buffer.c')
-rw-r--r--libavfilter/src_buffer.c44
1 files changed, 20 insertions, 24 deletions
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