2 * Copyright (C) 2013 nu774
3 * For conditions of distribution and use, see copyright notice in COPYING
8 #define M4AF_FOURCC(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
10 enum m4af_error_code
{
13 M4AF_FORMAT_ERROR
= -3,
14 M4AF_NOT_SUPPORTED
= -4,
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'),
40 enum m4af_itmf_type_code
{
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'),
55 enum m4af_priming_mode
{
56 M4AF_PRIMING_MODE_ITUNSMPB
= 1,
57 M4AF_PRIMING_MODE_EDTS
= 2,
58 M4AF_PRIMING_MODE_BOTH
= 3
61 typedef int (*m4af_read_callback
)(void *cookie
, void *buffer
, uint32_t size
);
62 typedef int (*m4af_write_callback
)(void *cookie
, const void *data
,
64 typedef int (*m4af_seek_callback
)(void *cookie
, int64_t off
, int whence
);
65 typedef int64_t (*m4af_tell_callback
)(void *cookie
);
67 typedef struct m4af_io_callbacks_t
{
68 m4af_read_callback read
;
69 m4af_write_callback write
;
70 m4af_seek_callback seek
;
71 m4af_tell_callback tell
;
72 } m4af_io_callbacks_t
;
74 typedef struct m4af_itmf_entry_t
{
82 typedef struct m4af_ctx_t m4af_ctx_t
;
85 m4af_ctx_t
*m4af_create(uint32_t codec
, uint32_t timescale
,
86 m4af_io_callbacks_t
*io
, void *io_cookie
);
88 int m4af_begin_write(m4af_ctx_t
*ctx
);
90 int m4af_finalize(m4af_ctx_t
*ctx
, int optimize
);
92 void m4af_teardown(m4af_ctx_t
**ctx
);
94 int m4af_write_sample(m4af_ctx_t
*ctx
, uint32_t track_idx
, const void *data
,
95 uint32_t size
, uint32_t duration
);
97 int m4af_set_decoder_specific_info(m4af_ctx_t
*ctx
, uint32_t track_idx
,
98 uint8_t *data
, uint32_t size
);
100 void m4af_set_vbr_mode(m4af_ctx_t
*ctx
, uint32_t track_idx
, int is_vbr
);
102 void m4af_set_priming(m4af_ctx_t
*ctx
, uint32_t track_idx
,
103 uint32_t encoder_delay
, uint32_t padding
);
105 void m4af_set_priming_mode(m4af_ctx_t
*ctx
, int mode
);
107 void m4af_set_num_channels(m4af_ctx_t
*ctx
, uint32_t track_idx
,
110 void m4af_set_fixed_frame_duration(m4af_ctx_t
*ctx
, uint32_t track_idx
,
113 int m4af_add_itmf_long_tag(m4af_ctx_t
*ctx
, const char *name
,
116 int m4af_add_itmf_short_tag(m4af_ctx_t
*ctx
, uint32_t fcc
, uint32_t type_code
,
117 const void *data
, uint32_t data_size
);
119 int m4af_add_itmf_string_tag(m4af_ctx_t
*ctx
, uint32_t fcc
, const char *data
);
121 int m4af_add_itmf_int8_tag(m4af_ctx_t
*ctx
, uint32_t fcc
, int value
);
123 int m4af_add_itmf_int16_tag(m4af_ctx_t
*ctx
, uint32_t fcc
, int value
);
125 int m4af_add_itmf_int32_tag(m4af_ctx_t
*ctx
, uint32_t fcc
, uint32_t value
);
127 int m4af_add_itmf_int64_tag(m4af_ctx_t
*ctx
, uint32_t fcc
, uint64_t value
);
129 int m4af_add_itmf_track_tag(m4af_ctx_t
*ctx
, int track
, int total
);
131 int m4af_add_itmf_disk_tag(m4af_ctx_t
*ctx
, int disk
, int total
);
133 int m4af_add_itmf_genre_tag(m4af_ctx_t
*ctx
, int genre
);