⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demux.c

📁 alac decoder,内容详细
💻 C
📖 第 1 页 / 共 2 页
字号:
        {            fprintf(stderr, "strange size for chunk inside stbl (%lu) (remaining: %lu)\n",                    sub_chunk_len, size_remaining);            return 0;        }        sub_chunk_id = stream_read_uint32(qtmovie->stream);        switch (sub_chunk_id)        {        case MAKEFOURCC('s','t','s','d'):            if (read_chunk_stsd(qtmovie, sub_chunk_len) == 0)                return 0;            break;        case MAKEFOURCC('s','t','t','s'):            read_chunk_stts(qtmovie, sub_chunk_len);            break;        case MAKEFOURCC('s','t','s','z'):            read_chunk_stsz(qtmovie, sub_chunk_len);            break;        case MAKEFOURCC('s','t','s','c'):        case MAKEFOURCC('s','t','c','o'):            /* skip these, no indexing for us! */            stream_skip(qtmovie->stream, sub_chunk_len - 8);            break;        default:            fprintf(stderr, "(stbl) unknown chunk id: %c%c%c%c\n",                    SPLITFOURCC(sub_chunk_id));            return 0;        }        size_remaining -= sub_chunk_len;    }    return 1;}static int read_chunk_minf(qtmovie_t *qtmovie, size_t chunk_len){    size_t dinf_size, stbl_size;    size_t size_remaining = chunk_len - 8; /* FIXME WRONG */  /**** SOUND HEADER CHUNK ****/    if (stream_read_uint32(qtmovie->stream) != 16)    {        fprintf(stderr, "unexpected size in media info\n");        return 0;    }    if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('s','m','h','d'))    {        fprintf(stderr, "not a sound header! can't handle this.\n");        return 0;    }    /* now skip the rest */    stream_skip(qtmovie->stream, 16 - 8);    size_remaining -= 16;  /****/  /**** DINF CHUNK ****/    dinf_size = stream_read_uint32(qtmovie->stream);    if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('d','i','n','f'))    {        fprintf(stderr, "expected dinf, didn't get it.\n");        return 0;    }    /* skip it */    stream_skip(qtmovie->stream, dinf_size - 8);    size_remaining -= dinf_size;  /****/  /**** SAMPLE TABLE ****/    stbl_size = stream_read_uint32(qtmovie->stream);    if (stream_read_uint32(qtmovie->stream) != MAKEFOURCC('s','t','b','l'))    {        fprintf(stderr, "expected stbl, didn't get it.\n");        return 0;    }    if (read_chunk_stbl(qtmovie, stbl_size) == 0)        return 0;    size_remaining -= stbl_size;    if (size_remaining)    {        fprintf(stderr, "oops\n");        stream_skip(qtmovie->stream, size_remaining);    }    return 1;}static int read_chunk_mdia(qtmovie_t *qtmovie, size_t chunk_len){    size_t size_remaining = chunk_len - 8; /* FIXME WRONG */    while (size_remaining)    {        size_t sub_chunk_len;        fourcc_t sub_chunk_id;        sub_chunk_len = stream_read_uint32(qtmovie->stream);        if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining)        {            fprintf(stderr, "strange size for chunk inside mdia\n");            return 0;        }        sub_chunk_id = stream_read_uint32(qtmovie->stream);        switch (sub_chunk_id)        {        case MAKEFOURCC('m','d','h','d'):            read_chunk_mdhd(qtmovie, sub_chunk_len);            break;        case MAKEFOURCC('h','d','l','r'):            read_chunk_hdlr(qtmovie, sub_chunk_len);            break;        case MAKEFOURCC('m','i','n','f'):            if (read_chunk_minf(qtmovie, sub_chunk_len) == 0)                return 0;            break;        default:            fprintf(stderr, "(mdia) unknown chunk id: %c%c%c%c\n",                    SPLITFOURCC(sub_chunk_id));            return 0;        }        size_remaining -= sub_chunk_len;    }    return 1;}/* 'trak' - a movie track - contains other atoms */static int read_chunk_trak(qtmovie_t *qtmovie, size_t chunk_len){    size_t size_remaining = chunk_len - 8; /* FIXME WRONG */    while (size_remaining)    {        size_t sub_chunk_len;        fourcc_t sub_chunk_id;        sub_chunk_len = stream_read_uint32(qtmovie->stream);        if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining)        {            fprintf(stderr, "strange size for chunk inside trak\n");            return 0;        }        sub_chunk_id = stream_read_uint32(qtmovie->stream);        switch (sub_chunk_id)        {        case MAKEFOURCC('t','k','h','d'):            read_chunk_tkhd(qtmovie, sub_chunk_len);            break;        case MAKEFOURCC('m','d','i','a'):            if (read_chunk_mdia(qtmovie, sub_chunk_len) == 0)                return 0;            break;        case MAKEFOURCC('e','d','t','s'):            read_chunk_edts(qtmovie, sub_chunk_len);            break;        default:            fprintf(stderr, "(trak) unknown chunk id: %c%c%c%c\n",                    SPLITFOURCC(sub_chunk_id));            return 0;        }        size_remaining -= sub_chunk_len;    }    return 1;}/* 'mvhd' movie header atom */static void read_chunk_mvhd(qtmovie_t *qtmovie, size_t chunk_len){    /* don't need anything from here atm, skip */    size_t size_remaining = chunk_len - 8; /* FIXME WRONG */    stream_skip(qtmovie->stream, size_remaining);}/* 'udta' user data.. contains tag info */static void read_chunk_udta(qtmovie_t *qtmovie, size_t chunk_len){    /* don't need anything from here atm, skip */    size_t size_remaining = chunk_len - 8; /* FIXME WRONG */    stream_skip(qtmovie->stream, size_remaining);}/* 'iods' */static void read_chunk_iods(qtmovie_t *qtmovie, size_t chunk_len){    /* don't need anything from here atm, skip */    size_t size_remaining = chunk_len - 8; /* FIXME WRONG */    stream_skip(qtmovie->stream, size_remaining);}/* 'moov' movie atom - contains other atoms */static int read_chunk_moov(qtmovie_t *qtmovie, size_t chunk_len){    size_t size_remaining = chunk_len - 8; /* FIXME WRONG */    while (size_remaining)    {        size_t sub_chunk_len;        fourcc_t sub_chunk_id;        sub_chunk_len = stream_read_uint32(qtmovie->stream);        if (sub_chunk_len <= 1 || sub_chunk_len > size_remaining)        {            fprintf(stderr, "strange size for chunk inside moov\n");            return 0;        }        sub_chunk_id = stream_read_uint32(qtmovie->stream);        switch (sub_chunk_id)        {        case MAKEFOURCC('m','v','h','d'):            read_chunk_mvhd(qtmovie, sub_chunk_len);            break;        case MAKEFOURCC('t','r','a','k'):            if (read_chunk_trak(qtmovie, sub_chunk_len) == 0)                return 0;            break;        case MAKEFOURCC('u','d','t','a'):            read_chunk_udta(qtmovie, sub_chunk_len);            break;        case MAKEFOURCC('e','l','s','t'):            read_chunk_elst(qtmovie, sub_chunk_len);            break;        case MAKEFOURCC('i','o','d','s'):            read_chunk_iods(qtmovie, sub_chunk_len);            break;        default:            fprintf(stderr, "(moov) unknown chunk id: %c%c%c%c\n",                    SPLITFOURCC(sub_chunk_id));            return 0;        }        size_remaining -= sub_chunk_len;    }    return 1;}static void read_chunk_mdat(qtmovie_t *qtmovie, size_t chunk_len, int skip_mdat){    size_t size_remaining = chunk_len - 8; /* FIXME WRONG */    if (size_remaining == 0) return;    qtmovie->res->mdat_len = (uint32_t)size_remaining;    if (skip_mdat)    {        qtmovie->saved_mdat_pos = stream_tell(qtmovie->stream);        stream_skip(qtmovie->stream, size_remaining);    }#if 0    qtmovie->res->mdat = malloc(size_remaining);    stream_read(qtmovie->stream, size_remaining, qtmovie->res->mdat);#endif}static int set_saved_mdat(qtmovie_t *qtmovie){    if (qtmovie->saved_mdat_pos == -1)    {        fprintf(stderr, "stream contains mdat before moov but is not seekable\n");        return 0;    }    if (stream_setpos(qtmovie->stream, qtmovie->saved_mdat_pos))    {        fprintf(stderr, "error while seeking stream to mdat pos\n");        return 0;    }    return 1;}int qtmovie_read(stream_t *file, demux_res_t *demux_res){    int found_moov = 0;    int found_mdat = 0;    qtmovie_t *qtmovie;    qtmovie = (qtmovie_t*)malloc(sizeof(qtmovie_t));    /* construct the stream */    qtmovie->stream = file;    qtmovie->res = demux_res;    memset(demux_res, 0, sizeof(demux_res_t));    /* read the chunks */    while (1)    {        size_t chunk_len;        fourcc_t chunk_id;        chunk_len = stream_read_uint32(qtmovie->stream);        if (stream_eof(qtmovie->stream))        {            return 0;        }        if (chunk_len == 1)        {            fprintf(stderr, "need 64bit support\n");            return 0;        }        chunk_id = stream_read_uint32(qtmovie->stream);        switch (chunk_id)        {        case MAKEFOURCC('f','t','y','p'):            read_chunk_ftyp(qtmovie, chunk_len);            break;        case MAKEFOURCC('m','o','o','v'):            if (read_chunk_moov(qtmovie, chunk_len) == 0)                return 0; /* failed to read moov, can't do anything */            if (found_mdat)            {                return set_saved_mdat(qtmovie);            }            found_moov = 1;            break;            /* if we hit mdat before we've found moov, record the position             * and move on. We can then come back to mdat later.             * This presumes the stream supports seeking backwards.             */        case MAKEFOURCC('m','d','a','t'):            read_chunk_mdat(qtmovie, chunk_len, !found_moov);            if (found_moov)                return 1;            found_mdat = 1;            break;            /*  these following atoms can be skipped !!!! */        case MAKEFOURCC('f','r','e','e'):            stream_skip(qtmovie->stream, chunk_len - 8); /* FIXME not 8 */            break;        default:            fprintf(stderr, "(top) unknown chunk id: %c%c%c%c\n",                    SPLITFOURCC(chunk_id));            return 0;        }    }    return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -