We already have all the necessary information in open_output_file(). This makes the information about the stream/filtergraph mappings available earlier.tags/n3.2
| @@ -2008,11 +2008,10 @@ static int transcode_init(void) | |||||
| exit_program(1); | exit_program(1); | ||||
| #endif | #endif | ||||
| if (!ost->filter && | |||||
| (enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO || | |||||
| enc_ctx->codec_type == AVMEDIA_TYPE_AUDIO)) { | |||||
| FilterGraph *fg; | |||||
| fg = init_simple_filtergraph(ist, ost); | |||||
| if ((enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO || | |||||
| enc_ctx->codec_type == AVMEDIA_TYPE_AUDIO) && | |||||
| filtergraph_is_simple(ost->filter->graph)) { | |||||
| FilterGraph *fg = ost->filter->graph; | |||||
| if (configure_filtergraph(fg)) { | if (configure_filtergraph(fg)) { | ||||
| av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n"); | av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n"); | ||||
| exit_program(1); | exit_program(1); | ||||
| @@ -450,7 +450,7 @@ int configure_filtergraph(FilterGraph *fg); | |||||
| int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out); | int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out); | ||||
| int ist_in_filtergraph(FilterGraph *fg, InputStream *ist); | int ist_in_filtergraph(FilterGraph *fg, InputStream *ist); | ||||
| int filtergraph_is_simple(FilterGraph *fg); | int filtergraph_is_simple(FilterGraph *fg); | ||||
| FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost); | |||||
| int init_simple_filtergraph(InputStream *ist, OutputStream *ost); | |||||
| int init_complex_filtergraph(FilterGraph *fg); | int init_complex_filtergraph(FilterGraph *fg); | ||||
| int avconv_parse_options(int argc, char **argv); | int avconv_parse_options(int argc, char **argv); | ||||
| @@ -76,7 +76,7 @@ DEF_CHOOSE_FORMAT(int, sample_rate, supported_samplerates, 0, | |||||
| DEF_CHOOSE_FORMAT(uint64_t, channel_layout, channel_layouts, 0, | DEF_CHOOSE_FORMAT(uint64_t, channel_layout, channel_layouts, 0, | ||||
| GET_CH_LAYOUT_NAME) | GET_CH_LAYOUT_NAME) | ||||
| FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost) | |||||
| int init_simple_filtergraph(InputStream *ist, OutputStream *ost) | |||||
| { | { | ||||
| FilterGraph *fg = av_mallocz(sizeof(*fg)); | FilterGraph *fg = av_mallocz(sizeof(*fg)); | ||||
| @@ -104,7 +104,7 @@ FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost) | |||||
| GROW_ARRAY(filtergraphs, nb_filtergraphs); | GROW_ARRAY(filtergraphs, nb_filtergraphs); | ||||
| filtergraphs[nb_filtergraphs - 1] = fg; | filtergraphs[nb_filtergraphs - 1] = fg; | ||||
| return fg; | |||||
| return 0; | |||||
| } | } | ||||
| static void init_input_filter(FilterGraph *fg, AVFilterInOut *in) | static void init_input_filter(FilterGraph *fg, AVFilterInOut *in) | ||||
| @@ -1469,7 +1469,7 @@ static int configure_complex_filters(void) | |||||
| int i, ret = 0; | int i, ret = 0; | ||||
| for (i = 0; i < nb_filtergraphs; i++) | for (i = 0; i < nb_filtergraphs; i++) | ||||
| if (!filtergraphs[i]->graph && | |||||
| if (!filtergraph_is_simple(filtergraphs[i]) && | |||||
| (ret = configure_filtergraph(filtergraphs[i])) < 0) | (ret = configure_filtergraph(filtergraphs[i])) < 0) | ||||
| return ret; | return ret; | ||||
| return 0; | return 0; | ||||
| @@ -1723,7 +1723,7 @@ loop_end: | |||||
| } | } | ||||
| av_dict_free(&unused_opts); | av_dict_free(&unused_opts); | ||||
| /* set the encoding/decoding_needed flags */ | |||||
| /* set the encoding/decoding_needed flags and create simple filtergraphs */ | |||||
| for (i = of->ost_index; i < nb_output_streams; i++) { | for (i = of->ost_index; i < nb_output_streams; i++) { | ||||
| OutputStream *ost = output_streams[i]; | OutputStream *ost = output_streams[i]; | ||||
| @@ -1731,6 +1731,18 @@ loop_end: | |||||
| if (ost->encoding_needed && ost->source_index >= 0) { | if (ost->encoding_needed && ost->source_index >= 0) { | ||||
| InputStream *ist = input_streams[ost->source_index]; | InputStream *ist = input_streams[ost->source_index]; | ||||
| ist->decoding_needed = 1; | ist->decoding_needed = 1; | ||||
| if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO || | |||||
| ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { | |||||
| err = init_simple_filtergraph(ist, ost); | |||||
| if (err < 0) { | |||||
| av_log(NULL, AV_LOG_ERROR, | |||||
| "Error initializing a simple filtergraph between streams " | |||||
| "%d:%d->%d:%d\n", ist->file_index, ost->source_index, | |||||
| nb_output_files - 1, ost->st->index); | |||||
| exit_program(1); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||