From 15afa396e4461e3ecabfecb13afb7ab95cf5aa9d Mon Sep 17 00:00:00 2001 From: Nico Sabbi Date: Tue, 25 Sep 2007 20:45:46 +0000 Subject: [PATCH] Added definition and utility functions to handle AVProgram(s) in AVFormatContext Originally committed as revision 10579 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/avformat.h | 18 ++++++++++++++++-- libavformat/utils.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 0ca5f41a20..69197c389c 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -21,8 +21,8 @@ #ifndef AVFORMAT_H #define AVFORMAT_H -#define LIBAVFORMAT_VERSION_INT ((51<<16)+(13<<8)+4) -#define LIBAVFORMAT_VERSION 51.13.4 +#define LIBAVFORMAT_VERSION_INT ((51<<16)+(14<<8)+0) +#define LIBAVFORMAT_VERSION 51.14.0 #define LIBAVFORMAT_BUILD LIBAVFORMAT_VERSION_INT #define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) @@ -345,6 +345,16 @@ typedef struct AVStream { int64_t pts_buffer[MAX_REORDER_DELAY+1]; } AVStream; +#define AV_PROGRAM_RUNNING 1 + +typedef struct AVProgram { + int id; + char *provider_name; ///< Network name for DVB streams + char *name; ///< Service name for DVB streams + int flags; + enum AVDiscard discard; ///< selects which program to discard and which to feed to the caller +} AVProgram; + #define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present (streams are added dynamically) */ @@ -430,6 +440,9 @@ typedef struct AVFormatContext { const uint8_t *key; int keylen; + + unsigned int nb_programs; + AVProgram **programs; } AVFormatContext; typedef struct AVPacketList { @@ -647,6 +660,7 @@ void av_close_input_file(AVFormatContext *s); * @param id file format dependent stream id */ AVStream *av_new_stream(AVFormatContext *s, int id); +AVProgram *av_new_program(AVFormatContext *s, int id); /** * Set the pts for a given stream. diff --git a/libavformat/utils.c b/libavformat/utils.c index dcdd5f0108..8700e9e4e5 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -2067,6 +2067,11 @@ void av_close_input_file(AVFormatContext *s) av_free(st->codec); av_free(st); } + 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]); + } flush_packet_queue(s); must_open_file = 1; if (s->iformat->flags & AVFMT_NOFILE) { @@ -2113,6 +2118,43 @@ AVStream *av_new_stream(AVFormatContext *s, int id) return st; } +AVProgram *av_new_program(AVFormatContext *ac, int id) +{ + AVProgram *program=NULL; + int i; + +#ifdef DEBUG_SI + av_log(ac, AV_LOG_DEBUG, "new_program: id=0x%04x\n", id); +#endif + + for(i=0; inb_programs; i++) + if(ac->programs[i]->id == id) + program = ac->programs[i]; + + if(!program){ + program = av_mallocz(sizeof(AVProgram)); + if (!program) + return NULL; + dynarray_add(&ac->programs, &ac->nb_programs, program); + program->discard = AVDISCARD_NONE; + } + program->id = id; + + return program; +} + +void av_set_program_name(AVProgram *program, char *provider_name, char *name) +{ + assert(!provider_name == !name); + if(name){ + av_free(program->provider_name); + av_free(program-> name); + program->provider_name = av_strdup(provider_name); + program-> name = av_strdup( name); + } +} + + /************************************************************/ /* output media file */