diff options
author | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2010-10-02 08:44:33 +0000 |
---|---|---|
committer | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2010-10-02 08:44:33 +0000 |
commit | a5c33faaccec6787419fe373a9e7ae0932b15ee1 (patch) | |
tree | 9b0f45a55539b3260f1db09053eb450435dfce7d | |
parent | 05931ab763c873198947142fc84dfe6c8c285fd6 (diff) | |
download | ffmpeg-a5c33faaccec6787419fe373a9e7ae0932b15ee1.tar.gz |
Add init and uninit functions to cmdutils, reduces code duplication
between ffmpeg and ffplay and avoids a valgrind error by freeing
avformat_opts->key.
Originally committed as revision 25309 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r-- | cmdutils.c | 19 | ||||
-rw-r--r-- | cmdutils.h | 11 | ||||
-rw-r--r-- | ffmpeg.c | 12 | ||||
-rw-r--r-- | ffplay.c | 16 |
4 files changed, 35 insertions, 23 deletions
diff --git a/cmdutils.c b/cmdutils.c index ff399299b6..313b37deb1 100644 --- a/cmdutils.c +++ b/cmdutils.c @@ -57,6 +57,25 @@ struct SwsContext *sws_opts; const int this_year = 2010; +void init_opts(void) +{ + int i; + for (i = 0; i < AVMEDIA_TYPE_NB; i++) + avcodec_opts[i] = avcodec_alloc_context2(i); + avformat_opts = avformat_alloc_context(); + sws_opts = sws_getContext(16, 16, 0, 16, 16, 0, SWS_BICUBIC, NULL, NULL, NULL); +} + +void uninit_opts(void) +{ + int i; + for (i = 0; i < AVMEDIA_TYPE_NB; i++) + av_freep(&avcodec_opts[i]); + av_freep(&avformat_opts->key); + av_freep(&avformat_opts); + av_freep(&sws_opts); +} + void log_callback_help(void* ptr, int level, const char* fmt, va_list vl) { vfprintf(stdout, fmt, vl); diff --git a/cmdutils.h b/cmdutils.h index e753c43081..4ce62b64a8 100644 --- a/cmdutils.h +++ b/cmdutils.h @@ -45,6 +45,17 @@ extern AVFormatContext *avformat_opts; extern struct SwsContext *sws_opts; /** + * Initialize the cmdutils option system, in particular + * allocate the *_opts contexts. + */ +void init_opts(void); +/** + * Uninitialize the cmdutils option system, in particular + * free the *_opts contexts and their contents. + */ +void uninit_opts(void); + +/** * Trivial log callback. * Only suitable for show_help and similar since it lacks prefix handling. */ @@ -636,10 +636,7 @@ static int ffmpeg_exit(int ret) av_free(video_standard); - for (i=0;i<AVMEDIA_TYPE_NB;i++) - av_free(avcodec_opts[i]); - av_free(avformat_opts); - av_free(sws_opts); + uninit_opts(); av_free(audio_buf); av_free(audio_out); allocated_audio_buf_size= allocated_audio_out_size= 0; @@ -4336,7 +4333,6 @@ static const OptionDef options[] = { int main(int argc, char **argv) { - int i; int64_t ti; av_log_set_flags(AV_LOG_SKIP_REPEATED); @@ -4355,11 +4351,7 @@ int main(int argc, char **argv) url_set_interrupt_cb(decode_interrupt_cb); #endif - for(i=0; i<AVMEDIA_TYPE_NB; i++){ - avcodec_opts[i]= avcodec_alloc_context2(i); - } - avformat_opts = avformat_alloc_context(); - sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL); + init_opts(); show_banner(); @@ -1326,15 +1326,11 @@ static void stream_close(VideoState *is) static void do_exit(void) { - int i; if (cur_stream) { stream_close(cur_stream); cur_stream = NULL; } - for (i = 0; i < AVMEDIA_TYPE_NB; i++) - av_free(avcodec_opts[i]); - av_free(avformat_opts); - av_free(sws_opts); + uninit_opts(); #if CONFIG_AVFILTER avfilter_uninit(); #endif @@ -3140,7 +3136,7 @@ static void opt_input_file(const char *filename) /* Called from the main */ int main(int argc, char **argv) { - int flags, i; + int flags; av_log_set_flags(AV_LOG_SKIP_REPEATED); @@ -3154,13 +3150,7 @@ int main(int argc, char **argv) #endif av_register_all(); - for(i=0; i<AVMEDIA_TYPE_NB; i++){ - avcodec_opts[i]= avcodec_alloc_context2(i); - } - avformat_opts = avformat_alloc_context(); -#if !CONFIG_AVFILTER - sws_opts = sws_getContext(16,16,0, 16,16,0, sws_flags, NULL,NULL,NULL); -#endif + init_opts(); show_banner(); |