-static uint32_t find_atom(struct mp4 *f, uint64_t base, uint32_t size,
- const char *name)
-{
- uint32_t remaining = size;
- uint64_t atom_offset = base;
- for (;;) {
- char atom_name[4];
- uint32_t atom_size;
-
- set_position(f, atom_offset);
-
- if (remaining < 8)
- break;
- atom_size = read_int32(f);
- if (atom_size > remaining || atom_size < 8)
- break;
- read_data(f, atom_name, 4);
-
- if (!memcmp(atom_name, name, 4)) {
- set_position(f, atom_offset);
- return 1;
- }
-
- remaining -= atom_size;
- atom_offset += atom_size;
- }
- return 0;
-}
-
-static uint32_t find_atom_v2(struct mp4 *f, uint64_t base, uint32_t size,
- const char *name, uint32_t extraheaders, const char *name_inside)
-{
- uint64_t first_base = (uint64_t) (-1);
- while (find_atom(f, base, size, name)) //try to find atom <name> with atom <name_inside> in it
- {
- uint64_t mybase = get_position(f);
- uint32_t mysize = read_int32(f);
-
- if (first_base == (uint64_t) (-1))
- first_base = mybase;
-
- if (mysize < 8 + extraheaders)
- break;
-
- if (find_atom (f, mybase + (8 + extraheaders),
- mysize - (8 + extraheaders), name_inside)) {
- set_position(f, mybase);
- return 2;
- }
- base += mysize;
- if (size <= mysize) {
- size = 0;
- break;
- }
- size -= mysize;
- }
-
- if (first_base != (uint64_t) (-1)) //wanted atom inside not found
- {
- set_position(f, first_base);
- return 1;
- } else
- return 0;
-}
-