[FFmpeg-cvslog] r10866 - trunk/ffmpeg.c
nicodvb
subversion
Sat Oct 27 20:46:25 CEST 2007
Author: nicodvb
Date: Sat Oct 27 20:46:25 2007
New Revision: 10866
Log:
added option programid to select the program to use and relative code to handle it
Modified:
trunk/ffmpeg.c
Modified: trunk/ffmpeg.c
==============================================================================
--- trunk/ffmpeg.c (original)
+++ trunk/ffmpeg.c Sat Oct 27 20:46:25 2007
@@ -187,6 +187,7 @@ static int opt_shortest = 0; //
static int video_global_header = 0;
static char *vstats_filename;
static FILE *vstats_file;
+static int opt_programid = 0;
static int rate_emu = 0;
@@ -1350,6 +1351,33 @@ static void print_sdp(AVFormatContext **
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
*/
@@ -1476,6 +1504,14 @@ static int av_encode(AVFormatContext **o
}
} 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++) {
@@ -1487,8 +1523,10 @@ static int av_encode(AVFormatContext **o
break;
}
}
+ }
if (!found) {
+ if(! opt_programid) {
/* try again and reuse existing stream */
for(j=0;j<nb_istreams;j++) {
ist = ist_table[j];
@@ -1497,6 +1535,7 @@ static int av_encode(AVFormatContext **o
found = 1;
}
}
+ }
if (!found) {
fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
ost->file_index, ost->index);
@@ -2590,6 +2629,12 @@ static void opt_input_file(const char *f
print_error(filename, err);
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;
@@ -3635,6 +3680,7 @@ const OptionDef options[] = {
{ "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
{ "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", "" },
+ { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
/* video options */
{ "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[CODEC_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
More information about the ffmpeg-cvslog
mailing list