]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - aac_afh.c
mp4: Introduce mp4_get_meta().
[paraslash.git] / aac_afh.c
index aed2153608fc56616be17a291230f6d8be4b5f4c..1522b5f0f7e1c8502439fd31b7884f246ef9079c 100644 (file)
--- a/aac_afh.c
+++ b/aac_afh.c
@@ -51,24 +51,13 @@ static uint32_t aac_afh_seek_cb(void *user_data, uint64_t pos)
 
 static int32_t aac_afh_get_track(struct mp4 *mp4)
 {
-       int32_t i, rc, num_tracks = mp4_total_tracks(mp4);
+       int32_t i, num_tracks = mp4_total_tracks(mp4);
 
        assert(num_tracks >= 0);
-       for (i = 0; i < num_tracks; i++) {
-               unsigned char *buf = NULL;
-               unsigned buf_size = 0;
-
-               mp4_get_decoder_config(mp4, i, &buf, &buf_size);
-               if (buf) {
-                       mp4AudioSpecificConfig masc;
-                       rc = NeAACDecAudioSpecificConfig(buf, buf_size, &masc);
-                       free(buf);
-                       if (rc < 0)
-                               continue;
+       for (i = 0; i < num_tracks; i++)
+               if (mp4_is_audio_track(mp4, i))
                        return i;
-               }
-       }
-       return -1; /* no audio track */
+       return -E_MP4_TRACK; /* no audio track */
 }
 
 static int aac_afh_open(const void *map, size_t mapsize, void **afh_context)
@@ -87,10 +76,10 @@ static int aac_afh_open(const void *map, size_t mapsize, void **afh_context)
        c->mp4 = mp4_open_read(&c->cb);
        if (!c->mp4)
                goto free_ctx;
-       c->track = aac_afh_get_track(c->mp4);
-       ret = -E_MP4_TRACK;
-       if (c->track < 0)
+       ret = aac_afh_get_track(c->mp4);
+       if (ret < 0)
                goto close_mp4;
+       c->track = ret;
        *afh_context = c;
        return 0;
 close_mp4:
@@ -129,11 +118,11 @@ static int aac_afh_get_chunk(uint32_t chunk_num, void *afh_context,
 
 static void _aac_afh_get_taginfo(const struct mp4 *mp4, struct taginfo *tags)
 {
-       mp4_meta_get_artist(mp4, &tags->artist);
-       mp4_meta_get_title(mp4, &tags->title);
-       mp4_meta_get_date(mp4, &tags->year);
-       mp4_meta_get_album(mp4, &tags->album);
-       mp4_meta_get_comment(mp4, &tags->comment);
+       tags->artist = mp4_meta_get_artist(mp4);
+       tags->title = mp4_meta_get_title(mp4);
+       tags->year = mp4_meta_get_date(mp4);
+       tags->album = mp4_meta_get_album(mp4);
+       tags->comment = mp4_meta_get_comment(mp4);
 }
 
 /*
@@ -232,8 +221,7 @@ static int aac_afh_rewrite_tags(const char *map, size_t mapsize,
                struct taginfo *tags, int fd, __a_unused const char *filename)
 {
        int ret, i;
-       int32_t rv;
-       struct mp4_metadata metadata;
+       struct mp4_metadata *metadata;
        struct mp4 *mp4;
        struct mp4_callback cb = {
                .read = aac_afh_meta_read_cb,
@@ -253,22 +241,12 @@ static int aac_afh_rewrite_tags(const char *map, size_t mapsize,
        mp4 = mp4_open_meta(&cb);
        if (!mp4)
                return -E_MP4_OPEN;
-
-       ret = -E_MP4_META_READ;
-       rv = mp4_meta_get_num_items(mp4);
-       if (rv < 0)
-               goto close;
-       metadata.count = rv;
-       PARA_NOTICE_LOG("%d metadata item(s) found\n", rv);
-
-       metadata.tags = para_malloc((metadata.count + 5) * sizeof(struct mp4_tag));
-       for (i = 0; i < metadata.count; i++) {
-               struct mp4_tag *tag = metadata.tags + i;
-
-               ret = -E_MP4_META_READ;
-               if (!mp4_meta_get_by_index(mp4, i, &tag->item, &tag->value))
-                       goto free_tags;
-               PARA_INFO_LOG("found: %s: %s\n", tag->item, tag->value);
+       metadata = mp4_get_meta(mp4);
+       PARA_NOTICE_LOG("%u metadata item(s) found\n", metadata->count);
+       metadata->tags = para_realloc(metadata->tags,
+               (metadata->count + 5) * sizeof(struct mp4_tag));
+       for (i = 0; i < metadata->count; i++) {
+               struct mp4_tag *tag = metadata->tags + i;
                if (!strcmp(tag->item, "artist"))
                        replace_tag(tag, tags->artist, &found_artist);
                else if (!strcmp(tag->item, "title"))
@@ -281,25 +259,19 @@ static int aac_afh_rewrite_tags(const char *map, size_t mapsize,
                        replace_tag(tag, tags->comment, &found_comment);
        }
        if (!found_artist)
-               add_tag(&metadata, "artist", tags->artist);
+               add_tag(metadata, "artist", tags->artist);
        if (!found_title)
-               add_tag(&metadata, "title", tags->title);
+               add_tag(metadata, "title", tags->title);
        if (!found_album)
-               add_tag(&metadata, "album", tags->album);
+               add_tag(metadata, "album", tags->album);
        if (!found_year)
-               add_tag(&metadata, "date", tags->year);
+               add_tag(metadata, "date", tags->year);
        if (!found_comment)
-               add_tag(&metadata, "comment", tags->comment);
+               add_tag(metadata, "comment", tags->comment);
        ret = -E_MP4_META_WRITE;
-       if (!mp4_meta_update(&cb, &metadata))
-               goto free_tags;
+       if (!mp4_meta_update(mp4, metadata))
+               goto close;
        ret = 1;
-free_tags:
-       for (; i > 0; i--) {
-               free(metadata.tags[i - 1].item);
-               free(metadata.tags[i - 1].value);
-       }
-       free(metadata.tags);
 close:
        mp4_close(mp4);
        return ret;