* first shot for generaly usable option parser for codecs
authorZdenek Kabelac <kabi@informatics.muni.cz>
Mon, 6 Jan 2003 18:06:51 +0000 (18:06 +0000)
committerZdenek Kabelac <kabi@informatics.muni.cz>
Mon, 6 Jan 2003 18:06:51 +0000 (18:06 +0000)
Originally committed as revision 1402 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/avcodec.h
libavcodec/opts.c [new file with mode: 0644]

index ae96558c95020e306d020fcbc47c8c5e8e3ee503..fd7eafbd4fa77901f4355b948ea026fcf7bc85c2 100644 (file)
@@ -1109,6 +1109,41 @@ void avcodec_register_all(void);
 
 void avcodec_flush_buffers(AVCodecContext *avctx);
 
+typedef struct {
+    /** options' name with default value*/
+    const char* name;
+    /** English text help */
+    const char* help;
+    /** type of variable */
+    int type;
+#define FF_CONF_TYPE_BOOL 1     // boolean - true,1,on  (or simply presence)
+#define FF_CONF_TYPE_DOUBLE 2   // double
+#define FF_CONF_TYPE_INT 3      // integer
+#define FF_CONF_TYPE_STRING 4   // string (finished with \0)
+#define FF_CONF_TYPE_MASK 0x1f // mask for types - upper bits are various flags
+#define FF_CONF_TYPE_EXPERT 0x20 // flag for expert option
+#define FF_CONF_TYPE_FLAG (FF_CONF_TYPE_BOOL | 0x40)
+#define FF_CONF_TYPE_RCOVERIDE (FF_CONF_TYPE_STRING | 0x80)
+    /** where the parsed value should be stored */
+    void* val;
+    /** min value  (min == max   ->  no limits) */
+    double min;
+    /** maximum value for double/int */
+    double max;
+    /** default boo [0,1]l/double/int value */
+    double defval;
+    /**
+     * default string value (with optional semicolon delimited extra option-list
+     * i.e.   option1;option2;option3
+     * defval might select other then first argument as default
+     */
+    const char* defstr;
+    /** char* list of supported codecs (i.e. ",msmpeg4,h263," NULL - everything */
+    const char* supported;
+} avc_config_t;
+
+void avcodec_getopt(AVCodecContext* avctx, char* str, avc_config_t** config);
+
 /**
  * Interface for 0.5.0 version
  *
@@ -1193,7 +1228,7 @@ void __av_freep(void **ptr);
 #define av_freep(p) __av_freep((void **)(p))
 /* for static data only */
 /* call av_free_static to release all staticaly allocated tables */
-void av_free_static();
+void av_free_static(void);
 void *__av_mallocz_static(void** location, unsigned int size);
 #define av_mallocz_static(p, s) __av_mallocz_static((void **)(p), s)
 
diff --git a/libavcodec/opts.c b/libavcodec/opts.c
new file mode 100644 (file)
index 0000000..bcefc40
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * LGPL
+ */
+
+/*
+ * typical parsed command line:
+ * msmpeg4:bitrate=720000:qmax=16
+ *
+ */
+
+#include "avcodec.h"
+
+/*
+ * possible extension - use for decoder options
+ *                    - for given codec names filter only correct
+ *                      options given (could be passed with 'str')
+ */
+
+/**
+ * \param avctx  where to store parsed results
+ * \param str    string with options for parsing
+ * \param config allocated avc_config_t for external parsing
+ *               i.e. external program might learn about all available
+ *               options for given codec
+ **/
+void avcodec_getopt(AVCodecContext* avctx, char* str, avc_config_t** config)
+{
+    AVCodecContext avctx_tmp;
+    AVCodecContext* ctx = (avctx) ? avctx : &avctx_tmp;
+    static const char* class_h263 = ",msmpeg4,";
+    //"huffyuv,wmv1,msmpeg4v2,msmpeg4,mpeg4,mpeg1,mpeg1video,mjpeg,rv10,h263,h263p"
+
+    avc_config_t cnf[] =
+    {
+       // FIXME: sorted by importance!!!
+        // expert option should follow more common ones
+       {
+           "bitrate", "desired video bitrate",
+           FF_CONF_TYPE_INT, &ctx->bit_rate, 4, 240000000, 800000, NULL, class_h263
+       }, {
+           "vhq", "very high quality",
+           FF_CONF_TYPE_FLAG, &ctx->flags, 0, CODEC_FLAG_HQ, 0, NULL, class_h263
+       }, {
+           "ratetol", "number of bits the bitstream is allowed to diverge from the reference"
+           "the reference can be CBR (for CBR pass1) or VBR (for pass2)",
+           FF_CONF_TYPE_INT, &ctx->bit_rate_tolerance, 4, 240000000, 8000, NULL, class_h263
+       }, {
+           "qmin", "minimum quantizer", FF_CONF_TYPE_INT, &ctx->qmin, 1, 31, 2, NULL, class_h263
+       }, {
+           "qmax", "maximum qunatizer", FF_CONF_TYPE_INT, &ctx->qmax, 1, 31, 31, NULL, class_h263
+       }, {
+           "rc_eq", "rate control equation",
+           FF_CONF_TYPE_STRING, &ctx->rc_eq, 0, 0, 0, "tex^qComp" /* FILLME options */, class_h263
+       }, {
+           "rc_minrate", "rate control minimum bitrate",
+           FF_CONF_TYPE_INT, &ctx->rc_min_rate, 4, 24000000, 0, NULL, class_h263
+       }, {
+           "rc_maxrate", "rate control maximum bitrate",
+           FF_CONF_TYPE_INT, &ctx->rc_max_rate, 4, 24000000, 0, NULL, class_h263
+       }, {
+           "psnr", "calculate PSNR of compressed frames",
+           FF_CONF_TYPE_FLAG, &ctx->flags, 0, CODEC_FLAG_PSNR, 0, NULL, class_h263
+       }, {
+           "rc_override", "ratecontrol override (=startframe,endframe,qscale,quality_factor)",
+           FF_CONF_TYPE_RCOVERIDE, &ctx->rc_override, 0, 0, 0, NULL, class_h263
+       },
+
+        { NULL, NULL, 0, NULL, 0, 0, 0, NULL, NULL }
+    };
+
+    if (config)
+    {
+       *config = malloc(sizeof(cnf));
+       if (*config)
+            memcpy(*config, cnf, sizeof(cnf));
+    }
+}