From 97f86680eb761bb92878edff06c10b73b75258a8 Mon Sep 17 00:00:00 2001 From: Nicolas George Date: Thu, 19 Jul 2012 11:14:04 +0200 Subject: lavfi: make copy_buffer_ref common. --- libavfilter/buffer.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'libavfilter/buffer.c') 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; +} -- cgit v1.2.3