Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2116829
  • 博文数量: 438
  • 博客积分: 3871
  • 博客等级: 中校
  • 技术积分: 6075
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-10 00:11
个人简介

邮箱: wangcong02345@163.com

文章分类

全部博文(438)

文章存档

2017年(15)

2016年(119)

2015年(91)

2014年(62)

2013年(56)

2012年(79)

2011年(16)

分类: LINUX

2016-05-12 17:30:10

avformat_open_input
s->iformat->read_header(s)
        --> mov_read_header





mov_read_default
-->mov_read_trak
    -->mov_build_index
  1. static void mov_build_index(MOVContext *mov, AVStream *st)
  2. {
  3.     MOVStreamContext *sc = st->priv_data;
  4.     int64_t current_offset;
  5.     int64_t current_dts = 0;
  6.     uint64_t stream_size = 0;
  7.     /*从媒体文件中读到video_trak的elst, sound_trak没有这个elst
    1.     0000 0001               -->edit_count=1
    2.     0014 6595               -->segment duration=0x146595
    3.     0000 03e9               -->media time=0x3e9=1001  ;;这个就是video的开始时间,负的
    4.     0001 0000               -->rate=0x1000,rate/65536=1.0
        */
  8.     //下面这个if,因为只有video的elst_count=1,所以只是得出video的start_time
  9.     if (sc->elst_count) {                                             //video:elst_count=1,sound:elst_count=0
  10.         int i, edit_start_index = 0, unsupported = 0;
  11.         int64_t empty_duration = 0; // empty duration of the first edit list entry
  12.         int64_t start_time = 0; // start time of the media

  13.         for (i = 0; i < sc->elst_count; i++) {
  14.             const MOVElst *e = &sc->elst_data[i];                    
  15.             if (i == 0 && e->time == -1) {                          //video:e->time=1001          
  16.                 empty_duration = e->duration;
  17.                 edit_start_index = 1;
  18.             } else if (i == edit_start_index && e->time >= 0) {
  19.                 start_time = e->time;                               //所以video的开始时间是1001,start_time=1001
  20.             } else
  21.                 unsupported = 1;
  22.         }
  23.         if ((empty_duration || start_time) && mov->time_scale > 0) {     //empty_duration=0
  24.             if (empty_duration)
  25.                 empty_duration = av_rescale(empty_duration, sc->time_scale, mov->time_scale);  //empty_duration=0
  26.             sc->time_offset = start_time - empty_duration;                   //video:sc->time_offset=1001; sound:sc->time_offet=0
  27.             current_dts = -sc->time_offset;                                  //video:current_dts=-1001;  sound:current_dts=0;
  28.             if (sc->ctts_count>0 && sc->stts_count>0 &&
  29.                 sc->ctts_data[0].duration / FFMAX(sc->stts_data[0].duration, 1) > 16) {
  30.                 sc->wrong_dts = 1;
  31.                 st->codec->has_b_frames = 1;
  32.             }
  33.         }
  34.     }

  35.     /* only use old uncompressed audio chunk demuxing when stts specifies it */
  36.     if (!(st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
  37.           sc->stts_count == 1 && sc->stts_data[0].duration == 1)) {
  38.         unsigned int current_sample = 0;
  39.         unsigned int stts_sample = 0;
  40.         unsigned int sample_size;
  41.         unsigned int distance = 0;
  42.         unsigned int rap_group_index = 0;
  43.         unsigned int rap_group_sample = 0;
  44.         int64_t last_dts = 0;
  45.         int64_t dts_correction = 0;
  46.         int rap_group_present = sc->rap_group_count && sc->rap_group;
  47.         int key_off = (sc->keyframe_count && sc->keyframes[0] > 0) || (sc->stps_count && sc->stps_data[0] > 0);

  48.         current_dts -= sc; 
  49.         last_dts = current_dts;                                         //video的current_dts=1001,sound的current_dts=0

  50.         av_reallocp_array(&st->index_entries, st->nb_index_entries + sc->sample_count, sizeof(*st->index_entries));  //分配空间
  51.         st->index_entries_allocated_size = (st->nb_index_entries + sc->sample_count) * sizeof(*st->index_entries);

  52.         for (i = 0; i < sc->chunk_count; i++) {  //这个sc->chunk_count就是从"stco"中读取的video_chuk_cnt=0x4e56,sound_chunk_count=0xe10c
  53.             int64_t next_offset = i+1 < sc->chunk_count ? sc->chunk_offsets[i+1] : INT64_MAX;
  54.             current_offset = sc->chunk_offsets[i];          //chunk_offset表出自"stco",video与sound各自都有各自的"stco"
  55.             while (stsc_index + 1 < sc->stsc_count & i + 1 == sc->stsc_data[stsc_index + 1].first)    //video与sound的stsc_count=1,所以stsc_index=0且一直为0
  56.                 stsc_index++;

  57.             for (j = 0; j < sc->stsc_data[stsc_index].count; j++) {
  58.                 int keyframe = 0;

  59.                 if (!sc->keyframe_absent && (!sc->keyframe_count || current_sample+key_off == sc->keyframes[stss_index])) {
  60.                     keyframe = 1;
  61.                     if (stss_index + 1 < sc->keyframe_count)
  62.                         stss_index++;                                    //stss_index=0且一直为0
  63.                 } else if (sc->stps_count && current_sample+key_off == sc->stps_data[stps_index]) {
  64.                     keyframe = 1;
  65.                     if (stps_index + 1 < sc->stps_count)
  66.                         stps_index++;                            
  67.                 }

  68.                 if (sc->keyframe_absent && !sc->stps_count && !rap_group_present && (st->codec->codec_type == AVMEDIA_TYPE_AUDIO || (i==0 && j==0)))
  69.                     keyframe = 1;
  70.                 if (keyframe)
  71.                     distance = 0;
  72.                 sample_size = sc->stsz_sample_size > 0 ? sc->stsz_sample_size : sc->sample_sizes[current_sample];
  73.                 if (sc->pseudo_stream_id == -1 ||
  74.                    sc->stsc_data[stsc_index].id - 1 == sc->pseudo_stream_id) {
  75.                     AVIndexEntry *e = &st->index_entries[st->nb_index_entries++];
  76.                     e->pos = current_offset;
  77.                     e->timestamp = current_dts;                                   //这个timestamp就是dts,计算过程就是start_time累加sample_duration
  78.                     e->size = sample_size;
  79.                     e->min_distance = distance;
  80.                     e->flags = keyframe ? AVINDEX_KEYFRAME : 0;                    
  81.                     if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && st->nb_index_entries < 100)
  82.                         ff_rfps_add_frame(mov->fc, st, current_dts);
  83.                 }

  84.                 current_offset += sample_size;
  85.                 stream_size += sample_size;

  86.                 if (sc->stts_data[stts_index].duration < 0) {                    
  87.                     dts_correction += sc->stts_data[stts_index].duration - 1;
  88.                     sc->stts_data[stts_index].duration = 1;
  89.                 }
  90.                 current_dts += sc->stts_data[stts_index].duration;
  91.                 if (!dts_correction || current_dts + dts_correction > last_dts) {
  92.                     current_dts += dts_correction;
  93.                     dts_correction = 0;
  94.                 } else {
  95.                     dts_correction += current_dts - last_dts - 1;
  96.                     current_dts = last_dts + 1;
  97.                 }
  98.                 last_dts = current_dts;
  99.                 distance++;
  100.                 stts_sample++;
  101.                 current_sample++;
  102.                 if (stts_index + 1 < sc->stts_count && stts_sample == sc->stts_data[stts_index].count) {
  103.                     stts_sample = 0;              //对于video来说有很多个stts的entries,所以这个stts_index是累加的
  104.                     stts_index++;                 //但对于sounde来说只有一个stts的entries,所以这个stts_index是不加的,一直为0
  105.                 }
  106.             }
  107.         }
  108.         if (st->duration > 0)
  109.             st->codec->bit_rate = stream_size*8*sc->time_scale/st->duration;   //每条trak的bit_rate的计算
  110.     } else {                                                        //video的0x7f0bb=520379,audio的bit_rate=0x14ec7=85703
  111.         //这个else没有用到
  112.     }
  113. }



video的dts的由来:
AVIndex stream=0, sample=0x0, offset=0x30, dts=-1001, size=0x1333, distance=0, keyframe=1
AVIndex stream=0, sample=0x1, offset=0x137d, dts=0x0, size=0xf6f, distance=1, keyframe=0
AVIndex stream=0, sample=0x2, offset=0x253c, dts=0xbbb, size=0x991, distance=2, keyframe=0
AVIndex stream=0, sample=0x3, offset=0x3143, dts=0x138d, size=0x9ab, distance=3, keyframe=0
AVIndex stream=0, sample=0x4, offset=0x3ca7, dts=0x1776, size=0x8e4, distance=4, keyframe=0
第0个dts就是从 video_trak的elst中解析出来的media time=0x3e9=1001 ,
然后把这个值 current_dts = -sc->time_offset; 取了个负值,所以dts_0 =-1001
以后的dts就是dts_0与sample_duration(在stts中)累加
00 020b a873 7474 73     -->stts的长度=0x20ba8,type=stts
00 0000 00               -->stts的version与flag
00 0041 73               -->entries=0x4173=16755    ::剩下的就是sample_count与sample_duration的entry
00 0000 01               -->sample_count=0x01       ::sample_count=1, sample_duration=1001
00 0003 e9               -->sample_duration=0x3e9   
00 0000 01               -->sample_count=0x1        ::sample_count=1, sample_duration=3003
00 000b bb               -->sample_duration=0xbbb
...

sound的dts的由来:
sc->chunk_count=0xe10c
AVIndex stream=1, sample=0x0, offset=0x1363, dts=0x0, size=0x1a, distance=0, keyframe=1
AVIndex stream=1, sample=0x1, offset=0x22ec, dts=0x400, size=0x9, distance=0, keyframe=1
AVIndex stream=1, sample=0x2, offset=0x22f5, dts=0x800, size=0x9, distance=0, keyframe=1
AVIndex stream=1, sample=0x3, offset=0x22fe, dts=0xc00, size=0xa1, distance=0, keyframe=1
AVIndex stream=1, sample=0x4, offset=0x239f, dts=0x1000, size=0xc9, distance=0, keyframe=1
sound没有elst这个box,所以 current_dts = 0,所以dts_0 =0
以后的dts就是dts_0与sample_duration(在stts中)累加
但sounde只有一个stts的entries,所以这个sample_duration=0x400,恒定的

  1. 00 0000 1873 7474 73           -->stts的长度=0x18,type=stts
  2. 00 0000 00                     -->stts的version与flag 
  3. 00 0000 01                     -->entries=0x01
  4. 00 00e1 0c                     -->sample_count=0xe10c=67612
  5. 00 0004 00                     -->sample_duration=0x400


  1. static int mov_read_header(AVFormatContext *s)
  2. {
  3.     MOVContext *mov = s->priv_data;
  4.     AVIOContext *pb = s->pb;
  5.     int j, err;
  6.     MOVAtom atom = { AV_RL32("root") };
  7.     int i;

  8.     mov->fc = s;
  9.     mov->trak_index = -1;
  10.     /* .mov and .mp4 aren't streamable anyway (only progressive download if moov is before mdat) */
  11.     if (pb->seekable)
  12.         atom.size = avio_size(pb);
  13.     else
  14.         atom.size = INT64_MAX;

  15.     /* check MOV header */
  16.     do {
  17.         if (mov->moov_retry)
  18.             avio_seek(pb, 0, SEEK_SET);
  19.         if ((err = mov_read_default(mov, pb, atom)) < 0) {
  20.             av_log(s, AV_LOG_ERROR, "error reading header\n");
  21.             mov_read_close(s);
  22.             return err;
  23.         }
  24.     } while (pb->seekable && !mov->found_moov && !mov->moov_retry++);
  25.     if (!mov->found_moov) {
  26.         av_log(s, AV_LOG_ERROR, "moov atom not found\n");
  27.         mov_read_close(s);
  28.         return AVERROR_INVALIDDATA;
  29.     }
  30.     if (pb->seekable) {
  31.         if (mov->chapter_track > 0 && !mov->ignore_chapters)
  32.             mov_read_chapters(s);
  33.         for (i = 0; i < s->nb_streams; i++)
  34.             if (s->streams[i]->codec->codec_tag == AV_RL32("tmcd"))
  35.                 mov_read_timecode_track(s, s->streams[i]);
  36.     }

  37.     /* copy timecode metadata from tmcd tracks to the related video streams */
  38.     for (i = 0; i < s->nb_streams; i++) {
  39.         AVStream *st = s->streams[i];
  40.         MOVStreamContext *sc = st->priv_data;
  41.         if (sc->timecode_track > 0) {
  42.             AVDictionaryEntry *tcr;
  43.             int tmcd_st_id = -1;

  44.             for (j = 0; j < s->nb_streams; j++)
  45.                 if (s->streams[j]->id == sc->timecode_track)
  46.                     tmcd_st_id = j;

  47.             if (tmcd_st_id < 0 || tmcd_st_id == i)
  48.                 continue;
  49.             tcr = av_dict_get(s->streams[tmcd_st_id]->metadata, "timecode", NULL, 0);
  50.             if (tcr)
  51.                 av_dict_set(&st->metadata, "timecode", tcr->value, 0);
  52.         }
  53.     }
  54.     export_orphan_timecode(s);

  55.     for (i = 0; i < s->nb_streams; i++) {
  56.         AVStream *st = s->streams[i];
  57.         MOVStreamContext *sc = st->priv_data;
  58.         fix_timescale(mov, sc);
  59.         if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO && st->codec->codec_id == AV_CODEC_ID_AAC) {
  60.             st->skip_samples = sc->start_pad;
  61.         }
  62.         if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && sc->nb_frames_for_fps > 0 && sc->duration_for_fps > 0)
  63.             av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
  64.                     sc->time_scale*(int64_t)sc->nb_frames_for_fps, sc->duration_for_fps, INT_MAX);
  65.         if (st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
  66.             if (st->codec->width <= 0 || st->codec->height <= 0) {
  67.                 st->codec->width = sc->width;
  68.                 st->codec->height = sc->height;
  69.             }
  70.             if (st->codec->codec_id == AV_CODEC_ID_DVD_SUBTITLE) {
  71.                 if ((err = mov_rewrite_dvd_sub_extradata(st)) < 0)
  72.                     return err;
  73.             }
  74.         }
  75.         if (mov->handbrake_version &mov->handbrake_version <= 1000000*0 + 1000*10 + 2 && st->codec->codec_id == AV_CODEC_ID_MP3) {
  76.             st->need_parsing = AVSTREAM_PARSE_FULL;
  77.         }
  78.     }

  79.     if (mov->trex_data) {
  80.         for (i = 0; i < s->nb_streams; i++) {
  81.             AVStream *st = s->streams[i];
  82.             MOVStreamContext *sc = st->priv_data;
  83.             if (st->duration > 0)
  84.                 st->codec->bit_rate = sc->data_size * 8 * sc->time_scale / st->duration;
  85.         }
  86.     }

  87.     if (mov->use_mfra_for > 0) {
  88.         for (i = 0; i < s->nb_streams; i++) {
  89.             AVStream *st = s->streams[i];
  90.             MOVStreamContext *sc = st->priv_data;
  91.             if (sc->duration_for_fps > 0) {
  92.                 st->codec->bit_rate = sc->data_size * 8 * sc->time_scale /
  93.                     sc->duration_for_fps;
  94.             }
  95.         }
  96.     }

  97.     for (i = 0; i < mov->bitrates_count && i < s->nb_streams; i++) {
  98.         if (mov->bitrates[i]) {
  99.             s->streams[i]->codec->bit_rate = mov->bitrates[i];
  100.         }
  101.     }

  102.     ff_rfps_calculate(s);

  103.     for (i = 0; i < s->nb_streams; i++) {
  104.         AVStream *st = s->streams[i];
  105.         MOVStreamContext *sc = st->priv_data;

  106.         switch (st->codec->codec_type) {
  107.             case AVMEDIA_TYPE_AUDIO:
  108.                 err = ff_replaygain_export(st, s->metadata);
  109.                 if (err < 0) {
  110.                     mov_read_close(s);
  111.                     return err;
  112.                 }
  113.                 break;
  114.             case AVMEDIA_TYPE_VIDEO:
  115.                 if (sc->display_matrix) {
  116.                     AVPacketSideData *sd, *tmp;

  117.                     tmp = av_realloc_array(st->side_data,
  118.                             st->nb_side_data + 1, sizeof(*tmp));
  119.                     if (!tmp)
  120.                         return AVERROR(ENOMEM);

  121.                     st->side_data = tmp;
  122.                     st->nb_side_data++;

  123.                     sd = &st->side_data[st->nb_side_data - 1];
  124.                     sd->type = AV_PKT_DATA_DISPLAYMATRIX;
  125.                     sd->size = sizeof(int32_t) * 9;
  126.                     sd->data = (uint8_t*)sc->display_matrix;
  127.                     sc->display_matrix = NULL;
  128.                 }
  129.                 break;
  130.         }
  131.     }
  132.     ff_configure_buffers_for_index(s, AV_TIME_BASE);

  133.     return 0;
  134. }



  1. static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom)
  2. {
  3.     int64_t total_size = 0;
  4.     MOVAtom a;
  5.     int i;

  6.     if (c->atom_depth > 10) {
  7.         return AVERROR_INVALIDDATA;
  8.     }
  9.     c->atom_depth ++;

  10.     if (atom.size < 0)
  11.         atom.size = INT64_MAX;
  12.     while (total_size + 8 <= atom.size && !avio_feof(pb)) {
  13.         int (*parse)(MOVContext*, AVIOContext*, MOVAtom) = NULL;
  14.         a.size = atom.size;
  15.         a.type=0;
  16.         if (atom.size >= 8) {
  17.             a.size = avio_rb32(pb);
  18.             a.type = avio_rl32(pb);
  19.             if (a.type == MKTAG('f','r','e','e') &&
  20.                     a.size >= 8 &&
  21.                     c->moov_retry) {
  22.                 uint8_t buf[8];
  23.                 uint32_t *type = (uint32_t *)buf + 1;
  24.                 if (avio_read(pb, buf, 8) != 8)
  25.                     return AVERROR_INVALIDDATA;
  26.                 avio_seek(pb, -8, SEEK_CUR);
  27.                 if (*type == MKTAG('m','v','h','d') ||
  28.                         *type == MKTAG('c','m','o','v')) {
  29.                     a.type = MKTAG('m','o','o','v');
  30.                 }
  31.             }
  32.             if (atom.type != MKTAG('r','o','o','t') &atom.type != MKTAG('m','o','o','v'))
  33.             {
  34.                 if (a.type == MKTAG('t','r','a','k') || a.type == MKTAG('m','d','a','t'))
  35.                 {
  36.                     avio_skip(pb, -8);
  37.                     c->atom_depth --;
  38.                     return 0;
  39.                 }
  40.             }
  41.             total_size += 8;
  42.             if (a.size == 1 && total_size + 8 <= atom.size) { /* 64 bit extended size */
  43.                 a.size = avio_rb64(pb) - 8;
  44.                 total_size += 8;
  45.             }
  46.         }
  47.         if (a.size == 0) {
  48.             a.size = atom.size - total_size + 8;
  49.         }
  50.         a.size -= 8;
  51.         if (a.size < 0)
  52.             break;
  53.         a.size = FFMIN(a.size, atom.size - total_size);

  54.         for (i = 0; mov_default_parse_table[i].type; i++)
  55.             if (mov_default_parse_table[i].type == a.type) {
  56.                 parse = mov_default_parse_table[i].parse;         //匹配type,调用各个box的读函数
  57.                 break;
  58.             }

  59.         if (!parse && (atom.type == MKTAG('u','d','t','a') ||
  60.                     atom.type == MKTAG('i','l','s','t')))
  61.             parse = mov_read_udta_string;

  62.         if (!parse && c->found_hdlr_mdta &&
  63.                 atom.type == MKTAG('m','e','t','a') &&
  64.                 a.type == MKTAG('k','e','y','s')) {
  65.             parse = mov_read_keys;
  66.         }

  67.         if (!parse) { /* skip leaf atoms data */
  68.             avio_skip(pb, a.size);
  69.         } else {
  70.             int64_t start_pos = avio_tell(pb);
  71.             int64_t left;
  72.             int err = parse(c, pb, a);
  73.             if (err < 0) {
  74.                 c->atom_depth --;
  75.                 return err;
  76.             }
  77.             if (c->found_moov && c->found_mdat &&
  78.                     ((!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX || c->fragment_index_complete) ||
  79.                      start_pos + a.size == avio_size(pb))) {
  80.                 if (!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX || c->fragment_index_complete)
  81.                     c->next_root_atom = start_pos + a.size;
  82.                 c->atom_depth --;
  83.                 return 0;
  84.             }
  85.             left = a.size - avio_tell(pb) + start_pos;
  86.             if (left > 0)
  87.                 avio_skip(pb, left);
  88.             else if (left < 0) {            
  89.                 avio_seek(pb, left, SEEK_CUR);
  90.             }
  91.         }

  92.         total_size += a.size;
  93.     }

  94.     if (total_size < atom.size && atom.size < 0x7ffff)
  95.         avio_skip(pb, atom.size - total_size);

  96.     c->atom_depth --;
  97.     return 0;
  98. }


所以box有如下:
  1. type='ftyp' ,parent='root',sz=32 8 102119991
  2. type='free' ,parent='root',sz=8 40 102119991
  3. type='mdat' ,parent='root',sz=101281678 48 102119991
  4. type='moov' ,parent='root',sz=838273 101281726 102119991
  5. type='mvhd' ,parent='moov',sz=108 8 838265
  6. type='trak' ,parent='moov',sz=376733 116 838265
  7. type='tkhd' ,parent='trak',sz=92 8 376725
  8. type='edts' ,parent='trak',sz=36 100 376725
  9. type='elst' ,parent='edts',sz=28 8 28
  10. type='mdia' ,parent='trak',sz=376597 136 376725
  11. type='mdhd' ,parent='mdia',sz=32 8 376589
  12. type='hdlr' ,parent='mdia',sz=45 40 376589
  13. type='minf' ,parent='mdia',sz=376512 85 376589
  14. type='vmhd' ,parent='minf',sz=20 8 376504
  15. type='dinf' ,parent='minf',sz=36 28 376504
  16. type='dref' ,parent='dinf',sz=28 8 28
  17. type='stbl' ,parent='minf',sz=376448 64 376504
  18. type='stsd' ,parent='stbl',sz=148 8 376440
  19. type='avcC' ,parent='stsd',sz=46 8 46
  20. type='stts' ,parent='stbl',sz=134056 156 376440
  21. type='stss' ,parent='stbl',sz=516 134212 376440
  22. type='ctts' ,parent='stbl',sz=81224 134728 376440
  23. type='stsc' ,parent='stbl',sz=28 215952 376440
  24. type='stsz' ,parent='stbl',sz=80236 215980 376440
  25. type='stco' ,parent='stbl',sz=80232 296216 376440
  26. type='trak' ,parent='moov',sz=461328 376849 838265
  27. type='tkhd' ,parent='trak',sz=92 8 461320
  28. type='mdia' ,parent='trak',sz=461228 100 461320
  29. type='mdhd' ,parent='mdia',sz=32 8 461220
  30. type='hdlr' ,parent='mdia',sz=45 40 461220
  31. type='minf' ,parent='mdia',sz=461143 85 461220
  32. type='smhd' ,parent='minf',sz=16 8 461135
  33. type='dinf' ,parent='minf',sz=36 24 461135
  34. type='dref' ,parent='dinf',sz=28 8 28
  35. type='stbl' ,parent='minf',sz=461083 60 461135
  36. type='stsd' ,parent='stbl',sz=91 8 461075
  37. type='esds' ,parent='stsd',sz=39 8 39
  38. type='stts' ,parent='stbl',sz=24 99 461075
  39. type='stsc' ,parent='stbl',sz=28 123 461075
  40. type='stsz' ,parent='stbl',sz=230468 151 461075
  41. type='stco' ,parent='stbl',sz=230464 230619 461075
  42. type='udta' ,parent='moov',sz=96 838177 838265
  43. type='meta' ,parent='udta',sz=88 8 88
  44. type='hdlr' ,parent='meta',sz=33 8 76
  45. type='ilst' ,parent='meta',sz=43 41 76
  46. type='?too' ,parent='ilst',sz=35 8 35



阅读(2286) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~