avconv: factor out initializing input streams.
This commit is contained in:
		
							parent
							
								
									ddf5ef0263
								
							
						
					
					
						commit
						630902a1e1
					
				
							
								
								
									
										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++) {
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user