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