mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-29 10:43:15 +00:00
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
This commit is contained in:
parent
6c6e6ef5e2
commit
6d3d3b836f
79
ffmpeg.c
79
ffmpeg.c
@ -1646,32 +1646,6 @@ static void print_sdp(AVFormatContext **avc, int n)
|
|||||||
fflush(stdout);
|
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
|
* The following code is the main loop of the file converter
|
||||||
*/
|
*/
|
||||||
@ -1803,33 +1777,39 @@ static int av_encode(AVFormatContext **output_files,
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} 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 */
|
/* get corresponding input stream index : we select the first one with the right type */
|
||||||
found = 0;
|
found = 0;
|
||||||
for(j=0;j<nb_istreams;j++) {
|
for(j=0;j<nb_istreams;j++) {
|
||||||
|
int skip=0;
|
||||||
ist = ist_table[j];
|
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) {
|
ist->st->codec->codec_type == ost->st->codec->codec_type) {
|
||||||
ost->source_index = j;
|
ost->source_index = j;
|
||||||
found = 1;
|
found = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
if(! opt_programid) {
|
if(! opt_programid) {
|
||||||
/* try again and reuse existing stream */
|
/* try again and reuse existing stream */
|
||||||
for(j=0;j<nb_istreams;j++) {
|
for(j=0;j<nb_istreams;j++) {
|
||||||
ist = ist_table[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;
|
ost->source_index = j;
|
||||||
found = 1;
|
found = 1;
|
||||||
}
|
}
|
||||||
@ -2909,10 +2889,27 @@ static void opt_input_file(const char *filename)
|
|||||||
av_exit(1);
|
av_exit(1);
|
||||||
}
|
}
|
||||||
if(opt_programid) {
|
if(opt_programid) {
|
||||||
int i;
|
int i, j;
|
||||||
for(i=0; i<ic->nb_programs; i++)
|
int found=0;
|
||||||
if(ic->programs[i]->id != opt_programid)
|
for(i=0; i<ic->nb_streams; i++){
|
||||||
ic->programs[i]->discard = AVDISCARD_ALL;
|
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;
|
ic->loop_input = loop_input;
|
||||||
|
Loading…
Reference in New Issue
Block a user