diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-11-05 23:38:04 +0400 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2013-11-05 23:38:04 +0400 |
commit | 60125d5802b59bed08e32d5a18a29aca42ad1700 (patch) | |
tree | 2a2de8699a5b0d050e7b22a98995c1ad21b547c6 /demuxer | |
parent | 5f3efe7e4341a0d645e0f25a1617f4df1003de74 (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.cpp | 14 | ||||
-rw-r--r-- | demuxer/Demuxers/BDDemuxer.h | 2 |
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; }; |