]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - mp4.h
mp4: Implement error checking for the write path.
[paraslash.git] / mp4.h
diff --git a/mp4.h b/mp4.h
index 92c995c14b0671bd59f0f5a0f73f6ad2de626580..30a609f38c108d0306ccc18ea68596cf64647c96 100644 (file)
--- a/mp4.h
+++ b/mp4.h
-typedef struct
-{
-    uint32_t (*read)(void *user_data, void *buffer, uint32_t length);
-    uint32_t (*write)(void *udata, void *buffer, uint32_t length);
-    uint32_t (*seek)(void *user_data, uint64_t position);
-    uint32_t (*truncate)(void *user_data);
-    void *user_data;
-    uint32_t read_error;
-} mp4ff_callback_t;
-
-typedef struct
-{
-    int32_t type;
-    int32_t channelCount;
-    int32_t sampleSize;
-    uint16_t sampleRate;
-    int32_t audioType;
-
-    /* stsd */
-    int32_t stsd_entry_count;
-
-    /* stsz */
-    int32_t stsz_sample_size;
-    int32_t stsz_sample_count;
-    int32_t *stsz_table;
-
-    /* stts */
-    int32_t stts_entry_count;
-    int32_t *stts_sample_count;
-    int32_t *stts_sample_delta;
-
-    /* stsc */
-    int32_t stsc_entry_count;
-    int32_t *stsc_first_chunk;
-    int32_t *stsc_samples_per_chunk;
-    int32_t *stsc_sample_desc_index;
-
-    /* stsc */
-    int32_t stco_entry_count;
-    int32_t *stco_chunk_offset;
-
-    /* ctts */
-    int32_t ctts_entry_count;
-    int32_t *ctts_sample_count;
-    int32_t *ctts_sample_offset;
-
-    /* esde */
-    uint8_t *decoderConfig;
-    int32_t decoderConfigLen;
-
-    uint32_t maxBitrate;
-    uint32_t avgBitrate;
-
-    uint32_t timeScale;
-    uint64_t duration;
-
-} mp4ff_track_t;
-
-#define MAX_TRACKS 1024
-
-typedef struct
-{
+struct mp4_callback {
+       ssize_t (*read)(void *user_data, void *buffer, size_t length);
+       ssize_t (*write)(void *user_data, void *buffer, size_t count);
+       uint32_t (*seek)(void *user_data, uint64_t position);
+       uint32_t (*truncate)(void *user_data);
+       void *user_data;
+};
+
+struct mp4_tag {
     char *item;
     char *value;
     uint32_t len;
-} mp4ff_tag_t;
+};
 
-typedef struct
-{
-    mp4ff_tag_t *tags;
+struct mp4_metadata {
+    struct mp4_tag *tags;
     uint32_t count;
-} mp4ff_metadata_t;
-
-/* mp4 main file structure */
-typedef struct
-{
-    /* stream to read from */
-    mp4ff_callback_t *stream;
-    int64_t current_position;
-
-    int32_t moov_read;
-    uint64_t moov_offset;
-    uint64_t moov_size;
-    uint8_t last_atom;
-    uint64_t file_size;
-    uint32_t error;
-
-    /* mvhd */
-    int32_t time_scale;
-    int32_t duration;
-
-    /* incremental track index while reading the file */
-    int32_t total_tracks;
-
-    /* track data */
-    mp4ff_track_t *track[MAX_TRACKS];
-
-    /* metadata */
-    mp4ff_metadata_t tags;
-} mp4ff_t;
-
-int32_t mp4ff_total_tracks(const mp4ff_t *f);
-void mp4ff_get_decoder_config(const mp4ff_t *f, const int track,
-               unsigned char** ppBuf, unsigned int* pBufSize);
-mp4ff_t *mp4ff_open_read(mp4ff_callback_t *f);
-void mp4ff_close(mp4ff_t *f);
-int32_t mp4ff_read_sample_getsize(mp4ff_t *f, const int track, const int sample);
-uint32_t mp4ff_get_sample_rate(const mp4ff_t *f, const int32_t track);
-uint32_t mp4ff_get_channel_count(const mp4ff_t * f,const int32_t track);
-int32_t mp4ff_num_samples(const mp4ff_t *f, const int track);
-mp4ff_t *mp4ff_open_read_metaonly(mp4ff_callback_t *f);
-
-int mp4ff_meta_get_by_index(const mp4ff_t *f, unsigned int index,
-                            char **item, char **value);
-int32_t mp4ff_meta_update(mp4ff_callback_t *f,const mp4ff_metadata_t * data);
-
-int mp4ff_meta_get_num_items(const mp4ff_t *f);
-int mp4ff_meta_get_artist(const mp4ff_t *f, char **value);
-int mp4ff_meta_get_title(const mp4ff_t *f, char **value);
-int mp4ff_meta_get_date(const mp4ff_t *f, char **value);
-int mp4ff_meta_get_album(const mp4ff_t *f, char **value);
-int mp4ff_meta_get_comment(const mp4ff_t *f, char **value);
+};
+
+struct mp4; /* opaque */
+
+int mp4_set_sample_position(struct mp4 *f, int32_t sample);
+int mp4_open_read(const struct mp4_callback *cb, struct mp4 **result);
+void mp4_close(struct mp4 *f);
+int32_t mp4_get_sample_size(const struct mp4 *f, int sample);
+uint32_t mp4_get_sample_rate(const struct mp4 *f);
+uint32_t mp4_get_channel_count(const struct mp4 * f);
+int32_t mp4_num_samples(const struct mp4 *f);
+uint64_t mp4_get_duration(const struct mp4 *f);
+int mp4_open_meta(const struct mp4_callback *cb, struct mp4 **result);
+struct mp4_metadata *mp4_get_meta(struct mp4 *f);
+int mp4_meta_update(struct mp4 *f);
+char *mp4_meta_get_artist(const struct mp4 *f);
+char *mp4_meta_get_title(const struct mp4 *f);
+char *mp4_meta_get_date(const struct mp4 *f);
+char *mp4_meta_get_album(const struct mp4 *f);
+char *mp4_meta_get_comment(const struct mp4 *f);