1 diff -Naur enigma/include/lib/dvb/epgcache.h enigma_fix/include/lib/dvb/epgcache.h
2 --- enigma/include/lib/dvb/epgcache.h 2008-02-18 17:35:38.000000000 +0100
3 +++ enigma_fix/include/lib/dvb/epgcache.h 2008-02-18 17:06:58.000000000 +0100
7 __u8 isRunning, firstStart, haveData;
8 - void FixOverlapping(std::pair<eventMap,timeMap> &, time_t, int, const timeMap::iterator &, const uniqueEPGKey &);
9 + bool FixOverlapping(std::pair<eventMap,timeMap> &, time_t, int, const timeMap::iterator &, const uniqueEPGKey &);
10 int sectionRead(__u8 *data, int source);
11 static eEPGCache *instance;
13 diff -Naur enigma/lib/dvb/epgcache.cpp enigma_fix/lib/dvb/epgcache.cpp
14 --- enigma/lib/dvb/epgcache.cpp 2008-02-18 17:35:38.000000000 +0100
15 +++ enigma_fix/lib/dvb/epgcache.cpp 2008-02-18 17:34:01.000000000 +0100
17 int sid = data[ptr++] << 8;
20 -// WORKAROUND for wrong transmitted epg data (01.08.2006)
21 +// WORKAROUND for wrong transmitted epg data (01.10.2007)
24 switch( (tsid << 16) | sid )
26 case 0x0300f5: sid = 0xdc; break;
27 case 0x0400d2: sid = 0xe2; tsid = 0x11; break;
28 case 0x1100d3: sid = 0xe3; break;
29 + case 0x0100d4: sid = 0xe4; tsid = 4; break;
32 ////////////////////////////////////////////
35 #endif // ENABLE_PRIVATE_EPG
37 -void eEPGCache::FixOverlapping(std::pair<eventMap,timeMap> &servicemap, time_t TM, int duration, const timeMap::iterator &tm_it, const uniqueEPGKey &service)
38 +bool eEPGCache::FixOverlapping(std::pair<eventMap,timeMap> &servicemap, time_t TM, int duration, const timeMap::iterator &tm_it, const uniqueEPGKey &service)
41 timeMap::iterator tmp = tm_it;
42 while ((tmp->first+tmp->second->getDuration()-300) > TM)
46 __u16 event_id = tmp->second->getEventID();
47 servicemap.first.erase(event_id);
50 + EITEvent evt((eit_event_struct *)tmp->second->get(), service.tsid<<16|service.onid);
53 + localtime_r(&evt.start_time, &t);
54 + snprintf(tmp, 255, "%08x(%d), %d seconds, %02d.%02d, %02d:%02d",
55 + evt.event_id, evt.event_id,
57 + t.tm_mday, t.tm_mon+1,
58 + t.tm_hour, t.tm_min);
59 + eDebug("(1)erase no more used event %s", tmp);
63 if (tmp == servicemap.second.begin())
68 servicemap.second.erase(tmp--);
75 __u16 event_id = tmp->second->getEventID();
76 servicemap.first.erase(event_id);
79 + EITEvent evt((eit_event_struct *)tmp->second->get(), service.tsid<<16|service.onid);
82 + localtime_r(&evt.start_time, &t);
83 + snprintf(tmp, 255, "%08x(%d), %d seconds, %02d.%02d, %02d:%02d",
84 + evt.event_id, evt.event_id,
86 + t.tm_mday, t.tm_mon+1,
87 + t.tm_hour, t.tm_min);
88 + eDebug("(2)erase no more used event %s", tmp);
92 servicemap.second.erase(tmp++);
97 if (tmp == servicemap.second.end())
103 int eEPGCache::sectionRead(__u8 *data, int source)
105 if ( data[ptr-1] < 0x40 )
108 - uniqueEPGKey service( HILO(eit->service_id), HILO(eit->original_network_id), HILO(eit->transport_stream_id) );
109 + // Cablecom HACK.. for incorrect tsid/onid in eit data
110 + bool use_transponder_chid = source == SCHEDULE || (source == NOWNEXT && data[0] == 0x4E);
111 + uniqueEPGKey service( HILO(eit->service_id),
112 + use_transponder_chid ? current_service.onid : HILO(eit->original_network_id),
113 + use_transponder_chid ? current_service.tsid : HILO(eit->transport_stream_id) );
115 eit_event_struct* eit_event = (eit_event_struct*) (data+ptr);
118 eventData *tmp = ev_it->second;
119 ev_it->second = tm_it_tmp->second =
120 new eventData(eit_event, eit_event_size, source);
121 - FixOverlapping(servicemap, TM, duration, tm_it_tmp, service);
122 + if (FixOverlapping(servicemap, TM, duration, tm_it_tmp, service))
124 + prevEventIt = servicemap.first.end();
125 + prevTimeIt = servicemap.second.end();
131 tm_it=prevTimeIt=servicemap.second.insert( prevTimeIt, std::pair<const time_t, eventData*>( TM, evt ) );
134 - FixOverlapping(servicemap, TM, duration, tm_it, service);
137 if ( consistencyCheck )
140 ev_it->first, event_id );
143 + if (FixOverlapping(servicemap, TM, duration, tm_it, service))
145 + prevEventIt = servicemap.first.end();
146 + prevTimeIt = servicemap.second.end();