aboutsummaryrefslogtreecommitdiffstats
path: root/ffmpeg.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2010-02-23 15:08:41 +0000
committerMichael Niedermayer <michaelni@gmx.at>2010-02-23 15:08:41 +0000
commit6d3d3b836f146eae3a22db42e9a0a9c1f2d8e375 (patch)
tree951eb8f5abde4dda0627b4be623bf30af10d8973 /ffmpeg.c
parent6c6e6ef5e20c6441ea0db7103a2f5ca7af8da644 (diff)
downloadffmpeg-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
Diffstat (limited to 'ffmpeg.c')
-rw-r--r--ffmpeg.c79
1 files changed, 38 insertions, 41 deletions
diff --git a/ffmpeg.c b/ffmpeg.c
index 654e7e666a..ad45ea3218 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -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;