|
|
|
@ -1882,6 +1882,36 @@ 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 %s) not found for input stream #%d.%d", |
|
|
|
|
avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index); |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
} |
|
|
|
|
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; |
|
|
|
|
ist->is_start = 1; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* The following code is the main loop of the file converter |
|
|
|
|
*/ |
|
|
|
@ -1890,7 +1920,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; |
|
|
|
@ -2180,39 +2210,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 %s) not found for input stream #%d.%d", |
|
|
|
|
avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index); |
|
|
|
|
ret = AVERROR(EINVAL); |
|
|
|
|
goto dump_format; |
|
|
|
|
} |
|
|
|
|
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; |
|
|
|
|
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++) { |
|
|
|
|