]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - mp4.c
mp4: Reduce indentation in modify_moov().
[paraslash.git] / mp4.c
diff --git a/mp4.c b/mp4.c
index 1b935fa85bd177a7d7cabcf96e21987ebb98cd12..bec0371035f5adf1bc1afb20429852305fe1342f 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)
 {
@@ -1428,83 +1408,72 @@ static uint32_t modify_moov(struct mp4 *f, void **out_buffer,
                *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);
-
-               if (!create_ilst(&f->meta, &new_ilst_buffer, &new_ilst_size))
+       }
+       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;
 
-               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));
+
+               membuffer_write_int32(buf, udta_size + 8 + new_meta_size);
+               membuffer_write_atom_name(buf, "udta");
+               membuffer_transfer_from_file(buf, f, udta_size);
 
-               *out_size = total_size + size_delta;
-               *out_buffer = para_malloc(*out_size);
-               p_out = (uint8_t *) * out_buffer;
+               membuffer_write_atom(buf, "meta", new_meta_size,
+                       new_meta_buffer);
+               free(new_meta_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);
+               *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);
+       if (!create_ilst(&f->meta, &new_ilst_buffer, &new_ilst_size))
+               return 0;
+       size_delta = new_ilst_size - (ilst_size - 8);
+       *out_size = total_size + size_delta;
+       *out_buffer = para_malloc(*out_size);
+       p_out = (uint8_t *)*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 1;
 }