|
|
@@ -33,6 +33,7 @@ |
|
|
|
#include "libavutil/internal.h" |
|
|
|
#include "libavutil/opt.h" |
|
|
|
#include "libavutil/samplefmt.h" |
|
|
|
#include "libavutil/timestamp.h" |
|
|
|
#include "audio.h" |
|
|
|
#include "avfilter.h" |
|
|
|
#include "buffersrc.h" |
|
|
@@ -67,15 +68,20 @@ typedef struct BufferSourceContext { |
|
|
|
int eof; |
|
|
|
} BufferSourceContext; |
|
|
|
|
|
|
|
#define CHECK_VIDEO_PARAM_CHANGE(s, c, width, height, format)\ |
|
|
|
#define CHECK_VIDEO_PARAM_CHANGE(s, c, width, height, format, pts)\ |
|
|
|
if (c->w != width || c->h != height || c->pix_fmt != format) {\ |
|
|
|
av_log(s, AV_LOG_INFO, "Changing frame properties on the fly is not supported by all filters.\n");\ |
|
|
|
av_log(s, AV_LOG_INFO, "filter context - w: %d h: %d fmt: %d, incoming frame - w: %d h: %d fmt: %d pts_time: %s\n",\ |
|
|
|
c->w, c->h, c->pix_fmt, width, height, format, av_ts2timestr(pts, &s->outputs[0]->time_base));\ |
|
|
|
av_log(s, AV_LOG_WARNING, "Changing video frame properties on the fly is not supported by all filters.\n");\ |
|
|
|
} |
|
|
|
|
|
|
|
#define CHECK_AUDIO_PARAM_CHANGE(s, c, srate, ch_layout, ch_count, format)\ |
|
|
|
#define CHECK_AUDIO_PARAM_CHANGE(s, c, srate, ch_layout, ch_count, format, pts)\ |
|
|
|
if (c->sample_fmt != format || c->sample_rate != srate ||\ |
|
|
|
c->channel_layout != ch_layout || c->channels != ch_count) {\ |
|
|
|
av_log(s, AV_LOG_ERROR, "Changing frame properties on the fly is not supported.\n");\ |
|
|
|
av_log(s, AV_LOG_INFO, "filter context - fmt: %s r: %d layout: %"PRIX64" ch: %d, incoming frame - fmt: %s r: %d layout: %"PRIX64" ch: %d pts_time: %s\n",\ |
|
|
|
av_get_sample_fmt_name(c->sample_fmt), c->sample_rate, c->channel_layout, c->channels,\ |
|
|
|
av_get_sample_fmt_name(format), srate, ch_layout, ch_count, av_ts2timestr(pts, &s->outputs[0]->time_base));\ |
|
|
|
av_log(s, AV_LOG_ERROR, "Changing audio frame properties on the fly is not supported.\n");\ |
|
|
|
return AVERROR(EINVAL);\ |
|
|
|
} |
|
|
|
|
|
|
@@ -208,14 +214,14 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx, |
|
|
|
switch (ctx->outputs[0]->type) { |
|
|
|
case AVMEDIA_TYPE_VIDEO: |
|
|
|
CHECK_VIDEO_PARAM_CHANGE(ctx, s, frame->width, frame->height, |
|
|
|
frame->format); |
|
|
|
frame->format, frame->pts); |
|
|
|
break; |
|
|
|
case AVMEDIA_TYPE_AUDIO: |
|
|
|
/* For layouts unknown on input but known on link after negotiation. */ |
|
|
|
if (!frame->channel_layout) |
|
|
|
frame->channel_layout = s->channel_layout; |
|
|
|
CHECK_AUDIO_PARAM_CHANGE(ctx, s, frame->sample_rate, frame->channel_layout, |
|
|
|
frame->channels, frame->format); |
|
|
|
frame->channels, frame->format, frame->pts); |
|
|
|
break; |
|
|
|
default: |
|
|
|
return AVERROR(EINVAL); |
|
|
|