Merge branch 'master' of fraxinas@git.opendreambox.org:/git/enigma2
authorFraxinas <andreas.frisch@multimedia-labs.de>
Thu, 23 Apr 2009 11:24:13 +0000 (13:24 +0200)
committerFraxinas <andreas.frisch@multimedia-labs.de>
Thu, 23 Apr 2009 11:24:13 +0000 (13:24 +0200)
RecordTimer.py
lib/dvb/db.cpp
lib/dvb/db.h
lib/dvb/metaparser.cpp
lib/dvb/metaparser.h
lib/gdi/font.cpp
lib/service/iservice.h
lib/service/servicedvb.cpp
lib/service/servicedvbrecord.cpp
lib/service/servicedvbrecord.h

index d72197c..381720e 100644 (file)
@@ -184,24 +184,12 @@ class RecordTimerEntry(timer.TimerEntry, object):
                                if event_id is None:
                                        event_id = -1
 
-                       prep_res=self.record_service.prepare(self.Filename + ".ts", self.begin, self.end, event_id)
+                       prep_res=self.record_service.prepare(self.Filename + ".ts", self.begin, self.end, event_id, self.name.replace("\n", ""), self.description.replace("\n", ""), ' '.join(self.tags))
                        if prep_res:
-                               self.log(2, "'prepare' failed: error %d" % prep_res)
-                               NavigationInstance.instance.stopRecordService(self.record_service)
-                               self.record_service = None
-                               return False
-
-                       self.log(3, "prepare ok, writing meta information to %s" % self.Filename)
-                       try:
-                               f = open(self.Filename + ".ts.meta", "w")
-                               f.write(rec_ref.toString() + "\n")
-                               f.write(self.name.replace("\n", "") + "\n")
-                               f.write(self.description.replace("\n", "") + "\n")
-                               f.write(str(self.begin) + "\n")
-                               f.write(' '.join(self.tags))
-                               f.close()
-                       except IOError:
-                               self.log(4, "failed to write meta information")
+                               if prep_rest == 255:
+                                       self.log(4, "failed to write meta information")
+                               else:
+                                       self.log(2, "'prepare' failed: error %d" % prep_res)
                                NavigationInstance.instance.stopRecordService(self.record_service)
                                self.record_service = None
                                return False
index 647afad..ae30e36 100644 (file)
@@ -265,6 +265,42 @@ void eDVBDB::reloadServicelist()
        loadServicelist(CONFIGDIR"/enigma2/lamedb");
 }
 
+void eDVBDB::parseServiceData(ePtr<eDVBService> s, std::string str)
+{
+       while ((!str.empty()) && str[1]==':') // new: p:, f:, c:%02d...
+       {
+               size_t c=str.find(',');
+               char p=str[0];
+               std::string v;
+               if (c == std::string::npos)
+               {
+                       v=str.substr(2);
+                       str="";
+               } else
+               {
+                       v=str.substr(2, c-2);
+                       str=str.substr(c+1);
+               }
+//             eDebug("%c ... %s", p, v.c_str());
+               if (p == 'p')
+                       s->m_provider_name=v;
+               else if (p == 'f')
+               {
+                       sscanf(v.c_str(), "%x", &s->m_flags);
+               } else if (p == 'c')
+               {
+                       int cid, val;
+                       sscanf(v.c_str(), "%02d%x", &cid, &val);
+                       s->setCacheEntry((eDVBService::cacheID)cid,val);
+               } else if (p == 'C')
+               {
+                       int val;
+                       sscanf(v.c_str(), "%04x", &val);
+                       s->m_ca.push_front((uint16_t)val);
+               }
+       }
+}
+
        /* THIS CODE IS BAD. it should be replaced by somethine better. */
 void eDVBDB::loadServicelist(const char *file)
 {
@@ -425,44 +461,10 @@ void eDVBDB::loadServicelist(const char *file)
                fgets(line, 256, f);
                if (strlen(line))
                        line[strlen(line)-1]=0;
-               std::string str=line;
-
-               if (str[1]!=':')        // old ... (only service_provider)
-               {
+               if (line[1]!=':')       // old ... (only service_provider)
                        s->m_provider_name=line;
-               } else
-                       while ((!str.empty()) && str[1]==':') // new: p:, f:, c:%02d...
-                       {
-                               size_t c=str.find(',');
-                               char p=str[0];
-                               std::string v;
-                               if (c == std::string::npos)
-                               {
-                                       v=str.substr(2);
-                                       str="";
-                               } else
-                               {
-                                       v=str.substr(2, c-2);
-                                       str=str.substr(c+1);
-                               }
-//                             eDebug("%c ... %s", p, v.c_str());
-                               if (p == 'p')
-                                       s->m_provider_name=v;
-                               else if (p == 'f')
-                               {
-                                       sscanf(v.c_str(), "%x", &s->m_flags);
-                               } else if (p == 'c')
-                               {
-                                       int cid, val;
-                                       sscanf(v.c_str(), "%02d%x", &cid, &val);
-                                       s->setCacheEntry((eDVBService::cacheID)cid,val);
-                               } else if (p == 'C')
-                               {
-                                       int val;
-                                       sscanf(v.c_str(), "%04x", &val);
-                                       s->m_ca.push_front((uint16_t)val);
-                               }
-                       }
+               else
+                       parseServiceData(s, line);
                addService(ref, s);
        }
 
index 11fb1ab..098ee03 100644 (file)
@@ -70,6 +70,7 @@ public:
        void saveServicelist();
        void saveServicelist(const char *file);
        void reloadBouquets();
+       void parseServiceData(ePtr<eDVBService> s, std::string str);
 };
 
 #ifndef SWIG
index 175c7cd..24a5ab6 100644 (file)
@@ -67,6 +67,9 @@ int eDVBMetaParser::parseMeta(const std::string &tsname)
                case 6:
                        m_filesize = atoll(line);
                        break;
+               case 7:
+                       m_service_data = line;
+                       break;
                default:
                        break;
                }
@@ -145,7 +148,7 @@ int eDVBMetaParser::updateMeta(const std::string &tsname)
        FILE *f = fopen(filename.c_str(), "w");
        if (!f)
                return -ENOENT;
-       fprintf(f, "%s\n%s\n%s\n%d\n%s\n%d\n%lld\n", ref.toString().c_str(), m_name.c_str(), m_description.c_str(), m_time_create, m_tags.c_str(), m_length, m_filesize );
+       fprintf(f, "%s\n%s\n%s\n%d\n%s\n%d\n%lld\n%s\n", ref.toString().c_str(), m_name.c_str(), m_description.c_str(), m_time_create, m_tags.c_str(), m_length, m_filesize, m_service_data.c_str() );
        fclose(f);
        return 0;
 }
index 2ca94d6..38534d8 100644 (file)
@@ -9,19 +9,14 @@ class eDVBMetaParser
 public:
        eDVBMetaParser();
        int parseFile(const std::string &basename);
-       
        int parseMeta(const std::string &filename);
        int parseRecordings(const std::string &filename);
        int updateMeta(const std::string &basename);
-       
-       int m_data_ok;
-       
+
        eServiceReferenceDVB m_ref;
-       std::string m_name, m_description;
-       int m_time_create, m_length;
+       int m_data_ok, m_time_create, m_length;
+       std::string m_name, m_description, m_tags, m_service_data;
        long long m_filesize;
-       
-       std::string m_tags;
 };
 
 #endif
index 6a6007e..dfac144 100644 (file)
@@ -511,17 +511,6 @@ int eTextPara::renderString(const char *string, int rflags)
        if (!current_font)
                return -1;
 
-       if (!current_face)
-               eFatal("eTextPara::renderString: no current_face");
-       if (!current_face->size)
-               eFatal("eTextPara::renderString: no current_face->size");
-
-       if (cursor.y()==-1)
-       {
-               cursor=ePoint(area.x(), area.y()+(current_face->size->metrics.ascender>>6));
-               left=cursor.x();
-       }
-               
 #ifdef HAVE_FREETYPE2
        if ((FTC_Manager_LookupFace(fontRenderClass::instance->cacheManager,
                                    current_font->scaler.face_id,
@@ -544,7 +533,18 @@ int eTextPara::renderString(const char *string, int rflags)
                cache_current_font=&current_font->font.font;
        }
 #endif
-       
+
+       if (!current_face)
+               eFatal("eTextPara::renderString: no current_face");
+       if (!current_face->size)
+               eFatal("eTextPara::renderString: no current_face->size");
+
+       if (cursor.y()==-1)
+       {
+               cursor=ePoint(area.x(), area.y()+(current_face->size->metrics.ascender>>6));
+               left=cursor.x();
+       }
+
        std::vector<unsigned long> uc_string, uc_visual;
        if (string)
                uc_string.reserve(strlen(string));
index e27752a..97930a7 100644 (file)
@@ -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;
index 0e6229c..c844216 100644 (file)
@@ -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);
index 5b7b5d8..294315e 100644 (file)
@@ -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()
index 856f92b..e70547f 100644 (file)
@@ -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;