From 526efa105349fbae87b0d0afcd9825575524e985 Mon Sep 17 00:00:00 2001 From: Nico Sabbi Date: Sat, 20 Oct 2007 08:25:13 +0000 Subject: [PATCH] API extension: AVProgram now has an array (stream_index) containing the indexes of the streams in AVFormatContext Originally committed as revision 10819 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/avformat.h | 6 ++++-- libavformat/utils.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/libavformat/avformat.h b/libavformat/avformat.h index dbbb9b4..2897188 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -21,8 +21,8 @@ #ifndef FFMPEG_AVFORMAT_H #define FFMPEG_AVFORMAT_H -#define LIBAVFORMAT_VERSION_INT ((51<<16)+(15<<8)+0) -#define LIBAVFORMAT_VERSION 51.15.0 +#define LIBAVFORMAT_VERSION_INT ((51<<16)+(16<<8)+0) +#define LIBAVFORMAT_VERSION 51.16.0 #define LIBAVFORMAT_BUILD LIBAVFORMAT_VERSION_INT #define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) @@ -353,6 +353,8 @@ typedef struct AVProgram { char *name; ///< Service name for DVB streams int flags; enum AVDiscard discard; ///< selects which program to discard and which to feed to the caller + unsigned int *stream_index; + unsigned int nb_stream_indexes; } AVProgram; #define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present diff --git a/libavformat/utils.c b/libavformat/utils.c index bc32850..d1480a2 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2067,6 +2067,7 @@ void av_close_input_file(AVFormatContext *s) for(i=s->nb_programs-1; i>=0; i--) { av_freep(&s->programs[i]->provider_name); av_freep(&s->programs[i]->name); + av_freep(&s->programs[i]->stream_index); av_freep(&s->programs[i]); } flush_packet_queue(s); @@ -2483,6 +2484,29 @@ fail: return ret; } +void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx) +{ + int i, j; + AVProgram *program=NULL; + void *tmp; + + for(i=0; inb_programs; i++){ + if(ac->programs[i]->id != progid) + continue; + program = ac->programs[i]; + for(j=0; jnb_stream_indexes; j++) + if(program->stream_index[j] == idx) + return; + + tmp = av_realloc(program->stream_index, sizeof(unsigned int)*(program->nb_stream_indexes+1)); + if(!tmp) + return; + program->stream_index = tmp; + program->stream_index[program->nb_stream_indexes++] = idx; + return; + } +} + /* "user interface" functions */ static void dump_stream_format(AVFormatContext *ic, int i, int index, char *buf, int is_output) { @@ -2554,6 +2578,16 @@ void dump_format(AVFormatContext *ic, } av_log(NULL, AV_LOG_INFO, "\n"); } + if(ic->nb_programs) { + int j, k; + for(j=0; jnb_programs; j++) { + av_log(NULL, AV_LOG_INFO, " Program %d", ic->programs[j]->id); + if(ic->programs[j]->name) + av_log(NULL, AV_LOG_INFO, " \"%s\"\n", ic->programs[j]->name); + for(k=0; kprograms[j]->nb_stream_indexes; k++) + dump_stream_format(ic, ic->programs[j]->stream_index[k], index, buf, is_output); + } + } else for(i=0;inb_streams;i++) dump_stream_format(ic, i, index, buf, is_output); } -- 2.7.4