You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	avconv: factor out initializing input streams.
This commit is contained in:
		
							
								
								
									
										93
									
								
								avconv.c
									
									
									
									
									
								
							
							
						
						
									
										93
									
								
								avconv.c
									
									
									
									
									
								
							| @@ -1816,6 +1816,48 @@ static void print_sdp(OutputFile *output_files, int n) | ||||
|     av_freep(&avc); | ||||
| } | ||||
|  | ||||
| static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams, | ||||
|                              char *error, int error_len) | ||||
| { | ||||
|     int i; | ||||
|     InputStream *ist = &input_streams[ist_index]; | ||||
|     if (ist->decoding_needed) { | ||||
|         AVCodec *codec = ist->dec; | ||||
|         if (!codec) | ||||
|             codec = avcodec_find_decoder(ist->st->codec->codec_id); | ||||
|         if (!codec) { | ||||
|             snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d", | ||||
|                     ist->st->codec->codec_id, ist->file_index, ist->st->index); | ||||
|             return AVERROR(EINVAL); | ||||
|         } | ||||
|  | ||||
|         /* update requested sample format for the decoder based on the | ||||
|            corresponding encoder sample format */ | ||||
|         for (i = 0; i < nb_output_streams; i++) { | ||||
|             OutputStream *ost = &output_streams[i]; | ||||
|             if (ost->source_index == ist_index) { | ||||
|                 update_sample_fmt(ist->st->codec, codec, ost->st->codec); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) { | ||||
|             snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d", | ||||
|                     ist->file_index, ist->st->index); | ||||
|             return AVERROR(EINVAL); | ||||
|         } | ||||
|         assert_codec_experimental(ist->st->codec, 0); | ||||
|         assert_avoptions(ist->opts); | ||||
|     } | ||||
|  | ||||
|     ist->pts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames*AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0; | ||||
|     ist->next_pts = AV_NOPTS_VALUE; | ||||
|     init_pts_correction(&ist->pts_ctx); | ||||
|     ist->is_start = 1; | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * The following code is the main loop of the file converter | ||||
|  */ | ||||
| @@ -1824,7 +1866,7 @@ static int transcode(OutputFile *output_files, | ||||
|                      InputFile *input_files, | ||||
|                      int nb_input_files) | ||||
| { | ||||
|     int ret = 0, i, j; | ||||
|     int ret = 0, i; | ||||
|     AVFormatContext *is, *os; | ||||
|     AVCodecContext *codec, *icodec; | ||||
|     OutputStream *ost; | ||||
| @@ -2118,51 +2160,10 @@ static int transcode(OutputFile *output_files, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* open each decoder */ | ||||
|     for (i = 0; i < nb_input_streams; i++) { | ||||
|         ist = &input_streams[i]; | ||||
|         if (ist->decoding_needed) { | ||||
|             AVCodec *codec = ist->dec; | ||||
|             if (!codec) | ||||
|                 codec = avcodec_find_decoder(ist->st->codec->codec_id); | ||||
|             if (!codec) { | ||||
|                 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d", | ||||
|                         ist->st->codec->codec_id, ist->file_index, ist->st->index); | ||||
|                 ret = AVERROR(EINVAL); | ||||
|                 goto dump_format; | ||||
|             } | ||||
|  | ||||
|             /* update requested sample format for the decoder based on the | ||||
|                corresponding encoder sample format */ | ||||
|             for (j = 0; j < nb_output_streams; j++) { | ||||
|                 ost = &output_streams[j]; | ||||
|                 if (ost->source_index == i) { | ||||
|                     update_sample_fmt(ist->st->codec, codec, ost->st->codec); | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) { | ||||
|                 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d", | ||||
|                         ist->file_index, ist->st->index); | ||||
|                 ret = AVERROR(EINVAL); | ||||
|                 goto dump_format; | ||||
|             } | ||||
|             assert_codec_experimental(ist->st->codec, 0); | ||||
|             assert_avoptions(ost->opts); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /* init pts */ | ||||
|     for (i = 0; i < nb_input_streams; i++) { | ||||
|         AVStream *st; | ||||
|         ist = &input_streams[i]; | ||||
|         st= ist->st; | ||||
|         ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0; | ||||
|         ist->next_pts = AV_NOPTS_VALUE; | ||||
|         init_pts_correction(&ist->pts_ctx); | ||||
|         ist->is_start = 1; | ||||
|     } | ||||
|     /* init input streams */ | ||||
|     for (i = 0; i < nb_input_streams; i++) | ||||
|         if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error)) < 0)) | ||||
|             goto dump_format; | ||||
|  | ||||
|     /* open files and write file headers */ | ||||
|     for (i = 0; i < nb_output_files; i++) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user