Mercurial > libavformat.hg
comparison avidec.c @ 977:8bb9cea3c2d3 libavformat
ODML index parsing support
author | michael |
---|---|
date | Wed, 01 Mar 2006 01:32:32 +0000 |
parents | edbe5c3717f9 |
children | d2e5dfdf4def |
comparison
equal
deleted
inserted
replaced
976:c4a67d8fa68f | 977:8bb9cea3c2d3 |
---|---|
35 int scale; | 35 int scale; |
36 int rate; | 36 int rate; |
37 int sample_size; /* audio only data */ | 37 int sample_size; /* audio only data */ |
38 int start; | 38 int start; |
39 | 39 |
40 int cum_len; /* temporary storage (used during seek) */ | 40 int64_t cum_len; /* temporary storage (used during seek) */ |
41 | 41 |
42 int prefix; ///< normally 'd'<<8 + 'c' or 'w'<<8 + 'b' | 42 int prefix; ///< normally 'd'<<8 + 'c' or 'w'<<8 + 'b' |
43 int prefix_count; | 43 int prefix_count; |
44 } AVIStream; | 44 } AVIStream; |
45 | 45 |
80 avi->riff_end += url_ftell(pb); /* RIFF chunk end */ | 80 avi->riff_end += url_ftell(pb); /* RIFF chunk end */ |
81 tag = get_le32(pb); | 81 tag = get_le32(pb); |
82 if (tag != MKTAG('A', 'V', 'I', ' ') && tag != MKTAG('A', 'V', 'I', 'X')) | 82 if (tag != MKTAG('A', 'V', 'I', ' ') && tag != MKTAG('A', 'V', 'I', 'X')) |
83 return -1; | 83 return -1; |
84 | 84 |
85 return 0; | |
86 } | |
87 | |
88 static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){ | |
89 ByteIOContext *pb = &s->pb; | |
90 int longs_pre_entry= get_le16(pb); | |
91 int index_sub_type = get_byte(pb); | |
92 int index_type = get_byte(pb); | |
93 int entries_in_use = get_le32(pb); | |
94 int chunk_id = get_le32(pb); | |
95 int64_t base = get_le64(pb); | |
96 int stream_id= 10*((chunk_id&0xFF) - '0') + (((chunk_id>>8)&0xFF) - '0'); | |
97 AVStream *st; | |
98 AVIStream *ast; | |
99 int i; | |
100 | |
101 // av_log(s, AV_LOG_ERROR, "longs_pre_entry:%d index_type:%d entries_in_use:%d chunk_id:%X base:%Ld\n", | |
102 // longs_pre_entry,index_type, entries_in_use, chunk_id, base); | |
103 | |
104 if(stream_id > s->nb_streams || stream_id < 0) | |
105 return -1; | |
106 st= s->streams[stream_id]; | |
107 ast = st->priv_data; | |
108 | |
109 if(index_sub_type) | |
110 return -1; | |
111 | |
112 get_le32(pb); | |
113 | |
114 if(index_type && longs_pre_entry != 2) | |
115 return -1; | |
116 if(index_type>1) | |
117 return -1; | |
118 | |
119 for(i=0; i<entries_in_use; i++){ | |
120 if(index_type){ | |
121 int64_t pos= get_le32(pb) + base; | |
122 int len = get_le32(pb); | |
123 | |
124 av_add_index_entry(st, pos, ast->cum_len, 0, (len<0) ? 0 : AVINDEX_KEYFRAME); | |
125 len &= 0x7FFFFFFF; | |
126 | |
127 if(ast->sample_size) | |
128 ast->cum_len += len / ast->sample_size; | |
129 else | |
130 ast->cum_len ++; | |
131 }else{ | |
132 int64_t offset= get_le64(pb); | |
133 int size = get_le32(pb); | |
134 int duration = get_le32(pb); | |
135 int64_t pos= url_ftell(pb); | |
136 | |
137 url_fseek(pb, offset+8, SEEK_SET); | |
138 read_braindead_odml_indx(s, frame_num); | |
139 frame_num += duration; | |
140 | |
141 url_fseek(pb, pos, SEEK_SET); | |
142 } | |
143 } | |
85 return 0; | 144 return 0; |
86 } | 145 } |
87 | 146 |
88 static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) | 147 static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap) |
89 { | 148 { |
324 url_fskip(pb, size); | 383 url_fskip(pb, size); |
325 break; | 384 break; |
326 } | 385 } |
327 } | 386 } |
328 break; | 387 break; |
388 case MKTAG('i', 'n', 'd', 'x'): | |
389 i= url_ftell(pb); | |
390 read_braindead_odml_indx(s, 0); | |
391 avi->index_loaded=1; | |
392 url_fseek(pb, i+size, SEEK_SET); | |
393 break; | |
329 default: | 394 default: |
330 /* skip tag */ | 395 /* skip tag */ |
331 size += (size & 1); | 396 size += (size & 1); |
332 url_fskip(pb, size); | 397 url_fskip(pb, size); |
333 break; | 398 break; |
342 av_freep(&s->streams[i]); | 407 av_freep(&s->streams[i]); |
343 } | 408 } |
344 return -1; | 409 return -1; |
345 } | 410 } |
346 | 411 |
347 assert(!avi->index_loaded); | 412 if(!avi->index_loaded) |
348 avi_load_index(s); | 413 avi_load_index(s); |
349 avi->index_loaded = 1; | 414 avi->index_loaded = 1; |
350 | 415 |
351 return 0; | 416 return 0; |
352 } | 417 } |
353 | 418 |