1 Index: libs/libmythtv/siparser.cpp
2 ===================================================================
3 --- libs/libmythtv/siparser.cpp.orig 2006-06-20 17:36:06.000000000 -0400
4 +++ libs/libmythtv/siparser.cpp 2006-06-20 17:37:17.000000000 -0400
11 // Get a list of wanted languages and set up their priorities
12 // (Lowest number wins)
13 QStringList langPref = iso639_get_language_list();
15 VERBOSE(VB_SIPARSER, LOC + "SIParser Reset due to channel change");
18 +// Fill in our maps of channels/serviceID's we actually want EIT data for
19 +void SIParser::FillEITMaps(void)
21 + MSqlQuery query(MSqlQuery::InitCon());
23 + //TODO: Clean this.. maybe a couple defines?
24 + // Should this be sourceid specific?
25 + VERBOSE(VB_GENERAL, LOC + "FillEITMaps()");
26 + query.prepare("SELECT atscsrcid, mplexid, chanid FROM channel "
27 + "WHERE useonairguide = 1");
29 + if (!query.exec() || !query.isActive())
30 + MythContext::DBError("FillMaps ATSC ", query);
32 + while (query.next())
34 + int ServiceID = query.value(0).toInt();
35 + int mplexid = query.value(1).toInt();
37 + eitATSCMap[mplexid][ServiceID] = query.value(2).toInt();
40 + query.prepare("SELECT serviceid,networkid,transportid,chanid "
41 + "FROM dtv_multiplex,channel WHERE "
42 + "useonairguide = 1 AND "
43 + "channel.mplexid = dtv_multiplex.mplexid;");
45 + if (!query.exec() || !query.isActive())
46 + MythContext::DBError("FillMaps DVB ", query);
48 + // Check to see if we are interseted in this channel
49 + while (query.next())
51 + int ServiceID = query.value(0).toInt();
52 + int NetworkID = query.value(1).toInt();
53 + int TransportID = query.value(2).toInt();
55 + eitDVBMap[TransportID][NetworkID][ServiceID] = query.value(3).toInt();
59 +/* Return true if we want EIT data for this channel, otherwise false */
60 +bool SIParser::WantEIT(Event *e)
63 +// TODO: premap fill in a mplexid map for use here
66 +// return (eitATSCMap[mplexid][e.ServiceID] > 0)
69 + return (eitDVBMap[e->TransportID][e->NetworkID][e->ServiceID] > 0);
72 void SIParser::CheckTrackers()
75 @@ -1439,82 +1495,98 @@
77 // Event to use temporarily to fill in data
79 + event.TableID = head->table_id;
80 event.ServiceID = head->table_id_ext;
81 event.TransportID = buffer[0] << 8 | buffer[1];
82 event.NetworkID = buffer[2] << 8 | buffer[3];
83 event.EventID = buffer[pos] << 8 | buffer[pos+1];
84 - event.StartTime = ConvertDVBDate(&buffer[pos+2]);
86 - uint lenInSeconds = ((bcdtoint(buffer[pos+7] & 0xFF) * 3600) +
87 - (bcdtoint(buffer[pos+8] & 0xFF) * 60) +
88 - (bcdtoint(buffer[pos+9] & 0xFF)));
89 + if (WantEIT(&event) &&
90 + !(eitEventMap[head->table_id_ext][event.EventID] == event.EventID))
92 + VERBOSE(VB_EIT, QString(" WantEIT : %1 Event %2 ")
93 + .arg(event.ServiceID).arg(event.EventID));
95 - event.EndTime = event.StartTime.addSecs(lenInSeconds);
98 - if (event.ServiceID == EIT_DEBUG_SID)
100 - VERBOSE(VB_EIT, "SIParser: DVB Events: " +
101 - QString("ServiceID %1 EventID: %2 Time: %3 - %4")
102 - .arg(event.ServiceID).arg(event.EventID)
103 - .arg(event.StartTime.toString(QString("MM/dd hh:mm")))
104 - .arg(event.EndTime.toString(QString("hh:mm"))));
107 + event.StartTime = ConvertDVBDate(&buffer[pos+2]);
109 - // Hold short & extended event information from descriptors.
110 - const unsigned char *bestDescriptorSE = NULL;
111 - vector<const unsigned char*> bestDescriptorsEE;
113 - // Parse descriptors
114 - descriptors_length = ((buffer[pos+10] & 0x0F) << 8) | buffer[pos+11];
117 + uint lenInSeconds = ((bcdtoint(buffer[pos+7] & 0xFF) * 3600) +
118 + (bcdtoint(buffer[pos+8] & 0xFF) * 60) +
119 + (bcdtoint(buffer[pos+9] & 0xFF)));
121 - // Pick out EIT descriptors for later parsing, and parse others.
122 - while ((des_pos < (pos + descriptors_length)) && (des_pos <= size))
124 - des_pos += ProcessDVBEventDescriptors(
127 - bestPrioritySE, bestDescriptorSE,
128 - bestPriorityEE, bestDescriptorsEE, event);
130 + event.EndTime = event.StartTime.addSecs(lenInSeconds);
132 - // Parse extended event descriptions for the most preferred language
133 - for (uint i = 0; i < bestDescriptorsEE.size(); ++i)
135 - if (!bestDescriptorsEE[i])
137 +#ifdef EIT_DEBUG_SID
138 + if (event.ServiceID == EIT_DEBUG_SID)
140 + VERBOSE(VB_EIT, "SIParser: DVB Events: " +
141 + QString("ServiceID %1 EventID: %2 Time: %3 - %4")
142 + .arg(event.ServiceID).arg(event.EventID)
143 + .arg(event.StartTime.toString(QString("MM/dd hh:mm")))
144 + .arg(event.EndTime.toString(QString("hh:mm"))));
148 - uint8_t *desc = (uint8_t*) bestDescriptorsEE[i];
149 - uint descLen = desc[1];
150 - ProcessExtendedEventDescriptor(desc, descLen + 2, event);
152 + // Hold short & extended event information from descriptors.
153 + const unsigned char *bestDescriptorSE = NULL;
154 + vector<const unsigned char*> bestDescriptorsEE;
156 + // Parse descriptors
157 + descriptors_length = ((buffer[pos+10] & 0x0F) << 8) | buffer[pos+11];
161 + // Pick out EIT descriptors for later parsing, and parse others.
162 + while ((des_pos < (pos + descriptors_length)) && (des_pos <= size))
164 + des_pos += ProcessDVBEventDescriptors(
167 + bestPrioritySE, bestDescriptorSE,
168 + bestPriorityEE, bestDescriptorsEE, event);
171 - // Parse short event descriptor for the most preferred language
172 - if (bestDescriptorSE)
174 - uint8_t *desc = (uint8_t*) bestDescriptorSE;
175 - uint descLen = desc[1];
176 - ProcessShortEventDescriptor(desc, descLen + 2, event);
178 + // Parse extended event descriptions for the most preferred language
179 + for (uint i = 0; i < bestDescriptorsEE.size(); ++i)
181 + if (!bestDescriptorsEE[i])
185 + uint8_t *desc = (uint8_t*) bestDescriptorsEE[i];
186 + uint descLen = desc[1];
187 + ProcessExtendedEventDescriptor(desc, descLen + 2, event);
190 + // Parse short event descriptor for the most preferred language
191 + if (bestDescriptorSE)
193 + uint8_t *desc = (uint8_t*) bestDescriptorSE;
194 + uint descLen = desc[1];
195 + ProcessShortEventDescriptor(desc, descLen + 2, event);
201 - if (event.ServiceID == EIT_DEBUG_SID)
203 - VERBOSE(VB_EIT, "SIParser: DVB Events: " +
204 - QString("LanguageCode='%1' "
205 - "\n\t\t\tEvent_Name='%2' Description='%3'")
206 - .arg(event.LanguageCode).arg(event.Event_Name)
207 - .arg(event.Description));
209 + if (event.ServiceID == EIT_DEBUG_SID)
211 + VERBOSE(VB_EIT, "SIParser: DVB Events: " +
212 + QString("LanguageCode='%1' "
213 + "\n\t\t\tEvent_Name='%2' Description='%3'")
214 + .arg(event.LanguageCode).arg(event.Event_Name)
215 + .arg(event.Description));
219 - QMap2D_Events &events = ((EventHandler*) Table[EVENTS])->Events;
220 - events[head->table_id_ext][event.EventID] = event;
221 + QMap2D_Events &events = ((EventHandler*) Table[EVENTS])->Events;
222 + events[head->table_id_ext][event.EventID] = event;
227 + descriptors_length = ((buffer[pos+10] & 0x0F) << 8) | buffer[pos+11];
230 pos += descriptors_length;
233 Index: libs/libmythtv/sitypes.h
234 ===================================================================
235 --- libs/libmythtv/sitypes.h.orig 2006-06-20 17:31:10.000000000 -0400
236 +++ libs/libmythtv/sitypes.h 2006-06-20 17:36:06.000000000 -0400
238 typedef QMap<uint16_t,QMap_Events> QMap2D_Events;
239 typedef QMap<uint16_t,pidHandler> QMap_pidHandler;
241 +typedef QMap<uint16_t,int> QMap_intObject;
242 +typedef QMap<uint16_t,QMap_intObject> QMap2D_intObject;
243 +typedef QMap<uint16_t,QMap2D_intObject> QMap3D_intObject;
253 uint ServiceID; ///< NOT the Virtual Channel Number used by ATSC
256 Index: libs/libmythtv/siparser.h
257 ===================================================================
258 --- libs/libmythtv/siparser.h.orig 2006-06-20 17:31:10.000000000 -0400
259 +++ libs/libmythtv/siparser.h 2006-06-20 17:37:17.000000000 -0400
262 bool ReinitSIParser(const QString &si_std, uint service_id);
264 + // Functions to prepare and use a map of serviceid/transports we
265 + // want EIT data from
266 + void FillEITMaps(void);
267 + bool WantEIT(Event *e);
269 // Stops all collection of data and clears all values (on a channel change for example)
274 QMap<uint,uint> descCount;
275 mutable QMutex descLock;
277 + // EIT Service Maps
278 + QMap2D_intObject eitATSCMap;
279 + QMap3D_intObject eitDVBMap;
281 + // Previously Seen EIT event Maps
282 + QMap2D_intObject eitEventMap;