lavfi: make copy_buffer_ref common.

pull/28/head
Nicolas George 13 years ago
parent b0629366a2
commit 97f86680eb
  1. 39
      libavfilter/buffer.c
  2. 40
      libavfilter/buffersrc.c
  3. 3
      libavfilter/internal.h

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

Loading…
Cancel
Save