[FFmpeg-devel] [PATCH] lavu/opt: add av_opt_bprint()
Nicolas George
nicolas.george at normalesup.org
Thu Jan 10 19:38:57 CET 2013
Le nonidi 19 nivôse, an CCXXI, Stefano Sabatini a écrit :
> >From 9b7de355afb61bab72bce682aacbd96eb4a9cb95 Mon Sep 17 00:00:00 2001
> From: Stefano Sabatini <stefasab at gmail.com>
> Date: Thu, 9 Aug 2012 19:59:48 +0200
> Subject: [PATCH] lavu/bprint: add av_bprint_options()
>
> This function will be useful to serialize an object context.
>
> TODO: add APIChanges entry, bump minor
> ---
> libavutil/bprint.c | 23 +++++++++++++++++++++++
> libavutil/bprint.h | 15 +++++++++++++++
> libavutil/opt.c | 10 +++++++++-
> 3 files changed, 47 insertions(+), 1 deletion(-)
>
> diff --git a/libavutil/bprint.c b/libavutil/bprint.c
> index 64cd8db..4565698 100644
> --- a/libavutil/bprint.c
> +++ b/libavutil/bprint.c
> @@ -28,6 +28,7 @@
> #include "common.h"
> #include "error.h"
> #include "mem.h"
> +#include "opt.h"
>
> #define av_bprint_room(buf) ((buf)->size - FFMIN((buf)->len, (buf)->size))
> #define av_bprint_is_allocated(buf) ((buf)->str != (buf)->reserved_internal_buffer)
> @@ -262,6 +263,28 @@ int av_bprint_escape(AVBPrint *dstbuf, const char *src, const char *special_char
> return dstbuf->len;
> }
>
> +void av_bprint_options(struct AVBPrint *bp, void *ctx,
> + const char *key_val_sep, const char *pairs_sep)
> +{
> + const AVOption *opt = NULL, *prev_opt = NULL;
> +
> + while (opt = av_opt_next(ctx, opt)) {
> + uint8_t *val;
> + char sep[2] = { pairs_sep[0], 0 };
> +
> + /* skip duplicated option values */
> + if (prev_opt && prev_opt->offset == opt->offset)
> + continue;
> + av_opt_get(ctx, opt->name, AV_OPT_SEARCH_CHILDREN, &val);
> + if (opt->offset) {
> + av_bprintf(bp, "%s%s%c", prev_opt ? sep : "", opt->name, key_val_sep[0]);
> + av_bprint_escape(bp, val, pairs_sep, AV_ESCAPE_MODE_BACKSLASH, 0);
> + av_freep(&val);
> + }
> + prev_opt = opt;
> + }
> +}
> +
> #ifdef TEST
>
> #undef printf
> diff --git a/libavutil/bprint.h b/libavutil/bprint.h
> index b9039bd..316f99c 100644
> --- a/libavutil/bprint.h
> +++ b/libavutil/bprint.h
> @@ -195,4 +195,19 @@ int av_bprint_finalize(AVBPrint *buf, char **ret_str);
> int av_bprint_escape(AVBPrint *dstbuf, const char *src, const char *special_chars,
> enum AVEscapeMode mode, int flags);
>
> +/**
> + * Append a compact description of the context options to a bprint buffer.
> + * The obtained string is escape, and can be used to set options through the function
escaped
> + * av_opt_set_from_string() or equivalent.
"the foobar() function", I believe.
> + *
> + * @param bp already inited destination bprint buffer
> + * @param ctx pointer to a context whose first field is a pointer to an AVClass
> + * @param key_val_sep a 0-terminated list of characters used to separate
> + * key from value, for example '='
> + * @param pairs_sep a 0-terminated list of characters used to separate
> + * two pairs from each other, for example ':' or ','
> + */
> +void av_bprint_options(struct AVBPrint *bp, void *ctx,
> + const char *key_val_sep, const char *pairs_sep);
> +
> #endif /* AVUTIL_BPRINT_H */
> diff --git a/libavutil/opt.c b/libavutil/opt.c
> index 61c76da..5a02113 100644
> --- a/libavutil/opt.c
> +++ b/libavutil/opt.c
> @@ -27,7 +27,7 @@
>
> #include "avutil.h"
> #include "avstring.h"
> -#include "common.h"
> +#include "bprint.h"
> #include "opt.h"
> #include "eval.h"
> #include "dict.h"
> @@ -1329,6 +1329,7 @@ static const AVOption test_options[]= {
> {"lame", "set lame flag ", 0, AV_OPT_TYPE_CONST, {.i64 = TEST_FLAG_LAME}, INT_MIN, INT_MAX, 0, "flags" },
> {"mu", "set mu flag ", 0, AV_OPT_TYPE_CONST, {.i64 = TEST_FLAG_MU}, INT_MIN, INT_MAX, 0, "flags" },
> {"size", "set size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE,{0}, 0, 0 },
> +{"s", "set size", OFFSET(w), AV_OPT_TYPE_IMAGE_SIZE,{0}, 0, 0 },
Not entirely related, but I see the point.
> {"pix_fmt", "set pixfmt", OFFSET(pix_fmt), AV_OPT_TYPE_PIXEL_FMT, {.i64 = AV_PIX_FMT_NONE}, -1, AV_PIX_FMT_NB-1},
> {"sample_fmt", "set samplefmt", OFFSET(sample_fmt), AV_OPT_TYPE_SAMPLE_FMT, {.i64 = AV_SAMPLE_FMT_NONE}, -1, AV_SAMPLE_FMT_NB-1},
> {NULL},
> @@ -1348,6 +1349,7 @@ static const AVClass test_class = {
> int main(void)
> {
> int i;
> + AVBPrint bp;
>
> printf("\nTesting av_set_options_string()\n");
> {
> @@ -1395,6 +1397,12 @@ int main(void)
> av_log(&test_ctx, AV_LOG_ERROR, "Error setting options string: '%s'\n", options[i]);
> printf("\n");
> }
> +
> + av_bprint_init(&bp, 1, AV_BPRINT_SIZE_UNLIMITED);
> + av_bprint_options(&bp, &test_ctx, "=", ":");
> + printf("test_ctx=%s\n", bp.str);
> + av_bprint_clear(&bp);
> +
> av_freep(&test_ctx.string);
> }
>
Looks good. Wild idea, not blocking: try to determine whether the options
are at their default or not.
Regards,
--
Nicolas George
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20130110/52e6bc7a/attachment.asc>
More information about the ffmpeg-devel
mailing list