Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/LAVFilters.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2012-10-25 19:16:32 +0400
committerHendrik Leppkes <h.leppkes@gmail.com>2012-10-25 19:17:23 +0400
commit9b8e62c7f49352ee55166e113577161fb1041b0f (patch)
tree737d3e7590b13cb620b56c0e4035c3152978e1e9 /demuxer
parent9aecb11582d0c79dd217102b3f1c2442c0b33902 (diff)
Retry seeking on audio stream if video stream failed.
Diffstat (limited to 'demuxer')
-rw-r--r--demuxer/Demuxers/LAVFDemuxer.cpp16
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);
}