Ticket #11399: eitscannerpatch

File eitscannerpatch, 7.9 KB (added by Roger James <roger@…>, 8 years ago)
Line 
1diff --git a/mythtv/libs/libmythtv/eitcache.cpp b/mythtv/libs/libmythtv/eitcache.cpp
2index d42dacd..febaca9 100644
3--- a/mythtv/libs/libmythtv/eitcache.cpp
4+++ b/mythtv/libs/libmythtv/eitcache.cpp
5@@ -57,21 +57,21 @@ QString EITCache::GetStatistics(void) const
6         .arg((hitCnt+prunedHitCnt+wrongChannelHitCnt)/(double)accessCnt);
7 }
8 
9-static inline uint64_t construct_sig(uint tableid, uint version,
10+static inline uint64_t construct_sig(uint now_next_version, uint schedule_version,
11                                      uint endtime, bool modified)
12 {
13-    return (((uint64_t) modified  << 63) | ((uint64_t) tableid   << 40) |
14-            ((uint64_t) version   << 32) | ((uint64_t) endtime));
15+    return (((uint64_t) modified  << 63) | ((uint64_t) now_next_version   << 40) |
16+            ((uint64_t) schedule_version   << 32) | ((uint64_t) endtime));
17 }
18 
19-static inline uint extract_table_id(uint64_t sig)
20+static inline uint extract_now_next_version(uint64_t sig)
21 {
22     return (sig >> 40) & 0xff;
23 }
24 
25-static inline uint extract_version(uint64_t sig)
26+static inline uint extract_schedule_version(uint64_t sig)
27 {
28-    return (sig >> 32) & 0x1f;
29+    return (sig >> 32) & 0xff;
30 }
31 
32 static inline uint extract_endtime(uint64_t sig)
33@@ -97,8 +97,8 @@ static void replace_in_db(int chanid, uint eventid, uint64_t sig)
34     query.prepare(qstr);
35     query.bindValue(":CHANID",   chanid);
36     query.bindValue(":EVENTID",  eventid);
37-    query.bindValue(":TABLEID",  extract_table_id(sig));
38-    query.bindValue(":VERSION",  extract_version(sig));
39+    query.bindValue(":TABLEID",  extract_now_next_version(sig));
40+    query.bindValue(":VERSION",  extract_schedule_version(sig));
41     query.bindValue(":ENDTIME",  extract_endtime(sig));
42 
43     if (!query.exec())
44@@ -247,11 +247,14 @@ event_map_t * EITCache::LoadChannel(uint chanid)
45     while (query.next())
46     {
47         uint eventid = query.value(0).toUInt();
48-        uint tableid = query.value(1).toUInt();
49-        uint version = query.value(2).toUInt();
50+        uint now_next_version = query.value(1).toUInt();
51+        // Temp for change of use of tableid
52+        if (now_next_version > 0x4d)
53+            now_next_version = kVersionMax + 1;
54+        uint schedule_version = query.value(2).toUInt();
55         uint endtime = query.value(3).toUInt();
56 
57-        (*eventMap)[eventid] = construct_sig(tableid, version, endtime, false);
58+        (*eventMap)[eventid] = construct_sig(now_next_version, schedule_version, endtime, false);
59     }
60 
61     if (eventMap->size())
62@@ -319,7 +322,7 @@ bool EITCache::IsNewEIT(uint chanid,  uint tableid,   uint version,
63         WriteToDB();
64     }
65 
66-    // don't readd pruned entries
67+    // don't readdo pruned entries
68     if (endtime < lastPruneTime)
69     {
70         prunedHitCnt++;
71@@ -345,30 +348,63 @@ bool EITCache::IsNewEIT(uint chanid,  uint tableid,   uint version,
72     event_map_t::iterator it = eventMap->find(eventid);
73     if (it != eventMap->end())
74     {
75-        if (extract_table_id(*it) > tableid)
76-        {
77-            // EIT from lower (ie. better) table number
78-            tblChgCnt++;
79-        }
80-        else if ((extract_table_id(*it) == tableid) &&
81-                 ((extract_version(*it) < version) ||
82-                  ((extract_version(*it) == kVersionMax) &&
83-                   version < kVersionMax)))
84+       if ((0x4e == tableid) || (0x4f == tableid))
85+       {
86+           // The incoming event is for the now next tables
87+           if ((extract_now_next_version(*it) > kVersionMax) ||
88+            (extract_now_next_version(*it) < version) ||
89+            ((extract_now_next_version(*it) == kVersionMax) && version < kVersionMax))
90+           {
91+               // EIT updated version on current table
92+               verChgCnt++;
93+               LOG(VB_EIT, LOG_INFO, LOC + QString("Table version change now next - new %1 old %2 eventid %3 for chanid %4")
94+                   .arg(version).arg(extract_now_next_version(*it)).arg(eventid).arg(chanid));
95+                   eventMap->insert(eventid, construct_sig(version, extract_schedule_version(*it), endtime, true));
96+           }
97+           else
98+           {
99+               // EIT data previously seen
100+               hitCnt++;
101+               return false;
102+           }
103+       }
104+       else
105+       {
106+           // The incoming event is for the now schedule tables
107+           if ((extract_schedule_version(*it) > kVersionMax) ||
108+            (extract_schedule_version(*it) < version) ||
109+            ((extract_schedule_version(*it) == kVersionMax) && version < kVersionMax))
110+           {
111+               // EIT updated version on current table
112+               verChgCnt++;
113+               LOG(VB_EIT, LOG_INFO, LOC + QString("Table version change schedule - new %1 old %2 eventid %3 for chanid %4")
114+                   .arg(version).arg(extract_schedule_version(*it)).arg(eventid).arg(chanid));
115+                   eventMap->insert(eventid, construct_sig(extract_now_next_version(*it), version, endtime, true));
116+           }
117+           else
118+           {
119+               // EIT data previously seen
120+               hitCnt++;
121+               return false;
122+           }
123+       }
124+    }
125+    else
126+    {
127+           // New entry
128+           if ((0x4e == tableid) || (0x4f == tableid))
129         {
130-            // EIT updated version on current table
131-            verChgCnt++;
132+               eventMap->insert(eventid, construct_sig(version, kVersionMax + 1, endtime, true));
133+           LOG(VB_EIT, LOG_INFO, LOC + QString("New entry - now_next_version %1 eventid %2").arg(version).arg(eventid));
134         }
135-        else
136+           else
137         {
138-            // EIT data previously seen
139-            hitCnt++;
140-            return false;
141+               eventMap->insert(eventid, construct_sig(kVersionMax + 1, version, endtime, true));
142+           LOG(VB_EIT, LOG_INFO, LOC + QString("New entry - schedule_version %1 eventid %2").arg(version).arg(eventid));
143         }
144+           entryCnt++;
145     }
146 
147-    eventMap->insert(eventid, construct_sig(tableid, version, endtime, true));
148-    entryCnt++;
149-
150     return true;
151 }
152 diff --git a/mythtv/libs/libmythtv/eithelper.cpp b/mythtv/libs/libmythtv/eithelper.cpp
153index 9ee2cc8..67121ed 100644
154--- a/mythtv/libs/libmythtv/eithelper.cpp
155+++ b/mythtv/libs/libmythtv/eithelper.cpp
156@@ -285,6 +285,9 @@ static inline void parse_dvb_component_descriptors(desc_list_t list,
157 
158 void EITHelper::AddEIT(const DVBEventInformationTable *eit)
159 {
160+    // Skip if not current
161+    if (!eit->IsCurrent())
162+        return;
163     uint descCompression = (eit->TableID() > 0x80) ? 2 : 1;
164     uint fix = fixup.value(eit->OriginalNetworkID() << 16);
165     fix |= fixup.value((((uint64_t)eit->TSID()) << 32) |
166@@ -475,6 +478,31 @@ void EITHelper::AddEIT(const DVBEventInformationTable *eit)
167             video_props, stars,
168             seriesId,  programId);
169 
170+       // If the event is from the now next table and the seriesId and programId are present
171+       // then test whether any recording rules match the seriesId amd programId. If not
172+       // then discard the event.
173+        // For a less argressive discard policy swap the following two lines
174+       //if (((0x4e == tableid) || (0x4f == tableid)) && (!seriesId.isEmpty() || !programId.isEmpty()))
175+       if ((0x4e == tableid) || (0x4f == tableid))
176+        {
177+            // Fix up the seriesId and programId
178+            DBEventEIT tempEvent(*event);
179+            tempEvent.fixup = EITFixUp::kFixGenericDVB;
180+            eitfixup->Fix(tempEvent);
181+            MSqlQuery query(MSqlQuery::InitCon());
182+            query.prepare("SELECT EXISTS(SELECT * FROM record WHERE seriesid = :SERIESID AND programid = :PROGRAMID)");
183+            query.bindValue(":SERIESID", tempEvent.seriesId);
184+            query.bindValue(":PROGRAMID", tempEvent.programId);
185+            if (!query.exec())
186+                MythDB::DBError("AddEIT", query);
187+            if (query.next())
188+                if (!query.value(0).toBool())
189+                {
190+                    LOG(VB_EIT, LOG_INFO, LOC + QString("Discarding now next event - eventid %1").arg(eit->EventID(i)));
191+                    continue;
192+                }
193+            LOG(VB_EIT, LOG_INFO, LOC + QString("Adding now next event to queue - eventid %1").arg(eit->EventID(i)));
194+        }
195         db_events.enqueue(event);
196     }
197 }