Ticket #1057: eitcache_8612.patch
File eitcache_8612.patch, 10.3 KB (added by , 20 years ago) |
---|
-
libs/libmythtv/siparser.cpp
80 80 81 81 Reset(); 82 82 83 FillEITMaps(); 84 83 85 // Get a list of wanted languages and set up their priorities 84 86 // (Lowest number wins) 85 87 QStringList langPref = iso639_get_language_list(); … … 145 147 VERBOSE(VB_SIPARSER, LOC + "SIParser Reset due to channel change"); 146 148 } 147 149 150 // Fill in our maps of channels/serviceID's we actually want EIT data for 151 void SIParser::FillEITMaps(void) 152 { 153 MSqlQuery query(MSqlQuery::InitCon()); 154 155 //TODO: Clean this.. maybe a couple defines? 156 // Should this be sourceid specific? 157 VERBOSE(VB_GENERAL, LOC + "FillEITMaps()"); 158 query.prepare("SELECT atscsrcid, mplexid, chanid FROM channel " 159 "WHERE useonairguide = 1"); 160 161 if (!query.exec() || !query.isActive()) 162 MythContext::DBError("FillMaps ATSC ", query); 163 164 while (query.next()) 165 { 166 int ServiceID = query.value(0).toInt(); 167 int mplexid = query.value(1).toInt(); 168 169 eitATSCMap[mplexid][ServiceID] = query.value(2).toInt(); 170 } 171 172 query.prepare("SELECT serviceid,networkid,transportid,chanid " 173 "FROM dtv_multiplex,channel WHERE " 174 "useonairguide = 1 AND " 175 "channel.mplexid = dtv_multiplex.mplexid;"); 176 177 if (!query.exec() || !query.isActive()) 178 MythContext::DBError("FillMaps DVB ", query); 179 180 // Check to see if we are interseted in this channel 181 while (query.next()) 182 { 183 int ServiceID = query.value(0).toInt(); 184 int NetworkID = query.value(1).toInt(); 185 int TransportID = query.value(2).toInt(); 186 187 eitDVBMap[TransportID][NetworkID][ServiceID] = query.value(3).toInt(); 188 } 189 } 190 191 /* Return true if we want EIT data for this channel, otherwise false */ 192 bool SIParser::WantEIT(Event *e) 193 { 194 195 // TODO: premap fill in a mplexid map for use here 196 // if (e.ATSC) 197 // { 198 // return (eitATSCMap[mplexid][e.ServiceID] > 0) 199 // } 200 // else 201 return (eitDVBMap[e->TransportID][e->NetworkID][e->ServiceID] > 0); 202 } 203 148 204 void SIParser::CheckTrackers() 149 205 { 150 206 … … 1414 1470 { 1415 1471 // Event to use temporarily to fill in data 1416 1472 Event event; 1473 event.TableID = head->table_id; 1417 1474 event.ServiceID = head->table_id_ext; 1418 1475 event.TransportID = buffer[0] << 8 | buffer[1]; 1419 1476 event.NetworkID = buffer[2] << 8 | buffer[3]; 1420 1477 event.EventID = buffer[pos] << 8 | buffer[pos+1]; 1421 event.StartTime = ConvertDVBDate(&buffer[pos+2]);1422 1478 1423 uint lenInSeconds = ((bcdtoint(buffer[pos+7] & 0xFF) * 3600) + 1424 (bcdtoint(buffer[pos+8] & 0xFF) * 60) + 1425 (bcdtoint(buffer[pos+9] & 0xFF))); 1479 if (WantEIT(&event) && 1480 !(eitEventMap[head->table_id_ext][event.EventID] == event.EventID)) 1481 { 1482 VERBOSE(VB_EIT, QString(" WantEIT : %1 Event %2 ") 1483 .arg(event.ServiceID).arg(event.EventID)); 1426 1484 1427 event.EndTime = event.StartTime.addSecs(lenInSeconds);1428 1485 1486 event.StartTime = ConvertDVBDate(&buffer[pos+2]); 1487 1488 uint lenInSeconds = ((bcdtoint(buffer[pos+7] & 0xFF) * 3600) + 1489 (bcdtoint(buffer[pos+8] & 0xFF) * 60) + 1490 (bcdtoint(buffer[pos+9] & 0xFF))); 1491 1492 event.EndTime = event.StartTime.addSecs(lenInSeconds); 1493 1429 1494 #ifdef EIT_DEBUG_SID 1430 if (event.ServiceID == EIT_DEBUG_SID)1431 {1432 VERBOSE(VB_EIT, "SIParser: DVB Events: " +1433 QString("ServiceID %1 EventID: %2 Time: %3 - %4")1434 .arg(event.ServiceID).arg(event.EventID)1435 .arg(event.StartTime.toString(QString("MM/dd hh:mm")))1436 .arg(event.EndTime.toString(QString("hh:mm"))));1437 }1495 if (event.ServiceID == EIT_DEBUG_SID) 1496 { 1497 VERBOSE(VB_EIT, "SIParser: DVB Events: " + 1498 QString("ServiceID %1 EventID: %2 Time: %3 - %4") 1499 .arg(event.ServiceID).arg(event.EventID) 1500 .arg(event.StartTime.toString(QString("MM/dd hh:mm"))) 1501 .arg(event.EndTime.toString(QString("hh:mm")))); 1502 } 1438 1503 #endif 1439 1504 1440 // Hold short & extended event information from descriptors.1441 const unsigned char *bestDescriptorSE = NULL;1442 vector<const unsigned char*> bestDescriptorsEE;1505 // Hold short & extended event information from descriptors. 1506 const unsigned char *bestDescriptorSE = NULL; 1507 vector<const unsigned char*> bestDescriptorsEE; 1443 1508 1444 // Parse descriptors1445 descriptors_length = ((buffer[pos+10] & 0x0F) << 8) | buffer[pos+11];1446 pos += 12;1447 des_pos = pos;1509 // Parse descriptors 1510 descriptors_length = ((buffer[pos+10] & 0x0F) << 8) | buffer[pos+11]; 1511 pos += 12; 1512 des_pos = pos; 1448 1513 1449 // Pick out EIT descriptors for later parsing, and parse others.1450 while ((des_pos < (pos + descriptors_length)) && (des_pos <= size))1451 {1452 des_pos += ProcessDVBEventDescriptors(1453 pid,1454 &buffer[des_pos],1455 bestPrioritySE, bestDescriptorSE,1456 bestPriorityEE, bestDescriptorsEE, event);1457 }1514 // Pick out EIT descriptors for later parsing, and parse others. 1515 while ((des_pos < (pos + descriptors_length)) && (des_pos <= size)) 1516 { 1517 des_pos += ProcessDVBEventDescriptors( 1518 pid, 1519 &buffer[des_pos], 1520 bestPrioritySE, bestDescriptorSE, 1521 bestPriorityEE, bestDescriptorsEE, event); 1522 } 1458 1523 1459 // Parse extended event descriptions for the most preferred language1460 for (uint i = 0; i < bestDescriptorsEE.size(); ++i)1461 {1462 if (!bestDescriptorsEE[i])1463 continue;1524 // Parse extended event descriptions for the most preferred language 1525 for (uint i = 0; i < bestDescriptorsEE.size(); ++i) 1526 { 1527 if (!bestDescriptorsEE[i]) 1528 continue; 1464 1529 1465 uint8_t *desc = (uint8_t*) bestDescriptorsEE[i];1466 uint descLen = desc[1];1467 ProcessExtendedEventDescriptor(desc, descLen + 2, event);1468 }1530 uint8_t *desc = (uint8_t*) bestDescriptorsEE[i]; 1531 uint descLen = desc[1]; 1532 ProcessExtendedEventDescriptor(desc, descLen + 2, event); 1533 } 1469 1534 1470 // Parse short event descriptor for the most preferred language 1471 if (bestDescriptorSE) 1472 { 1473 uint8_t *desc = (uint8_t*) bestDescriptorSE; 1474 uint descLen = desc[1]; 1475 ProcessShortEventDescriptor(desc, descLen + 2, event); 1476 } 1535 // Parse short event descriptor for the most preferred language 1536 if (bestDescriptorSE) 1537 { 1538 uint8_t *desc = (uint8_t*) bestDescriptorSE; 1539 uint descLen = desc[1]; 1540 ProcessShortEventDescriptor(desc, descLen + 2, event); 1541 } 1542 1543 EITFixUp(event); 1477 1544 1478 EITFixUp(event);1479 1480 1545 #ifdef EIT_DEBUG_SID 1481 if (event.ServiceID == EIT_DEBUG_SID)1482 {1483 VERBOSE(VB_EIT, "SIParser: DVB Events: " +1484 QString("LanguageCode='%1' "1485 "\n\t\t\tEvent_Name='%2' Description='%3'")1486 .arg(event.LanguageCode).arg(event.Event_Name)1487 .arg(event.Description));1488 }1546 if (event.ServiceID == EIT_DEBUG_SID) 1547 { 1548 VERBOSE(VB_EIT, "SIParser: DVB Events: " + 1549 QString("LanguageCode='%1' " 1550 "\n\t\t\tEvent_Name='%2' Description='%3'") 1551 .arg(event.LanguageCode).arg(event.Event_Name) 1552 .arg(event.Description)); 1553 } 1489 1554 #endif 1490 1555 1491 QMap2D_Events &events = ((EventHandler*) Table[EVENTS])->Events; 1492 events[head->table_id_ext][event.EventID] = event; 1556 QMap2D_Events &events = ((EventHandler*) Table[EVENTS])->Events; 1557 events[head->table_id_ext][event.EventID] = event; 1558 1559 } // WantEIT 1560 else 1561 { 1562 descriptors_length = ((buffer[pos+10] & 0x0F) << 8) | buffer[pos+11]; 1563 pos += 12; 1564 } 1493 1565 pos += descriptors_length; 1494 1566 } 1495 1567 } -
libs/libmythtv/sitypes.h
78 78 typedef QMap<uint16_t,QMap_Events> QMap2D_Events; 79 79 typedef QMap<uint16_t,pidHandler> QMap_pidHandler; 80 80 81 typedef QMap<uint16_t,int> QMap_intObject; 82 typedef QMap<uint16_t,QMap_intObject> QMap2D_intObject; 83 typedef QMap<uint16_t,QMap2D_intObject> QMap3D_intObject; 84 81 85 class pidHandler 82 86 { 83 87 public: … … 350 354 uint SourcePID; 351 355 uint TransportID; 352 356 uint NetworkID; 357 uint TableID; 353 358 uint ServiceID; ///< NOT the Virtual Channel Number used by ATSC 354 359 uint EventID; 355 360 bool Stereo; -
libs/libmythtv/siparser.h
87 87 88 88 bool ReinitSIParser(const QString &si_std, uint service_id); 89 89 90 // Functions to prepare and use a map of serviceid/transports we 91 // want EIT data from 92 void FillEITMaps(void); 93 bool WantEIT(Event *e); 94 90 95 // Stops all collection of data and clears all values (on a channel change for example) 91 96 void Reset(void); 92 97 … … 279 284 // statistics 280 285 QMap<uint,uint> descCount; 281 286 mutable QMutex descLock; 287 288 // EIT Service Maps 289 QMap2D_intObject eitATSCMap; 290 QMap3D_intObject eitDVBMap; 291 292 // Previously Seen EIT event Maps 293 QMap2D_intObject eitEventMap; 282 294 }; 283 295 284 296 #endif // SIPARSER_H