History

src_buffer: move audio format change check in a separate function.

Nicolas George committed 14 years ago

Commit be8edff1 parent cc14cde1 file · +86 −67Browse files

Unified · Split

libavfilter/src_buffer.c+86−67
@@ -69,6 +69,28 @@ typedef struct { · 68 unmodified lines
6969 return AVERROR(EINVAL);\
7070 }
7171
72+static int insert_filter(BufferSourceContext *abuffer,
73+ AVFilterLink *link, AVFilterContext **filt_ctx,
74+ const char *filt_name);
75+static void remove_filter(AVFilterContext **filt_ctx);
76+static int reconfigure_filter(BufferSourceContext *abuffer, AVFilterContext *filt_ctx);
77+
78+static inline void log_input_change(void *ctx, AVFilterLink *link, AVFilterBufferRef *ref)
79+{
80+ char old_layout_str[16], new_layout_str[16];
81+ av_get_channel_layout_string(old_layout_str, sizeof(old_layout_str),
82+ -1, link->channel_layout);
83+ av_get_channel_layout_string(new_layout_str, sizeof(new_layout_str),
84+ -1, ref->audio->channel_layout);
85+ av_log(ctx, AV_LOG_INFO,
86+ "Audio input format changed: "
87+ "%s:%s:%d -> %s:%s:%d, normalizing\n",
88+ av_get_sample_fmt_name(link->format),
89+ old_layout_str, (int)link->sample_rate,
90+ av_get_sample_fmt_name(ref->format),
91+ new_layout_str, ref->audio->sample_rate);
92+}
93+
7294 static int check_format_change_video(AVFilterContext *buffer_filter,
7395 AVFilterBufferRef *picref)
7496 {
@@ -122,12 +144,72 @@ static int check_format_change_video(AVFilterContext *buffer_filter, · 47 unmodified lines
122144 return 0;
123145 }
124146
147+static int check_format_change_audio(AVFilterContext *ctx,
148+ AVFilterBufferRef *samplesref)
149+{
150+ BufferSourceContext *abuffer = ctx->priv;
151+ AVFilterLink *link;
152+ int ret, logged = 0;
153+
154+ link = ctx->outputs[0];
155+ if (samplesref->audio->sample_rate != link->sample_rate) {
156+
157+ log_input_change(ctx, link, samplesref);
158+ logged = 1;
159+
160+ abuffer->sample_rate = samplesref->audio->sample_rate;
161+
162+ if (!abuffer->aresample) {
163+ ret = insert_filter(abuffer, link, &abuffer->aresample, "aresample");
164+ if (ret < 0) return ret;
165+ } else {
166+ link = abuffer->aresample->outputs[0];
167+ if (samplesref->audio->sample_rate == link->sample_rate)
168+ remove_filter(&abuffer->aresample);
169+ else
170+ if ((ret = reconfigure_filter(abuffer, abuffer->aresample)) < 0)
171+ return ret;
172+ }
173+ }
174+
175+ link = ctx->outputs[0];
176+ if (samplesref->format != link->format ||
177+ samplesref->audio->channel_layout != link->channel_layout ||
178+ samplesref->audio->planar != link->planar) {
179+
180+ if (!logged) log_input_change(ctx, link, samplesref);
181+
182+ abuffer->sample_format = samplesref->format;
183+ abuffer->channel_layout = samplesref->audio->channel_layout;
184+ abuffer->packing_format = samplesref->audio->planar;
185+
186+ if (!abuffer->aconvert) {
187+ ret = insert_filter(abuffer, link, &abuffer->aconvert, "aconvert");
188+ if (ret < 0) return ret;
189+ } else {
190+ link = abuffer->aconvert->outputs[0];
191+ if (samplesref->format == link->format &&
192+ samplesref->audio->channel_layout == link->channel_layout &&
193+ samplesref->audio->planar == link->planar
194+ )
195+ remove_filter(&abuffer->aconvert);
196+ else
197+ if ((ret = reconfigure_filter(abuffer, abuffer->aconvert)) < 0)
198+ return ret;
199+ }
200+ }
201+
202+ return 0;
203+}
204+
125205 static int check_format_change(AVFilterContext *buffer_filter,
126206 AVFilterBufferRef *picref)
127207 {
128208 switch (buffer_filter->outputs[0]->type) {
129209 case AVMEDIA_TYPE_VIDEO:
130210 return check_format_change_video(buffer_filter, picref);
211+ case AVMEDIA_TYPE_AUDIO:
212+ return check_format_change_audio(buffer_filter, picref);
131213 default:
132214 return AVERROR(ENOSYS);
133215 }
@@ -484,29 +566,12 @@ static void remove_filter(AVFilterContext **filt_ctx) · 350 unmodified lines
484566 set_link_source(src, outlink);
485567 }
486568
487−static inline void log_input_change(void *ctx, AVFilterLink *link, AVFilterBufferRef *ref)
488−{
489− char old_layout_str[16], new_layout_str[16];
490− av_get_channel_layout_string(old_layout_str, sizeof(old_layout_str),
491− -1, link->channel_layout);
492− av_get_channel_layout_string(new_layout_str, sizeof(new_layout_str),
493− -1, ref->audio->channel_layout);
494− av_log(ctx, AV_LOG_INFO,
495− "Audio input format changed: "
496− "%s:%s:%d -> %s:%s:%d, normalizing\n",
497− av_get_sample_fmt_name(link->format),
498− old_layout_str, (int)link->sample_rate,
499− av_get_sample_fmt_name(ref->format),
500− new_layout_str, ref->audio->sample_rate);
501−}
502−
503569 int av_asrc_buffer_add_audio_buffer_ref(AVFilterContext *ctx,
504570 AVFilterBufferRef *samplesref,
505571 int av_unused flags)
506572 {
507573 BufferSourceContext *abuffer = ctx->priv;
508− AVFilterLink *link;
509− int ret, logged = 0;
574+ int ret;
510575
511576 if (av_fifo_space(abuffer->fifo) < sizeof(samplesref)) {
512577 av_log(ctx, AV_LOG_ERROR,
@@ -515,55 +580,9 @@ int av_asrc_buffer_add_audio_buffer_ref(AVFilterContext *ctx, · 2 unmodified lines
515580 return AVERROR(EINVAL);
516581 }
517582
518− // Normalize input
519−
520− link = ctx->outputs[0];
521− if (samplesref->audio->sample_rate != link->sample_rate) {
522−
523− log_input_change(ctx, link, samplesref);
524− logged = 1;
525−
526− abuffer->sample_rate = samplesref->audio->sample_rate;
527−
528− if (!abuffer->aresample) {
529− ret = insert_filter(abuffer, link, &abuffer->aresample, "aresample");
530− if (ret < 0) return ret;
531− } else {
532− link = abuffer->aresample->outputs[0];
533− if (samplesref->audio->sample_rate == link->sample_rate)
534− remove_filter(&abuffer->aresample);
535− else
536− if ((ret = reconfigure_filter(abuffer, abuffer->aresample)) < 0)
537− return ret;
538− }
539− }
540−
541− link = ctx->outputs[0];
542− if (samplesref->format != link->format ||
543− samplesref->audio->channel_layout != link->channel_layout ||
544− samplesref->audio->planar != link->planar) {
545−
546− if (!logged) log_input_change(ctx, link, samplesref);
547−
548− abuffer->sample_format = samplesref->format;
549− abuffer->channel_layout = samplesref->audio->channel_layout;
550− abuffer->packing_format = samplesref->audio->planar;
551−
552− if (!abuffer->aconvert) {
553− ret = insert_filter(abuffer, link, &abuffer->aconvert, "aconvert");
554− if (ret < 0) return ret;
555− } else {
556− link = abuffer->aconvert->outputs[0];
557− if (samplesref->format == link->format &&
558− samplesref->audio->channel_layout == link->channel_layout &&
559− samplesref->audio->planar == link->planar
560− )
561− remove_filter(&abuffer->aconvert);
562− else
563− if ((ret = reconfigure_filter(abuffer, abuffer->aconvert)) < 0)
564− return ret;
565− }
566− }
583+ ret = check_format_change(ctx, samplesref);
584+ if (ret < 0)
585+ return ret;
567586
568587 if (sizeof(samplesref) != av_fifo_generic_write(abuffer->fifo, &samplesref,
569588 sizeof(samplesref), NULL)) {

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t