diff options
| author | Fraxinas <andreas.frisch@multimedia-labs.de> | 2009-04-23 13:24:13 +0200 |
|---|---|---|
| committer | Fraxinas <andreas.frisch@multimedia-labs.de> | 2009-04-23 13:24:13 +0200 |
| commit | e21cff679bb73bce310e877d5219ec29291dbe10 (patch) | |
| tree | ca5ef1a2c77b6b588ebff4bb479f3485dd44529c /lib/service | |
| parent | 6ae5d719b93de2e8897a660ac61b0e9c5a190dde (diff) | |
| parent | 4b7061b946278825a03d7dd07a65056c3f4e1373 (diff) | |
| download | enigma2-e21cff679bb73bce310e877d5219ec29291dbe10.tar.gz enigma2-e21cff679bb73bce310e877d5219ec29291dbe10.zip | |
Merge branch 'master' of fraxinas@git.opendreambox.org:/git/enigma2
Diffstat (limited to 'lib/service')
| -rw-r--r-- | lib/service/iservice.h | 2 | ||||
| -rw-r--r-- | lib/service/servicedvb.cpp | 112 | ||||
| -rw-r--r-- | lib/service/servicedvbrecord.cpp | 107 | ||||
| -rw-r--r-- | lib/service/servicedvbrecord.h | 4 |
4 files changed, 161 insertions, 64 deletions
diff --git a/lib/service/iservice.h b/lib/service/iservice.h index e27752a2..97930a7b 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -848,7 +848,7 @@ public: virtual RESULT connectEvent(const Slot2<void,iRecordableService*,int> &event, ePtr<eConnection> &connection)=0; #endif virtual SWIG_VOID(RESULT) getError(int &SWIG_OUTPUT)=0; - virtual RESULT prepare(const char *filename, time_t begTime=-1, time_t endTime=-1, int eit_event_id=-1)=0; + virtual RESULT prepare(const char *filename, time_t begTime=-1, time_t endTime=-1, int eit_event_id=-1, const char *name=0, const char *descr=0, const char *tags=0)=0; virtual RESULT prepareStreaming()=0; virtual RESULT start(bool simulate=false)=0; virtual RESULT stop()=0; diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 0e6229c5..c8442161 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -860,30 +860,41 @@ RESULT eServiceFactoryDVB::offlineOperations(const eServiceReference &ref, ePtr< RESULT eServiceFactoryDVB::lookupService(ePtr<eDVBService> &service, const eServiceReference &ref) { - // TODO: handle the listing itself - // if (ref.... == -1) .. return "... bouquets ..."; - // could be also done in another serviceFactory (with seperate ID) to seperate actual services and lists - // TODO: cache - ePtr<iDVBChannelList> db; - ePtr<eDVBResourceManager> res; - - int err; - if ((err = eDVBResourceManager::getInstance(res)) != 0) + if (!ref.path.empty()) // playback { - eDebug("no resource manager"); - return err; + eDVBMetaParser parser; + int ret=parser.parseFile(ref.path); + service = new eDVBService; + if (!ret) + eDVBDB::getInstance()->parseServiceData(service, parser.m_service_data); } - if ((err = res->getChannelList(db)) != 0) + else { - eDebug("no channel list"); - return err; - } + // TODO: handle the listing itself + // if (ref.... == -1) .. return "... bouquets ..."; + // could be also done in another serviceFactory (with seperate ID) to seperate actual services and lists + // TODO: cache + ePtr<iDVBChannelList> db; + ePtr<eDVBResourceManager> res; + + int err; + if ((err = eDVBResourceManager::getInstance(res)) != 0) + { + eDebug("no resource manager"); + return err; + } + if ((err = res->getChannelList(db)) != 0) + { + eDebug("no channel list"); + return err; + } /* we are sure to have a ..DVB reference as the info() call was forwarded here according to it's ID. */ - if ((err = db->getService((eServiceReferenceDVB&)ref, service)) != 0) - { - eDebug("getService failed!"); - return err; + if ((err = db->getService((eServiceReferenceDVB&)ref, service)) != 0) + { + eDebug("getService failed!"); + return err; + } } return 0; @@ -916,6 +927,29 @@ eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *serv eDVBServicePlay::~eDVBServicePlay() { + if (m_is_pvr) + { + eDVBMetaParser meta; + int ret=meta.parseFile(m_reference.path); + if (!ret) + { + char tmp[255]; + meta.m_service_data=""; + sprintf(tmp, "f:%x", m_dvb_service->m_flags); + meta.m_service_data += tmp; + // cached pids + for (int x=0; x < eDVBService::cacheMax; ++x) + { + int entry = m_dvb_service->getCacheEntry((eDVBService::cacheID)x); + if (entry != -1) + { + sprintf(tmp, ",c:%02d%04x", x, entry); + meta.m_service_data += tmp; + } + } + meta.updateMeta(m_reference.path); + } + } delete m_subtitle_widget; } @@ -1028,7 +1062,7 @@ RESULT eDVBServicePlay::start() m_first_program_info = 1; eServiceReferenceDVB &service = (eServiceReferenceDVB&)m_reference; - r = m_service_handler.tune(service, m_is_pvr, m_cue); + r = m_service_handler.tune(service, m_is_pvr, m_cue, false, m_dvb_service); /* inject EIT if there is a stored one */ if (m_is_pvr) @@ -1425,7 +1459,7 @@ RESULT eDVBServicePlay::getName(std::string &name) ePtr<iStaticServiceInformation> i = new eStaticServiceDVBPVRInformation(m_reference); return i->getName(m_reference, name); } - if (m_dvb_service) + else if (m_dvb_service) { m_dvb_service->getName(m_reference, name); if (name.empty()) @@ -1524,10 +1558,34 @@ int eDVBServicePlay::getInfo(int w) break; } case sIsCrypted: if (no_program_info) return -1; return program.isCrypted(); - case sVideoPID: if (no_program_info) return -1; if (program.videoStreams.empty()) return -1; return program.videoStreams[0].pid; + case sVideoPID: + if (m_dvb_service) + { + int vpid = m_dvb_service->getCacheEntry(eDVBService::cVPID); + if (vpid != -1) + return vpid; + } + if (no_program_info) return -1; if (program.videoStreams.empty()) return -1; return program.videoStreams[0].pid; case sVideoType: if (no_program_info) return -1; if (program.videoStreams.empty()) return -1; return program.videoStreams[0].type; - case sAudioPID: if (no_program_info) return -1; if (program.audioStreams.empty()) return -1; return program.audioStreams[0].pid; - case sPCRPID: if (no_program_info) return -1; return program.pcrPid; + case sAudioPID: + if (m_dvb_service) + { + int apid = m_dvb_service->getCacheEntry(eDVBService::cAPID); + if (apid != -1) + return apid; + apid = m_dvb_service->getCacheEntry(eDVBService::cAC3PID); + if (apid != -1) + return apid; + } + if (no_program_info) return -1; if (program.audioStreams.empty()) return -1; return program.audioStreams[0].pid; + case sPCRPID: + if (m_dvb_service) + { + int pcrpid = m_dvb_service->getCacheEntry(eDVBService::cPCRPID); + if (pcrpid != -1) + return pcrpid; + } + if (no_program_info) return -1; return program.pcrPid; case sPMTPID: if (no_program_info) return -1; return program.pmtPid; case sTXTPID: if (no_program_info) return -1; return program.textPid; case sSID: return ((const eServiceReferenceDVB&)m_reference).getServiceID().get(); @@ -1708,7 +1766,7 @@ int eDVBServicePlay::selectAudioStream(int i) anything in the best case, or destroy the default setting in case the real default is not yet available.) */ - if (m_dvb_service && !m_is_pvr && ((i != -1) + if (m_dvb_service && ((i != -1) || ((m_dvb_service->getCacheEntry(eDVBService::cAPID) == -1) && (m_dvb_service->getCacheEntry(eDVBService::cAC3PID)==-1)))) { if (apidtype == eDVBAudio::aMPEG) @@ -2271,7 +2329,7 @@ void eDVBServicePlay::updateDecoder() ac3_delay = m_dvb_service->getCacheEntry(eDVBService::cAC3DELAY); pcm_delay = m_dvb_service->getCacheEntry(eDVBService::cPCMDELAY); } - else // subservice or recording + else // subservice { eServiceReferenceDVB ref; m_service_handler.getServiceReference(ref); @@ -2340,7 +2398,7 @@ void eDVBServicePlay::updateDecoder() m_decoder->setAudioChannel(achannel); /* don't worry about non-existing services, nor pvr services */ - if (m_dvb_service && !m_is_pvr) + if (m_dvb_service) { /* (audio pid will be set in selectAudioTrack */ m_dvb_service->setCacheEntry(eDVBService::cVPID, vpid); diff --git a/lib/service/servicedvbrecord.cpp b/lib/service/servicedvbrecord.cpp index 5b7b5d8c..294315e9 100644 --- a/lib/service/servicedvbrecord.cpp +++ b/lib/service/servicedvbrecord.cpp @@ -1,6 +1,7 @@ #include <lib/service/servicedvbrecord.h> #include <lib/base/eerror.h> #include <lib/dvb/epgcache.h> +#include <lib/dvb/metaparser.h> #include <fcntl.h> /* for cutlist */ @@ -83,7 +84,7 @@ void eDVBServiceRecord::serviceEvent(int event) } } -RESULT eDVBServiceRecord::prepare(const char *filename, time_t begTime, time_t endTime, int eit_event_id) +RESULT eDVBServiceRecord::prepare(const char *filename, time_t begTime, time_t endTime, int eit_event_id, const char *name, const char *descr, const char *tags) { m_filename = filename; m_streaming = 0; @@ -93,51 +94,89 @@ RESULT eDVBServiceRecord::prepare(const char *filename, time_t begTime, time_t e int ret = doPrepare(); if (!ret) { - eEPGCache::getInstance()->Lock(); - const eit_event_struct *event = 0; eServiceReferenceDVB ref = m_ref.getParentServiceReference(); + ePtr<eDVBResourceManager> res_mgr; + eDVBMetaParser meta; + std::string service_data; if (!ref.valid()) ref = m_ref; - if ( eit_event_id != -1 ) + if (!eDVBResourceManager::getInstance(res_mgr)) { - eDebug("query epg event id %d", eit_event_id); - eEPGCache::getInstance()->lookupEventId(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(ref, queryTime, event); + ePtr<iDVBChannelList> db; + if (!res_mgr->getChannelList(db)) + { + ePtr<eDVBService> service; + if (!db->getService(ref, service)) + { + char tmp[255]; + sprintf(tmp, "f:%x", service->m_flags); + service_data += tmp; + // cached pids + for (int x=0; x < eDVBService::cacheMax; ++x) + { + int entry = service->getCacheEntry((eDVBService::cacheID)x); + if (entry != -1) + { + sprintf(tmp, ",c:%02d%04x", x, entry); + service_data += tmp; + } + } + } + } } - if ( event ) + meta.m_time_create = begTime; + meta.m_ref = m_ref; + meta.m_data_ok = 1; + meta.m_service_data = service_data; + if (name) + meta.m_name = name; + if (descr) + meta.m_description = descr; + ret = meta.updateMeta(filename) ? -255 : 0; + if (!ret) { - 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) + const eit_event_struct *event = 0; + eEPGCache::getInstance()->Lock(); + if ( eit_event_id != -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); + eDebug("query epg event id %d", eit_event_id); + eEPGCache::getInstance()->lookupEventId(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(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(); } - eEPGCache::getInstance()->Unlock(); } return ret; } - else - return -1; + return -1; } RESULT eDVBServiceRecord::prepareStreaming() diff --git a/lib/service/servicedvbrecord.h b/lib/service/servicedvbrecord.h index 856f92b3..e70547f1 100644 --- a/lib/service/servicedvbrecord.h +++ b/lib/service/servicedvbrecord.h @@ -18,7 +18,7 @@ class eDVBServiceRecord: public eDVBServiceBase, DECLARE_REF(eDVBServiceRecord); public: RESULT connectEvent(const Slot2<void,iRecordableService*,int> &event, ePtr<eConnection> &connection); - RESULT prepare(const char *filename, time_t begTime, time_t endTime, int eit_event_id); + RESULT prepare(const char *filename, time_t begTime, time_t endTime, int eit_event_id, const char *name, const char *descr, const char *tags); RESULT prepareStreaming(); RESULT start(bool simulate=false); RESULT stop(); @@ -41,7 +41,7 @@ private: eServiceReferenceDVB m_ref; ePtr<iDVBTSRecorder> m_record; - ePtr<eConnection> m_con_record_event; + ePtr<eConnection> m_con_record_event; int m_recording, m_tuned, m_error; std::set<int> m_pids_active; |
