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 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 **avc, int n)
 | 
			
		||||
    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
 | 
			
		||||
 */
 | 
			
		||||
@ -1475,6 +1503,14 @@ static int av_encode(AVFormatContext **output_files,
 | 
			
		||||
                    exit(1);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
            } 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;
 | 
			
		||||
@ -1487,8 +1523,10 @@ static int av_encode(AVFormatContext **output_files,
 | 
			
		||||
                        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 **output_files,
 | 
			
		||||
                            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 *filename)
 | 
			
		||||
        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" },
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user