]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - mp4.h
client: Fix memory leak on exit.
[paraslash.git] / mp4.h
diff --git a/mp4.h b/mp4.h
index 8cd08ccfe1c03f80a439aa70399861b2b5c21821..c36a1f81db84bbe8c0f6a800f74a75f36cc2d93b 100644 (file)
--- a/mp4.h
+++ b/mp4.h
@@ -1,44 +1,87 @@
-struct mp4ff_callback {
-    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;
-};
+/** \file mp4.h Public API of the mp4 parser. */
 
-struct mp4ff_tag {
-    char *item;
-    char *value;
-    uint32_t len;
+/**
+ * Callbacks provided by the user of the mp4 parsing API.
+ *
+ * A pointer to this structure is passed to the two public open functions. If
+ * the file is opened in read-only mode, the ->write() and ->truncate() methods
+ * won't be called and may thus be NULL. The ->read() and ->seek() methods
+ * must be supplied for either open type.
+ *
+ * All methods are supposed to work like their corresponding system calls.
+ * That is, they should return non-negative for success and -1 on failure. In
+ * the error case errno is expected to be set accordingly.
+ *
+ * \sa \ref mp4_open(), \ref mp4_open_meta().
+ */
+struct mp4_callback {
+       /** This pointer is propagated to each call of all methods. */
+       void *user_data;
+       /**
+        * This should return the number of bytes read on success. Short reads
+        * are OK: the function may return less than length.
+        */
+       ssize_t (*read)(void *user_data, void *buffer, size_t length);
+       /**
+        * This method is assumed to succeed. The implementation should simply
+        * abort on errors. Note that offsets beyond EOF must not be regarded
+        * as invalid arguments.
+        */
+       off_t (*seek)(void *user_data, off_t offset, int whence);
+       /**
+        * Like the write() system call, this should return the number of bytes
+        * written. Short writes are OK: the function may return less than
+        * count.
+        */
+       ssize_t (*write)(void *user_data, void *buffer, size_t count);
+       /**
+        * Unlike the truncate system call, this function does not receive an
+        * offset. The method is expected to truncate the file to the offset
+        * given by the current file position instead.
+        */
+       int (*truncate)(void *user_data);
 };
 
-struct mp4ff_metadata {
-    struct mp4ff_tag *tags;
-    uint32_t count;
+/** Specifies one metadata tag. Both fields are 0-terminated strings. */
+struct mp4_tag {
+       /** The item name: "artist", "title", "album", "comment", or "date". */
+       char *item;
+       /** An arbitrary string value. */
+       char *value;
 };
 
-struct mp4ff; /* opaque */
-
-void mp4ff_set_sample_position(struct mp4ff *f, int32_t track, int32_t sample);
-int32_t mp4ff_total_tracks(const struct mp4ff *f);
-void mp4ff_get_decoder_config(const struct mp4ff *f, int track,
-               unsigned char** ppBuf, unsigned int* pBufSize);
-struct mp4ff *mp4ff_open_read(struct mp4ff_callback *f);
-void mp4ff_close(struct mp4ff *f);
-int32_t mp4ff_get_sample_size(const struct mp4ff *f, int track, int sample);
-uint32_t mp4ff_get_sample_rate(const struct mp4ff *f, int32_t track);
-uint32_t mp4ff_get_channel_count(const struct mp4ff * f, int32_t track);
-int32_t mp4ff_num_samples(const struct mp4ff *f, int track);
-struct mp4ff *mp4ff_open_read_metaonly(struct mp4ff_callback *f);
+/**
+ * An array of name/value pairs.
+ *
+ * This structure is initialized when the mp4 file is opened in either mode.
+ * If the file contains metadata items other than the standard five, those
+ * non-standard items are not included in the array. After a successful open, a
+ * pointer to the metadata structure can be obtained via \ref mp4_get_meta().
+ */
+struct mp4_metadata {
+       /** It's OK to change this, for example by calling realloc(). */
+       struct mp4_tag *tags;
+       /** The number of entries of the array. */
+       unsigned count;
+};
 
-int mp4ff_meta_get_by_index(const struct mp4ff *f, unsigned int index,
-                            char **item, char **value);
-int32_t mp4ff_meta_update(struct mp4ff_callback *f,const struct mp4ff_metadata * data);
+/**
+ * The mp4 file handle.
+ *
+ * A pointer to this opaque structure is returned by the two open functions.
+ * All other functions of the mp4 API receive a pointer of this type.
+ */
+struct mp4;
 
-int mp4ff_meta_get_num_items(const struct mp4ff *f);
-int mp4ff_meta_get_artist(const struct mp4ff *f, char **value);
-int mp4ff_meta_get_title(const struct mp4ff *f, char **value);
-int mp4ff_meta_get_date(const struct mp4ff *f, char **value);
-int mp4ff_meta_get_album(const struct mp4ff *f, char **value);
-int mp4ff_meta_get_comment(const struct mp4ff *f, char **value);
+int mp4_set_sample_position(struct mp4 *f, uint32_t sample);
+int mp4_open(const struct mp4_callback *cb, struct mp4 **result);
+void mp4_close(struct mp4 *f);
+int mp4_get_sample_size(const struct mp4 *f, uint32_t sample, uint32_t *result);
+uint16_t mp4_get_sample_rate(const struct mp4 *f);
+uint16_t mp4_get_channel_count(const struct mp4 *f);
+uint32_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_update_meta(struct mp4 *f);
+__malloc char *mp4_get_tag_value(const struct mp4 *f, const char *item);