#define MAX_TRACKS 1024
struct mp4 {
- /* stream to read from */
- struct mp4_callback *stream;
+ struct mp4_callback *cb;
int64_t current_position;
uint64_t moov_offset;
{
int32_t result = 1;
- result = f->stream->read(f->stream->user_data, data, size);
+ result = f->cb->read(f->cb->user_data, data, size);
if (result < size)
f->read_error++;
static int32_t set_position(struct mp4 *f, int64_t position)
{
- f->stream->seek(f->stream->user_data, position);
+ f->cb->seek(f->cb->user_data, position);
f->current_position = position;
return 0;
return 0;
}
-struct mp4 *mp4_open_read(struct mp4_callback *f)
+struct mp4 *mp4_open_read(struct mp4_callback *cb)
{
- struct mp4 *ff = para_calloc(sizeof(struct mp4));
+ struct mp4 *f = para_calloc(sizeof(struct mp4));
- ff->stream = f;
-
- parse_atoms(ff, 0);
-
- if (ff->error) {
- free(ff);
- ff = NULL;
+ f->cb = cb;
+ parse_atoms(f, 0);
+ if (f->error) {
+ free(f);
+ f = NULL;
}
-
- return ff;
+ return f;
}
static int32_t tag_delete(struct mp4_metadata *tags)
return 0;
}
-void mp4_close(struct mp4 *ff)
+void mp4_close(struct mp4 *f)
{
int32_t i;
- for (i = 0; i < ff->total_tracks; i++) {
- if (ff->track[i]) {
- free(ff->track[i]->stsz_table);
- free(ff->track[i]->stts_sample_count);
- free(ff->track[i]->stts_sample_delta);
- free(ff->track[i]->stsc_first_chunk);
- free(ff->track[i]->stsc_samples_per_chunk);
- free(ff->track[i]->stsc_sample_desc_index);
- free(ff->track[i]->stco_chunk_offset);
- free(ff->track[i]);
+ for (i = 0; i < f->total_tracks; i++) {
+ if (f->track[i]) {
+ free(f->track[i]->stsz_table);
+ free(f->track[i]->stts_sample_count);
+ free(f->track[i]->stts_sample_delta);
+ free(f->track[i]->stsc_first_chunk);
+ free(f->track[i]->stsc_samples_per_chunk);
+ free(f->track[i]->stsc_sample_desc_index);
+ free(f->track[i]->stco_chunk_offset);
+ free(f->track[i]);
}
}
- tag_delete(&(ff->tags));
- free(ff);
+ tag_delete(&(f->tags));
+ free(f);
}
static int32_t chunk_of_sample(const struct mp4 *f, int32_t track,
return total;
}
-struct mp4 *mp4_open_meta(struct mp4_callback *f)
+struct mp4 *mp4_open_meta(struct mp4_callback *cb)
{
- struct mp4 *ff = para_calloc(sizeof(struct mp4));
-
- ff->stream = f;
+ struct mp4 *f = para_calloc(sizeof(struct mp4));
- parse_atoms(ff, 1);
-
- if (ff->error) {
- free(ff);
- ff = NULL;
+ f->cb = cb;
+ parse_atoms(f, 1);
+ if (f->error) {
+ free(f);
+ f = NULL;
}
-
- return ff;
+ return f;
}
int32_t mp4_meta_get_num_items(const struct mp4 *f)
{
int32_t result = 1;
- result = f->stream->write(f->stream->user_data, data, size);
+ result = f->cb->write(f->cb->user_data, data, size);
f->current_position += size;
return write_data(f, temp, sizeof(temp));
}
-int32_t mp4_meta_update(struct mp4_callback *f, const struct mp4_metadata *data)
+int32_t mp4_meta_update(struct mp4_callback *cb, const struct mp4_metadata *data)
{
void *new_moov_data;
uint32_t new_moov_size;
- struct mp4 *ff = para_calloc(sizeof(struct mp4));
- ff->stream = f;
- set_position(ff, 0);
-
- parse_atoms(ff, 1);
-
- if (!modify_moov(ff, data, &new_moov_data, &new_moov_size)) {
- mp4_close(ff);
+ struct mp4 *f = para_calloc(sizeof(struct mp4));
+ f->cb = cb;
+ set_position(f, 0);
+ parse_atoms(f, 1);
+ if (!modify_moov(f, data, &new_moov_data, &new_moov_size)) {
+ mp4_close(f);
return 0;
}
/* copy moov atom to end of the file */
- if (ff->last_atom != ATOM_MOOV) {
+ if (f->last_atom != ATOM_MOOV) {
char *free_data = "free";
/* rename old moov to free */
- set_position(ff, ff->moov_offset + 4);
- write_data(ff, free_data, 4);
+ set_position(f, f->moov_offset + 4);
+ write_data(f, free_data, 4);
- set_position(ff, ff->file_size);
- write_int32(ff, new_moov_size + 8);
- write_data(ff, "moov", 4);
- write_data(ff, new_moov_data, new_moov_size);
+ set_position(f, f->file_size);
+ write_int32(f, new_moov_size + 8);
+ write_data(f, "moov", 4);
+ write_data(f, new_moov_data, new_moov_size);
} else {
- set_position(ff, ff->moov_offset);
- write_int32(ff, new_moov_size + 8);
- write_data(ff, "moov", 4);
- write_data(ff, new_moov_data, new_moov_size);
+ set_position(f, f->moov_offset);
+ write_int32(f, new_moov_size + 8);
+ write_data(f, "moov", 4);
+ write_data(f, new_moov_data, new_moov_size);
}
- f->truncate(f->user_data);
- mp4_close(ff);
+ cb->truncate(cb->user_data);
+ mp4_close(f);
return 1;
}
void mp4_set_sample_position(struct mp4 *f, int32_t track, int32_t sample);
int32_t mp4_total_tracks(const struct mp4 *f);
bool mp4_is_audio_track(const struct mp4 *f, int32_t track);
-struct mp4 *mp4_open_read(struct mp4_callback *f);
+struct mp4 *mp4_open_read(struct mp4_callback *cb);
void mp4_close(struct mp4 *f);
int32_t mp4_get_sample_size(const struct mp4 *f, int track, int sample);
uint32_t mp4_get_sample_rate(const struct mp4 *f, int32_t track);
uint32_t mp4_get_channel_count(const struct mp4 * f, int32_t track);
int32_t mp4_num_samples(const struct mp4 *f, int track);
uint64_t mp4_get_duration(const struct mp4 *f, int32_t track);
-struct mp4 *mp4_open_meta(struct mp4_callback *f);
+struct mp4 *mp4_open_meta(struct mp4_callback *cb);
int mp4_meta_get_by_index(const struct mp4 *f, unsigned int index,
char **item, char **value);
-int32_t mp4_meta_update(struct mp4_callback *f,const struct mp4_metadata * data);
+int32_t mp4_meta_update(struct mp4_callback *cb, const struct mp4_metadata *data);
int mp4_meta_get_num_items(const struct mp4 *f);
int mp4_meta_get_artist(const struct mp4 *f, char **value);