]>
Commit | Line | Data |
---|---|---|
48e2f01c | 1 | /* |
2 | * Copyright (C) 2013 nu774 | |
3 | * For conditions of distribution and use, see copyright notice in COPYING | |
4 | */ | |
5 | #ifndef M4AF_H | |
6 | #define M4AF_H | |
7 | ||
8 | #define M4AF_FOURCC(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d)) | |
9 | ||
10 | enum m4af_error_code { | |
e4bbeeb0 | 11 | M4AF_IO_ERROR = -1, |
12 | M4AF_NO_MEMORY = -2, | |
13 | M4AF_FORMAT_ERROR = -3, | |
14 | M4AF_NOT_SUPPORTED = -4, | |
48e2f01c | 15 | }; |
16 | ||
17 | enum m4af_itmf_tag { | |
18 | M4AF_TAG_TITLE = M4AF_FOURCC('\xa9','n','a','m'), | |
19 | M4AF_TAG_ARTIST = M4AF_FOURCC('\xa9','A','R','T'), | |
20 | M4AF_TAG_ALBUM = M4AF_FOURCC('\xa9','a','l','b'), | |
21 | M4AF_TAG_GENRE = M4AF_FOURCC('\xa9','g','e','n'), | |
22 | M4AF_TAG_DATE = M4AF_FOURCC('\xa9','d','a','y'), | |
23 | M4AF_TAG_COMPOSER = M4AF_FOURCC('\xa9','w','r','t'), | |
24 | M4AF_TAG_GROUPING = M4AF_FOURCC('\xa9','g','r','p'), | |
25 | M4AF_TAG_COMMENT = M4AF_FOURCC('\xa9','c','m','t'), | |
26 | M4AF_TAG_LYRICS = M4AF_FOURCC('\xa9','l','y','r'), | |
27 | M4AF_TAG_TOOL = M4AF_FOURCC('\xa9','t','o','o'), | |
28 | M4AF_TAG_ALBUM_ARTIST = M4AF_FOURCC('a','A','R','T'), | |
29 | M4AF_TAG_TRACK = M4AF_FOURCC('t','r','k','n'), | |
30 | M4AF_TAG_DISK = M4AF_FOURCC('d','i','s','k'), | |
31 | M4AF_TAG_GENRE_ID3 = M4AF_FOURCC('g','n','r','e'), | |
32 | M4AF_TAG_TEMPO = M4AF_FOURCC('t','m','p','o'), | |
33 | M4AF_TAG_DESCRIPTION = M4AF_FOURCC('d','e','s','c'), | |
34 | M4AF_TAG_LONG_DESCRIPTION = M4AF_FOURCC('l','d','e','s'), | |
35 | M4AF_TAG_COPYRIGHT = M4AF_FOURCC('c','p','r','t'), | |
36 | M4AF_TAG_COMPILATION = M4AF_FOURCC('c','p','i','l'), | |
37 | M4AF_TAG_ARTWORK = M4AF_FOURCC('c','o','v','r'), | |
38 | }; | |
39 | ||
40 | enum m4af_itmf_type_code { | |
41 | M4AF_IMPLICIT = 0, | |
42 | M4AF_UTF8 = 1, | |
43 | M4AF_GIF = 12, | |
44 | M4AF_JPEG = 13, | |
45 | M4AF_PNG = 14, | |
46 | M4AF_INTEGER = 21, | |
47 | }; | |
48 | ||
49 | enum m4af_codec_type { | |
50 | M4AF_CODEC_MP4A = M4AF_FOURCC('m','p','4','a'), | |
51 | M4AF_CODEC_ALAC = M4AF_FOURCC('a','l','a','c'), | |
52 | M4AF_CODEC_TEXT = M4AF_FOURCC('t','e','x','t'), | |
53 | }; | |
54 | ||
e4bbeeb0 | 55 | typedef int (*m4af_read_callback)(void *cookie, void *buffer, uint32_t size); |
48e2f01c | 56 | typedef int (*m4af_write_callback)(void *cookie, const void *data, |
57 | uint32_t size); | |
58 | typedef int (*m4af_seek_callback)(void *cookie, int64_t off, int whence); | |
59 | typedef int64_t (*m4af_tell_callback)(void *cookie); | |
60 | ||
61 | typedef struct m4af_io_callbacks_t { | |
e4bbeeb0 | 62 | m4af_read_callback read; |
48e2f01c | 63 | m4af_write_callback write; |
64 | m4af_seek_callback seek; | |
65 | m4af_tell_callback tell; | |
66 | } m4af_io_callbacks_t; | |
67 | ||
e4bbeeb0 | 68 | typedef struct m4af_itmf_entry_t { |
69 | uint32_t fcc; | |
70 | char *name; | |
71 | uint32_t type_code; | |
72 | char *data; | |
73 | uint32_t data_size; | |
74 | } m4af_itmf_entry_t; | |
48e2f01c | 75 | |
e4bbeeb0 | 76 | typedef struct m4af_ctx_t m4af_ctx_t; |
48e2f01c | 77 | |
48e2f01c | 78 | |
e4bbeeb0 | 79 | m4af_ctx_t *m4af_create(uint32_t codec, uint32_t timescale, |
80 | m4af_io_callbacks_t *io, void *io_cookie); | |
48e2f01c | 81 | |
e4bbeeb0 | 82 | int m4af_begin_write(m4af_ctx_t *ctx); |
48e2f01c | 83 | |
e4bbeeb0 | 84 | int m4af_finalize(m4af_ctx_t *ctx); |
48e2f01c | 85 | |
e4bbeeb0 | 86 | void m4af_teardown(m4af_ctx_t **ctx); |
48e2f01c | 87 | |
e4bbeeb0 | 88 | int m4af_write_sample(m4af_ctx_t *ctx, uint32_t track_idx, const void *data, |
89 | uint32_t size, uint32_t duration); | |
48e2f01c | 90 | |
e4bbeeb0 | 91 | int m4af_set_decoder_specific_info(m4af_ctx_t *ctx, uint32_t track_idx, |
92 | uint8_t *data, uint32_t size); | |
48e2f01c | 93 | |
e4bbeeb0 | 94 | void m4af_set_priming(m4af_ctx_t *ctx, uint32_t track_idx, |
48e2f01c | 95 | uint32_t encoder_delay, uint32_t padding); |
96 | ||
e4bbeeb0 | 97 | void m4af_set_fixed_frame_duration(m4af_ctx_t *ctx, uint32_t track_idx, |
98 | uint32_t length); | |
48e2f01c | 99 | |
e4bbeeb0 | 100 | int m4af_add_itmf_long_tag(m4af_ctx_t *ctx, const char *name, |
101 | const char *data); | |
48e2f01c | 102 | |
e4bbeeb0 | 103 | int m4af_add_itmf_short_tag(m4af_ctx_t *ctx, uint32_t fcc, uint32_t type_code, |
104 | const void *data, uint32_t data_size); | |
48e2f01c | 105 | |
e4bbeeb0 | 106 | int m4af_add_itmf_string_tag(m4af_ctx_t *ctx, uint32_t fcc, const char *data); |
48e2f01c | 107 | |
e4bbeeb0 | 108 | int m4af_add_itmf_int8_tag(m4af_ctx_t *ctx, uint32_t fcc, int value); |
48e2f01c | 109 | |
e4bbeeb0 | 110 | int m4af_add_itmf_int16_tag(m4af_ctx_t *ctx, uint32_t fcc, int value); |
c5c45908 | 111 | |
e4bbeeb0 | 112 | int m4af_add_itmf_int32_tag(m4af_ctx_t *ctx, uint32_t fcc, uint32_t value); |
48e2f01c | 113 | |
e4bbeeb0 | 114 | int m4af_add_itmf_int64_tag(m4af_ctx_t *ctx, uint32_t fcc, uint64_t value); |
48e2f01c | 115 | |
e4bbeeb0 | 116 | int m4af_add_itmf_track_tag(m4af_ctx_t *ctx, int track, int total); |
48e2f01c | 117 | |
e4bbeeb0 | 118 | int m4af_add_itmf_disk_tag(m4af_ctx_t *ctx, int disk, int total); |
48e2f01c | 119 | |
e4bbeeb0 | 120 | int m4af_add_itmf_genre_tag(m4af_ctx_t *ctx, int genre); |
48e2f01c | 121 | #endif |