aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReimar Döffinger <Reimar.Doeffinger@gmx.de>2010-10-02 08:44:33 +0000
committerReimar Döffinger <Reimar.Doeffinger@gmx.de>2010-10-02 08:44:33 +0000
commita5c33faaccec6787419fe373a9e7ae0932b15ee1 (patch)
tree9b0f45a55539b3260f1db09053eb450435dfce7d
parent05931ab763c873198947142fc84dfe6c8c285fd6 (diff)
downloadffmpeg-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.c19
-rw-r--r--cmdutils.h11
-rw-r--r--ffmpeg.c12
-rw-r--r--ffplay.c16
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.
*/
diff --git a/ffmpeg.c b/ffmpeg.c
index 9b99786431..52028baf08 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 2e61268d93..df15f4890e 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();