comparison libmpdemux/demux_real.c @ 12665:751a27fc8895

index creation/reading behaviour just like the avi demuxer, patch based on work by Reza Jelveh, Moritz Bunkus und myself
author alex
date Fri, 25 Jun 2004 18:45:56 +0000
parents f63f71986487
children 0945a0a7ed98
comparison
equal deleted inserted replaced
12664:a27908f9ddbc 12665:751a27fc8895
205 205
206 if (next_header_pos > 0) 206 if (next_header_pos > 0)
207 goto read_index; 207 goto read_index;
208 208
209 end: 209 end:
210 demuxer->seekable = 1; /* got index, we're able to seek */
211 if (i == -256) 210 if (i == -256)
212 stream_reset(demuxer->stream); 211 stream_reset(demuxer->stream);
213 stream_seek(demuxer->stream, origpos); 212 stream_seek(demuxer->stream, origpos);
214 if (i == -256) 213 if (i == -256)
215 return 0; 214 return 0;
219 218
220 #if 1 219 #if 1
221 220
222 static void add_index_item(demuxer_t *demuxer, int stream_id, int timestamp, int offset) 221 static void add_index_item(demuxer_t *demuxer, int stream_id, int timestamp, int offset)
223 { 222 {
224 if (index_mode > 0 && (unsigned)stream_id < MAX_STREAMS) 223 if ((unsigned)stream_id < MAX_STREAMS)
225 { 224 {
226 real_priv_t *priv = demuxer->priv; 225 real_priv_t *priv = demuxer->priv;
227 real_index_table_t *index; 226 real_index_table_t *index;
228 if (priv->index_table_size[stream_id] >= priv->index_malloc_size[stream_id]) 227 if (priv->index_table_size[stream_id] >= priv->index_malloc_size[stream_id])
229 { 228 {
240 return; 239 return;
241 } 240 }
242 index = &priv->index_table[stream_id][priv->index_table_size[stream_id]++]; 241 index = &priv->index_table[stream_id][priv->index_table_size[stream_id]++];
243 index->timestamp = timestamp; 242 index->timestamp = timestamp;
244 index->offset = offset; 243 index->offset = offset;
245 demuxer->seekable = 1;
246 } 244 }
247 } 245 }
248 246
249 static void add_index_segment(demuxer_t *demuxer, int seek_stream_id, int seek_timestamp) 247 static void add_index_segment(demuxer_t *demuxer, int seek_stream_id, int seek_timestamp)
250 { 248 {
306 else 304 else
307 { 305 {
308 stream_skip(demuxer->stream, 14); 306 stream_skip(demuxer->stream, 14);
309 add_index_segment(demuxer, -1, -1); 307 add_index_segment(demuxer, -1, -1);
310 } 308 }
311 demuxer->seekable = 0;
312 for (i = 0; i < MAX_STREAMS; i++) 309 for (i = 0; i < MAX_STREAMS; i++)
313 { 310 {
314 if (priv->index_table_size[i] > 0) 311 if (priv->index_table_size[i] > 0)
315 { 312 {
316 dump_index(demuxer, i); 313 dump_index(demuxer, i);
317 demuxer->seekable = 1; /* got index, we're able to seek */
318 } 314 }
319 } 315 }
320 stream_reset(demuxer->stream); 316 stream_reset(demuxer->stream);
321 stream_seek(demuxer->stream, origpos); 317 stream_seek(demuxer->stream, origpos);
322 return 0; 318 return 0;
404 dump_index(demuxer, stream_id); 400 dump_index(demuxer, stream_id);
405 if (data_pos) 401 if (data_pos)
406 goto read_index; 402 goto read_index;
407 403
408 end: 404 end:
409 demuxer->seekable = 1; /* got index, we're able to seek */
410 if (i == -256) 405 if (i == -256)
411 stream_reset(demuxer->stream); 406 stream_reset(demuxer->stream);
412 stream_seek(demuxer->stream, origpos); 407 stream_seek(demuxer->stream, origpos);
413 if (i == -256) 408 if (i == -256)
414 return 0; 409 return 0;
1459 mp_msg(MSGT_DEMUX,MSGL_V,"Packets in file: %d\n", priv->num_of_packets); 1454 mp_msg(MSGT_DEMUX,MSGL_V,"Packets in file: %d\n", priv->num_of_packets);
1460 1455
1461 if (priv->num_of_packets == 0) 1456 if (priv->num_of_packets == 0)
1462 priv->num_of_packets = -10; 1457 priv->num_of_packets = -10;
1463 1458
1464 /* disable seeking */
1465 demuxer->seekable = 0;
1466 1459
1467 priv->audio_need_keyframe = 0; 1460 priv->audio_need_keyframe = 0;
1468 priv->video_after_seek = 0; 1461 priv->video_after_seek = 0;
1469 1462
1470 if (index_mode == 2) 1463 switch (index_mode){
1471 generate_index(demuxer); 1464 case -1: // untouched
1472 else if (priv->index_chunk_offset && (index_mode == 1)) 1465 if (priv->index_chunk_offset && (priv->index_chunk_offset < demuxer->movi_end))
1473 parse_index_chunk(demuxer); 1466 {
1467 parse_index_chunk(demuxer);
1468 demuxer->seekable = 1;
1469 }
1470 break;
1471 case 1: // use (generate index)
1472 if (priv->index_chunk_offset && (priv->index_chunk_offset < demuxer->movi_end))
1473 {
1474 parse_index_chunk(demuxer);
1475 demuxer->seekable = 1;
1476 } else {
1477 generate_index(demuxer);
1478 demuxer->seekable = 1;
1479 }
1480 break;
1481 case 2: // force generating index
1482 generate_index(demuxer);
1483 demuxer->seekable = 1;
1484 break;
1485 default: // do nothing
1486 break;
1487 }
1474 1488
1475 // detect streams: 1489 // detect streams:
1476 if(demuxer->video->id==-1 && v_streams>0){ 1490 if(demuxer->video->id==-1 && v_streams>0){
1477 // find the valid video stream: 1491 // find the valid video stream:
1478 if(!ds_fill_buffer(demuxer->video)){ 1492 if(!ds_fill_buffer(demuxer->video)){
1519 int next_offset = 0; 1533 int next_offset = 0;
1520 int cur_timestamp = 0; 1534 int cur_timestamp = 0;
1521 int streams = 0; 1535 int streams = 0;
1522 int retried = 0; 1536 int retried = 0;
1523 1537
1524 if ((index_mode != 1) && (index_mode != 2))
1525 return 0;
1526 1538
1527 if (sh_video && (unsigned)vid < MAX_STREAMS && priv->index_table_size[vid]) 1539 if (sh_video && (unsigned)vid < MAX_STREAMS && priv->index_table_size[vid])
1528 streams |= 1; 1540 streams |= 1;
1529 if (sh_audio && (unsigned)aid < MAX_STREAMS && priv->index_table_size[aid]) 1541 if (sh_audio && (unsigned)aid < MAX_STREAMS && priv->index_table_size[aid])
1530 streams |= 2; 1542 streams |= 2;