From ef2b2243dc1e258e77dac6d702d3c1ec1b2bcc6f Mon Sep 17 00:00:00 2001
From: Anssi Hannula <anssi.hannula@iki.fi>
Date: Sun, 2 Jan 2011 16:00:47 +0000
Subject: [PATCH] Use AVOption for muxers in ffmpeg.

Patch by Anssi Hannula, anssi d hannula d iki d fi

Originally committed as revision 26199 to svn://svn.ffmpeg.org/ffmpeg/trunk
---
 cmdutils.c | 16 +++++++++++++++-
 ffmpeg.c   | 10 ++++++++++
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/cmdutils.c b/cmdutils.c
index 5e4b7168914..a48d0c35c94 100644
--- a/cmdutils.c
+++ b/cmdutils.c
@@ -241,12 +241,20 @@ int opt_default(const char *opt, const char *arg){
     }
     if (!o) {
         AVCodec *p = NULL;
+        AVOutputFormat *oformat = NULL;
         while ((p=av_codec_next(p))){
             AVClass *c= p->priv_class;
             if(c && av_find_opt(&c, opt, NULL, 0, 0))
                 break;
         }
-        if(!p){
+        if (!p) {
+            while ((oformat = av_oformat_next(oformat))) {
+                const AVClass *c = oformat->priv_class;
+                if (c && av_find_opt(&c, opt, NULL, 0, 0))
+                    break;
+            }
+        }
+        if(!p && !oformat){
         fprintf(stderr, "Unrecognized option '%s'\n", opt);
         exit(1);
         }
@@ -322,7 +330,13 @@ void set_context_opts(void *ctx, void *opts_ctx, int flags, AVCodec *codec)
         if(codec && codec->priv_class && avctx->priv_data){
             priv_ctx= avctx->priv_data;
         }
+    } else if (!strcmp("AVFormatContext", (*(AVClass**)ctx)->class_name)) {
+        AVFormatContext *avctx = ctx;
+        if (avctx->oformat && avctx->oformat->priv_class) {
+            priv_ctx = avctx->priv_data;
+        }
     }
+
     for(i=0; i<opt_name_count; i++){
         char buf[256];
         const AVOption *opt;
diff --git a/ffmpeg.c b/ffmpeg.c
index 87f6d99d820..875a1f42f2c 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -3904,6 +3904,7 @@ static void show_usage(void)
 static void show_help(void)
 {
     AVCodec *c;
+    AVOutputFormat *oformat = NULL;
 
     av_log_set_callback(log_callback_help);
     show_usage();
@@ -3945,6 +3946,15 @@ static void show_help(void)
 
     av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
     printf("\n");
+
+    /* individual muxer options */
+    while ((oformat = av_oformat_next(oformat))) {
+        if (oformat->priv_class) {
+            av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
+            printf("\n");
+        }
+    }
+
     av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
 }
 
-- 
GitLab