|
|
|
@ -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; |
|
|
|
|
|
|
|
|
|