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

📄 mov.c

📁 ffmpeg移植到symbian的全部源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
#define MP4DecConfigDescrTag            0x04#define MP4DecSpecificDescrTag          0x05static const AVCodecTag mp4_audio_types[] = {    { CODEC_ID_MP3ON4, 29 }, /* old mp3on4 draft */    { CODEC_ID_MP3ON4, 32 }, /* layer 1 */    { CODEC_ID_MP3ON4, 33 }, /* layer 2 */    { CODEC_ID_MP3ON4, 34 }, /* layer 3 */    { CODEC_ID_NONE,    0 },};static int mov_read_esds(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom){    AVStream *st = c->fc->streams[c->fc->nb_streams-1];    int tag, len;    get_be32(pb); /* version + flags */    len = mp4_read_descr(c, pb, &tag);    if (tag == MP4ESDescrTag) {        get_be16(pb); /* ID */        get_byte(pb); /* priority */    } else        get_be16(pb); /* ID */    len = mp4_read_descr(c, pb, &tag);    if (tag == MP4DecConfigDescrTag) {        int object_type_id = get_byte(pb);        get_byte(pb); /* stream type */        get_be24(pb); /* buffer size db */        get_be32(pb); /* max bitrate */        get_be32(pb); /* avg bitrate */        st->codec->codec_id= codec_get_id(ff_mp4_obj_type, object_type_id);        dprintf(c->fc, "esds object type id %d\n", object_type_id);        len = mp4_read_descr(c, pb, &tag);        if (tag == MP4DecSpecificDescrTag) {            dprintf(c->fc, "Specific MPEG4 header len=%d\n", len);            if((uint64_t)len > (1<<30))                return -1;            st->codec->extradata = av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE);            if (!st->codec->extradata)                return AVERROR(ENOMEM);            get_buffer(pb, st->codec->extradata, len);            st->codec->extradata_size = len;            if (st->codec->codec_id == CODEC_ID_AAC) {                MPEG4AudioConfig cfg;                ff_mpeg4audio_get_config(&cfg, st->codec->extradata,                                         st->codec->extradata_size);                if (cfg.chan_config > 7)                    return -1;                st->codec->channels = ff_mpeg4audio_channels[cfg.chan_config];                if (cfg.object_type == 29 && cfg.sampling_index < 3) // old mp3on4                    st->codec->sample_rate = ff_mpa_freq_tab[cfg.sampling_index];                else                    st->codec->sample_rate = cfg.sample_rate; // ext sample rate ?                dprintf(c->fc, "mp4a config channels %d obj %d ext obj %d "                        "sample rate %d ext sample rate %d\n", st->codec->channels,                        cfg.object_type, cfg.ext_object_type,                        cfg.sample_rate, cfg.ext_sample_rate);                if (!(st->codec->codec_id = codec_get_id(mp4_audio_types,                                                         cfg.object_type)))                    st->codec->codec_id = CODEC_ID_AAC;            }        }    }    return 0;}/* this atom contains actual media data */static int mov_read_mdat(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom){    if(atom.size == 0) /* wrong one (MP4) */        return 0;    c->found_mdat=1;    return 0; /* now go for moov */}static int mov_read_ftyp(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom){    uint32_t type = get_le32(pb);    if (type != MKTAG('q','t',' ',' '))        c->isom = 1;    av_log(c->fc, AV_LOG_DEBUG, "ISO: File Type Major Brand: %.4s\n",(char *)&type);    get_be32(pb); /* minor version */    url_fskip(pb, atom.size - 8);    return 0;}/* this atom should contain all header atoms */static int mov_read_moov(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom){    if (mov_read_default(c, pb, atom) < 0)        return -1;    /* we parsed the 'moov' atom, we can terminate the parsing as soon as we find the 'mdat' */    /* so we don't parse the whole file if over a network */    c->found_moov=1;    return 0; /* now go for mdat */}static int mov_read_moof(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom){    c->fragment.moof_offset = url_ftell(pb) - 8;    dprintf(c->fc, "moof offset %llx\n", c->fragment.moof_offset);    return mov_read_default(c, pb, atom);}static int mov_read_mdhd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom){    AVStream *st = c->fc->streams[c->fc->nb_streams-1];    MOVStreamContext *sc = st->priv_data;    int version = get_byte(pb);    int lang;    if (version > 1)        return -1; /* unsupported */    get_be24(pb); /* flags */    if (version == 1) {        get_be64(pb);        get_be64(pb);    } else {        get_be32(pb); /* creation time */        get_be32(pb); /* modification time */    }    sc->time_scale = get_be32(pb);    st->duration = (version == 1) ? get_be64(pb) : get_be32(pb); /* duration */    lang = get_be16(pb); /* language */    ff_mov_lang_to_iso639(lang, st->language);    get_be16(pb); /* quality */    return 0;}static int mov_read_mvhd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom){    int version = get_byte(pb); /* version */    get_be24(pb); /* flags */    if (version == 1) {        get_be64(pb);        get_be64(pb);    } else {        get_be32(pb); /* creation time */        get_be32(pb); /* modification time */    }    c->time_scale = get_be32(pb); /* time scale */    dprintf(c->fc, "time scale = %i\n", c->time_scale);    c->duration = (version == 1) ? get_be64(pb) : get_be32(pb); /* duration */    get_be32(pb); /* preferred scale */    get_be16(pb); /* preferred volume */    url_fskip(pb, 10); /* reserved */    url_fskip(pb, 36); /* display matrix */    get_be32(pb); /* preview time */    get_be32(pb); /* preview duration */    get_be32(pb); /* poster time */    get_be32(pb); /* selection time */    get_be32(pb); /* selection duration */    get_be32(pb); /* current time */    get_be32(pb); /* next track ID */    return 0;}static int mov_read_smi(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom){    AVStream *st = c->fc->streams[c->fc->nb_streams-1];    if((uint64_t)atom.size > (1<<30))        return -1;    // currently SVQ3 decoder expect full STSD header - so let's fake it    // this should be fixed and just SMI header should be passed    av_free(st->codec->extradata);    st->codec->extradata = av_mallocz(atom.size + 0x5a + FF_INPUT_BUFFER_PADDING_SIZE);    if (!st->codec->extradata)        return AVERROR(ENOMEM);    st->codec->extradata_size = 0x5a + atom.size;    memcpy(st->codec->extradata, "SVQ3", 4); // fake    get_buffer(pb, st->codec->extradata + 0x5a, atom.size);    dprintf(c->fc, "Reading SMI %"PRId64"  %s\n", atom.size, st->codec->extradata + 0x5a);    return 0;}static int mov_read_enda(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom){    AVStream *st = c->fc->streams[c->fc->nb_streams-1];    int little_endian = get_be16(pb);    if (little_endian) {        switch (st->codec->codec_id) {        case CODEC_ID_PCM_S24BE:            st->codec->codec_id = CODEC_ID_PCM_S24LE;            break;        case CODEC_ID_PCM_S32BE:            st->codec->codec_id = CODEC_ID_PCM_S32LE;            break;        default:            break;        }    }    return 0;}/* FIXME modify qdm2/svq3/h264 decoders to take full atom as extradata */static int mov_read_extradata(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom){    AVStream *st = c->fc->streams[c->fc->nb_streams-1];    uint64_t size= (uint64_t)st->codec->extradata_size + atom.size + 8 + FF_INPUT_BUFFER_PADDING_SIZE;    uint8_t *buf;    if(size > INT_MAX || (uint64_t)atom.size > INT_MAX)        return -1;    buf= av_realloc(st->codec->extradata, size);    if(!buf)        return -1;    st->codec->extradata= buf;    buf+= st->codec->extradata_size;    st->codec->extradata_size= size - FF_INPUT_BUFFER_PADDING_SIZE;    AV_WB32(       buf    , atom.size + 8);    AV_WL32(       buf + 4, atom.type);    get_buffer(pb, buf + 8, atom.size);    return 0;}static int mov_read_wave(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom){    AVStream *st = c->fc->streams[c->fc->nb_streams-1];    if((uint64_t)atom.size > (1<<30))        return -1;    if (st->codec->codec_id == CODEC_ID_QDM2) {        // pass all frma atom to codec, needed at least for QDM2        av_free(st->codec->extradata);        st->codec->extradata = av_mallocz(atom.size + FF_INPUT_BUFFER_PADDING_SIZE);        if (!st->codec->extradata)            return AVERROR(ENOMEM);        st->codec->extradata_size = atom.size;        get_buffer(pb, st->codec->extradata, atom.size);    } else if (atom.size > 8) { /* to read frma, esds atoms */        if (mov_read_default(c, pb, atom) < 0)            return -1;    } else        url_fskip(pb, atom.size);    return 0;}/** * This function reads atom content and puts data in extradata without tag * nor size unlike mov_read_extradata. */static int mov_read_glbl(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom){    AVStream *st = c->fc->streams[c->fc->nb_streams-1];    if((uint64_t)atom.size > (1<<30))        return -1;    av_free(st->codec->extradata);    st->codec->extradata = av_mallocz(atom.size + FF_INPUT_BUFFER_PADDING_SIZE);    if (!st->codec->extradata)        return AVERROR(ENOMEM);    st->codec->extradata_size = atom.size;    get_buffer(pb, st->codec->extradata, atom.size);    return 0;}static int mov_read_stco(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom){    AVStream *st = c->fc->streams[c->fc->nb_streams-1];    MOVStreamContext *sc = st->priv_data;    unsigned int i, entries;    get_byte(pb); /* version */    get_be24(pb); /* flags */    entries = get_be32(pb);    if(entries >= UINT_MAX/sizeof(int64_t))        return -1;    sc->chunk_count = entries;    sc->chunk_offsets = av_malloc(entries * sizeof(int64_t));    if (!sc->chunk_offsets)        return -1;    if      (atom.type == MKTAG('s','t','c','o'))        for(i=0; i<entries; i++)            sc->chunk_offsets[i] = get_be32(pb);    else if (atom.type == MKTAG('c','o','6','4'))        for(i=0; i<entries; i++)            sc->chunk_offsets[i] = get_be64(pb);    else        return -1;    return 0;}static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom){    AVStream *st = c->fc->streams[c->fc->nb_streams-1];    MOVStreamContext *sc = st->priv_data;    int j, entries, pseudo_stream_id;    get_byte(pb); /* version */    get_be24(pb); /* flags */    entries = get_be32(pb);    for(pseudo_stream_id=0; pseudo_stream_id<entries; pseudo_stream_id++) {        //Parsing Sample description table        enum CodecID id;        int dref_id;        MOV_atom_t a = { 0, 0, 0 };        offset_t start_pos = url_ftell(pb);        int size = get_be32(pb); /* size */        uint32_t format = get_le32(pb); /* data format */        get_be32(pb); /* reserved */        get_be16(pb); /* reserved */        dref_id = get_be16(pb);        if (st->codec->codec_tag &&            st->codec->codec_tag != format &&            (c->fc->video_codec_id ? codec_get_id(codec_movvideo_tags, format) != c->fc->video_codec_id                                   : st->codec->codec_tag != MKTAG('j','p','e','g'))           ){            /* Multiple fourcc, we skip JPEG. This is not correct, we should             * export it as a separate AVStream but this needs a few changes             * in the MOV demuxer, patch welcome. */            av_log(c->fc, AV_LOG_WARNING, "multiple fourcc not supported\n");            url_fskip(pb, size - (url_ftell(pb) - start_pos));            continue;        }        sc->pseudo_stream_id = st->codec->codec_tag ? -1 : pseudo_stream_id;        sc->dref_id= dref_id;        st->codec->codec_tag = format;        id = codec_get_id(codec_movaudio_tags, format);        if (id<=0 && (format&0xFFFF) == 'm'+('s'<<8))            id = codec_get_id(codec_wav_tags, bswap_32(format)&0xFFFF);        if (st->codec->codec_type != CODEC_TYPE_VIDEO && id > 0) {            st->codec->codec_type = CODEC_TYPE_AUDIO;        } else if (st->codec->codec_type != CODEC_TYPE_AUDIO && /* do not overwrite codec type */                   format && format != MKTAG('m','p','4','s')) { /* skip old asf mpeg4 tag */            id = codec_get_id(codec_movvideo_tags, format);            if (id <= 0)                id = codec_get_id(codec_bmp_tags, format);            if (id > 0)                st->codec->codec_type = CODEC_TYPE_VIDEO;            else if(st->codec->codec_type == CODEC_TYPE_DATA){                id = codec_get_id(ff_codec_movsubtitle_tags, format);                if(id > 0)                    st->codec->codec_type = CODEC_TYPE_SUBTITLE;            }        }        dprintf(c->fc, "size=%d 4CC= %c%c%c%c codec_type=%d\n", size,                (format >> 0) & 0xff, (format >> 8) & 0xff, (format >> 16) & 0xff,                (format >> 24) & 0xff, st->codec->codec_type);        if(st->codec->codec_type==CODEC_TYPE_VIDEO) {            uint8_t codec_name[32];            unsigned int color_depth;            int color_greyscale;

⌨️ 快捷键说明

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