aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb/epgcache.h
diff options
context:
space:
mode:
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>2005-08-29 20:50:20 +0000
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>2005-08-29 20:50:20 +0000
commita434abbb775f2b4083ab0c7a7570ec14bd1cbce9 (patch)
tree7865456fbfddf291f4fc505cffded99bc2604fda /lib/dvb/epgcache.h
parentdf39d616cc296948524d227116bb82e7a7e3eb1b (diff)
downloadenigma2-a434abbb775f2b4083ab0c7a7570ec14bd1cbce9.tar.gz
enigma2-a434abbb775f2b4083ab0c7a7570ec14bd1cbce9.zip
optimize epg for less memory consumption,
add RESULT return values to lookupEvent, we need still a python interface for query the epgcache
Diffstat (limited to 'lib/dvb/epgcache.h')
-rw-r--r--lib/dvb/epgcache.h92
1 files changed, 60 insertions, 32 deletions
diff --git a/lib/dvb/epgcache.h b/lib/dvb/epgcache.h
index 1da612de..8a62325d 100644
--- a/lib/dvb/epgcache.h
+++ b/lib/dvb/epgcache.h
@@ -104,45 +104,39 @@ struct hash_uniqueEPGKey
#define tidMap std::hash_map<__u32, hash_32, equal_32>
#endif
+#define descriptorPair std::pair<int,__u8*>
+#define descriptorMap std::map<__u32, descriptorPair >
+
class eventData
{
friend class eEPGCache;
private:
__u8* EITdata;
int ByteSize;
+ static descriptorMap descriptors;
public:
int type;
static int CacheSize;
- eventData(const eit_event_struct* e, int size, int type)
- :ByteSize(size), type(type)
- {
- CacheSize+=size;
- EITdata = new __u8[size];
- if (e)
- memcpy(EITdata, (__u8*) e, size);
- }
- ~eventData()
- {
- CacheSize-=ByteSize;
- delete [] EITdata;
- }
+ static void load(FILE *);
+ static void save(FILE *);
+ eventData(const eit_event_struct* e, int size, int type);
+ ~eventData();
+ const eit_event_struct* get() const;
operator const eit_event_struct*() const
{
- return (const eit_event_struct*) EITdata;
- }
- const eit_event_struct* get() const
- {
- return (const eit_event_struct*) EITdata;
+ return get();
}
int getEventID()
{
- return HILO( ((const eit_event_struct*) EITdata)->event_id );
+ return (EITdata[0] << 8) | EITdata[1];
}
time_t getStartTime()
{
- return parseDVBtime(
- EITdata[2], EITdata[3],
- EITdata[4], EITdata[5], EITdata[6]);
+ return parseDVBtime(EITdata[2], EITdata[3], EITdata[4], EITdata[5], EITdata[6]);
+ }
+ int getDuration()
+ {
+ return fromBCD(EITdata[7])*3600+fromBCD(EITdata[8])*60+fromBCD(EITdata[9]);
}
};
@@ -239,30 +233,64 @@ public:
// called from main thread
inline void Lock();
inline void Unlock();
- Event *lookupEvent(const eServiceReferenceDVB &service, int event_id, bool plain=false );
- Event *lookupEvent(const eServiceReferenceDVB &service, time_t=0, bool plain=false );
- const eventMap* getEventMap(const eServiceReferenceDVB &service);
- const timeMap* getTimeMap(const eServiceReferenceDVB &service);
+
+ // result Event * must be deleted by caller of lookupEvent
+ inline RESULT lookupEvent(const eServiceReferenceDVB &service, int event_id, Event *& );
+ inline RESULT lookupEvent(const eServiceReferenceDVB &service, time_t , Event *& );
+
+ // methods for faster use.. but not thread save ..
+ // Lock and Unlock should be used !!
+ RESULT lookupEvent(const eServiceReferenceDVB &service, int event_id, const eventData *& );
+ RESULT lookupEvent(const eServiceReferenceDVB &service, time_t , const eventData *& );
+
+ inline RESULT getEventMap(const eServiceReferenceDVB &service, const eventMap *& );
+ inline RESULT getTimeMap(const eServiceReferenceDVB &service, const timeMap *& );
};
TEMPLATE_TYPEDEF(ePtr<eEPGCache>,eEPGCachePtr);
-inline const eventMap* eEPGCache::getEventMap(const eServiceReferenceDVB &service)
+inline RESULT eEPGCache::lookupEvent(const eServiceReferenceDVB &service, time_t t, Event *& result )
+{
+ const eventData *data=0;
+ RESULT ret = lookupEvent(service, t, data);
+ if ( !ret && data )
+ result = new Event((uint8_t*)data->get());
+ return ret;
+}
+
+inline RESULT eEPGCache::lookupEvent(const eServiceReferenceDVB &service, int event_id, Event *& result)
+{
+ const eventData *data=0;
+ RESULT ret = lookupEvent(service, event_id, data);
+ if ( !ret && data )
+ result = new Event((uint8_t*)data->get());
+ return ret;
+}
+
+inline RESULT eEPGCache::getEventMap(const eServiceReferenceDVB &service, const eventMap *& result)
{
eventCache::iterator It = eventDB.find( service );
if ( It != eventDB.end() && It->second.first.size() )
- return &(It->second.first);
- else
+ {
+ result=&(It->second.first);
return 0;
+ }
+ else
+ result=0;
+ return -1;
}
-inline const timeMap* eEPGCache::getTimeMap(const eServiceReferenceDVB &service)
+inline RESULT eEPGCache::getTimeMap(const eServiceReferenceDVB &service, const timeMap *& result)
{
eventCache::iterator It = eventDB.find( service );
if ( It != eventDB.end() && It->second.second.size() )
- return &(It->second.second);
- else
+ {
+ result=&(It->second.second);
return 0;
+ }
+ else
+ result=0;
+ return -1;
}
inline void eEPGCache::Lock()