aboutsummaryrefslogtreecommitdiff
path: root/src/decoder/libav_decoder_plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/decoder/libav_decoder_plugin.c')
-rw-r--r--src/decoder/libav_decoder_plugin.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/src/decoder/libav_decoder_plugin.c b/src/decoder/libav_decoder_plugin.c
index a1e05b6b..60208f56 100644
--- a/src/decoder/libav_decoder_plugin.c
+++ b/src/decoder/libav_decoder_plugin.c
@@ -20,8 +20,8 @@
#include "config.h"
#include "decoder_api.h"
#include "audio_check.h"
-#include "libav_metadata.h"
#include "tag_handler.h"
+#include "tag_table.h"
#include <glib.h>
@@ -56,6 +56,51 @@ typedef struct LibavDecContext {
AVStream *ast;
} LibavDecContext;
+static const struct tag_table libav_tags[] = {
+ { "year", TAG_DATE },
+ { "author-sort", TAG_ARTIST_SORT },
+ { "album_artist", TAG_ALBUM_ARTIST },
+ { "album_artist-sort", TAG_ALBUM_ARTIST_SORT },
+
+ /* sentinel */
+ { NULL, TAG_NUM_OF_ITEM_TYPES }
+};
+
+static void libav_copy_metadata(enum tag_type type, AVDictionary *m, const char *name,
+ const struct tag_handler *handler, void *handler_ctx)
+{
+ AVDictionaryEntry *mt = NULL;
+
+ while ((mt = av_dict_get(m, name, mt, 0)) != NULL)
+ tag_handler_invoke_tag(handler, handler_ctx,
+ type, mt->value);
+}
+
+static void libav_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);
+}
+
+static void libav_scan_dictionary(AVDictionary *dict, const struct tag_handler *handler,
+ void *handler_ctx)
+{
+ for (int i = 0; i < TAG_NUM_OF_ITEM_TYPES; i++)
+ libav_copy_metadata(i, dict, tag_item_names[i],
+ handler, handler_ctx);
+
+ for (const struct tag_table *i = libav_tags; i->name != NULL; i++)
+ libav_copy_metadata(i->type, dict, i->name,
+ handler, handler_ctx);
+
+ if (handler->pair != NULL)
+ libav_scan_pairs(dict, handler, handler_ctx);
+}
+
static int mpd_libav_stream_read(void *opaque, uint8_t *buf, int size)
{
LibavDecContext *stream = opaque;