summaryrefslogtreecommitdiff
path: root/libavfilter/buffer.c
diff options
context:
space:
mode:
authorNicolas George <nicolas.george@normalesup.org>2012-07-19 11:14:04 +0200
committerNicolas George <nicolas.george@normalesup.org>2012-07-20 13:16:23 +0200
commit97f86680eb761bb92878edff06c10b73b75258a8 (patch)
tree2b2e92e32f3b406ef93d41564236c58be21fbec0 /libavfilter/buffer.c
parentb0629366a26628f19245ea2c06a6e366cb70f92f (diff)
lavfi: make copy_buffer_ref common.
Diffstat (limited to 'libavfilter/buffer.c')
-rw-r--r--libavfilter/buffer.c39
1 files changed, 39 insertions, 0 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;
+}