Mercurial > mplayer.hg
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; |