@ -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 ;