mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-28 12:32:17 +02:00
lavfi: make copy_buffer_ref common.
This commit is contained in:
parent
b0629366a2
commit
97f86680eb
@ -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 */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user