From 52e38dd76a71c293879d23d7a4dff02ec6790e6c Mon Sep 17 00:00:00 2001 From: Julien BLACHE Date: Mon, 22 Mar 2010 18:22:39 +0100 Subject: [PATCH] Allow a secondary metadata map for metadata extraction --- src/filescanner_ffmpeg.c | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/filescanner_ffmpeg.c b/src/filescanner_ffmpeg.c index fb90e1c5..4600faf5 100644 --- a/src/filescanner_ffmpeg.c +++ b/src/filescanner_ffmpeg.c @@ -65,7 +65,7 @@ struct metadata_map { * map, the slower the filescanner gets. */ /* Lookup is case-insensitive, first occurrence takes precedence */ -static struct metadata_map md_map[] = +static struct metadata_map md_map_generic[] = { { "title", 0, mfi_offsetof(title) }, { "TT2", 0, mfi_offsetof(title) }, /* ID3v2.2 */ @@ -119,7 +119,7 @@ static struct metadata_map md_map[] = static int -extract_metadata(struct media_file_info *mfi, AVMetadata *md) +extract_metadata_core(struct media_file_info *mfi, AVMetadata *md, struct metadata_map *md_map) { AVMetadataTag *mdt; char **strval; @@ -184,10 +184,33 @@ extract_metadata(struct media_file_info *mfi, AVMetadata *md) return mdcount; } +static int +extract_metadata(struct media_file_info *mfi, AVMetadata *md, struct metadata_map *extra_md_map) +{ + int mdcount; + int extra; + + mdcount = extract_metadata_core(mfi, md, md_map_generic); + + DPRINTF(E_DBG, L_SCAN, "Picked up %d metadata with generic map\n", mdcount); + + if (extra_md_map) + { + extra = extract_metadata_core(mfi, md, extra_md_map); + + DPRINTF(E_DBG, L_SCAN, "Picked up %d metadata with extra map\n", extra); + + mdcount += extra; + } + + return mdcount; +} + int scan_metadata_ffmpeg(char *file, struct media_file_info *mfi) { AVFormatContext *ctx; + struct metadata_map *extra_md_map; enum CodecID codec_id; enum CodecID video_codec_id; enum CodecID audio_codec_id; @@ -293,6 +316,7 @@ scan_metadata_ffmpeg(char *file, struct media_file_info *mfi) } /* Check codec */ + extra_md_map = NULL; codec_id = (mfi->has_video) ? video_codec_id : audio_codec_id; switch (codec_id) { @@ -412,7 +436,7 @@ scan_metadata_ffmpeg(char *file, struct media_file_info *mfi) if (ctx->metadata) { - ret = extract_metadata(mfi, ctx->metadata); + ret = extract_metadata(mfi, ctx->metadata, extra_md_map); DPRINTF(E_DBG, L_SCAN, "Picked up %d tags from file metadata\n", ret); @@ -421,7 +445,7 @@ scan_metadata_ffmpeg(char *file, struct media_file_info *mfi) if (ctx->streams[audio_stream]->metadata) { - ret = extract_metadata(mfi, ctx->streams[audio_stream]->metadata); + ret = extract_metadata(mfi, ctx->streams[audio_stream]->metadata, extra_md_map); DPRINTF(E_DBG, L_SCAN, "Picked up %d tags from audio stream metadata\n", ret); @@ -430,7 +454,7 @@ scan_metadata_ffmpeg(char *file, struct media_file_info *mfi) if ((video_stream != -1) && (ctx->streams[video_stream]->metadata)) { - ret = extract_metadata(mfi, ctx->streams[video_stream]->metadata); + ret = extract_metadata(mfi, ctx->streams[video_stream]->metadata, extra_md_map); DPRINTF(E_DBG, L_SCAN, "Picked up %d tags from video stream metadata\n", ret);