| @@ -22,10 +22,12 @@ | |||||
| #include "libavutil/audioconvert.h" | #include "libavutil/audioconvert.h" | ||||
| #include "libavutil/avassert.h" | #include "libavutil/avassert.h" | ||||
| #include "libavutil/imgutils.h" | |||||
| #include "libavcodec/avcodec.h" | #include "libavcodec/avcodec.h" | ||||
| #include "avfilter.h" | #include "avfilter.h" | ||||
| #include "internal.h" | #include "internal.h" | ||||
| #include "audio.h" | |||||
| #include "avcodec.h" | #include "avcodec.h" | ||||
| void ff_avfilter_default_free_buffer(AVFilterBuffer *ptr) | void ff_avfilter_default_free_buffer(AVFilterBuffer *ptr) | ||||
| @@ -175,3 +177,40 @@ void avfilter_copy_buffer_ref_props(AVFilterBufferRef *dst, AVFilterBufferRef *s | |||||
| default: break; | 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);\ | 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, | int av_buffersrc_add_frame(AVFilterContext *buffer_src, | ||||
| const AVFrame *frame, int flags) | 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)) | 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) | if(!buf) | ||||
| return -1; | return -1; | ||||
| @@ -347,4 +347,7 @@ int ff_request_frame(AVFilterLink *link); | |||||
| .category = AV_CLASS_CATEGORY_FILTER, \ | .category = AV_CLASS_CATEGORY_FILTER, \ | ||||
| } | } | ||||
| AVFilterBufferRef *ff_copy_buffer_ref(AVFilterLink *outlink, | |||||
| AVFilterBufferRef *ref); | |||||
| #endif /* AVFILTER_INTERNAL_H */ | #endif /* AVFILTER_INTERNAL_H */ | ||||