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);
}
/*
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,
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"))
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;