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)); HRESULT hr = m_lavfDemuxer->SeekByte(target + 4, AVSEEK_FLAG_BACKWARD); if (m_MVCPlayback && m_MVCFormatContext) { // Re-open to switch clip if needed CloseMVCExtensionDemuxer(); if (FAILED(OpenMVCExtensionDemuxer(m_NewClip))) return E_FAIL; // Adjust for clip offset int64_t seek_pts = 0; if (rTime > 0) { AVStream *stream = m_MVCFormatContext->streams[m_MVCStreamIndex]; rTime -= m_rtNewOffset; rTime -= 10000000; // seek one second before the target to ensure the MVC queue isn't out of sync for too long seek_pts = m_lavfDemuxer->ConvertRTToTimestamp(rTime, stream->time_base.num, stream->time_base.den); } if (seek_pts < 0) seek_pts = 0; av_seek_frame(m_MVCFormatContext, m_MVCStreamIndex, seek_pts, AVSEEK_FLAG_BACKWARD); } return hr; }
STDMETHODIMP CBDDemuxer::Seek(REFERENCE_TIME rTime) { int64_t prev = bd_tell(m_pBD); int64_t target = bd_find_seek_point(m_pBD, ConvertDSTimeTo90Khz(rTime)); DbgLog((LOG_TRACE, 1, "Seek Request: %I64u (time); %I64u (byte), %I64u (prev byte)", rTime, target, prev)); return m_lavfDemuxer->SeekByte(target, AVSEEK_FLAG_BACKWARD); }