diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-06-22 13:23:29 +0400 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-06-22 13:28:59 +0400 |
commit | 6129e78cbf123f36472d9a43d94b4f1af29139b8 (patch) | |
tree | 89f6e814b28c189cd2190ff71a848e7bdf639d83 /demuxer | |
parent | 8a6fe68b2814d7b9cfe9c2dfb21a91799730cc52 (diff) |
Improve accuracy of IAMExtendedSeeking::get_CurrentMarker
Previously it would report the demuxers internal position, which usually
is at least 10-20 seconds in the future. Instead, query the graph about
the current position.
Diffstat (limited to 'demuxer')
-rw-r--r-- | demuxer/Demuxers/LAVFDemuxer.cpp | 16 | ||||
-rw-r--r-- | demuxer/LAVSplitter/LAVSplitter.h | 1 |
2 files changed, 16 insertions, 1 deletions
diff --git a/demuxer/Demuxers/LAVFDemuxer.cpp b/demuxer/Demuxers/LAVFDemuxer.cpp index 57f0b2dd..bbdf4752 100644 --- a/demuxer/Demuxers/LAVFDemuxer.cpp +++ b/demuxer/Demuxers/LAVFDemuxer.cpp @@ -1109,10 +1109,24 @@ STDMETHODIMP CLAVFDemuxer::get_CurrentMarker(long* pCurrentMarker) *pCurrentMarker = 0; + REFERENCE_TIME rtCurrent = m_rtCurrent; + IFilterGraph *pGraph = m_pSettings->GetFilterGraph(); + if (pGraph) { + IMediaSeeking *pSeeking = NULL; + if (SUCCEEDED(pGraph->QueryInterface(&pSeeking))) { + if (FAILED(pSeeking->GetCurrentPosition(&rtCurrent))) { + DbgLog((LOG_TRACE, 10, L"get_CurrentMarker: Obtaining current playback position failed")); + rtCurrent = m_rtCurrent; + } + SafeRelease(&pSeeking); + } + SafeRelease(&pGraph); + } + // Can the time_base change in between chapters? // Anyhow, we do the calculation in the loop, just to be safe for(unsigned int i = 0; i < m_avFormat->nb_chapters; ++i) { - int64_t pts = ConvertRTToTimestamp(m_rtCurrent, m_avFormat->chapters[i]->time_base.num, m_avFormat->chapters[i]->time_base.den); + int64_t pts = ConvertRTToTimestamp(rtCurrent, m_avFormat->chapters[i]->time_base.num, m_avFormat->chapters[i]->time_base.den); // Check if the pts is in between the bounds of the chapter if (pts >= m_avFormat->chapters[i]->start) { *pCurrentMarker = (i + 1); diff --git a/demuxer/LAVSplitter/LAVSplitter.h b/demuxer/LAVSplitter/LAVSplitter.h index 9686506f..b5ac327f 100644 --- a/demuxer/LAVSplitter/LAVSplitter.h +++ b/demuxer/LAVSplitter/LAVSplitter.h @@ -177,6 +177,7 @@ public: STDMETHODIMP_(std::set<FormatInfo>&) GetInputFormats(); STDMETHODIMP_(BOOL) IsVC1CorrectionRequired(); STDMETHODIMP_(CMediaType *) GetOutputMediatype(int stream); + STDMETHODIMP_(IFilterGraph *) GetFilterGraph() { if (m_pGraph) { m_pGraph->AddRef(); return m_pGraph; } return NULL; } STDMETHODIMP_(DWORD) GetStreamFlags(DWORD dwStream) { if (m_pDemuxer) return m_pDemuxer->GetStreamFlags(dwStream); return 0; } STDMETHODIMP_(int) GetPixelFormat(DWORD dwStream) { if (m_pDemuxer) return m_pDemuxer->GetPixelFormat(dwStream); return AV_PIX_FMT_NONE; } |