summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavfilter/buffer.c39
-rw-r--r--libavfilter/buffersrc.c40
-rw-r--r--libavfilter/internal.h3
3 files changed, 43 insertions, 39 deletions
diff --git a/libavfilter/buffer.c b/libavfilter/buffer.c
index 816e23c6a6..30663b5a70 100644
--- a/libavfilter/buffer.c
+++ b/libavfilter/buffer.c
@@ -22,10 +22,12 @@
#include "libavutil/audioconvert.h"
#include "libavutil/avassert.h"
+#include "libavutil/imgutils.h"
#include "libavcodec/avcodec.h"
#include "avfilter.h"
#include "internal.h"
+#include "audio.h"
#include "avcodec.h"
void ff_avfilter_default_free_buffer(AVFilterBuffer *ptr)
@@ -175,3 +177,40 @@ void avfilter_copy_buffer_ref_props(AVFilterBufferRef *dst, AVFilterBufferRef *s
default: break;
}
}
+
+AVFilterBufferRef *ff_copy_buffer_ref(AVFilterLink *outlink,
+ AVFilterBufferRef *ref)
+{
+ AVFilterBufferRef *buf;
+ int channels;
+
+ switch (outlink->type) {
+
+ case AVMEDIA_TYPE_VIDEO:
+ buf = ff_get_video_buffer(outlink, AV_PERM_WRITE,
+ ref->video->w, ref->video->h);
+ if(!buf)
+ return NULL;
+ av_image_copy(buf->data, buf->linesize,
+ (void*)ref->data, ref->linesize,
+ ref->format, ref->video->w, ref->video->h);
+ break;
+
+ case AVMEDIA_TYPE_AUDIO:
+ buf = ff_get_audio_buffer(outlink, AV_PERM_WRITE,
+ ref->audio->nb_samples);
+ if(!buf)
+ return NULL;
+ channels = av_get_channel_layout_nb_channels(ref->audio->channel_layout);
+ av_samples_copy(buf->extended_data, ref->buf->extended_data,
+ 0, 0, ref->audio->nb_samples,
+ channels,
+ ref->format);
+ break;
+
+ default:
+ return NULL;
+ }
+ avfilter_copy_buffer_ref_props(buf, ref);
+ return buf;
+}
diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c
index 72ee268e1b..befefb8069 100644
--- a/libavfilter/buffersrc.c
+++ b/libavfilter/buffersrc.c
@@ -74,44 +74,6 @@ typedef struct {
return AVERROR(EINVAL);\
}
-static AVFilterBufferRef *copy_buffer_ref(AVFilterContext *ctx,
- AVFilterBufferRef *ref)
-{
- AVFilterLink *outlink = ctx->outputs[0];
- AVFilterBufferRef *buf;
- int channels;
-
- switch (outlink->type) {
-
- case AVMEDIA_TYPE_VIDEO:
- buf = ff_get_video_buffer(outlink, AV_PERM_WRITE,
- ref->video->w, ref->video->h);
- if(!buf)
- return NULL;
- av_image_copy(buf->data, buf->linesize,
- (void*)ref->data, ref->linesize,
- ref->format, ref->video->w, ref->video->h);
- break;
-
- case AVMEDIA_TYPE_AUDIO:
- buf = ff_get_audio_buffer(outlink, AV_PERM_WRITE,
- ref->audio->nb_samples);
- if(!buf)
- return NULL;
- channels = av_get_channel_layout_nb_channels(ref->audio->channel_layout);
- av_samples_copy(buf->extended_data, ref->buf->extended_data,
- 0, 0, ref->audio->nb_samples,
- channels,
- ref->format);
- break;
-
- default:
- return NULL;
- }
- avfilter_copy_buffer_ref_props(buf, ref);
- return buf;
-}
-
int av_buffersrc_add_frame(AVFilterContext *buffer_src,
const AVFrame *frame, int flags)
{
@@ -175,7 +137,7 @@ int av_buffersrc_add_ref(AVFilterContext *s, AVFilterBufferRef *buf, int flags)
}
}
if (!(flags & AV_BUFFERSRC_FLAG_NO_COPY))
- to_free = buf = copy_buffer_ref(s, buf);
+ to_free = buf = ff_copy_buffer_ref(s->outputs[0], buf);
if(!buf)
return -1;
diff --git a/libavfilter/internal.h b/libavfilter/internal.h
index d1bcb0353c..b80a6fe1fa 100644
--- a/libavfilter/internal.h
+++ b/libavfilter/internal.h
@@ -347,4 +347,7 @@ int ff_request_frame(AVFilterLink *link);
.category = AV_CLASS_CATEGORY_FILTER, \
}
+AVFilterBufferRef *ff_copy_buffer_ref(AVFilterLink *outlink,
+ AVFilterBufferRef *ref);
+
#endif /* AVFILTER_INTERNAL_H */