[FFmpeg-devel] [PATCH/RFC] Per-codec option system

Stefano Sabatini stefano.sabatini-lala
Wed Sep 30 01:06:27 CEST 2009


On date Tuesday 2009-09-29 11:21:10 -0700, Jason Garrett-Glaser encoded:
> A very simple implementation of a string option system, with x264
> completed as an example.  Not implemented in ffmpeg.c yet.
> 
> Eventual goal: eliminate [nearly] all options in AVCodecContext and
> revert entirely to codec-specific options.
> 
> Potential improvements: add a .help() command as well to return help
> information on the options for a specific codec.

That's similar to what happens in lavfi: we have a private context for
each filter, which is filled using an ad-hoc options array.

For codecs / mu-demuxers / devices we have an common context shared by
all of them, so an idea could be to put somewhere a private context
(e.g. in priv_data), and use that for setting private options.

In the case of an external library, the private context would be an
opaque struct, in this case we need a function to set the private
options used by the library.

The first case can be reduced to the second one using for example:

int mucodec_set_private_option(AVCodecContext *avctx, const char *name, const char *value)
{
    MuCodecContext *muctx = avctx->priv_data;
    return av_set_option(muctx, name, value);
}
 
> I think practically everyone agrees that this needs to be done at some
> point.  If bikeshedding results in some variant of this not being
> committed within the next week, I will commit without discussion.  At
> a minimum, I think the (or a similar) API should go in as soon as
> possible so that we can start writing interfaces to it and converting
> more codecs to use it.

I don't think this is something can be set fast and furiously,
especially as it affects the whole framework so extra care should be
taken.

[...]
Index: libavcodec/avcodec.h
===================================================================
--- libavcodec/avcodec.h    (revision 20083)
+++ libavcodec/avcodec.h    (working copy)
@@ -609,6 +609,10 @@
  * Codec can output multiple frames per AVPacket
  */
 #define CODEC_CAP_SUBFRAMES        0x0100
+/** Codec supports the string option system.
+ *
+ */
+#define CODEC_CAP_STRING_OPTIONS   0x0200

 //The following defines may change, don't expect compatibility if you use them.
 #define MB_TYPE_INTRA4x4   0x0001
@@ -2526,6 +2530,13 @@
      * - decoding: Set by libavcodec
      */
     enum AVChromaLocation chroma_sample_location;
+
+    /**
+     * Use the string option instead of the options in AVCodecContext.
+     * - encoding: Set by user
+     * - decoding: Set by user
+     */
+    int use_string_options;
 } AVCodecContext;

As Mans noted maybe this is not necessary.

 /**
@@ -2547,6 +2558,20 @@
     int (*close)(AVCodecContext *);
     int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt);
     /**
+     * Apply a codec-specific option using the option string system.

Please use third person in doxies.

+     * Only works if use_string_options is set in the AVCodecContext.
+     * Only supported for codecs with CODEC_CAP_STRING_OPTIONS in capabilities.
+     * Must be called before init().
+     * Returns: negative if failure, zero if success.
+     */
+    int (*set_option)(AVCodecContext *ctx, const char *name, const char *value);
+    /**
+     * Apply the default options for the codec-specific options system.
+     * Only supported for codecs with CODEC_CAP_STRING_OPTIONS in capabilities.
+     * Must be called before set_option().
+     */
+    int (*defaults)(AVCodecContext *ctx);
+    /**

I would prefer something more explicit like "set_private_option()" /
"set_private_options_defaults()", also "defaults" is not even a verb.

Regards.
-- 
FFmpeg = Faboulous and Fostering MultiPurpose Extravagant Ghost



More information about the ffmpeg-devel mailing list