Mercurial > libavformat.hg
comparison matroskadec.c @ 3916:4a7174c2b34e libavformat
matroskadec: demux relevant subtitle packets after a seek
only works for subtitle tracks which were properly indexed up to the seek point
author | aurel |
---|---|
date | Tue, 09 Sep 2008 12:10:25 +0000 |
parents | 7643d7c3fcf6 |
children | 6339a1e029de |
comparison
equal
deleted
inserted
replaced
3915:7643d7c3fcf6 | 3916:4a7174c2b34e |
---|---|
1469 if (is_keyframe) | 1469 if (is_keyframe) |
1470 av_add_index_entry(st, cluster_pos, timecode, 0,0,AVINDEX_KEYFRAME); | 1470 av_add_index_entry(st, cluster_pos, timecode, 0,0,AVINDEX_KEYFRAME); |
1471 track->end_timecode = FFMAX(track->end_timecode, timecode+duration); | 1471 track->end_timecode = FFMAX(track->end_timecode, timecode+duration); |
1472 } | 1472 } |
1473 | 1473 |
1474 if (matroska->skip_to_keyframe) { | 1474 if (matroska->skip_to_keyframe && track->type != MATROSKA_TRACK_TYPE_SUBTITLE) { |
1475 if (!is_keyframe || timecode < matroska->skip_to_timecode) | 1475 if (!is_keyframe || timecode < matroska->skip_to_timecode) |
1476 return res; | 1476 return res; |
1477 matroska->skip_to_keyframe = 0; | 1477 matroska->skip_to_keyframe = 0; |
1478 } | 1478 } |
1479 | 1479 |
1687 | 1687 |
1688 static int matroska_read_seek(AVFormatContext *s, int stream_index, | 1688 static int matroska_read_seek(AVFormatContext *s, int stream_index, |
1689 int64_t timestamp, int flags) | 1689 int64_t timestamp, int flags) |
1690 { | 1690 { |
1691 MatroskaDemuxContext *matroska = s->priv_data; | 1691 MatroskaDemuxContext *matroska = s->priv_data; |
1692 MatroskaTrack *tracks = matroska->tracks.elem; | |
1692 AVStream *st = s->streams[stream_index]; | 1693 AVStream *st = s->streams[stream_index]; |
1693 int index; | 1694 int i, index, index_sub, index_min; |
1694 | 1695 |
1695 if (timestamp < 0) | 1696 if (timestamp < 0) |
1696 timestamp = 0; | 1697 timestamp = 0; |
1697 | 1698 |
1698 if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0) { | 1699 if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0) { |
1707 | 1708 |
1708 matroska_clear_queue(matroska); | 1709 matroska_clear_queue(matroska); |
1709 if (index < 0) | 1710 if (index < 0) |
1710 return 0; | 1711 return 0; |
1711 | 1712 |
1712 url_fseek(s->pb, st->index_entries[index].pos, SEEK_SET); | 1713 index_min = index; |
1714 for (i=0; i < matroska->tracks.nb_elem; i++) { | |
1715 tracks[i].end_timecode = 0; | |
1716 if (tracks[i].type == MATROSKA_TRACK_TYPE_SUBTITLE | |
1717 && !tracks[i].stream->discard != AVDISCARD_ALL) { | |
1718 index_sub = av_index_search_timestamp(tracks[i].stream, st->index_entries[index].timestamp, AVSEEK_FLAG_BACKWARD); | |
1719 if (index_sub >= 0 | |
1720 && st->index_entries[index_sub].pos < st->index_entries[index_min].pos | |
1721 && st->index_entries[index].timestamp - st->index_entries[index_sub].timestamp < 30000000000/matroska->time_scale) | |
1722 index_min = index_sub; | |
1723 } | |
1724 } | |
1725 | |
1726 url_fseek(s->pb, st->index_entries[index_min].pos, SEEK_SET); | |
1713 matroska->skip_to_keyframe = !(flags & AVSEEK_FLAG_ANY); | 1727 matroska->skip_to_keyframe = !(flags & AVSEEK_FLAG_ANY); |
1714 matroska->skip_to_timecode = st->index_entries[index].timestamp; | 1728 matroska->skip_to_timecode = st->index_entries[index].timestamp; |
1715 matroska->done = 0; | 1729 matroska->done = 0; |
1716 av_update_cur_dts(s, st, st->index_entries[index].timestamp); | 1730 av_update_cur_dts(s, st, st->index_entries[index].timestamp); |
1717 return 0; | 1731 return 0; |