static int32_t tag_add_field(struct mp4_metadata *tags, const char *item,
const char *value, int32_t len)
{
- if (!item || (item && !*item) || !value)
- return 0;
tags->tags = para_realloc(tags->tags,
(tags->count + 1) * sizeof(struct mp4_tag));
tags->tags[tags->count].item = para_strdup(item);
static void parse_tag(struct mp4 *f, uint8_t parent, int32_t size)
{
uint64_t subsize, sumsize;
- char *name = NULL;
char *data = NULL;
uint32_t len = 0;
uint64_t destpos;
uint8_t header_size = 0;
subsize = atom_read_header(f, &atom_type, &header_size);
destpos = get_position(f) + subsize - header_size;
- if (atom_type == ATOM_NAME) {
- read_char(f); /* version */
- read_int24(f); /* flags */
- free(name);
- name = read_string(f, subsize - (header_size + 4));
- continue;
- }
if (atom_type != ATOM_DATA)
continue;
read_char(f); /* version */
data = read_string(f, subsize - (header_size + 8));
len = subsize - (header_size + 8);
}
- if (data) {
- if (!name)
- name = para_strdup(get_metadata_name(parent));
- tag_add_field(&(f->tags), name, data, len);
- free(data);
- }
- free(name);
+ if (!data)
+ return;
+ tag_add_field(&f->tags, get_metadata_name(parent), data, len);
+ free(data);
}
static int32_t read_mdhd(struct mp4 *f)
return 1;
}
-/* find a metadata item by name */
-/* returns 0 if item found, 1 if no such item */
-static int32_t meta_find_by_name(const struct mp4 *f, const char *item,
- char **value)
+static char *meta_find_by_name(const struct mp4 *f, const char *item)
{
uint32_t i;
- for (i = 0; i < f->tags.count; i++) {
- if (!strcasecmp(f->tags.tags[i].item, item)) {
- *value = para_strdup(f->tags.tags[i].value);
- return 1;
- }
- }
-
- *value = NULL;
-
- /* not found */
- return 0;
+ for (i = 0; i < f->tags.count; i++)
+ if (!strcasecmp(f->tags.tags[i].item, item))
+ return para_strdup(f->tags.tags[i].value);
+ return NULL;
}
-int32_t mp4_meta_get_artist(const struct mp4 *f, char **value)
+/**
+ * Return the value of the artist meta tag of an mp4 file.
+ *
+ * \param f Must not be NULL.
+ *
+ * \return If the file does not contain this metadata tag, the function returns
+ * NULL. Otherwise, a copy of the tag value is returned. The caller should free
+ * this memory when it is no longer needed.
+ */
+char *mp4_meta_get_artist(const struct mp4 *f)
{
- return meta_find_by_name(f, "artist", value);
+ return meta_find_by_name(f, "artist");
}
-int32_t mp4_meta_get_title(const struct mp4 *f, char **value)
+/**
+ * Return the value of the title meta tag of an mp4 file.
+ *
+ * \param f See \ref mp4_meta_get_artist().
+ * \return See \ref mp4_meta_get_artist().
+ */
+char *mp4_meta_get_title(const struct mp4 *f)
{
- return meta_find_by_name(f, "title", value);
+ return meta_find_by_name(f, "title");
}
-int32_t mp4_meta_get_date(const struct mp4 *f, char **value)
+/**
+ * Return the value of the date meta tag of an mp4 file.
+ *
+ * \param f See \ref mp4_meta_get_artist().
+ * \return See \ref mp4_meta_get_artist().
+ */
+char *mp4_meta_get_date(const struct mp4 *f)
{
- return meta_find_by_name(f, "date", value);
+ return meta_find_by_name(f, "date");
}
-int32_t mp4_meta_get_album(const struct mp4 *f, char **value)
+/**
+ * Return the value of the album meta tag of an mp4 file.
+ *
+ * \param f See \ref mp4_meta_get_artist().
+ * \return See \ref mp4_meta_get_artist().
+ */
+char *mp4_meta_get_album(const struct mp4 *f)
{
- return meta_find_by_name(f, "album", value);
+ return meta_find_by_name(f, "album");
}
-int32_t mp4_meta_get_comment(const struct mp4 *f, char **value)
+/**
+ * Return the value of the comment meta tag of an mp4 file.
+ *
+ * \param f See \ref mp4_meta_get_artist().
+ * \return See \ref mp4_meta_get_artist().
+ */
+char *mp4_meta_get_comment(const struct mp4 *f)
{
- return meta_find_by_name(f, "comment", value);
+ return meta_find_by_name(f, "comment");
}