-static uint8_t mp4ff_atom_name_to_type(const int8_t a, const int8_t b,
- const int8_t c, const int8_t d)
-{
- if (a == 'm')
- {
- if (mp4ff_atom_compare(a,b,c,d, 'm','o','o','v'))
- return ATOM_MOOV;
- else if (mp4ff_atom_compare(a,b,c,d, 'm','i','n','f'))
- return ATOM_MINF;
- else if (mp4ff_atom_compare(a,b,c,d, 'm','d','i','a'))
- return ATOM_MDIA;
- else if (mp4ff_atom_compare(a,b,c,d, 'm','d','a','t'))
- return ATOM_MDAT;
- else if (mp4ff_atom_compare(a,b,c,d, 'm','d','h','d'))
- return ATOM_MDHD;
- else if (mp4ff_atom_compare(a,b,c,d, 'm','v','h','d'))
- return ATOM_MVHD;
- else if (mp4ff_atom_compare(a,b,c,d, 'm','p','4','a'))
- return ATOM_MP4A;
- else if (mp4ff_atom_compare(a,b,c,d, 'm','p','4','v'))
- return ATOM_MP4V;
- else if (mp4ff_atom_compare(a,b,c,d, 'm','p','4','s'))
- return ATOM_MP4S;
- else if (mp4ff_atom_compare(a,b,c,d, 'm','e','t','a'))
- return ATOM_META;
- } else if (a == 't') {
- if (mp4ff_atom_compare(a,b,c,d, 't','r','a','k'))
- return ATOM_TRAK;
- else if (mp4ff_atom_compare(a,b,c,d, 't','k','h','d'))
- return ATOM_TKHD;
- else if (mp4ff_atom_compare(a,b,c,d, 't','r','e','f'))
- return ATOM_TREF;
- else if (mp4ff_atom_compare(a,b,c,d, 't','r','k','n'))
- return ATOM_TRACK;
- else if (mp4ff_atom_compare(a,b,c,d, 't','m','p','o'))
- return ATOM_TEMPO;
- else if (mp4ff_atom_compare(a,b,c,d, 't','v','n','n'))
- return ATOM_NETWORK;
- else if (mp4ff_atom_compare(a,b,c,d, 't','v','s','h'))
- return ATOM_SHOW;
- else if (mp4ff_atom_compare(a,b,c,d, 't','v','e','n'))
- return ATOM_EPISODENAME;
- else if (mp4ff_atom_compare(a,b,c,d, 't','v','s','n'))
- return ATOM_SEASON;
- else if (mp4ff_atom_compare(a,b,c,d, 't','v','e','s'))
- return ATOM_EPISODE;
- } else if (a == 's') {
- if (mp4ff_atom_compare(a,b,c,d, 's','t','b','l'))
- return ATOM_STBL;
- else if (mp4ff_atom_compare(a,b,c,d, 's','m','h','d'))
- return ATOM_SMHD;
- else if (mp4ff_atom_compare(a,b,c,d, 's','t','s','d'))
- return ATOM_STSD;
- else if (mp4ff_atom_compare(a,b,c,d, 's','t','t','s'))
- return ATOM_STTS;
- else if (mp4ff_atom_compare(a,b,c,d, 's','t','c','o'))
- return ATOM_STCO;
- else if (mp4ff_atom_compare(a,b,c,d, 's','t','s','c'))
- return ATOM_STSC;
- else if (mp4ff_atom_compare(a,b,c,d, 's','t','s','z'))
- return ATOM_STSZ;
- else if (mp4ff_atom_compare(a,b,c,d, 's','t','z','2'))
- return ATOM_STZ2;
- else if (mp4ff_atom_compare(a,b,c,d, 's','k','i','p'))
- return ATOM_SKIP;
- else if (mp4ff_atom_compare(a,b,c,d, 's','i','n','f'))
- return ATOM_SINF;
- else if (mp4ff_atom_compare(a,b,c,d, 's','c','h','i'))
- return ATOM_SCHI;
- else if (mp4ff_atom_compare(a,b,c,d, 's','o','n','m'))
- return ATOM_SORTTITLE;
- else if (mp4ff_atom_compare(a,b,c,d, 's','o','a','l'))
- return ATOM_SORTALBUM;
- else if (mp4ff_atom_compare(a,b,c,d, 's','o','a','r'))
- return ATOM_SORTARTIST;
- else if (mp4ff_atom_compare(a,b,c,d, 's','o','a','a'))
- return ATOM_SORTALBUMARTIST;
- else if (mp4ff_atom_compare(a,b,c,d, 's','o','c','o'))
- return ATOM_SORTWRITER;
- else if (mp4ff_atom_compare(a,b,c,d, 's','o','s','n'))
- return ATOM_SORTSHOW;
- } else if (a == COPYRIGHT_SYMBOL) {
- if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'n','a','m'))
- return ATOM_TITLE;
- else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'A','R','T'))
- return ATOM_ARTIST;
- else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'w','r','t'))
- return ATOM_WRITER;
- else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'a','l','b'))
- return ATOM_ALBUM;
- else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'d','a','y'))
- return ATOM_DATE;
- else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'t','o','o'))
- return ATOM_TOOL;
- else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'c','m','t'))
- return ATOM_COMMENT;
- else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'g','e','n'))
- return ATOM_GENRE1;
- else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'g','r','p'))
- return ATOM_CONTENTGROUP;
- else if (mp4ff_atom_compare(a,b,c,d, COPYRIGHT_SYMBOL,'l','y','r'))
- return ATOM_LYRICS;
- }
-
- if (mp4ff_atom_compare(a,b,c,d, 'e','d','t','s'))
- return ATOM_EDTS;
- else if (mp4ff_atom_compare(a,b,c,d, 'e','s','d','s'))
- return ATOM_ESDS;
- else if (mp4ff_atom_compare(a,b,c,d, 'f','t','y','p'))
- return ATOM_FTYP;
- else if (mp4ff_atom_compare(a,b,c,d, 'f','r','e','e'))
- return ATOM_FREE;
- else if (mp4ff_atom_compare(a,b,c,d, 'h','m','h','d'))
- return ATOM_HMHD;
- else if (mp4ff_atom_compare(a,b,c,d, 'v','m','h','d'))
- return ATOM_VMHD;
- else if (mp4ff_atom_compare(a,b,c,d, 'u','d','t','a'))
- return ATOM_UDTA;
- else if (mp4ff_atom_compare(a,b,c,d, 'i','l','s','t'))
- return ATOM_ILST;
- else if (mp4ff_atom_compare(a,b,c,d, 'n','a','m','e'))
- return ATOM_NAME;
- else if (mp4ff_atom_compare(a,b,c,d, 'd','a','t','a'))
- return ATOM_DATA;
- else if (mp4ff_atom_compare(a,b,c,d, 'd','i','s','k'))
- return ATOM_DISC;
- else if (mp4ff_atom_compare(a,b,c,d, 'g','n','r','e'))
- return ATOM_GENRE2;
- else if (mp4ff_atom_compare(a,b,c,d, 'c','o','v','r'))
- return ATOM_COVER;
- else if (mp4ff_atom_compare(a,b,c,d, 'c','p','i','l'))
- return ATOM_COMPILATION;
- else if (mp4ff_atom_compare(a,b,c,d, 'c','t','t','s'))
- return ATOM_CTTS;
- else if (mp4ff_atom_compare(a,b,c,d, 'd','r','m','s'))
- return ATOM_DRMS;
- else if (mp4ff_atom_compare(a,b,c,d, 'f','r','m','a'))
- return ATOM_FRMA;
- else if (mp4ff_atom_compare(a,b,c,d, 'p','r','i','v'))
- return ATOM_PRIV;
- else if (mp4ff_atom_compare(a,b,c,d, 'i','v','i','v'))
- return ATOM_IVIV;
- else if (mp4ff_atom_compare(a,b,c,d, 'u','s','e','r'))
- return ATOM_USER;
- else if (mp4ff_atom_compare(a,b,c,d, 'k','e','y',' '))
- return ATOM_KEY;
- else if (mp4ff_atom_compare(a,b,c,d, 'a','A','R','T'))
- return ATOM_ALBUM_ARTIST;
- else if (mp4ff_atom_compare(a,b,c,d, 'd','e','s','c'))
- return ATOM_DESCRIPTION;
- else if (mp4ff_atom_compare(a,b,c,d, 'p','c','s','t'))
- return ATOM_PODCAST;
- else
- return ATOM_UNKNOWN;
-}
-
-/* read atom header, return atom size, atom size is with header included */
-uint64_t mp4ff_atom_read_header(mp4ff_t *f, uint8_t *atom_type, uint8_t *header_size)
-{
- uint64_t size;
- int32_t ret;
- int8_t atom_header[8];
-
- ret = mp4ff_read_data(f, atom_header, 8);
- if (ret != 8)
- return 0;
-
- size = mp4ff_atom_get_size(atom_header);
- *header_size = 8;
-
- /* check for 64 bit atom size */
- if (size == 1)
- {
- *header_size = 16;
- size = mp4ff_read_int64(f);
- }
-
- //printf("%c%c%c%c\n", atom_header[4], atom_header[5], atom_header[6], atom_header[7]);
-
- *atom_type = mp4ff_atom_name_to_type(atom_header[4], atom_header[5], atom_header[6], atom_header[7]);
-
- return size;
-}
-
-int64_t mp4ff_position(const mp4ff_t *f)
-{
- return f->current_position;
+static uint8_t atom_name_to_type(int8_t a, int8_t b, int8_t c, int8_t d)
+{
+ if (a == 'm') {
+ if (atom_compare(a, b, c, d, 'm', 'o', 'o', 'v'))
+ return ATOM_MOOV;
+ else if (atom_compare(a, b, c, d, 'm', 'i', 'n', 'f'))
+ return ATOM_MINF;
+ else if (atom_compare(a, b, c, d, 'm', 'd', 'i', 'a'))
+ return ATOM_MDIA;
+ else if (atom_compare(a, b, c, d, 'm', 'd', 'a', 't'))
+ return ATOM_MDAT;
+ else if (atom_compare(a, b, c, d, 'm', 'd', 'h', 'd'))
+ return ATOM_MDHD;
+ else if (atom_compare(a, b, c, d, 'm', 'v', 'h', 'd'))
+ return ATOM_MVHD;
+ else if (atom_compare(a, b, c, d, 'm', 'p', '4', 'a'))
+ return ATOM_MP4A;
+ else if (atom_compare(a, b, c, d, 'm', 'p', '4', 'v'))
+ return ATOM_MP4V;
+ else if (atom_compare(a, b, c, d, 'm', 'p', '4', 's'))
+ return ATOM_MP4S;
+ else if (atom_compare(a, b, c, d, 'm', 'e', 't', 'a'))
+ return ATOM_META;
+ } else if (a == 't') {
+ if (atom_compare(a, b, c, d, 't', 'r', 'a', 'k'))
+ return ATOM_TRAK;
+ else if (atom_compare(a, b, c, d, 't', 'k', 'h', 'd'))
+ return ATOM_TKHD;
+ else if (atom_compare(a, b, c, d, 't', 'r', 'e', 'f'))
+ return ATOM_TREF;
+ else if (atom_compare(a, b, c, d, 't', 'r', 'k', 'n'))
+ return ATOM_TRACK;
+ else if (atom_compare(a, b, c, d, 't', 'm', 'p', 'o'))
+ return ATOM_TEMPO;
+ else if (atom_compare(a, b, c, d, 't', 'v', 'n', 'n'))
+ return ATOM_NETWORK;
+ else if (atom_compare(a, b, c, d, 't', 'v', 's', 'h'))
+ return ATOM_SHOW;
+ else if (atom_compare(a, b, c, d, 't', 'v', 'e', 'n'))
+ return ATOM_EPISODENAME;
+ else if (atom_compare(a, b, c, d, 't', 'v', 's', 'n'))
+ return ATOM_SEASON;
+ else if (atom_compare(a, b, c, d, 't', 'v', 'e', 's'))
+ return ATOM_EPISODE;
+ } else if (a == 's') {
+ if (atom_compare(a, b, c, d, 's', 't', 'b', 'l'))
+ return ATOM_STBL;
+ else if (atom_compare(a, b, c, d, 's', 'm', 'h', 'd'))
+ return ATOM_SMHD;
+ else if (atom_compare(a, b, c, d, 's', 't', 's', 'd'))
+ return ATOM_STSD;
+ else if (atom_compare(a, b, c, d, 's', 't', 't', 's'))
+ return ATOM_STTS;
+ else if (atom_compare(a, b, c, d, 's', 't', 'c', 'o'))
+ return ATOM_STCO;
+ else if (atom_compare(a, b, c, d, 's', 't', 's', 'c'))
+ return ATOM_STSC;
+ else if (atom_compare(a, b, c, d, 's', 't', 's', 'z'))
+ return ATOM_STSZ;
+ else if (atom_compare(a, b, c, d, 's', 't', 'z', '2'))
+ return ATOM_STZ2;
+ else if (atom_compare(a, b, c, d, 's', 'k', 'i', 'p'))
+ return ATOM_SKIP;
+ else if (atom_compare(a, b, c, d, 's', 'i', 'n', 'f'))
+ return ATOM_SINF;
+ else if (atom_compare(a, b, c, d, 's', 'c', 'h', 'i'))
+ return ATOM_SCHI;
+ else if (atom_compare(a, b, c, d, 's', 'o', 'n', 'm'))
+ return ATOM_SORTTITLE;
+ else if (atom_compare(a, b, c, d, 's', 'o', 'a', 'l'))
+ return ATOM_SORTALBUM;
+ else if (atom_compare(a, b, c, d, 's', 'o', 'a', 'r'))
+ return ATOM_SORTARTIST;
+ else if (atom_compare(a, b, c, d, 's', 'o', 'a', 'a'))
+ return ATOM_SORTALBUMARTIST;
+ else if (atom_compare(a, b, c, d, 's', 'o', 'c', 'o'))
+ return ATOM_SORTWRITER;
+ else if (atom_compare(a, b, c, d, 's', 'o', 's', 'n'))
+ return ATOM_SORTSHOW;
+ } else if (a == COPYRIGHT_SYMBOL) {
+ if (atom_compare(a, b, c, d, COPYRIGHT_SYMBOL, 'n', 'a', 'm'))
+ return ATOM_TITLE;
+ else if (atom_compare(a, b, c, d, COPYRIGHT_SYMBOL, 'A', 'R', 'T'))
+ return ATOM_ARTIST;
+ else if (atom_compare(a, b, c, d, COPYRIGHT_SYMBOL, 'w', 'r', 't'))
+ return ATOM_WRITER;
+ else if (atom_compare(a, b, c, d, COPYRIGHT_SYMBOL, 'a', 'l', 'b'))
+ return ATOM_ALBUM;
+ else if (atom_compare(a, b, c, d, COPYRIGHT_SYMBOL, 'd', 'a', 'y'))
+ return ATOM_DATE;
+ else if (atom_compare(a, b, c, d, COPYRIGHT_SYMBOL, 't', 'o', 'o'))
+ return ATOM_TOOL;
+ else if (atom_compare(a, b, c, d, COPYRIGHT_SYMBOL, 'c', 'm', 't'))
+ return ATOM_COMMENT;
+ else if (atom_compare(a, b, c, d, COPYRIGHT_SYMBOL, 'g', 'e', 'n'))
+ return ATOM_GENRE1;
+ else if (atom_compare(a, b, c, d, COPYRIGHT_SYMBOL, 'g', 'r', 'p'))
+ return ATOM_CONTENTGROUP;
+ else if (atom_compare(a, b, c, d, COPYRIGHT_SYMBOL, 'l', 'y', 'r'))
+ return ATOM_LYRICS;
+ }
+
+ if (atom_compare(a, b, c, d, 'e', 'd', 't', 's'))
+ return ATOM_EDTS;
+ else if (atom_compare(a, b, c, d, 'e', 's', 'd', 's'))
+ return ATOM_ESDS;
+ else if (atom_compare(a, b, c, d, 'f', 't', 'y', 'p'))
+ return ATOM_FTYP;
+ else if (atom_compare(a, b, c, d, 'f', 'r', 'e', 'e'))
+ return ATOM_FREE;
+ else if (atom_compare(a, b, c, d, 'h', 'm', 'h', 'd'))
+ return ATOM_HMHD;
+ else if (atom_compare(a, b, c, d, 'v', 'm', 'h', 'd'))
+ return ATOM_VMHD;
+ else if (atom_compare(a, b, c, d, 'u', 'd', 't', 'a'))
+ return ATOM_UDTA;
+ else if (atom_compare(a, b, c, d, 'i', 'l', 's', 't'))
+ return ATOM_ILST;
+ else if (atom_compare(a, b, c, d, 'n', 'a', 'm', 'e'))
+ return ATOM_NAME;
+ else if (atom_compare(a, b, c, d, 'd', 'a', 't', 'a'))
+ return ATOM_DATA;
+ else if (atom_compare(a, b, c, d, 'd', 'i', 's', 'k'))
+ return ATOM_DISC;
+ else if (atom_compare(a, b, c, d, 'g', 'n', 'r', 'e'))
+ return ATOM_GENRE2;
+ else if (atom_compare(a, b, c, d, 'c', 'o', 'v', 'r'))
+ return ATOM_COVER;
+ else if (atom_compare(a, b, c, d, 'c', 'p', 'i', 'l'))
+ return ATOM_COMPILATION;
+ else if (atom_compare(a, b, c, d, 'c', 't', 't', 's'))
+ return ATOM_CTTS;
+ else if (atom_compare(a, b, c, d, 'd', 'r', 'm', 's'))
+ return ATOM_DRMS;
+ else if (atom_compare(a, b, c, d, 'f', 'r', 'm', 'a'))
+ return ATOM_FRMA;
+ else if (atom_compare(a, b, c, d, 'p', 'r', 'i', 'v'))
+ return ATOM_PRIV;
+ else if (atom_compare(a, b, c, d, 'i', 'v', 'i', 'v'))
+ return ATOM_IVIV;
+ else if (atom_compare(a, b, c, d, 'u', 's', 'e', 'r'))
+ return ATOM_USER;
+ else if (atom_compare(a, b, c, d, 'k', 'e', 'y', ' '))
+ return ATOM_KEY;
+ else if (atom_compare(a, b, c, d, 'a', 'A', 'R', 'T'))
+ return ATOM_ALBUM_ARTIST;
+ else if (atom_compare(a, b, c, d, 'd', 'e', 's', 'c'))
+ return ATOM_DESCRIPTION;
+ else if (atom_compare(a, b, c, d, 'p', 'c', 's', 't'))
+ return ATOM_PODCAST;
+ else
+ return ATOM_UNKNOWN;
+}
+
+/* read atom header, atom size is returned with header included. */
+static int atom_read_header(struct mp4 *f, uint8_t *atom_type,
+ uint8_t *header_size, uint64_t *atom_size)
+{
+ uint32_t size;
+ int ret;
+ int8_t atom_header[8];
+
+ ret = read_data(f, atom_header, 8);
+ if (ret <= 0)
+ return ret;
+ size = read_u32_be(atom_header);
+ if (size == 1) { /* 64 bit atom size */
+ if (header_size)
+ *header_size = 16;
+ ret = read_int64(f, atom_size);
+ if (ret <= 0)
+ return ret;
+ } else {
+ if (header_size)
+ *header_size = 8;
+ if (atom_size)
+ *atom_size = size;
+ }
+ *atom_type = atom_name_to_type(atom_header[4], atom_header[5],
+ atom_header[6], atom_header[7]);
+ return 1;
+}
+
+static int64_t get_position(const struct mp4 *f)
+{
+ return f->current_position;