Ticket #1057: eitcache_8612.patch

File eitcache_8612.patch, 10.3 KB (added by greg, 20 years ago)
  • libs/libmythtv/siparser.cpp

     
    8080
    8181    Reset();
    8282
     83    FillEITMaps();
     84
    8385    // Get a list of wanted languages and set up their priorities
    8486    // (Lowest number wins)
    8587    QStringList langPref = iso639_get_language_list();
     
    145147    VERBOSE(VB_SIPARSER, LOC + "SIParser Reset due to channel change");
    146148}
    147149
     150// Fill in our maps of channels/serviceID's we actually want EIT data for
     151void 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 */
     192bool 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
    148204void SIParser::CheckTrackers()
    149205{
    150206
     
    14141470    {
    14151471        // Event to use temporarily to fill in data
    14161472        Event event;
     1473        event.TableID     = head->table_id;
    14171474        event.ServiceID   = head->table_id_ext;
    14181475        event.TransportID = buffer[0] << 8 | buffer[1];
    14191476        event.NetworkID   = buffer[2] << 8 | buffer[3];
    14201477        event.EventID     = buffer[pos] << 8 | buffer[pos+1];
    1421         event.StartTime   = ConvertDVBDate(&buffer[pos+2]);
    14221478
    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));
    14261484
    1427         event.EndTime     = event.StartTime.addSecs(lenInSeconds);
    14281485
     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
    14291494#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            }
    14381503#endif
    14391504
    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;
    14431508
    1444         // Parse descriptors
    1445         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;
    14481513
    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            }
    14581523
    1459         // Parse extended event descriptions for the most preferred language
    1460         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;
    14641529
    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            }
    14691534
    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);
    14771544
    1478         EITFixUp(event);
    1479 
    14801545#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            }
    14891554#endif
    14901555
    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         }
    14931565        pos += descriptors_length;
    14941566    }
    14951567}
  • libs/libmythtv/sitypes.h

     
    7878typedef QMap<uint16_t,QMap_Events>         QMap2D_Events;
    7979typedef QMap<uint16_t,pidHandler>          QMap_pidHandler;
    8080
     81typedef QMap<uint16_t,int>                 QMap_intObject;
     82typedef QMap<uint16_t,QMap_intObject>      QMap2D_intObject;
     83typedef QMap<uint16_t,QMap2D_intObject>    QMap3D_intObject;
     84
    8185class pidHandler
    8286{
    8387public:
     
    350354    uint    SourcePID;
    351355    uint    TransportID;
    352356    uint    NetworkID;
     357    uint    TableID;
    353358    uint    ServiceID;    ///< NOT the Virtual Channel Number used by ATSC
    354359    uint    EventID;
    355360    bool    Stereo;
  • libs/libmythtv/siparser.h

     
    8787
    8888    bool ReinitSIParser(const QString &si_std, uint service_id);
    8989
     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
    9095    // Stops all collection of data and clears all values (on a channel change for example)
    9196    void Reset(void);
    9297
     
    279284    // statistics
    280285    QMap<uint,uint>     descCount;
    281286    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;
    282294};
    283295
    284296#endif // SIPARSER_H