Skip to content
Snippets Groups Projects
Commit 44c1cc3f authored by Stefano Sabatini's avatar Stefano Sabatini
Browse files

ffprobe: generalize nesting model for the default writer

Regular section fields nested in a regular section are now prefixed by
the nested section name.

This is required by the pending change related to disposition.
parent b6ea9c87
No related branches found
No related tags found
No related merge requests found
...@@ -79,6 +79,7 @@ struct section { ...@@ -79,6 +79,7 @@ struct section {
#define SECTION_FLAG_IS_WRAPPER 1 ///< the section only contains other sections, but has no data at its own level #define SECTION_FLAG_IS_WRAPPER 1 ///< the section only contains other sections, but has no data at its own level
#define SECTION_FLAG_IS_ARRAY 2 ///< the section contains an array of elements of the same type #define SECTION_FLAG_IS_ARRAY 2 ///< the section contains an array of elements of the same type
int flags; int flags;
const char *element_name; ///< name of the contained element, if provided
}; };
typedef enum { typedef enum {
...@@ -104,10 +105,10 @@ typedef enum { ...@@ -104,10 +105,10 @@ typedef enum {
static const struct section sections[] = { static const struct section sections[] = {
[SECTION_ID_ERROR] = { SECTION_ID_ERROR, "error" }, [SECTION_ID_ERROR] = { SECTION_ID_ERROR, "error" },
[SECTION_ID_FORMAT] = { SECTION_ID_FORMAT, "format" }, [SECTION_ID_FORMAT] = { SECTION_ID_FORMAT, "format" },
[SECTION_ID_FORMAT_TAGS] = { SECTION_ID_FORMAT_TAGS, "tags" }, [SECTION_ID_FORMAT_TAGS] = { SECTION_ID_FORMAT_TAGS, "tags", .element_name = "tag" },
[SECTION_ID_FRAME] = { SECTION_ID_FRAME, "frame" }, [SECTION_ID_FRAME] = { SECTION_ID_FRAME, "frame" },
[SECTION_ID_FRAMES] = { SECTION_ID_FRAMES, "frames", SECTION_FLAG_IS_ARRAY }, [SECTION_ID_FRAMES] = { SECTION_ID_FRAMES, "frames", SECTION_FLAG_IS_ARRAY },
[SECTION_ID_FRAME_TAGS] = { SECTION_ID_FRAME_TAGS, "tags" }, [SECTION_ID_FRAME_TAGS] = { SECTION_ID_FRAME_TAGS, "tags", .element_name = "tag" },
[SECTION_ID_LIBRARY_VERSION] = { SECTION_ID_LIBRARY_VERSION, "library_version" }, [SECTION_ID_LIBRARY_VERSION] = { SECTION_ID_LIBRARY_VERSION, "library_version" },
[SECTION_ID_LIBRARY_VERSIONS] = { SECTION_ID_LIBRARY_VERSIONS, "library_versions", SECTION_FLAG_IS_ARRAY }, [SECTION_ID_LIBRARY_VERSIONS] = { SECTION_ID_LIBRARY_VERSIONS, "library_versions", SECTION_FLAG_IS_ARRAY },
[SECTION_ID_PACKET] = { SECTION_ID_PACKET, "packet" }, [SECTION_ID_PACKET] = { SECTION_ID_PACKET, "packet" },
...@@ -117,7 +118,7 @@ static const struct section sections[] = { ...@@ -117,7 +118,7 @@ static const struct section sections[] = {
[SECTION_ID_ROOT] = { SECTION_ID_ROOT, "root", SECTION_FLAG_IS_WRAPPER }, [SECTION_ID_ROOT] = { SECTION_ID_ROOT, "root", SECTION_FLAG_IS_WRAPPER },
[SECTION_ID_STREAM] = { SECTION_ID_STREAM, "stream" }, [SECTION_ID_STREAM] = { SECTION_ID_STREAM, "stream" },
[SECTION_ID_STREAMS] = { SECTION_ID_STREAMS, "streams", SECTION_FLAG_IS_ARRAY }, [SECTION_ID_STREAMS] = { SECTION_ID_STREAMS, "streams", SECTION_FLAG_IS_ARRAY },
[SECTION_ID_STREAM_TAGS] = { SECTION_ID_STREAM_TAGS, "tags" }, [SECTION_ID_STREAM_TAGS] = { SECTION_ID_STREAM_TAGS, "tags", .element_name = "tag" },
}; };
static const OptionDef *options; static const OptionDef *options;
...@@ -488,6 +489,8 @@ typedef struct DefaultContext { ...@@ -488,6 +489,8 @@ typedef struct DefaultContext {
const AVClass *class; const AVClass *class;
int nokey; int nokey;
int noprint_wrappers; int noprint_wrappers;
int nested_section[SECTION_MAX_NB_LEVELS];
AVBPrint prefix[SECTION_MAX_NB_LEVELS];
} DefaultContext; } DefaultContext;
#define OFFSET(x) offsetof(DefaultContext, x) #define OFFSET(x) offsetof(DefaultContext, x)
...@@ -512,6 +515,25 @@ static inline char *upcase_string(char *dst, size_t dst_size, const char *src) ...@@ -512,6 +515,25 @@ static inline char *upcase_string(char *dst, size_t dst_size, const char *src)
return dst; return dst;
} }
static int default_init(WriterContext *wctx)
{
DefaultContext *def = wctx->priv;
int i;
for (i = 0; i < SECTION_MAX_NB_LEVELS; i++)
av_bprint_init(&def->prefix[i], 1, AV_BPRINT_SIZE_UNLIMITED);
return 0;
}
static void default_uninit(WriterContext *wctx)
{
DefaultContext *def = wctx->priv;
int i;
for (i = 0; i < SECTION_MAX_NB_LEVELS; i++)
av_bprint_finalize(&def->prefix[i], NULL);
}
static void default_print_section_header(WriterContext *wctx) static void default_print_section_header(WriterContext *wctx)
{ {
DefaultContext *def = wctx->priv; DefaultContext *def = wctx->priv;
...@@ -520,9 +542,16 @@ static void default_print_section_header(WriterContext *wctx) ...@@ -520,9 +542,16 @@ static void default_print_section_header(WriterContext *wctx)
const struct section *parent_section = wctx->level ? const struct section *parent_section = wctx->level ?
wctx->section[wctx->level-1] : NULL; wctx->section[wctx->level-1] : NULL;
if (def->noprint_wrappers || av_bprint_clear(&def->prefix[wctx->level]);
(parent_section && if (parent_section &&
!(parent_section->flags & (SECTION_FLAG_IS_WRAPPER|SECTION_FLAG_IS_ARRAY)))) !(parent_section->flags & (SECTION_FLAG_IS_WRAPPER|SECTION_FLAG_IS_ARRAY))) {
def->nested_section[wctx->level] = 1;
av_bprintf(&def->prefix[wctx->level], "%s%s:", def->prefix[wctx->level-1].str,
upcase_string(buf, sizeof(buf),
av_x_if_null(section->element_name, section->name)));
}
if (def->noprint_wrappers || def->nested_section[wctx->level])
return; return;
if (!(section->flags & (SECTION_FLAG_IS_WRAPPER|SECTION_FLAG_IS_ARRAY))) if (!(section->flags & (SECTION_FLAG_IS_WRAPPER|SECTION_FLAG_IS_ARRAY)))
...@@ -533,13 +562,9 @@ static void default_print_section_footer(WriterContext *wctx) ...@@ -533,13 +562,9 @@ static void default_print_section_footer(WriterContext *wctx)
{ {
DefaultContext *def = wctx->priv; DefaultContext *def = wctx->priv;
const struct section *section = wctx->section[wctx->level]; const struct section *section = wctx->section[wctx->level];
const struct section *parent_section = wctx->level ?
wctx->section[wctx->level-1] : NULL;
char buf[32]; char buf[32];
if (def->noprint_wrappers || if (def->noprint_wrappers || def->nested_section[wctx->level])
(parent_section &&
!(parent_section->flags & (SECTION_FLAG_IS_WRAPPER|SECTION_FLAG_IS_ARRAY))))
return; return;
if (!(section->flags & (SECTION_FLAG_IS_WRAPPER|SECTION_FLAG_IS_ARRAY))) if (!(section->flags & (SECTION_FLAG_IS_WRAPPER|SECTION_FLAG_IS_ARRAY)))
...@@ -549,11 +574,9 @@ static void default_print_section_footer(WriterContext *wctx) ...@@ -549,11 +574,9 @@ static void default_print_section_footer(WriterContext *wctx)
static void default_print_str(WriterContext *wctx, const char *key, const char *value) static void default_print_str(WriterContext *wctx, const char *key, const char *value)
{ {
DefaultContext *def = wctx->priv; DefaultContext *def = wctx->priv;
const struct section *section = wctx->section[wctx->level];
const char *key_prefix = !strcmp(section->name, "tags") ? "TAG:" : "";
if (!def->nokey) if (!def->nokey)
printf("%s%s=", key_prefix, key); printf("%s%s=", def->prefix[wctx->level].str, key);
printf("%s\n", value); printf("%s\n", value);
} }
...@@ -562,13 +585,15 @@ static void default_print_int(WriterContext *wctx, const char *key, long long in ...@@ -562,13 +585,15 @@ static void default_print_int(WriterContext *wctx, const char *key, long long in
DefaultContext *def = wctx->priv; DefaultContext *def = wctx->priv;
if (!def->nokey) if (!def->nokey)
printf("%s=", key); printf("%s%s=", def->prefix[wctx->level].str, key);
printf("%lld\n", value); printf("%lld\n", value);
} }
static const Writer default_writer = { static const Writer default_writer = {
.name = "default", .name = "default",
.priv_size = sizeof(DefaultContext), .priv_size = sizeof(DefaultContext),
.init = default_init,
.uninit = default_uninit,
.print_section_header = default_print_section_header, .print_section_header = default_print_section_header,
.print_section_footer = default_print_section_footer, .print_section_footer = default_print_section_footer,
.print_integer = default_print_int, .print_integer = default_print_int,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment