tag_handler: handle arbitrary name/value pairs

The new method pair() receives an arbitrary name/value pair.  Support
for this is being added to a few decoder plugins.
This commit is contained in:
Max Kellermann
2012-02-11 19:24:51 +01:00
parent 1783aac438
commit ffea273a28
9 changed files with 114 additions and 9 deletions

View File

@@ -50,6 +50,21 @@ ffmpeg_copy_metadata(enum tag_type type,
type, mt->value);
}
#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(51,5,0)
static void
ffmpeg_scan_pairs(AVDictionary *dict,
const struct tag_handler *handler, void *handler_ctx)
{
AVDictionaryEntry *i = NULL;
while ((i = av_dict_get(dict, "", i, AV_DICT_IGNORE_SUFFIX)) != NULL)
tag_handler_invoke_pair(handler, handler_ctx,
i->key, i->value);
}
#endif
void
ffmpeg_scan_dictionary(AVDictionary *dict,
const struct tag_handler *handler, void *handler_ctx)
@@ -62,4 +77,9 @@ ffmpeg_scan_dictionary(AVDictionary *dict,
i->name != NULL; ++i)
ffmpeg_copy_metadata(i->type, dict, i->name,
handler, handler_ctx);
#if LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(51,5,0)
if (handler->pair != NULL)
ffmpeg_scan_pairs(dict, handler, handler_ctx);
#endif
}

View File

@@ -196,6 +196,19 @@ flac_scan_comment(const char *char_tnum,
const FLAC__StreamMetadata_VorbisComment_Entry *entry,
const struct tag_handler *handler, void *handler_ctx)
{
if (handler->pair != NULL) {
char *name = g_strdup((const char*)entry->entry);
char *value = strchr(name, '=');
if (value != NULL && value > name) {
*value++ = 0;
tag_handler_invoke_pair(handler, handler_ctx,
name, value);
}
g_free(name);
}
for (const struct tag_table *i = flac_tags; i->name != NULL; ++i)
if (flac_copy_comment(entry, i->name, i->type, char_tnum,
handler, handler_ctx))

View File

@@ -414,6 +414,8 @@ mp4ff_scan_stream(struct input_stream *is,
mp4ff_meta_get_by_index(mp4fh, i, &item, &value);
tag_handler_invoke_pair(handler, handler_ctx, item, value);
enum tag_type type = mp4ff_tag_name_parse(item);
if (type != TAG_NUM_OF_ITEM_TYPES)
tag_handler_invoke_tag(handler, handler_ctx,

View File

@@ -106,6 +106,19 @@ static void
vorbis_scan_comment(const char *comment,
const struct tag_handler *handler, void *handler_ctx)
{
if (handler->pair != NULL) {
char *name = g_strdup((const char*)comment);
char *value = strchr(name, '=');
if (value != NULL && value > name) {
*value++ = 0;
tag_handler_invoke_pair(handler, handler_ctx,
name, value);
}
g_free(name);
}
for (const struct tag_table *i = vorbis_tags; i->name != NULL; ++i)
if (vorbis_copy_comment(comment, i->name, i->type,
handler, handler_ctx))

View File

@@ -286,6 +286,19 @@ wavpack_scan_tag_item(WavpackContext *wpc, const char *name,
}
static void
wavpack_scan_pair(WavpackContext *wpc, const char *name,
const struct tag_handler *handler, void *handler_ctx)
{
char buffer[1024];
int len = WavpackGetTagItem(wpc, name, buffer, sizeof(buffer));
if (len <= 0 || (unsigned)len >= sizeof(buffer))
return;
tag_handler_invoke_pair(handler, handler_ctx, name, buffer);
}
/*
* Reads metainfo from the specified file.
*/
@@ -313,6 +326,20 @@ wavpack_scan_file(const char *fname,
wavpack_scan_tag_item(wpc, i->name, i->type,
handler, handler_ctx);
if (handler->pair != NULL) {
char name[64];
for (int i = 0, n = WavpackGetNumTagItems(wpc);
i < n; ++i) {
int len = WavpackGetTagItemIndexed(wpc, i, name,
sizeof(name));
if (len <= 0 || (unsigned)len >= sizeof(name))
continue;
wavpack_scan_pair(wpc, name, handler, handler_ctx);
}
}
WavpackCloseFile(wpc);
return true;