diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2010-02-23 15:08:41 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2010-02-23 15:08:41 +0000 |
commit | 6d3d3b836f146eae3a22db42e9a0a9c1f2d8e375 (patch) | |
tree | 951eb8f5abde4dda0627b4be623bf30af10d8973 | |
parent | 6c6e6ef5e20c6441ea0db7103a2f5ca7af8da644 (diff) | |
download | ffmpeg-6d3d3b836f146eae3a22db42e9a0a9c1f2d8e375.tar.gz |
Redesign opt_programid code.
Its now possible to also select programs per input file and there is
less code duplication.
Originally committed as revision 21999 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | ffmpeg.c | 79 |
1 files changed, 38 insertions, 41 deletions
@@ -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; |