From 4eb72c6b2354e7e4126bb958832bf3dd24c8e7e9 Mon Sep 17 00:00:00 2001
From: Nico Sabbi <nicola.sabbi@poste.it>
Date: Sun, 27 Aug 2006 12:14:13 +0000
Subject: [PATCH] initial support for AVOption in AVFormatContext

Originally committed as revision 6108 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 ffmpeg.c               | 14 ++++++++++++++
 libavformat/avformat.h |  1 +
 libavformat/utils.c    | 23 +++++++++++++++++++++--
 3 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/ffmpeg.c b/ffmpeg.c
index f305dffbccd..96cdc702d5c 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -252,6 +252,7 @@ static int sws_flags = SWS_BICUBIC;
 const char **opt_names=NULL;
 int opt_name_count=0;
 AVCodecContext *avctx_opts;
+AVFormatContext *avformat_opts;
 
 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
@@ -2780,7 +2781,10 @@ static void opt_input_file(const char *filename)
                    !strcmp( filename, "/dev/stdin" );
 
     /* get default parameters from command line */
+    ic = av_alloc_format_context();
+
     memset(ap, 0, sizeof(*ap));
+    ap->prealloced_context = 1;
     ap->sample_rate = audio_sample_rate;
     ap->channels = audio_channels;
     ap->time_base.den = frame_rate;
@@ -2797,6 +2801,12 @@ static void opt_input_file(const char *filename)
     if(pgmyuv_compatibility_hack)
         ap->video_codec_id= CODEC_ID_PGMYUV;
 
+    for(i=0; i<opt_name_count; i++){
+        AVOption *opt;
+        double d= av_get_double(avformat_opts, opt_names[i], &opt);
+        if(d==d && (opt->flags&AV_OPT_FLAG_DECODING_PARAM))
+            av_set_double(ic, opt_names[i], d);
+    }
     /* open the input file with generic libav function */
     err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
     if (err < 0) {
@@ -3928,6 +3938,8 @@ static void show_version(void)
 
 static int opt_default(const char *opt, const char *arg){
     AVOption *o= av_set_string(avctx_opts, opt, arg);
+    if(!o)
+        o = av_set_string(avformat_opts, opt, arg);
     if(!o)
         return -1;
 
@@ -4191,6 +4203,7 @@ static void show_help(void)
                       OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
                       OPT_EXPERT);
     av_opt_show(avctx_opts, NULL);
+    av_opt_show(avformat_opts, NULL);
 
     exit(1);
 }
@@ -4208,6 +4221,7 @@ int main(int argc, char **argv)
     av_register_all();
 
     avctx_opts= avcodec_alloc_context();
+    avformat_opts = av_alloc_format_context();
 
     if (argc <= 1)
         show_help();
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 3f834a424de..9ba1b278650 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -112,6 +112,7 @@ typedef struct AVFormatParameters {
                                   mpeg2ts_raw is TRUE */
     int initial_pause:1;       /* do not begin to play the stream
                                   immediately (RTSP only) */
+    int prealloced_context:1;
     enum CodecID video_codec_id;
     enum CodecID audio_codec_id;
 } AVFormatParameters;
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 32810e2d784..a590de024cf 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -18,6 +18,7 @@
  */
 #include "avformat.h"
 #include "allformats.h"
+#include "opt.h"
 
 #undef NDEBUG
 #include <assert.h>
@@ -453,13 +454,28 @@ static const char* format_to_name(void* ptr)
     else return "NULL";
 }
 
-static const AVClass av_format_context_class = { "AVFormatContext", format_to_name };
+#define OFFSET(x) (int)&((AVFormatContext*)0)->x
+#define DEFAULT 0 //should be NAN but it doesnt work as its not a constant in glibc as required by ANSI/ISO C
+//these names are too long to be readable
+#define E AV_OPT_FLAG_ENCODING_PARAM
+#define D AV_OPT_FLAG_DECODING_PARAM
+
+static const AVOption options[]={
+{NULL},
+};
+
+static const AVClass av_format_context_class = { "AVFormatContext", format_to_name, options };
+
+void avformat_get_context_defaults(AVFormatContext *s){
+    memset(s, 0, sizeof(AVFormatContext));
+}
 
 AVFormatContext *av_alloc_format_context(void)
 {
     AVFormatContext *ic;
     ic = av_mallocz(sizeof(AVFormatContext));
     if (!ic) return ic;
+    avformat_get_context_defaults(ic);
     ic->av_class = &av_format_context_class;
     return ic;
 }
@@ -481,7 +497,10 @@ int av_open_input_stream(AVFormatContext **ic_ptr,
         memset(ap, 0, sizeof(default_ap));
     }
 
-    ic = av_alloc_format_context();
+    if(!ap->prealloced_context)
+        ic = av_alloc_format_context();
+    else
+        ic = *ic_ptr;
     if (!ic) {
         err = AVERROR_NOMEM;
         goto fail;
-- 
GitLab