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)
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:
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);
}
/*
return ftruncate(fd, offset);
}
-static void replace_tag(struct mp4_tag *tag, const char *new_val, bool *found)
+static void replace_or_add_tag(const char *item, const char *value,
+ struct mp4_metadata *meta)
{
- free(tag->value);
- tag->value = para_strdup(new_val);
- *found = true;
-}
-
-static void add_tag(struct mp4_metadata *md, const char *item, const char *value)
-{
- md->tags[md->count].item = para_strdup(item);
- md->tags[md->count].value = para_strdup(value);
- md->count++;
+ uint32_t n;
+ struct mp4_tag *t;
+
+ for (n = 0; n < meta->count; n++) {
+ t = meta->tags + n;
+ if (strcasecmp(t->item, item))
+ continue;
+ free(t->value);
+ t->value = para_strdup(value);
+ return;
+ }
+ /* item not found, add new tag */
+ meta->tags = para_realloc(meta->tags, (meta->count + 1)
+ * sizeof(struct mp4_tag));
+ t = meta->tags + meta->count;
+ t->item = para_strdup(item);
+ t->value = para_strdup(value);
+ meta->count++;
}
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;
+ int ret;
+ struct mp4_metadata *metadata;
struct mp4 *mp4;
struct mp4_callback cb = {
.read = aac_afh_meta_read_cb,
.truncate = aac_afh_meta_truncate_cb,
.user_data = &fd
};
- bool found_artist = false, found_title = false, found_album = false,
- found_year = false, found_comment = false;
ret = write_all(fd, map, mapsize);
if (ret < 0)
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);
- if (!strcmp(tag->item, "artist"))
- replace_tag(tag, tags->artist, &found_artist);
- else if (!strcmp(tag->item, "title"))
- replace_tag(tag, tags->title, &found_title);
- else if (!strcmp(tag->item, "album"))
- replace_tag(tag, tags->album, &found_album);
- else if (!strcmp(tag->item, "date"))
- replace_tag(tag, tags->year, &found_year);
- else if (!strcmp(tag->item, "comment"))
- replace_tag(tag, tags->comment, &found_comment);
- }
- if (!found_artist)
- add_tag(&metadata, "artist", tags->artist);
- if (!found_title)
- add_tag(&metadata, "title", tags->title);
- if (!found_album)
- add_tag(&metadata, "album", tags->album);
- if (!found_year)
- add_tag(&metadata, "date", tags->year);
- if (!found_comment)
- add_tag(&metadata, "comment", tags->comment);
+ metadata = mp4_get_meta(mp4);
+ PARA_NOTICE_LOG("%u metadata item(s) found\n", metadata->count);
+ replace_or_add_tag("artist", tags->artist, metadata);
+ replace_or_add_tag("title", tags->title, metadata);
+ replace_or_add_tag("album", tags->album, metadata);
+ replace_or_add_tag("date", tags->year, metadata);
+ replace_or_add_tag("comment", tags->comment, metadata);
ret = -E_MP4_META_WRITE;
- if (!mp4_meta_update(&cb, &metadata))
- goto free_tags;
+ if (!mp4_meta_update(mp4))
+ 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;