mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-23 04:24:35 +02:00
added option programid to select the program to use and relative code to handle it
Originally committed as revision 10866 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
90f0344165
commit
50e143c4be
46
ffmpeg.c
46
ffmpeg.c
@ -187,6 +187,7 @@ static int opt_shortest = 0; //
|
|||||||
static int video_global_header = 0;
|
static int video_global_header = 0;
|
||||||
static char *vstats_filename;
|
static char *vstats_filename;
|
||||||
static FILE *vstats_file;
|
static FILE *vstats_file;
|
||||||
|
static int opt_programid = 0;
|
||||||
|
|
||||||
static int rate_emu = 0;
|
static int rate_emu = 0;
|
||||||
|
|
||||||
@ -1350,6 +1351,33 @@ static void print_sdp(AVFormatContext **avc, int n)
|
|||||||
printf("SDP:\n%s\n", sdp);
|
printf("SDP:\n%s\n", sdp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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, r, s, z;
|
||||||
|
AVInputStream *ist;
|
||||||
|
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
|
||||||
*/
|
*/
|
||||||
@ -1476,6 +1504,14 @@ 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++) {
|
||||||
@ -1487,8 +1523,10 @@ static int av_encode(AVFormatContext **output_files,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!found) {
|
if (!found) {
|
||||||
|
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];
|
||||||
@ -1497,6 +1535,7 @@ static int av_encode(AVFormatContext **output_files,
|
|||||||
found = 1;
|
found = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (!found) {
|
if (!found) {
|
||||||
fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
|
fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
|
||||||
ost->file_index, ost->index);
|
ost->file_index, ost->index);
|
||||||
@ -2590,6 +2629,12 @@ static void opt_input_file(const char *filename)
|
|||||||
print_error(filename, err);
|
print_error(filename, err);
|
||||||
exit(1);
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
ic->loop_input = loop_input;
|
ic->loop_input = loop_input;
|
||||||
|
|
||||||
@ -3635,6 +3680,7 @@ const OptionDef options[] = {
|
|||||||
{ "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
|
{ "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
|
||||||
{ "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
|
{ "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
|
||||||
{ "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "" },
|
{ "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "" },
|
||||||
|
{ "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
|
||||||
|
|
||||||
/* video options */
|
/* video options */
|
||||||
{ "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
|
{ "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user