X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/0ee9e6abfea296a1edced778f5c3ccd9d3f1e67b..17796962c6e917a4f1e30110a87aba64dc14039a:/lib/dvb/dvb.cpp diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 135d0547..13e3a179 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -52,6 +52,13 @@ RESULT eDVBResourceManager::getInstance(ePtr &ptr) return -1; } +ePtr NewResourceManagerPtr(void) +{ + ePtr ptr; + eDVBResourceManager::getInstance(ptr); + return ptr; +} + eDVBResourceManager::eDVBResourceManager() :m_releaseCachedChannelTimer(eApp) { @@ -529,7 +536,7 @@ int eDVBResourceManager::canAllocateFrontend(ePtr &fepar int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID& ignore) { - bool ret=3000; + int ret=30000; if (m_cached_channel) { eDVBChannel *cache_chan = (eDVBChannel*)&(*m_cached_channel); @@ -804,17 +811,17 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off eDebug("getNextSourceSpan, no decoding demux. forcing normal play"); return; } - + if (m_skipmode_n) { eDebug("skipmode %d:%d", m_skipmode_m, m_skipmode_n); max = m_skipmode_n; } - + eDebug("getNextSourceSpan, current offset is %08llx!", current_offset); - + current_offset += m_skipmode_m; - + while (!m_cue->m_seek_requests.empty()) { std::pair seek = m_cue->m_seek_requests.front(); @@ -840,6 +847,18 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off eDebug("seekTo: getCurrentPosition failed!"); continue; } + } else if (pts < 0) /* seek relative to end */ + { + pts_t len; + if (!getLength(len)) + { + eDebug("seeking relative to end. len=%lld, seek = %lld", len, pts); + pts += len; + } else + { + eWarning("getLength failed - can't seek relative to end!"); + continue; + } } if (relative == 1) /* pts relative */ @@ -870,7 +889,10 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off off_t offset = 0; if (m_tstools.getOffset(offset, pts)) + { + eDebug("get offset for pts=%lld failed!", pts); continue; + } eDebug("ok, resolved skip (rel: %d, diff %lld), now at %08llx", relative, pts, offset); current_offset = offset; @@ -1091,6 +1113,7 @@ RESULT eDVBChannel::playFile(const char *file) m_pvr_thread = new eFilePushThread(); m_pvr_thread->enablePVRCommit(1); + m_pvr_thread->setStreamMode(1); m_pvr_thread->setScatterGather(this); if (m_pvr_thread->start(file, m_pvr_fd_dst)) @@ -1203,7 +1226,7 @@ eCueSheet::eCueSheet() void eCueSheet::seekTo(int relative, const pts_t &pts) { { - eSingleLock l(m_lock); + eSingleLocker l(m_lock); m_seek_requests.push_back(std::pair(relative, pts)); } m_event(evtSeek); @@ -1211,14 +1234,14 @@ void eCueSheet::seekTo(int relative, const pts_t &pts) void eCueSheet::clear() { - eSingleLock l(m_lock); + eSingleLocker l(m_lock); m_spans.clear(); } void eCueSheet::addSourceSpan(const pts_t &begin, const pts_t &end) { { - eSingleLock l(m_lock); + eSingleLocker l(m_lock); m_spans.push_back(std::pair(begin, end)); } } @@ -1231,7 +1254,7 @@ void eCueSheet::commitSpans() void eCueSheet::setSkipmode(const pts_t &ratio) { { - eSingleLock l(m_lock); + eSingleLocker l(m_lock); m_skipmode_ratio = ratio; } m_event(evtSkipmode);