X-Git-Url: http://git.tuebingen.mpg.de/?a=blobdiff_plain;f=mp4.c;h=7085e95918b626eb917269c3389db8bb77161130;hb=7f29c8effd9e1e534176d453b37e507e0600d7e7;hp=3167a132b1b6ca7a230d37df8c49f1c9abc9a12b;hpb=dab576cb940f48319befac01f67f611f0acabe35;p=paraslash.git diff --git a/mp4.c b/mp4.c index 3167a132..7085e959 100644 --- 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); } @@ -1206,24 +1193,19 @@ static unsigned membuffer_write_int32(struct membuffer *buf, uint32_t data) 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) @@ -1314,12 +1296,7 @@ static void *membuffer_get_ptr(const struct membuffer *buf) return buf->data; } -static void membuffer_set_error(struct membuffer *buf) -{ - buf->error = 1; -} - -static unsigned membuffer_transfer_from_file(struct membuffer *buf, struct mp4 *src, +static bool membuffer_transfer_from_file(struct membuffer *buf, struct mp4 *src, unsigned bytes) { unsigned oldsize; @@ -1327,19 +1304,18 @@ static unsigned membuffer_transfer_from_file(struct membuffer *buf, struct mp4 * oldsize = membuffer_get_size(buf); if (membuffer_write(buf, 0, bytes) != bytes) - return 0; + return false; bufptr = membuffer_get_ptr(buf); if (bufptr == 0) - return 0; + return false; if ((unsigned)read_data(src, (char *) bufptr + oldsize, bytes) != bytes) { - membuffer_set_error(buf); - return 0; + membuffer_free(buf); + return false; } - - return bytes; + return true; } static uint32_t create_meta(const struct mp4_metadata *meta, void **out_buffer, @@ -1391,8 +1367,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); @@ -1401,7 +1376,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; @@ -1411,99 +1386,97 @@ 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); - membuffer_transfer_from_file(buf, f, total_size); - + if (!membuffer_transfer_from_file(buf, f, total_size)) { + free(new_udta_buffer); + return NULL; + } membuffer_write_atom(buf, "udta", new_udta_size, new_udta_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); + 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; - *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_meta(&f->meta, &new_meta_buffer, &new_meta_size)) + return NULL; - if (!create_ilst(&f->meta, &new_ilst_buffer, &new_ilst_size)) - return 0; + buf = membuffer_create(); + set_position(f, total_base); + if (!membuffer_transfer_from_file(buf, f, + udta_offset - total_base)) { + free(new_meta_buffer); + return NULL; + } - size_delta = new_ilst_size - (ilst_size - 8); + membuffer_write_int32(buf, udta_size + 8 + new_meta_size); + membuffer_write_atom_name(buf, "udta"); + if (!membuffer_transfer_from_file(buf, f, udta_size)) { + free(new_meta_buffer); + return NULL; + } - *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 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) @@ -1530,7 +1503,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; }