#include "formats.h"
#include "internal.h"
#include "video.h"
-#include "vsrc_buffer.h"
#include "avcodec.h"
#include "libavutil/audioconvert.h"
AVRational time_base; ///< time_base to set in the output link
AVRational frame_rate; ///< frame_rate to set in the output link
unsigned nb_failed_requests;
+ unsigned warning_limit;
/* video only */
int w, h;
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)
{
if (!frame) /* NULL for EOF */
return av_buffersrc_add_ref(buffer_src, NULL, flags);
- switch (buffer_src->outputs[0]->type) {
- case AVMEDIA_TYPE_VIDEO:
- picref = avfilter_get_video_buffer_ref_from_frame(frame, AV_PERM_WRITE);
- break;
- case AVMEDIA_TYPE_AUDIO:
- picref = avfilter_get_audio_buffer_ref_from_frame(frame, AV_PERM_WRITE);
- break;
- default:
- return AVERROR(ENOSYS);
- }
+ picref = avfilter_get_buffer_ref_from_frame(buffer_src->outputs[0]->type,
+ frame, AV_PERM_WRITE);
if (!picref)
return AVERROR(ENOMEM);
ret = av_buffersrc_add_ref(buffer_src, picref, 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;
return ret;
}
c->nb_failed_requests = 0;
+ if (c->warning_limit &&
+ av_fifo_size(c->fifo) / sizeof(buf) >= c->warning_limit) {
+ av_log(s, AV_LOG_WARNING,
+ "%d buffers queued in %s, something may be wrong.\n",
+ c->warning_limit,
+ (char *)av_x_if_null(s->name, s->filter->name));
+ c->warning_limit *= 10;
+ }
return 0;
}
+#ifdef FF_API_BUFFERSRC_BUFFER
int av_buffersrc_buffer(AVFilterContext *s, AVFilterBufferRef *buf)
{
return av_buffersrc_add_ref(s, buf, AV_BUFFERSRC_FLAG_NO_COPY);
}
+#endif
unsigned av_buffersrc_get_nb_failed_requests(AVFilterContext *buffer_src)
{
AVFILTER_DEFINE_CLASS(buffer);
-static av_cold int init_video(AVFilterContext *ctx, const char *args, void *opaque)
+static av_cold int init_video(AVFilterContext *ctx, const char *args)
{
BufferSourceContext *c = ctx->priv;
char pix_fmt_str[128], sws_param[256] = "", *colon, *equal;
goto fail;
}
- av_log(ctx, AV_LOG_INFO, "w:%d h:%d pixfmt:%s tb:%d/%d fr:%d/%d sar:%d/%d sws_param:%s\n",
+ av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d pixfmt:%s tb:%d/%d fr:%d/%d sar:%d/%d sws_param:%s\n",
c->w, c->h, av_pix_fmt_descriptors[c->pix_fmt].name,
c->time_base.num, c->time_base.den, c->frame_rate.num, c->frame_rate.den,
c->pixel_aspect.num, c->pixel_aspect.den, (char *)av_x_if_null(c->sws_param, ""));
+ c->warning_limit = 100;
return 0;
fail:
AVFILTER_DEFINE_CLASS(abuffer);
-static av_cold int init_audio(AVFilterContext *ctx, const char *args, void *opaque)
+static av_cold int init_audio(AVFilterContext *ctx, const char *args)
{
BufferSourceContext *s = ctx->priv;
int ret = 0;
if (!s->time_base.num)
s->time_base = (AVRational){1, s->sample_rate};
- av_log(ctx, AV_LOG_INFO,
+ av_log(ctx, AV_LOG_VERBOSE,
"tb:%d/%d samplefmt:%s samplerate:%d chlayout:%s\n",
s->time_base.num, s->time_base.den, s->sample_fmt_str,
s->sample_rate, s->channel_layout_str);
+ s->warning_limit = 100;
fail:
av_opt_free(s);
{
BufferSourceContext *c = link->src->priv;
AVFilterBufferRef *buf;
+ int ret = 0;
if (!av_fifo_size(c->fifo)) {
if (c->eof)
switch (link->type) {
case AVMEDIA_TYPE_VIDEO:
- ff_start_frame(link, avfilter_ref_buffer(buf, ~0));
- ff_draw_slice(link, 0, link->h, 1);
- ff_end_frame(link);
+ if ((ret = ff_start_frame(link, buf)) < 0 ||
+ (ret = ff_draw_slice(link, 0, link->h, 1)) < 0 ||
+ (ret = ff_end_frame(link)) < 0)
+ return ret;
break;
case AVMEDIA_TYPE_AUDIO:
- ff_filter_samples(link, avfilter_ref_buffer(buf, ~0));
+ ret = ff_filter_samples(link, buf);
break;
default:
+ avfilter_unref_bufferp(&buf);
return AVERROR(EINVAL);
}
- avfilter_unref_buffer(buf);
-
- return 0;
+ return ret;
}
static int poll_frame(AVFilterLink *link)
.init = init_video,
.uninit = uninit,
- .inputs = (AVFilterPad[]) {{ .name = NULL }},
- .outputs = (AVFilterPad[]) {{ .name = "default",
- .type = AVMEDIA_TYPE_VIDEO,
- .request_frame = request_frame,
- .poll_frame = poll_frame,
- .config_props = config_props, },
- { .name = NULL}},
+ .inputs = (const AVFilterPad[]) {{ .name = NULL }},
+ .outputs = (const AVFilterPad[]) {{ .name = "default",
+ .type = AVMEDIA_TYPE_VIDEO,
+ .request_frame = request_frame,
+ .poll_frame = poll_frame,
+ .config_props = config_props, },
+ { .name = NULL}},
};
AVFilter avfilter_asrc_abuffer = {
.init = init_audio,
.uninit = uninit,
- .inputs = (AVFilterPad[]) {{ .name = NULL }},
- .outputs = (AVFilterPad[]) {{ .name = "default",
- .type = AVMEDIA_TYPE_AUDIO,
- .request_frame = request_frame,
- .poll_frame = poll_frame,
- .config_props = config_props, },
- { .name = NULL}},
+ .inputs = (const AVFilterPad[]) {{ .name = NULL }},
+ .outputs = (const AVFilterPad[]) {{ .name = "default",
+ .type = AVMEDIA_TYPE_AUDIO,
+ .request_frame = request_frame,
+ .poll_frame = poll_frame,
+ .config_props = config_props, },
+ { .name = NULL}},
};