From 97f86680eb761bb92878edff06c10b73b75258a8 Mon Sep 17 00:00:00 2001 From: Nicolas George Date: Thu, 19 Jul 2012 11:14:04 +0200 Subject: [PATCH] lavfi: make copy_buffer_ref common. --- libavfilter/buffer.c | 39 +++++++++++++++++++++++++++++++++++++++ libavfilter/buffersrc.c | 40 +--------------------------------------- libavfilter/internal.h | 3 +++ 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 */