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-11-05 23:38:04 +0400
committerHendrik Leppkes <h.leppkes@gmail.com>2013-11-05 23:38:04 +0400
commit60125d5802b59bed08e32d5a18a29aca42ad1700 (patch)
tree2a2de8699a5b0d050e7b22a98995c1ad21b547c6 /demuxer
parent5f3efe7e4341a0d645e0f25a1617f4df1003de74 (diff)
Implement a workaround for BDs which have a clip without audio at the end.
Diffstat (limited to 'demuxer')
-rw-r--r--demuxer/Demuxers/BDDemuxer.cpp14
-rw-r--r--demuxer/Demuxers/BDDemuxer.h2
2 files changed, 16 insertions, 0 deletions
diff --git a/demuxer/Demuxers/BDDemuxer.cpp b/demuxer/Demuxers/BDDemuxer.cpp
index d8c672a8..0cf22592 100644
--- a/demuxer/Demuxers/BDDemuxer.cpp
+++ b/demuxer/Demuxers/BDDemuxer.cpp
@@ -107,6 +107,7 @@ CBDDemuxer::CBDDemuxer(CCritSec *pLock, ILAVFSettingsInternal *pSettings)
, m_rtNewOffset(0)
, m_bNewOffsetPos(0)
, m_nTitleCount(0)
+ , m_EndOfStreamPacketFlushProtection(FALSE)
{
#ifdef DEBUG
bd_set_debug_mask(DBG_FILE|DBG_BLURAY|DBG_DIR|DBG_NAV|DBG_CRIT);
@@ -261,6 +262,9 @@ void CBDDemuxer::ProcessBDEvents()
m_bNewOffsetPos = bytepos-4;
DbgLog((LOG_TRACE, 10, L"New clip! offset: %I64d bytepos: %I64u", m_rtNewOffset, bytepos));
}
+ m_EndOfStreamPacketFlushProtection = FALSE;
+ } else if (event.event == BD_EVENT_END_OF_TITLE) {
+ m_EndOfStreamPacketFlushProtection = TRUE;
}
}
}
@@ -283,6 +287,15 @@ STDMETHODIMP CBDDemuxer::GetNextPacket(Packet **ppPacket)
pPacket->rtStart += rtOffset;
pPacket->rtStop += rtOffset;
}
+
+ if (hr == S_OK && m_EndOfStreamPacketFlushProtection && pPacket && pPacket->bPosition != -1) {
+ if (pPacket->bPosition < m_bNewOffsetPos) {
+ DbgLog((LOG_TRACE, 10, L"Dropping packet from a pervious segment (pos %I64d, segment started at %I64d) at EOS, from stream %d", pPacket->bPosition, m_bNewOffsetPos, pPacket->StreamId));
+ SAFE_DELETE(*ppPacket);
+ *ppPacket = NULL;
+ return S_FALSE;
+ }
+ }
return hr;
}
@@ -437,6 +450,7 @@ STDMETHODIMP CBDDemuxer::Seek(REFERENCE_TIME rTime)
int64_t prev = bd_tell(m_pBD);
int64_t target = bd_find_seek_point(m_pBD, ConvertDSTimeTo90Khz(rTime));
+ m_EndOfStreamPacketFlushProtection = FALSE;
DbgLog((LOG_TRACE, 1, "Seek Request: %I64u (time); %I64u (byte), %I64u (prev byte)", rTime, target, prev));
return m_lavfDemuxer->SeekByte(target + 4, AVSEEK_FLAG_BACKWARD);
diff --git a/demuxer/Demuxers/BDDemuxer.h b/demuxer/Demuxers/BDDemuxer.h
index 85e22d59..d46bf884 100644
--- a/demuxer/Demuxers/BDDemuxer.h
+++ b/demuxer/Demuxers/BDDemuxer.h
@@ -92,4 +92,6 @@ private:
REFERENCE_TIME *m_rtOffset;
REFERENCE_TIME m_rtNewOffset;
int64_t m_bNewOffsetPos;
+
+ BOOL m_EndOfStreamPacketFlushProtection;
};