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>2013-06-22 13:23:29 +0400
committerHendrik Leppkes <h.leppkes@gmail.com>2013-06-22 13:28:59 +0400
commit6129e78cbf123f36472d9a43d94b4f1af29139b8 (patch)
tree89f6e814b28c189cd2190ff71a848e7bdf639d83 /demuxer
parent8a6fe68b2814d7b9cfe9c2dfb21a91799730cc52 (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.cpp16
-rw-r--r--demuxer/LAVSplitter/LAVSplitter.h1
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; }