Browse Source

ffprobe: add support for nested options in writer contexts

tags/n2.2-rc1
Stefano Sabatini 12 years ago
parent
commit
11cba3ba9d
1 changed files with 35 additions and 2 deletions
  1. +35
    -2
      ffprobe.c

+ 35
- 2
ffprobe.c View File

@@ -306,11 +306,22 @@ static const char *writer_get_name(void *p)
return wctx->writer->name;
}

#define OFFSET(x) offsetof(WriterContext, x)

static void *writer_child_next(void *obj, void *prev)
{
WriterContext *ctx = obj;
if (!prev && ctx->writer && ctx->writer->priv_class && ctx->priv)
return ctx->priv;
return NULL;
}

static const AVClass writer_class = {
"Writer",
writer_get_name,
NULL,
LIBAVUTIL_VERSION_INT,
.child_next = writer_child_next,
};

static void writer_close(WriterContext **wctx)
@@ -351,14 +362,35 @@ static int writer_open(WriterContext **wctx, const Writer *writer, const char *a
(*wctx)->sections = sections;
(*wctx)->nb_sections = nb_sections;

av_opt_set_defaults(*wctx);

if (writer->priv_class) {
void *priv_ctx = (*wctx)->priv;
*((const AVClass **)priv_ctx) = writer->priv_class;
av_opt_set_defaults(priv_ctx);
}

if (args &&
(ret = av_set_options_string(priv_ctx, args, "=", ":")) < 0)
/* convert options to dictionary */
if (args) {
AVDictionary *opts = NULL;
AVDictionaryEntry *opt = NULL;

if ((ret = av_dict_parse_string(&opts, args, "=", ":", 0)) < 0) {
av_log(*wctx, AV_LOG_ERROR, "Failed to parse option string '%s' provided to writer context\n", args);
av_dict_free(&opts);
goto fail;
}

while ((opt = av_dict_get(opts, "", opt, AV_DICT_IGNORE_SUFFIX))) {
if ((ret = av_opt_set(*wctx, opt->key, opt->value, AV_OPT_SEARCH_CHILDREN)) < 0) {
av_log(*wctx, AV_LOG_ERROR, "Failed to set option '%s' with value '%s' provided to writer context\n",
opt->key, opt->value);
av_dict_free(&opts);
goto fail;
}
}

av_dict_free(&opts);
}

for (i = 0; i < SECTION_MAX_NB_LEVELS; i++)
@@ -557,6 +589,7 @@ typedef struct DefaultContext {
int nested_section[SECTION_MAX_NB_LEVELS];
} DefaultContext;

#undef OFFSET
#define OFFSET(x) offsetof(DefaultContext, x)

static const AVOption default_options[] = {


Loading…
Cancel
Save