X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/b96f203b700c91e463eff20889d734119530bce0..77899dbcdd418844bb0749eeb2538b87eed4c83f:/lib/service/servicedvb.cpp diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 5f5aae65..8ff07250 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -20,6 +21,8 @@ #include #include +#include + #ifndef BYTE_ORDER #error no byte order defined! #endif @@ -246,6 +249,9 @@ RESULT eDVBPVRServiceOfflineOperations::getListOfFilenames(std::list -1 ) + { + __u8 buf[4096]; + int rd = ::read(fd, buf, 4096); + ::close(fd); + if ( rd > 12 /*EIT_LOOP_SIZE*/ ) + { + Event ev(buf); + ePtr event = new eServiceEvent; + ePtr empty; + event->parseFrom(&ev, (service.getTransportStreamID().get()<<16)|service.getOriginalNetworkID().get()); + m_event_handler.inject(event, 0); + m_event_handler.inject(empty, 1); + eDebug("injected"); + } + } + } + + if (m_is_pvr) + loadCuesheet(); + m_event(this, evStart); m_event((iPlayableService*)this, evSeekableStatusChanged); return 0; @@ -802,12 +837,18 @@ RESULT eDVBServicePlay::seekRelative(int direction, pts_t to) if ((m_timeshift_enabled ? m_service_handler_timeshift : m_service_handler).getPVRChannel(pvr_channel)) return -1; + int mode = 1; + + /* HACK until we have skip-AP api */ + if ((to > 0) && (to < 100)) + mode = 2; + to *= direction; if (!m_cue) return 0; - m_cue->seekTo(1, to); + m_cue->seekTo(mode, to); return 0; } @@ -1258,6 +1299,15 @@ void eDVBServicePlay::setCutList(PyObject *list) eDebug("adding %08llx, %d", pts, type); } m_cuesheet_changed = 1; + + cutlistToCuesheet(); + m_event((iPlayableService*)this, evCuesheetChanged); +} + +void eDVBServicePlay::setCutListEnable(int enable) +{ + m_cutlist_enabled = enable; + cutlistToCuesheet(); } void eDVBServicePlay::updateTimeshiftPids() @@ -1399,7 +1449,7 @@ void eDVBServicePlay::updateDecoder() if (m_decode_demux) m_decode_demux->getMPEGDecoder(m_decoder); if (m_cue) - m_cue->setDecodingDemux(m_decode_demux); + m_cue->setDecodingDemux(m_decode_demux, m_decoder); } if (m_decoder) @@ -1474,6 +1524,8 @@ void eDVBServicePlay::loadCuesheet() eDebug("cutfile not found!"); m_cuesheet_changed = 0; + cutlistToCuesheet(); + m_event((iPlayableService*)this, evCuesheetChanged); } void eDVBServicePlay::saveCuesheet() @@ -1505,6 +1557,57 @@ void eDVBServicePlay::saveCuesheet() m_cuesheet_changed = 0; } +void eDVBServicePlay::cutlistToCuesheet() +{ + if (!m_cue) + { + eDebug("no cue sheet"); + return; + } + m_cue->clear(); + + if (!m_cutlist_enabled) + { + m_cue->commitSpans(); + eDebug("cutlists where disabled"); + return; + } + + pts_t in = 0, out = 0, length = 0; + + getLength(length); + + std::multiset::iterator i(m_cue_entries.begin()); + + while (1) + { + if (i == m_cue_entries.end()) + out = length; + else { + if (i->what == 0) /* in */ + { + in = i++->where; + continue; + } else if (i->what == 1) /* out */ + out = i++->where; + else /* mark */ + { + i++; + continue; + } + } + + if (in != out) + m_cue->addSourceSpan(in, out); + + in = length; + + if (i == m_cue_entries.end()) + break; + } + m_cue->commitSpans(); +} + DEFINE_REF(eDVBServicePlay) eAutoInitPtr init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");