diff options
Diffstat (limited to 'lib/service')
| -rw-r--r-- | lib/service/iservice.h | 2 | ||||
| -rw-r--r-- | lib/service/servicedvb.cpp | 30 | ||||
| -rw-r--r-- | lib/service/servicedvbrecord.cpp | 48 | ||||
| -rw-r--r-- | lib/service/servicedvbrecord.h | 2 |
4 files changed, 77 insertions, 5 deletions
diff --git a/lib/service/iservice.h b/lib/service/iservice.h index bc0fc974..436d3554 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -444,7 +444,7 @@ class iRecordableService: public iObject ~iRecordableService(); #endif public: - virtual RESULT prepare(const char *filename)=0; + virtual RESULT prepare(const char *filename, time_t begTime=-1, time_t endTime=-1, int eit_event_id=-1)=0; virtual RESULT start()=0; virtual RESULT stop()=0; }; diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 3d551016..f9bb877f 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -11,6 +11,7 @@ #include <lib/dvb/decoder.h> #include <lib/service/servicedvbrecord.h> +#include <lib/service/event.h> #include <lib/dvb/metaparser.h> #include <lib/dvb/tstools.h> #include <lib/python/python.h> @@ -20,6 +21,8 @@ #include <byteswap.h> #include <netinet/in.h> +#include <dvbsi++/event_information_section.h> + #ifndef BYTE_ORDER #error no byte order defined! #endif @@ -248,6 +251,7 @@ RESULT eDVBPVRServiceOfflineOperations::getListOfFilenames(std::list<std::string res.push_back(m_ref.path + ".meta"); res.push_back(m_ref.path + ".ap"); res.push_back(m_ref.path + ".cuts"); + res.push_back(m_ref.path + ".eit"); return 0; } @@ -645,7 +649,31 @@ RESULT eDVBServicePlay::start() to start recording from the data demux. */ m_cue = new eCueSheet(); m_first_program_info = 1; - r = m_service_handler.tune((eServiceReferenceDVB&)m_reference, m_is_pvr, m_cue); + eServiceReferenceDVB &service = (eServiceReferenceDVB&)m_reference; + r = m_service_handler.tune(service, m_is_pvr, m_cue); + if (m_is_pvr) + { + std::string filename = service.path; + filename.erase(filename.length()-2, 2); + filename+="eit"; + int fd = ::open( filename.c_str(), O_RDONLY ); + if ( fd > -1 ) + { + __u8 buf[4096]; + int rd = ::read(fd, buf, 4096); + ::close(fd); + if ( rd > 12 /*EIT_LOOP_SIZE*/ ) + { + Event ev(buf); + ePtr<eServiceEvent> event = new eServiceEvent; + ePtr<eServiceEvent> 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"); + } + } + } m_event(this, evStart); m_event((iPlayableService*)this, evSeekableStatusChanged); return 0; diff --git a/lib/service/servicedvbrecord.cpp b/lib/service/servicedvbrecord.cpp index bded7cc9..a0359351 100644 --- a/lib/service/servicedvbrecord.cpp +++ b/lib/service/servicedvbrecord.cpp @@ -1,5 +1,6 @@ #include <lib/service/servicedvbrecord.h> #include <lib/base/eerror.h> +#include <lib/dvb/epgcache.h> #include <fcntl.h> @@ -37,11 +38,54 @@ void eDVBServiceRecord::serviceEvent(int event) } } -RESULT eDVBServiceRecord::prepare(const char *filename) +RESULT eDVBServiceRecord::prepare(const char *filename, time_t begTime, time_t endTime, int eit_event_id) { m_filename = filename; if (m_state == stateIdle) - return doPrepare(); + { + int ret = doPrepare(); + if (!ret) + { + eEPGCache::getInstance()->Lock(); + const eit_event_struct *event = 0; + if ( eit_event_id != -1 ) + { + eDebug("query epg event id %d", eit_event_id); + eEPGCache::getInstance()->lookupEventId(m_ref, eit_event_id, event); + } + if ( !event && (begTime != -1 && endTime != -1) ) + { + time_t queryTime = begTime + ((endTime-begTime)/2); + tm beg, end, query; + localtime_r(&begTime, &beg); + localtime_r(&endTime, &end); + localtime_r(&queryTime, &query); + eDebug("query stime %d:%d:%d, etime %d:%d:%d, qtime %d:%d:%d", + beg.tm_hour, beg.tm_min, beg.tm_sec, + end.tm_hour, end.tm_min, end.tm_sec, + query.tm_hour, query.tm_min, query.tm_sec); + eEPGCache::getInstance()->lookupEventTime(m_ref, queryTime, event); + } + if ( event ) + { + eDebug("found event.. store to disc"); + std::string fname = filename; + fname.erase(fname.length()-2, 2); + fname+="eit"; + int fd = open(fname.c_str(), O_CREAT|O_WRONLY, 0777); + if (fd>-1) + { + int evLen=HILO(event->descriptors_loop_length)+12/*EIT_LOOP_SIZE*/; + int wr = ::write( fd, (unsigned char*)event, evLen ); + if ( wr != evLen ) + eDebug("eit write error (%m)"); + ::close(fd); + } + } + eEPGCache::getInstance()->Unlock(); + } + return ret; + } else return -1; } diff --git a/lib/service/servicedvbrecord.h b/lib/service/servicedvbrecord.h index 7f08c554..25ca3e56 100644 --- a/lib/service/servicedvbrecord.h +++ b/lib/service/servicedvbrecord.h @@ -14,7 +14,7 @@ class eDVBServiceRecord: public iRecordableService, public Object { DECLARE_REF(eDVBServiceRecord); public: - RESULT prepare(const char *filename); + RESULT prepare(const char *filename, time_t begTime, time_t endTime, int eit_event_id); RESULT start(); RESULT stop(); private: |
