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

📄 asf.c

📁 ffmpeg源码分析
💻 C
📖 第 1 页 / 共 3 页
字号:
                sizeX= get_le32(pb); /* size */                st->codec->width = get_le32(pb);                st->codec->height = get_le32(pb);                /* not available for asf */                get_le16(pb); /* panes */                st->codec->bits_per_sample = get_le16(pb); /* depth */                tag1 = get_le32(pb);                url_fskip(pb, 20);//                av_log(NULL, AV_LOG_DEBUG, "size:%d tsize:%d sizeX:%d\n", size, total_size, sizeX);                size= sizeX;                if (size > 40) {                    st->codec->extradata_size = size - 40;                    st->codec->extradata = av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);                    get_buffer(pb, st->codec->extradata, st->codec->extradata_size);                }        /* Extract palette from extradata if bpp <= 8 */        /* This code assumes that extradata contains only palette */        /* This is true for all paletted codecs implemented in ffmpeg */        if (st->codec->extradata_size && (st->codec->bits_per_sample <= 8)) {            st->codec->palctrl = av_mallocz(sizeof(AVPaletteControl));#ifdef WORDS_BIGENDIAN            for (i = 0; i < FFMIN(st->codec->extradata_size, AVPALETTE_SIZE)/4; i++)                st->codec->palctrl->palette[i] = bswap_32(((uint32_t*)st->codec->extradata)[i]);#else            memcpy(st->codec->palctrl->palette, st->codec->extradata,                   FFMIN(st->codec->extradata_size, AVPALETTE_SIZE));#endif            st->codec->palctrl->palette_changed = 1;        }                st->codec->codec_tag = tag1;                st->codec->codec_id = codec_get_id(codec_bmp_tags, tag1);                if(tag1 == MKTAG('D', 'V', 'R', ' '))                    st->need_parsing = 1;            }            pos2 = url_ftell(pb);            url_fskip(pb, gsize - (pos2 - pos1 + 24));        } else if (!memcmp(&g, &data_header, sizeof(GUID))) {            break;        } else if (!memcmp(&g, &comment_header, sizeof(GUID))) {            int len1, len2, len3, len4, len5;            len1 = get_le16(pb);            len2 = get_le16(pb);            len3 = get_le16(pb);            len4 = get_le16(pb);            len5 = get_le16(pb);            get_str16_nolen(pb, len1, s->title, sizeof(s->title));            get_str16_nolen(pb, len2, s->author, sizeof(s->author));            get_str16_nolen(pb, len3, s->copyright, sizeof(s->copyright));            get_str16_nolen(pb, len4, s->comment, sizeof(s->comment));            url_fskip(pb, len5);       } else if (!memcmp(&g, &extended_content_header, sizeof(GUID))) {                int desc_count, i;                desc_count = get_le16(pb);                for(i=0;i<desc_count;i++)                {                        int name_len,value_type,value_len,value_num = 0;                        char *name, *value;                        name_len = get_le16(pb);                        name = (char *)av_mallocz(name_len);                        get_str16_nolen(pb, name_len, name, name_len);                        value_type = get_le16(pb);                        value_len = get_le16(pb);                        if ((value_type == 0) || (value_type == 1)) // unicode or byte                        {                                value = (char *)av_mallocz(value_len);                                get_str16_nolen(pb, value_len, value, value_len);                                if (strcmp(name,"WM/AlbumTitle")==0) { pstrcpy(s->album, sizeof(s->album), value); }                                av_free(value);                        }                        if ((value_type >= 2) && (value_type <= 5)) // boolean or DWORD or QWORD or WORD                        {                                if (value_type==2) value_num = get_le32(pb);                                if (value_type==3) value_num = get_le32(pb);                                if (value_type==4) value_num = get_le64(pb);                                if (value_type==5) value_num = get_le16(pb);                                if (strcmp(name,"WM/Track")==0) s->track = value_num + 1;                                if (strcmp(name,"WM/TrackNumber")==0) s->track = value_num;                        }                        av_free(name);                }        } else if (!memcmp(&g, &ext_stream_header, sizeof(GUID))) {            int ext_len, payload_ext_ct, stream_ct;            uint32_t ext_d;            int64_t pos_ex_st;            pos_ex_st = url_ftell(pb);            get_le64(pb);            get_le64(pb);            get_le32(pb);            get_le32(pb);            get_le32(pb);            get_le32(pb);            get_le32(pb);            get_le32(pb);            get_le32(pb);            get_le32(pb);            get_le16(pb);            get_le16(pb);            get_le64(pb);            stream_ct = get_le16(pb);            payload_ext_ct = get_le16(pb);            for (i=0; i<stream_ct; i++){                get_le16(pb);                ext_len = get_le16(pb);                url_fseek(pb, ext_len, SEEK_CUR);            }            for (i=0; i<payload_ext_ct; i++){                get_guid(pb, &g);                ext_d=get_le16(pb);                ext_len=get_le32(pb);                url_fseek(pb, ext_len, SEEK_CUR);            }            // there could be a optional stream properties object to follow            // if so the next iteration will pick it up        } else if (!memcmp(&g, &head1_guid, sizeof(GUID))) {            int v1, v2;            get_guid(pb, &g);            v1 = get_le32(pb);            v2 = get_le16(pb);#if 0        } else if (!memcmp(&g, &codec_comment_header, sizeof(GUID))) {            int len, v1, n, num;            char str[256], *q;            char tag[16];            get_guid(pb, &g);            print_guid(&g);            n = get_le32(pb);            for(i=0;i<n;i++) {                num = get_le16(pb); /* stream number */                get_str16(pb, str, sizeof(str));                get_str16(pb, str, sizeof(str));                len = get_le16(pb);                q = tag;                while (len > 0) {                    v1 = get_byte(pb);                    if ((q - tag) < sizeof(tag) - 1)                        *q++ = v1;                    len--;                }                *q = '\0';            }#endif        } else if (url_feof(pb)) {            goto fail;        } else {            url_fseek(pb, gsize - 24, SEEK_CUR);        }    }    get_guid(pb, &g);    get_le64(pb);    get_byte(pb);    get_byte(pb);    if (url_feof(pb))        goto fail;    asf->data_offset = url_ftell(pb);    asf->packet_size_left = 0;    return 0; fail:     for(i=0;i<s->nb_streams;i++) {        AVStream *st = s->streams[i];        if (st) {            av_free(st->priv_data);            av_free(st->codec->extradata);        }        av_free(st);    }    return -1;}#define DO_2BITS(bits, var, defval) \    switch (bits & 3) \    { \    case 3: var = get_le32(pb); rsize += 4; break; \    case 2: var = get_le16(pb); rsize += 2; break; \    case 1: var = get_byte(pb); rsize++; break; \    default: var = defval; break; \    }static int asf_get_packet(AVFormatContext *s){    ASFContext *asf = s->priv_data;    ByteIOContext *pb = &s->pb;    uint32_t packet_length, padsize;    int rsize = 9;    int c;    assert((url_ftell(&s->pb) - s->data_offset) % asf->packet_size == 0);    c = get_byte(pb);    if (c != 0x82) {        if (!url_feof(pb))            av_log(s, AV_LOG_ERROR, "ff asf bad header %x  at:%"PRId64"\n", c, url_ftell(pb));    }    if ((c & 0x0f) == 2) { // always true for now        if (get_le16(pb) != 0) {            if (!url_feof(pb))                av_log(s, AV_LOG_ERROR, "ff asf bad non zero\n");            return AVERROR_IO;        }        rsize+=2;/*    }else{        if (!url_feof(pb))            printf("ff asf bad header %x  at:%lld\n", c, url_ftell(pb));        return AVERROR_IO;*/    }    asf->packet_flags = get_byte(pb);    asf->packet_property = get_byte(pb);    DO_2BITS(asf->packet_flags >> 5, packet_length, asf->packet_size);    DO_2BITS(asf->packet_flags >> 1, padsize, 0); // sequence ignored    DO_2BITS(asf->packet_flags >> 3, padsize, 0); // padding length    asf->packet_timestamp = get_le32(pb);    get_le16(pb); /* duration */    // rsize has at least 11 bytes which have to be present    if (asf->packet_flags & 0x01) {        asf->packet_segsizetype = get_byte(pb); rsize++;        asf->packet_segments = asf->packet_segsizetype & 0x3f;    } else {        asf->packet_segments = 1;        asf->packet_segsizetype = 0x80;    }    asf->packet_size_left = packet_length - padsize - rsize;    if (packet_length < asf->hdr.min_pktsize)        padsize += asf->hdr.min_pktsize - packet_length;    asf->packet_padsize = padsize;#ifdef DEBUG    printf("packet: size=%d padsize=%d  left=%d\n", asf->packet_size, asf->packet_padsize, asf->packet_size_left);#endif    return 0;}static int asf_read_packet(AVFormatContext *s, AVPacket *pkt){    ASFContext *asf = s->priv_data;    ASFStream *asf_st = 0;    ByteIOContext *pb = &s->pb;    //static int pc = 0;    for (;;) {        int rsize = 0;        if (asf->packet_size_left < FRAME_HEADER_SIZE            || asf->packet_segments < 1) {            //asf->packet_size_left <= asf->packet_padsize) {            int ret = asf->packet_size_left + asf->packet_padsize;            //printf("PacketLeftSize:%d  Pad:%d Pos:%Ld\n", asf->packet_size_left, asf->packet_padsize, url_ftell(pb));            if((url_ftell(&s->pb) + ret - s->data_offset) % asf->packet_size)                ret += asf->packet_size - ((url_ftell(&s->pb) + ret - s->data_offset) % asf->packet_size);            /* fail safe */            url_fskip(pb, ret);            asf->packet_pos= url_ftell(&s->pb);            ret = asf_get_packet(s);            //printf("READ ASF PACKET  %d   r:%d   c:%d\n", ret, asf->packet_size_left, pc++);            if (ret < 0 || url_feof(pb))                return AVERROR_IO;            asf->packet_time_start = 0;            continue;        }        if (asf->packet_time_start == 0) {            /* read frame header */            int num = get_byte(pb);            asf->packet_segments--;            rsize++;            asf->packet_key_frame = (num & 0x80) >> 7;            asf->stream_index = asf->asfid2avid[num & 0x7f];            // sequence should be ignored!            DO_2BITS(asf->packet_property >> 4, asf->packet_seq, 0);            DO_2BITS(asf->packet_property >> 2, asf->packet_frag_offset, 0);            DO_2BITS(asf->packet_property, asf->packet_replic_size, 0);//printf("key:%d stream:%d seq:%d offset:%d replic_size:%d\n", asf->packet_key_frame, asf->stream_index, asf->packet_seq, //asf->packet_frag_offset, asf->packet_replic_size);            if (asf->packet_replic_size > 1) {                assert(asf->packet_replic_size >= 8);                // it should be always at least 8 bytes - FIXME validate                asf->packet_obj_size = get_le32(pb);                asf->packet_frag_timestamp = get_le32(pb); // timestamp                if (asf->packet_replic_size > 8)                    url_fskip(pb, asf->packet_replic_size - 8);

⌨️ 快捷键说明

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