X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/5fc3149fdff52264866de0866c3f9f768a53a951..9b6b96172d1d20d9daf3c11bc5f0222f487d53d7:/lib/dvb/dvb.cpp diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index 8f4022ec..f215b906 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -310,7 +310,9 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse channel = m_cached_channel; return 0; } + m_cached_channel_state_changed_conn.disconnect(); m_cached_channel=0; + m_releaseCachedChannelTimer.stop(); } // eDebug("allocate channel.. %04x:%04x", channelid.transport_stream_id.get(), channelid.original_network_id.get()); @@ -358,7 +360,8 @@ RESULT eDVBResourceManager::allocateChannel(const eDVBChannelID &channelid, eUse return errChidNotFound; } m_cached_channel = channel = ch; - CONNECT(ch->m_stateChanged,eDVBResourceManager::DVBChannelStateChanged); + m_cached_channel_state_changed_conn = + CONNECT(ch->m_stateChanged,eDVBResourceManager::DVBChannelStateChanged); return 0; } @@ -389,7 +392,7 @@ void eDVBResourceManager::DVBChannelStateChanged(iDVBChannel *chan) void eDVBResourceManager::releaseCachedChannel() { - eDebug("release cached channel"); + eDebug("release cached channel (timer timeout)"); m_cached_channel=0; } @@ -398,7 +401,11 @@ RESULT eDVBResourceManager::allocateRawChannel(eUsePtr &channel, in ePtr fe; if (m_cached_channel) + { + m_cached_channel_state_changed_conn.disconnect(); m_cached_channel=0; + m_releaseCachedChannelTimer.stop(); + } if (allocateFrontendByIndex(fe, frontend_index)) return errNoFrontend; @@ -415,9 +422,6 @@ RESULT eDVBResourceManager::allocatePVRChannel(eUsePtr &channel) { ePtr demux; - if (m_cached_channel) - m_cached_channel=0; - eDVBChannel *ch; ch = new eDVBChannel(this, 0); @@ -681,13 +685,16 @@ void eDVBChannel::cueSheetEvent(int event) eDebug("skipmode ratio is %lld:90000, bitrate is %d bit/s", m_cue->m_skipmode_ratio, bitrate); /* i agree that this might look a bit like black magic. */ m_skipmode_n = 512*1024; /* must be 1 iframe at least. */ - m_skipmode_m = bitrate / 8 / 90000 * m_cue->m_skipmode_ratio; + m_skipmode_m = bitrate / 8 / 90000 * m_cue->m_skipmode_ratio / 8; + + if (m_cue->m_skipmode_ratio < 0) + m_skipmode_m -= m_skipmode_n; eDebug("resolved to: %d %d", m_skipmode_m, m_skipmode_n); if (abs(m_skipmode_m) < abs(m_skipmode_n)) { - eFatal("damn, something is wrong with this calculation"); + eWarning("something is wrong with this calculation"); m_skipmode_n = m_skipmode_m = 0; } @@ -762,8 +769,16 @@ void eDVBChannel::getNextSourceSpan(off_t current_offset, size_t bytes_read, off if (relative) { pts_t now; - /* we're using the decoder's timestamp here. this - won't work for radio (ouch). */ + if (!m_cue->m_decoder) + { + eDebug("no decoder - can't seek relative"); + continue; + } + if (m_cue->m_decoder->getPTS(0, now)) + { + eDebug("decoder getPTS failed, can't seek relative"); + continue; + } if (getCurrentPosition(m_cue->m_decoding_demux, now, 1)) { eDebug("seekTo: getCurrentPosition failed!"); @@ -934,7 +949,11 @@ RESULT eDVBChannel::playFile(const char *file) THEN DO A REAL FIX HERE! */ /* (this codepath needs to be improved anyway.) */ +#if HAVE_DVB_API_VERSION < 3 + m_pvr_fd_dst = open("/dev/pvr", O_WRONLY); +#else m_pvr_fd_dst = open("/dev/misc/pvr", O_WRONLY); +#endif if (m_pvr_fd_dst < 0) { eDebug("can't open /dev/misc/pvr - you need to buy the new(!) $$$ box! (%m)"); // or wait for the driver to be improved. @@ -992,39 +1011,30 @@ RESULT eDVBChannel::getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos, in if (!decoding_demux) return -1; - off_t begin = 0; - /* getPTS for offset 0 is cached, so it doesn't harm. */ - int r = m_tstools.getPTS(begin, pos); - if (r) - { - eDebug("tstools getpts(0) failed!"); - return r; - } - pts_t now; - /* TODO: this is a gross hack. */ - r = decoding_demux->getSTC(now, mode ? 128 : 0); - - if (r) + int r; + + if (mode == 0) /* demux */ { - eDebug("demux getSTC failed"); - return -1; - } + r = decoding_demux->getSTC(now, 0); + if (r) + { + eDebug("demux getSTC failed"); + return -1; + } + } else + now = pos; /* fixup supplied */ -// eDebug("STC: %08llx PTS: %08llx, diff %lld", now, pos, now - pos); - /* when we are less than 10 seconds before the start, return 0. */ - /* (we're just waiting for the timespam to start) */ - if ((now < pos) && ((pos - now) < 90000 * 10)) + off_t off = 0; /* TODO: fixme */ + r = m_tstools.fixupPTS(off, now); + if (r) { - pos = 0; - return 0; + eDebug("fixup PTS failed"); + return -1; } - if (now < pos) /* wrap around */ - pos = now + ((pts_t)1)<<33 - pos; - else - pos = now - pos; + pos = now; return 0; } @@ -1097,9 +1107,10 @@ void eCueSheet::setSkipmode(const pts_t &ratio) m_event(evtSkipmode); } -void eCueSheet::setDecodingDemux(iDVBDemux *demux) +void eCueSheet::setDecodingDemux(iDVBDemux *demux, iTSMPEGDecoder *decoder) { m_decoding_demux = demux; + m_decoder = decoder; } RESULT eCueSheet::connectEvent(const Slot1 &event, ePtr &connection)