diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2012-10-25 19:16:32 +0400 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2012-10-25 19:17:23 +0400 |
commit | 9b8e62c7f49352ee55166e113577161fb1041b0f (patch) | |
tree | 737d3e7590b13cb620b56c0e4035c3152978e1e9 /demuxer | |
parent | 9aecb11582d0c79dd217102b3f1c2442c0b33902 (diff) |
Retry seeking on audio stream if video stream failed.
Diffstat (limited to 'demuxer')
-rw-r--r-- | demuxer/Demuxers/LAVFDemuxer.cpp | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/demuxer/Demuxers/LAVFDemuxer.cpp b/demuxer/Demuxers/LAVFDemuxer.cpp index 8a659e72..9436a97a 100644 --- a/demuxer/Demuxers/LAVFDemuxer.cpp +++ b/demuxer/Demuxers/LAVFDemuxer.cpp @@ -735,12 +735,13 @@ STDMETHODIMP CLAVFDemuxer::GetNextPacket(Packet **ppPacket) STDMETHODIMP CLAVFDemuxer::Seek(REFERENCE_TIME rTime) { - int videoStreamId = m_dActiveStreams[video]; + int seekStreamId = m_dActiveStreams[video]; int64_t seek_pts = 0; +retry: // If we have a video stream, seek on that one. If we don't, well, then don't! if (rTime > 0) { - if (videoStreamId != -1) { - AVStream *stream = m_avFormat->streams[videoStreamId]; + if (seekStreamId != -1) { + AVStream *stream = m_avFormat->streams[seekStreamId]; int64_t start_time = AV_NOPTS_VALUE; // MPEG-TS needs a protection against a wrapped around start time @@ -771,12 +772,17 @@ STDMETHODIMP CLAVFDemuxer::Seek(REFERENCE_TIME rTime) int flags = AVSEEK_FLAG_BACKWARD; - int ret = av_seek_frame(m_avFormat, videoStreamId, seek_pts, flags); + int ret = av_seek_frame(m_avFormat, seekStreamId, seek_pts, flags); if(ret < 0) { DbgLog((LOG_CUSTOM1, 1, L"::Seek() -- Key-Frame Seek failed")); - ret = av_seek_frame(m_avFormat, videoStreamId, seek_pts, flags | AVSEEK_FLAG_ANY); + ret = av_seek_frame(m_avFormat, seekStreamId, seek_pts, flags | AVSEEK_FLAG_ANY); if (ret < 0) { DbgLog((LOG_ERROR, 1, L"::Seek() -- Inaccurate Seek failed as well")); + if (seekStreamId == m_dActiveStreams[video] && seekStreamId != -1 && m_dActiveStreams[audio] != -1) { + DbgLog((LOG_ERROR, 1, L"::Seek() -- retrying seek on audio stream")); + seekStreamId = m_dActiveStreams[audio]; + goto retry; + } if (seek_pts == 0) return SeekByte(0, AVSEEK_FLAG_BACKWARD); } |