|
|
@@ -1646,32 +1646,6 @@ static void print_sdp(AVFormatContext **avc, int n) |
|
|
|
fflush(stdout); |
|
|
|
} |
|
|
|
|
|
|
|
static int stream_index_from_inputs(AVFormatContext **input_files, |
|
|
|
int nb_input_files, |
|
|
|
AVInputFile *file_table, |
|
|
|
AVInputStream **ist_table, |
|
|
|
enum CodecType type, |
|
|
|
int programid) |
|
|
|
{ |
|
|
|
int p, q, z; |
|
|
|
for(z=0; z<nb_input_files; z++) { |
|
|
|
AVFormatContext *ic = input_files[z]; |
|
|
|
for(p=0; p<ic->nb_programs; p++) { |
|
|
|
AVProgram *program = ic->programs[p]; |
|
|
|
if(program->id != programid) |
|
|
|
continue; |
|
|
|
for(q=0; q<program->nb_stream_indexes; q++) { |
|
|
|
int sidx = program->stream_index[q]; |
|
|
|
int ris = file_table[z].ist_index + sidx; |
|
|
|
if(ist_table[ris]->discard && ic->streams[sidx]->codec->codec_type == type) |
|
|
|
return ris; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
return -1; |
|
|
|
} |
|
|
|
|
|
|
|
/* |
|
|
|
* The following code is the main loop of the file converter |
|
|
|
*/ |
|
|
@@ -1803,33 +1777,39 @@ static int av_encode(AVFormatContext **output_files, |
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
if(opt_programid) { |
|
|
|
found = 0; |
|
|
|
j = stream_index_from_inputs(input_files, nb_input_files, file_table, ist_table, ost->st->codec->codec_type, opt_programid); |
|
|
|
if(j != -1) { |
|
|
|
ost->source_index = j; |
|
|
|
found = 1; |
|
|
|
} |
|
|
|
} else { |
|
|
|
/* get corresponding input stream index : we select the first one with the right type */ |
|
|
|
found = 0; |
|
|
|
for(j=0;j<nb_istreams;j++) { |
|
|
|
int skip=0; |
|
|
|
ist = ist_table[j]; |
|
|
|
if (ist->discard && |
|
|
|
if(opt_programid){ |
|
|
|
int pi,si; |
|
|
|
AVFormatContext *f= input_files[ ist->file_index ]; |
|
|
|
skip=1; |
|
|
|
for(pi=0; pi<f->nb_programs; pi++){ |
|
|
|
AVProgram *p= f->programs[pi]; |
|
|
|
if(p->id == opt_programid) |
|
|
|
for(si=0; si<p->nb_stream_indexes; si++){ |
|
|
|
if(f->streams[ p->stream_index[si] ] == ist->st) |
|
|
|
skip=0; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip && |
|
|
|
ist->st->codec->codec_type == ost->st->codec->codec_type) { |
|
|
|
ost->source_index = j; |
|
|
|
found = 1; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (!found) { |
|
|
|
if(! opt_programid) { |
|
|
|
/* try again and reuse existing stream */ |
|
|
|
for(j=0;j<nb_istreams;j++) { |
|
|
|
ist = ist_table[j]; |
|
|
|
if (ist->st->codec->codec_type == ost->st->codec->codec_type) { |
|
|
|
if ( ist->st->codec->codec_type == ost->st->codec->codec_type |
|
|
|
&& ist->st->discard != AVDISCARD_ALL) { |
|
|
|
ost->source_index = j; |
|
|
|
found = 1; |
|
|
|
} |
|
|
@@ -2909,10 +2889,27 @@ static void opt_input_file(const char *filename) |
|
|
|
av_exit(1); |
|
|
|
} |
|
|
|
if(opt_programid) { |
|
|
|
int i; |
|
|
|
for(i=0; i<ic->nb_programs; i++) |
|
|
|
if(ic->programs[i]->id != opt_programid) |
|
|
|
ic->programs[i]->discard = AVDISCARD_ALL; |
|
|
|
int i, j; |
|
|
|
int found=0; |
|
|
|
for(i=0; i<ic->nb_streams; i++){ |
|
|
|
ic->streams[i]->discard= AVDISCARD_ALL; |
|
|
|
} |
|
|
|
for(i=0; i<ic->nb_programs; i++){ |
|
|
|
AVProgram *p= ic->programs[i]; |
|
|
|
if(p->id != opt_programid){ |
|
|
|
p->discard = AVDISCARD_ALL; |
|
|
|
}else{ |
|
|
|
found=1; |
|
|
|
for(j=0; j<p->nb_stream_indexes; j++){ |
|
|
|
ic->streams[p->stream_index[j]]->discard= 0; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if(!found){ |
|
|
|
fprintf(stderr, "Specified program id not found\n"); |
|
|
|
av_exit(1); |
|
|
|
} |
|
|
|
opt_programid=0; |
|
|
|
} |
|
|
|
|
|
|
|
ic->loop_input = loop_input; |
|
|
|