return out_buffer;
}
-static int32_t write_data(struct mp4 *f, void *data, uint32_t size)
+static int write_data(struct mp4 *f, void *data, size_t size)
{
- int32_t result = 1;
-
- result = f->cb->write(f->cb->user_data, data, size);
-
- f->current_position += size;
-
- return result;
+ while (size > 0) {
+ ssize_t ret = f->cb->write(f->cb->user_data, data, size);
+ if (ret < 0) {
+ if (errno == EINTR)
+ continue;
+ return -ERRNO_TO_PARA_ERROR(errno);
+ }
+ f->current_position += ret;
+ size -= ret;
+ }
+ return 1;
}
-int32_t mp4_meta_update(struct mp4 *f)
+int mp4_meta_update(struct mp4 *f)
{
void *new_moov_data;
uint32_t new_moov_size;
- uint8_t buf[4];
+ uint8_t buf[8] = "----moov";
+ int ret;
set_position(f, 0);
new_moov_data = modify_moov(f, &new_moov_size);
}
if (f->last_atom != ATOM_MOOV) {
set_position(f, f->moov_offset + 4);
- write_data(f, "free", 4); /* rename old moov to free */
+ ret = write_data(f, "free", 4); /* rename old moov to free */
+ if (ret < 0)
+ goto free_moov;
set_position(f, f->file_size); /* write new moov atom at EOF */
} else /* overwrite old moov atom */
set_position(f, f->moov_offset);
write_u32_be(buf, new_moov_size + 8);
- write_data(f, buf, 4);
- write_data(f, "moov", 4);
- write_data(f, new_moov_data, new_moov_size);
- free(new_moov_data);
+ ret = write_data(f, buf, sizeof(buf));
+ if (ret < 0)
+ goto free_moov;
+ ret = write_data(f, new_moov_data, new_moov_size);
+ if (ret < 0)
+ goto free_moov;
f->cb->truncate(f->cb->user_data);
- return 1;
+ ret = 1;
+free_moov:
+ free(new_moov_data);
+ return ret;
}
static char *meta_find_by_name(const struct mp4 *f, const char *item)