| @@ -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; | |||
| } | |||
| @@ -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; | |||
| @@ -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 */ | |||