X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavfilter%2Favfilter.c;h=31580f6175f910feaab94721d09df4fb2cf111d1;hb=9c0ec23c7dde8a2d6a356fa21cf3339b208467cf;hp=4d59bba4eec4597893d133864307b8474dc1d784;hpb=4d941eac1655b21af33c6e4d52b7bfd7f9e5b990;p=ffmpeg diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index 4d59bba4eec..31580f6175f 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -23,9 +23,12 @@ #include "libavutil/avstring.h" #include "libavutil/channel_layout.h" #include "libavutil/common.h" +#include "libavutil/imgutils.h" #include "libavutil/pixdesc.h" #include "libavutil/rational.h" +#include "libavutil/samplefmt.h" +#include "audio.h" #include "avfilter.h" #include "formats.h" #include "internal.h" @@ -409,6 +412,8 @@ AVFilter *avfilter_get_by_name(const char *name) int avfilter_register(AVFilter *filter) { + int i; + if (next_registered_avfilter_idx == MAX_REGISTERED_AVFILTERS_NB) { av_log(NULL, AV_LOG_ERROR, "Maximum number of registered filters %d reached, " @@ -417,6 +422,12 @@ int avfilter_register(AVFilter *filter) return AVERROR(ENOMEM); } + for(i=0; filter->inputs && filter->inputs[i].name; i++) { + const AVFilterPad *input = &filter->inputs[i]; + av_assert0( !input->filter_frame + || (!input->start_frame && !input->end_frame && !input->draw_slice)); + } + registered_avfilters[next_registered_avfilter_idx++] = filter; return 0; } @@ -623,3 +634,23 @@ enum AVMediaType avfilter_pad_get_type(AVFilterPad *pads, int pad_idx) { return pads[pad_idx].type; } + +int ff_filter_frame(AVFilterLink *link, AVFilterBufferRef *frame) +{ + int ret; + FF_TPRINTF_START(NULL, filter_frame); ff_tlog_link(NULL, link, 1); ff_tlog(NULL, " "); ff_tlog_ref(NULL, frame, 1); + + switch (link->type) { + case AVMEDIA_TYPE_VIDEO: + if((ret = ff_start_frame(link, frame)) < 0) + return ret; + if((ret = ff_draw_slice(link, 0, frame->video->h, 1)) < 0) + return ret; + if((ret = ff_end_frame(link)) < 0) + return ret; + return ret; + case AVMEDIA_TYPE_AUDIO: + return ff_filter_samples(link, frame); + default: return AVERROR(EINVAL); + } +}