return 1;
}
-static int32_t parse_metadata(struct mp4 *f, int32_t size)
+static int32_t read_ilst(struct mp4 *f, int32_t size)
{
uint64_t sumsize = 0;
subsize = atom_read_header(f, &atom_type, &header_size);
if (subsize <= header_size + 4)
return 1;
- if (atom_type == ATOM_ILST) {
- parse_metadata(f, (uint32_t) (subsize - (header_size + 4)));
- } else {
+ if (atom_type == ATOM_ILST)
+ read_ilst(f, subsize - (header_size + 4));
+ else
set_position(f, get_position(f) + subsize - header_size);
- }
sumsize += subsize;
}
return membuffer_write(buf, temp, 4);
}
-struct stdmeta_entry {
- const char *atom;
- const char *name;
-};
-
-struct stdmeta_entry stdmetas[] = {
- {"\xA9" "nam", "title"},
- {"\xA9" "ART", "artist"},
- {"\xA9" "alb", "album"},
- {"\xA9" "day", "date"},
- {"\xA9" "cmt", "comment"},
-};
-
-static const char *find_standard_meta(const char *name) //returns atom name if found, 0 if not
-{
- unsigned n;
- for (n = 0; n < sizeof (stdmetas) / sizeof (stdmetas[0]); n++) {
- if (!strcasecmp(name, stdmetas[n].name))
- return stdmetas[n].atom;
- }
- return 0;
-}
-
static void membuffer_write_std_tag(struct membuffer *buf, const char *name,
const char *value)
{
- uint32_t flags = 1;
-
- /* special check for compilation flag */
- if (strcmp(name, "cpil") == 0) {
- flags = 21;
- }
-
- membuffer_write_int32(buf,
- 8 /*atom header */ + 8 /*data atom header */ +
- 8 /*flags + reserved */ + strlen(value));
+ uint32_t len = strlen(value);
+ membuffer_write_int32(buf, 8 /* atom header */
+ + 8 /* data atom header */
+ + 8 /* flags + reserved */
+ + len);
membuffer_write_atom_name(buf, name);
- membuffer_write_int32(buf,
- 8 /*data atom header */ +
- 8 /*flags + reserved */ + strlen(value));
+ membuffer_write_int32(buf, 8 /* data atom header */
+ + 8 /* flags + reserved */
+ + len);
membuffer_write_atom_name(buf, "data");
- membuffer_write_int32(buf, flags); //flags
- membuffer_write_int32(buf, 0); //reserved
- membuffer_write(buf, value, strlen(value));
+ membuffer_write_int32(buf, 1); /* flags */
+ membuffer_write_int32(buf, 0); /* reserved */
+ membuffer_write(buf, value, len);
}
static unsigned membuffer_error(const struct membuffer *buf)
return ret;
}
+struct stdmeta_entry {
+ const char *atom;
+ const char *name;
+};
+
+static const char *find_standard_meta(const char *name)
+{
+ const struct stdmeta_entry stdmetas[] = {
+ {"\xA9" "nam", "title"},
+ {"\xA9" "ART", "artist"},
+ {"\xA9" "alb", "album"},
+ {"\xA9" "day", "date"},
+ {"\xA9" "cmt", "comment"},
+ };
+
+ for (unsigned n = 0; n < ARRAY_SIZE(stdmetas); n++)
+ if (!strcasecmp(name, stdmetas[n].name))
+ return stdmetas[n].atom;
+ return NULL;
+}
+
static uint32_t create_ilst(const struct mp4_metadata *meta, void **out_buffer,
uint32_t * out_size)
{