X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/0cb7bd236d96662117bf8928cedd953b7b68579f..61402686fd1130b5b183fbe853927180be1ba1e1:/lib/dvb/epgcache.h diff --git a/lib/dvb/epgcache.h b/lib/dvb/epgcache.h index 5dea4630..1da612de 100644 --- a/lib/dvb/epgcache.h +++ b/lib/dvb/epgcache.h @@ -4,12 +4,8 @@ #include #include #include +#include -// check if gcc version >= 3.4 -#if defined(__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || __GNUC__ == 4 ) -#else -#include -#endif #include #include @@ -74,26 +70,39 @@ struct uniqueEPGKey #define timeMap std::map #define channelMapIterator std::map::iterator - -#define tmpMap std::map > #define updateMap std::map -#if defined(__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ == 4 ) // check if gcc version >= 3.1 - #define eventCache __gnu_cxx::hash_map, __gnu_cxx::hash, uniqueEPGKey::equal> - namespace __gnu_cxx -#else // for older gcc use following - #define eventCache std::hash_map, std::hash, uniqueEPGKey::equal > - namespace std -#endif +struct hash_32 { -template<> struct hash + inline size_t operator()( const __u32 &x) const + { + return (x >> 8)&0xFFFF; + } +}; + +struct equal_32 +{ + inline size_t operator()(const __u32 &x, const __u32 &y) const + { + return x == y; + } +}; + +struct hash_uniqueEPGKey { inline size_t operator()( const uniqueEPGKey &x) const { - return (x.tsid << 16) | x.onid; + return (x.onid << 16) | x.tsid; } }; -} + +#if defined(__GNUC__) && ((__GNUC__ == 3 && __GNUC_MINOR__ >= 1) || __GNUC__ == 4 ) // check if gcc version >= 3.1 + #define eventCache __gnu_cxx::hash_map, hash_uniqueEPGKey, uniqueEPGKey::equal> + #define tidMap __gnu_cxx::hash_set<__u32, hash_32, equal_32> +#else // for older gcc use following + #define eventCache std::hash_map, hash_uniqueEPGKey, uniqueEPGKey::equal > + #define tidMap std::hash_map<__u32, hash_32, equal_32> +#endif class eventData { @@ -149,6 +158,7 @@ class eEPGCache: public eMainloop, private eThread, public Object ePtr channel; ePtr m_stateChangedConn, m_NowNextConn, m_ScheduleConn, m_ScheduleOtherConn; ePtr m_NowNextReader, m_ScheduleReader, m_ScheduleOtherReader; + tidMap seenSections[3], calcedSections[3]; void readData(const __u8 *data); void startChannel(); void startEPG(); @@ -211,7 +221,7 @@ private: // called from epgcache thread void save(); void load(); - int sectionRead(const __u8 *data, int source, channel_data *channel); + void sectionRead(const __u8 *data, int source, channel_data *channel); void gotMessage(const Message &message); void flushEPG(const uniqueEPGKey & s=uniqueEPGKey()); void cleanLoop();