]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - mp4.c
mp4: Drop integer return type from modify_moov().
[paraslash.git] / mp4.c
diff --git a/mp4.c b/mp4.c
index 1b935fa85bd177a7d7cabcf96e21987ebb98cd12..7f223bc3ea67853bd2b6e42ee49eeb5f9c3949fe 100644 (file)
--- a/mp4.c
+++ b/mp4.c
@@ -699,7 +699,7 @@ static int32_t read_mdhd(struct mp4 *f)
        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;
 
@@ -739,11 +739,10 @@ static int32_t read_meta(struct mp4 *f, uint64_t size)
                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;
        }
 
@@ -861,21 +860,6 @@ struct mp4 *mp4_open_read(const struct mp4_callback *cb)
        return f;
 }
 
-static int32_t tag_delete(struct mp4_metadata *meta)
-{
-       uint32_t i;
-
-       for (i = 0; i < meta->count; i++) {
-               free(meta->tags[i].item);
-               free(meta->tags[i].value);
-       }
-       free(meta->tags);
-       meta->tags = NULL;
-       meta->count = 0;
-
-       return 0;
-}
-
 void mp4_close(struct mp4 *f)
 {
        int32_t i;
@@ -892,8 +876,11 @@ void mp4_close(struct mp4 *f)
                        free(f->track[i]);
                }
        }
-
-       tag_delete(&(f->meta));
+       for (i = 0; i < f->meta.count; i++) {
+               free(f->meta.tags[i].item);
+               free(f->meta.tags[i].value);
+       }
+       free(f->meta.tags);
        free(f);
 }
 
@@ -1203,50 +1190,22 @@ static unsigned membuffer_write_int32(struct membuffer *buf, uint32_t data)
        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)
@@ -1277,6 +1236,27 @@ static void *membuffer_detach(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)
 {
@@ -1393,8 +1373,7 @@ static uint32_t fix_byte_order_32(uint32_t src)
        return read_u32_be(&src);
 }
 
-static uint32_t modify_moov(struct mp4 *f, void **out_buffer,
-               uint32_t *out_size)
+static void *modify_moov(struct mp4 *f, uint32_t *out_size)
 {
        uint64_t total_base = f->moov_offset + 8;
        uint32_t total_size = (uint32_t) (f->moov_size - 8);
@@ -1403,7 +1382,7 @@ static uint32_t modify_moov(struct mp4 *f, void **out_buffer,
        uint32_t udta_size, meta_size, ilst_size;
 
        uint32_t new_ilst_size;
-       void *new_ilst_buffer;
+       void *new_ilst_buffer, *out_buffer;
 
        uint8_t *p_out;
        int32_t size_delta;
@@ -1413,7 +1392,7 @@ static uint32_t modify_moov(struct mp4 *f, void **out_buffer,
                void *new_udta_buffer;
                uint32_t new_udta_size;
                if (!create_udta(&f->meta, &new_udta_buffer, &new_udta_size))
-                       return 0;
+                       return NULL;
 
                buf = membuffer_create();
                set_position(f, total_base);
@@ -1425,87 +1404,77 @@ static uint32_t modify_moov(struct mp4 *f, void **out_buffer,
                free(new_udta_buffer);
 
                *out_size = membuffer_get_size(buf);
-               *out_buffer = membuffer_detach(buf);
+               out_buffer = membuffer_detach(buf);
                membuffer_free(buf);
-               return 1;
-       } else {
-               udta_offset = get_position(f);
-               udta_size = read_int32(f);
-               if (!find_atom_v2 (f, udta_offset + 8, udta_size - 8, "meta", 4, "ilst")) {
-                       struct membuffer *buf;
-                       void *new_meta_buffer;
-                       uint32_t new_meta_size;
-
-                       if (!create_meta(&f->meta, &new_meta_buffer, &new_meta_size))
-                               return 0;
-
-                       buf = membuffer_create();
-                       set_position(f, total_base);
-                       membuffer_transfer_from_file(buf, f,
-                               (uint32_t)(udta_offset - total_base));
-
-                       membuffer_write_int32(buf, udta_size + 8 + new_meta_size);
-                       membuffer_write_atom_name(buf, "udta");
-                       membuffer_transfer_from_file(buf, f, udta_size);
-
-                       membuffer_write_atom(buf, "meta", new_meta_size,
-                               new_meta_buffer);
-                       free(new_meta_buffer);
-
-                       *out_size = membuffer_get_size(buf);
-                       *out_buffer = membuffer_detach(buf);
-                       membuffer_free(buf);
-                       return 1;
-               }
-               meta_offset = get_position(f);
-               meta_size = read_int32(f);
-               if (!find_atom(f, meta_offset + 12, meta_size - 12, "ilst"))
-                       return 0;       //shouldn't happen, find_atom_v2 above takes care of it
-               ilst_offset = get_position(f);
-               ilst_size = read_int32(f);
+               return out_buffer;
+       }
+       udta_offset = get_position(f);
+       udta_size = read_int32(f);
+       if (!find_atom_v2 (f, udta_offset + 8, udta_size - 8, "meta", 4, "ilst")) {
+               struct membuffer *buf;
+               void *new_meta_buffer;
+               uint32_t new_meta_size;
 
-               if (!create_ilst(&f->meta, &new_ilst_buffer, &new_ilst_size))
-                       return 0;
+               if (!create_meta(&f->meta, &new_meta_buffer, &new_meta_size))
+                       return NULL;
 
-               size_delta = new_ilst_size - (ilst_size - 8);
+               buf = membuffer_create();
+               set_position(f, total_base);
+               membuffer_transfer_from_file(buf, f,
+                       (uint32_t)(udta_offset - total_base));
 
-               *out_size = total_size + size_delta;
-               *out_buffer = para_malloc(*out_size);
-               p_out = (uint8_t *) * out_buffer;
+               membuffer_write_int32(buf, udta_size + 8 + new_meta_size);
+               membuffer_write_atom_name(buf, "udta");
+               membuffer_transfer_from_file(buf, f, udta_size);
 
-               set_position(f, total_base);
-               read_data(f, p_out,
-                               (uint32_t) (udta_offset - total_base));
-               p_out += (uint32_t) (udta_offset - total_base);
-               *(uint32_t *) p_out = fix_byte_order_32(read_int32(f) + size_delta);
-               p_out += 4;
-               read_data(f, p_out, 4);
-               p_out += 4;
-               read_data(f, p_out,
-                               (uint32_t) (meta_offset - udta_offset - 8));
-               p_out += (uint32_t) (meta_offset - udta_offset - 8);
-               *(uint32_t *) p_out = fix_byte_order_32(read_int32(f) + size_delta);
-               p_out += 4;
-               read_data(f, p_out, 4);
-               p_out += 4;
-               read_data(f, p_out,
-                               (uint32_t) (ilst_offset - meta_offset - 8));
-               p_out += (uint32_t) (ilst_offset - meta_offset - 8);
-               *(uint32_t *) p_out = fix_byte_order_32(read_int32(f) + size_delta);
-               p_out += 4;
-               read_data(f, p_out, 4);
-               p_out += 4;
-
-               memcpy(p_out, new_ilst_buffer, new_ilst_size);
-               p_out += new_ilst_size;
-
-               set_position(f, ilst_offset + ilst_size);
-               read_data(f, p_out, (uint32_t) (total_size
-                       - (ilst_offset - total_base) - ilst_size));
-
-               free(new_ilst_buffer);
+               membuffer_write_atom(buf, "meta", new_meta_size,
+                       new_meta_buffer);
+               free(new_meta_buffer);
+
+               *out_size = membuffer_get_size(buf);
+               out_buffer = membuffer_detach(buf);
+               membuffer_free(buf);
+               return out_buffer;
        }
-       return 1;
+       meta_offset = get_position(f);
+       meta_size = read_int32(f);
+       /* shouldn't happen, find_atom_v2 above takes care of it */
+       if (!find_atom(f, meta_offset + 12, meta_size - 12, "ilst"))
+               return NULL;
+       ilst_offset = get_position(f);
+       ilst_size = read_int32(f);
+       if (!create_ilst(&f->meta, &new_ilst_buffer, &new_ilst_size))
+               return NULL;
+       size_delta = new_ilst_size - (ilst_size - 8);
+       *out_size = total_size + size_delta;
+       out_buffer = para_malloc(*out_size);
+       p_out = out_buffer;
+       set_position(f, total_base);
+       read_data(f, p_out, (uint32_t) (udta_offset - total_base));
+       p_out += (uint32_t) (udta_offset - total_base);
+       *(uint32_t *)p_out = fix_byte_order_32(read_int32(f) + size_delta);
+       p_out += 4;
+       read_data(f, p_out, 4);
+       p_out += 4;
+       read_data(f, p_out, (uint32_t) (meta_offset - udta_offset - 8));
+       p_out += (uint32_t) (meta_offset - udta_offset - 8);
+       *(uint32_t *)p_out = fix_byte_order_32(read_int32(f) + size_delta);
+       p_out += 4;
+       read_data(f, p_out, 4);
+       p_out += 4;
+       read_data(f, p_out, (uint32_t) (ilst_offset - meta_offset - 8));
+       p_out += (uint32_t) (ilst_offset - meta_offset - 8);
+       *(uint32_t *)p_out = fix_byte_order_32(read_int32(f) + size_delta);
+       p_out += 4;
+       read_data(f, p_out, 4);
+       p_out += 4;
+       memcpy(p_out, new_ilst_buffer, new_ilst_size);
+       p_out += new_ilst_size;
+       set_position(f, ilst_offset + ilst_size);
+       read_data(f, p_out, (uint32_t) (total_size
+               - (ilst_offset - total_base) - ilst_size));
+       free(new_ilst_buffer);
+       return out_buffer;
 }
 
 static int32_t write_data(struct mp4 *f, void *data, uint32_t size)
@@ -1532,7 +1501,8 @@ int32_t mp4_meta_update(struct mp4 *f)
        uint32_t new_moov_size;
 
        set_position(f, 0);
-       if (!modify_moov(f, &new_moov_data, &new_moov_size)) {
+       new_moov_data = modify_moov(f, &new_moov_size);
+       if (!new_moov_data ) {
                mp4_close(f);
                return 0;
        }