1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
/** \file mp4.h Public API of the mp4 parser. */
/**
* 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);
};
/** 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;
};
/**
* 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;
};
/**
* 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 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);
|