static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
    int64_t total_size = 0;
    MOVAtom a;
    int i;
    if (atom.size < 0)
        atom.size = INT64_MAX;
    while (total_size + 8 < atom.size && !pb->eof_reached) {
        int (*parse)(MOVContext*, AVIOContext*, MOVAtom) = NULL;
        a.size = atom.size;
        a.type=0;
        if (atom.size >= 8) {
            a.size = avio_rb32(pb);
            a.type = avio_rl32(pb);
        }
        av_dlog(c->fc, "type: %08x '%.4s' parent:'%.4s' sz: %"PRId64" %"PRId64" %"PRId64"\n",
                a.type, (char*)&a.type, (char*)&atom.type, a.size, total_size, atom.size);
        total_size += 8;
        if (a.size == 1) {
            a.size = avio_rb64(pb) - 8;
            total_size += 8;
        }
        if (a.size == 0) {
            a.size = atom.size - total_size;
            if (a.size <= 8)
                break;
        }
        a.size -= 8;
        if (a.size < 0)
            break;
        a.size = FFMIN(a.size, atom.size - total_size);
        for (i = 0; mov_default_parse_table[i].type; i++)
            if (mov_default_parse_table[i].type == a.type) {
                parse = mov_default_parse_table[i].parse;
                break;
            }
        if (!parse && (atom.type == MKTAG('u','d','t','a') ||
                       atom.type == MKTAG('i','l','s','t')))
            parse = mov_read_udta_string;
        if (!parse) {
            avio_skip(pb, a.size);
        } else {
            int64_t start_pos = avio_tell(pb);
            int64_t left;
            int err = parse(c, pb, a);
            if (err < 0)
                return err;
            if (c->found_moov && c->found_mdat &&
                ((!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX) ||
                 start_pos + a.size == avio_size(pb))) {
                if (!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX)
                    c->next_root_atom = start_pos + a.size;
                return 0;
            }
            left = a.size - avio_tell(pb) + start_pos;
            if (left > 0)
                avio_skip(pb, left);
        }
        total_size += a.size;
    }
    if (total_size < atom.size && atom.size < 0x7ffff)
        avio_skip(pb, atom.size - total_size);
    return 0;
}
['static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom)\n{\n    int64_t total_size = 0;\n    MOVAtom a;\n    int i;\n    if (atom.size < 0)\n        atom.size = INT64_MAX;\n    while (total_size + 8 < atom.size && !pb->eof_reached) {\n        int (*parse)(MOVContext*, AVIOContext*, MOVAtom) = NULL;\n        a.size = atom.size;\n        a.type=0;\n        if (atom.size >= 8) {\n            a.size = avio_rb32(pb);\n            a.type = avio_rl32(pb);\n        }\n        av_dlog(c->fc, "type: %08x \'%.4s\' parent:\'%.4s\' sz: %"PRId64" %"PRId64" %"PRId64"\\n",\n                a.type, (char*)&a.type, (char*)&atom.type, a.size, total_size, atom.size);\n        total_size += 8;\n        if (a.size == 1) {\n            a.size = avio_rb64(pb) - 8;\n            total_size += 8;\n        }\n        if (a.size == 0) {\n            a.size = atom.size - total_size;\n            if (a.size <= 8)\n                break;\n        }\n        a.size -= 8;\n        if (a.size < 0)\n            break;\n        a.size = FFMIN(a.size, atom.size - total_size);\n        for (i = 0; mov_default_parse_table[i].type; i++)\n            if (mov_default_parse_table[i].type == a.type) {\n                parse = mov_default_parse_table[i].parse;\n                break;\n            }\n        if (!parse && (atom.type == MKTAG(\'u\',\'d\',\'t\',\'a\') ||\n                       atom.type == MKTAG(\'i\',\'l\',\'s\',\'t\')))\n            parse = mov_read_udta_string;\n        if (!parse) {\n            avio_skip(pb, a.size);\n        } else {\n            int64_t start_pos = avio_tell(pb);\n            int64_t left;\n            int err = parse(c, pb, a);\n            if (err < 0)\n                return err;\n            if (c->found_moov && c->found_mdat &&\n                ((!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX) ||\n                 start_pos + a.size == avio_size(pb))) {\n                if (!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX)\n                    c->next_root_atom = start_pos + a.size;\n                return 0;\n            }\n            left = a.size - avio_tell(pb) + start_pos;\n            if (left > 0)\n                avio_skip(pb, left);\n        }\n        total_size += a.size;\n    }\n    if (total_size < atom.size && atom.size < 0x7ffff)\n        avio_skip(pb, atom.size - total_size);\n    return 0;\n}']