From a5c33faaccec6787419fe373a9e7ae0932b15ee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reimar=20D=C3=B6ffinger?= <Reimar.Doeffinger@gmx.de> Date: Sat, 2 Oct 2010 08:44:33 +0000 Subject: [PATCH] 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 --- cmdutils.c | 19 +++++++++++++++++++ cmdutils.h | 11 +++++++++++ ffmpeg.c | 12 ++---------- ffplay.c | 16 +++------------- 4 files changed, 35 insertions(+), 23 deletions(-) diff --git a/cmdutils.c b/cmdutils.c index ff399299b69..313b37deb1d 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 e753c430819..4ce62b64a8e 100644 --- a/cmdutils.h +++ b/cmdutils.h @@ -44,6 +44,17 @@ extern AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB]; 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. diff --git a/ffmpeg.c b/ffmpeg.c index 9b99786431b..52028baf08a 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -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(); diff --git a/ffplay.c b/ffplay.c index 2e61268d93e..df15f4890eb 100644 --- a/ffplay.c +++ b/ffplay.c @@ -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(); -- GitLab