Merge branch 'org.openembedded.dev' of git://git.openembedded.net/openembedded into...
[vuplus_openembedded] / packages / enigma / enigma / epgfix_backport.diff
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
4 @@ -315,7 +315,7 @@
5  
6         int state;
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;
12  
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
16 @@ -325,7 +325,7 @@
17                                         int sid = data[ptr++] << 8;
18                                         sid |= data[ptr++];
19  
20 -// WORKAROUND for wrong transmitted epg data (01.08.2006)
21 +// WORKAROUND for wrong transmitted epg data (01.10.2007)
22                                         if ( onid == 0x85 )
23                                         {
24                                                 switch( (tsid << 16) | sid )
25 @@ -336,6 +336,7 @@
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;
30                                                 }
31                                         }
32  ////////////////////////////////////////////
33 @@ -448,8 +449,9 @@
34  }
35  #endif // ENABLE_PRIVATE_EPG
36  
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)
39  {
40 +       bool ret = false;
41         timeMap::iterator tmp = tm_it;
42         while ((tmp->first+tmp->second->getDuration()-300) > TM)
43         {
44 @@ -464,6 +466,20 @@
45                 {
46                         __u16 event_id = tmp->second->getEventID();
47                         servicemap.first.erase(event_id);
48 +#ifdef EPG_DEBUG  
49 +                       {
50 +                               EITEvent evt((eit_event_struct *)tmp->second->get(), service.tsid<<16|service.onid);
51 +                               char tmp[255];
52 +                               struct tm t;
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,
56 +                                       evt.duration,
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);
60 +                       }
61 +#endif
62                         delete tmp->second;
63                         if (tmp == servicemap.second.begin())
64                         {
65 @@ -472,6 +488,7 @@
66                         }
67                         else
68                                 servicemap.second.erase(tmp--);
69 +                       ret = true;
70                 }
71                 else
72                 {
73 @@ -495,14 +512,30 @@
74                 {
75                         __u16 event_id = tmp->second->getEventID();
76                         servicemap.first.erase(event_id);
77 +#ifdef EPG_DEBUG
78 +                       {
79 +                               EITEvent evt((eit_event_struct *)tmp->second->get(), service.tsid<<16|service.onid);
80 +                               char tmp[255];
81 +                               struct tm t;
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,
85 +                                       evt.duration,
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);
89 +                       }
90 +#endif
91                         delete tmp->second;
92                         servicemap.second.erase(tmp++);
93 +                       ret = true;
94                 }
95                 else
96                         ++tmp;
97                 if (tmp == servicemap.second.end())
98                         break;
99         }
100 +       return ret;
101  }
102  
103  int eEPGCache::sectionRead(__u8 *data, int source)
104 @@ -560,7 +593,11 @@
105                 if ( data[ptr-1] < 0x40 )
106                         --ptr;
107  
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) );
114  
115                 eit_event_struct* eit_event = (eit_event_struct*) (data+ptr);
116                 int eit_event_size;
117 @@ -658,7 +695,11 @@
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))
123 +                                                       {
124 +                                                               prevEventIt = servicemap.first.end();
125 +                                                               prevTimeIt = servicemap.second.end();
126 +                                                       }
127                                                         delete tmp;
128                                                         goto next;
129                                                 }
130 @@ -730,8 +771,6 @@
131                                         tm_it=prevTimeIt=servicemap.second.insert( prevTimeIt, std::pair<const time_t, eventData*>( TM, evt ) );
132                                 }
133  
134 -                               FixOverlapping(servicemap, TM, duration, tm_it, service);
135 -
136  #if EPG_DEBUG
137                                 if ( consistencyCheck )
138                                 {
139 @@ -751,6 +790,11 @@
140                                                         ev_it->first, event_id );
141                                 }
142  #endif
143 +                               if (FixOverlapping(servicemap, TM, duration, tm_it, service))
144 +                               {
145 +                                       prevEventIt = servicemap.first.end();
146 +                                       prevTimeIt = servicemap.second.end();
147 +                               }
148                         }
149  next:
150  #if EPG_DEBUG