Ticket #2418: prem_eit_032007.diff

File prem_eit_032007.diff, 15.2 KB (added by jochen, 5 years ago)

Patch for newest SVN Version

  • libs/libmythtv/eithelper.cpp

     
    225225 
    226226    uint chanid = GetChanID(eit->ServiceID(), eit->OriginalNetworkID(), 
    227227                            eit->TSID()); 
    228     if (!chanid) 
     228 
     229    uint tableid   = eit->TableID(); 
     230 
     231    if (!chanid && tableid != TableID::PR_EIT)    
    229232        return; 
    230233 
    231     uint tableid   = eit->TableID(); 
    232234    uint version   = eit->Version(); 
    233235    for (uint i = 0; i < eit->EventCount(); i++) 
    234236    { 
    235237        // Skip event if we have already processed it before... 
    236         if (!eitcache->IsNewEIT(chanid, tableid, version, eit->EventID(i), 
    237                               eit->EndTimeUnixUTC(i))) 
     238        if ((tableid != TableID::PR_EIT) 
     239            && (!eitcache->IsNewEIT(chanid, tableid, version, eit->EventID(i), 
     240                              eit->EndTimeUnixUTC(i)))) 
    238241        { 
    239242            continue; 
    240243        } 
     
    347350        if (content_data) 
    348351        { 
    349352            ContentDescriptor content(content_data); 
    350             category      = content.GetDescription(0); 
    351             category_type = content.GetMythCategory(0); 
     353          
     354            // fix events without real content data for Premiere EIT  
     355            if ((tableid == TableID::PR_EIT) && (content.Nibble(0)==0x00)){   
     356                if(content.UserNibble(0)==0x1)   
     357                {  
     358                    category_type = kCategoryMovie;  
     359                    subtitle.length() < 2 ? category = QObject::tr("Movie") : category = subtitle;  
     360                }  
     361                else if(content.UserNibble(0)==0x0)   
     362                {  
     363                    category_type = kCategorySports;  
     364                    subtitle.length() < 2 ? category = QObject::tr("Sports") : category = subtitle;  
     365                }  
     366            }  
     367            else   
     368            {    
     369                category      = content.GetDescription(0); 
     370                category_type = content.GetMythCategory(0); 
     371            } 
    352372        } 
    353373 
    354         desc_list_t contentIds = 
     374        if (tableid == TableID::PR_EIT)  
     375        {  
     376        // Find all transmission descriptors for this event  
     377            desc_list_t transmissions =  
     378                MPEGDescriptor::FindAll(list, DescriptorID::pr_event_transmission);  
     379                    for(uint j=0; j<transmissions.size(); j++)  
     380            {  
     381                PremiereTransmissionDescriptor transmission(transmissions[j]);  
     382                uint descriptor_length = transmission.DescriptorLength();  
     383                uint networkid         = transmission.OriginalNetworkID();  
     384                uint tsid              = transmission.TSID();  
     385                uint serviceid         = transmission.ServiceID();  
     386                 
     387                uint chanid = GetChanID(serviceid, networkid, tsid);  
     388              
     389                if (!chanid)  
     390                {  
     391                    VERBOSE(VB_GENERAL, LOC + QString("No channid for NIT:%1 TID:%2 SID:%3. Possible new feed channel or wrong eit data").arg(networkid).arg(tsid).arg(serviceid));  
     392                    continue;  
     393                }  
     394                uint pos = 0;   
     395                // find all transmissions for this event  
     396                while (pos<descriptor_length-6)  
     397                {  
     398                    unsigned char startdate[5];  
     399                    memcpy(startdate, transmission.StartDate(pos), 2);  
     400                    // get all start times on this day  
     401                    for (uint k=0; k<transmission.TransmissionCount(pos); k+=3)  
     402                    {  
     403                        memcpy(&startdate[2], transmission.StartTime(pos+k), 3);  
     404                        QDateTime starttime = MythUTCToLocal(dvbdate2qt(startdate));  
     405                        EITFixUp::TimeFix(starttime);  
     406                        QDateTime endtime   = starttime.addSecs(eit->DurationInSeconds(i));  
     407                    QString programId = "", seriesId = ""; 
     408 
     409                    DBEvent *event = new DBEvent(chanid,  
     410                                                 title,     subtitle,      description,  
     411                                                 category,  category_type,  
     412                                                 starttime, endtime,       fix,  
     413                                                 false,     subtitled,  
     414                                                 stereo,    hdtv,  
     415                                                 seriesId,  programId); 
     416                        db_events.enqueue(event);  
     417                    }  
     418                    // set pos to next transmission  
     419                    pos += 3 + transmission.TransmissionCount(pos);  
     420                }  
     421            }  
     422        }  
     423        else  
     424        {  
     425            desc_list_t contentIds = 
    355426            MPEGDescriptor::FindAll(list, DescriptorID::dvb_content_identifier); 
    356427        QString programId = "", seriesId = ""; 
    357428        for (uint j = 0; j < contentIds.size(); j++) 
     
    381452                                     stereo,    hdtv, 
    382453                                     seriesId,  programId); 
    383454        db_events.enqueue(event); 
    384     } 
     455    }   } 
    385456} 
    386457 
    387458void EITHelper::PruneEITCache(uint timestamp) 
  • libs/libmythtv/eithelper.h

     
    4747class EventInformationTable; 
    4848class ExtendedTextTable; 
    4949class DVBEventInformationTable; 
     50class DVBPremiereEventInformationTable; 
    5051 
    5152class EITHelper 
    5253{ 
  • libs/libmythtv/mpeg/dvbtables.cpp

     
    165165    // Dish Network Long Term Future Event Information for all transports 
    166166    is_eit |= (TableID::DN_EITbego <= table_id && 
    167167               TableID::DN_EITendo >= table_id); 
     168    // Premiere Event Information for option channels 
     169    is_eit |= TableID::PR_EIT == table_id; 
    168170 
    169171    return is_eit; 
    170172} 
  • libs/libmythtv/mpeg/dvbstreamdata.cpp

     
    141141        is_eit |= (TableID::DN_EITbego <= table_id && 
    142142                   TableID::DN_EITendo >= table_id); 
    143143    } 
     144    if (DVB_PR_SPORT_EIT_PID == pid || DVB_PR_DIRECT_EIT_PID == pid) 
     145    { 
     146        is_eit |= TableID::PR_EIT == table_id; 
     147    } 
    144148    if (is_eit) 
    145149    { 
    146150        uint service_id = psip.TableIDExtension(); 
     
    309313        return true; 
    310314    } 
    311315 
     316    if ((DVB_PR_SPORT_EIT_PID || DVB_PR_DIRECT_EIT_PID) && 
     317        DVBEventInformationTable::IsEIT(psip.TableID())) 
     318    { 
     319        QMutexLocker locker(&_listener_lock); 
     320        if (!_dvb_eit_listeners.size() && !_eit_helper) 
     321            return true; 
     322 
     323        uint service_id = psip.TableIDExtension(); 
     324        SetVersionEIT(psip.TableID(), service_id, psip.Version()); 
     325        SetEITSectionSeen(psip.TableID(), service_id, psip.Section()); 
     326 
     327        DVBPremiereEventInformationTable eit(psip); 
     328        for (uint i = 0; i < _dvb_eit_listeners.size(); i++) 
     329            _dvb_eit_listeners[i]->HandleEIT(&eit); 
     330 
     331        if (_eit_helper) 
     332            _eit_helper->AddEIT(&eit); 
     333 
     334        return true; 
     335    } 
     336 
    312337    return false; 
    313338} 
    314339 
     
    354379        { 
    355380            add_pids.push_back(DVB_DNLONG_EIT_PID); 
    356381        } 
     382        if (find(cur_pids.begin(), cur_pids.end(), 
     383                 (uint) DVB_PR_SPORT_EIT_PID) == cur_pids.end()) 
     384        { 
     385            add_pids.push_back(DVB_PR_SPORT_EIT_PID); 
     386        } 
     387        if (find(cur_pids.begin(), cur_pids.end(), 
     388                 (uint) DVB_PR_DIRECT_EIT_PID) == cur_pids.end()) 
     389        { 
     390            add_pids.push_back(DVB_PR_DIRECT_EIT_PID); 
     391        } 
    357392    } 
    358393    else 
    359394    { 
     
    369404        { 
    370405            del_pids.push_back(DVB_DNLONG_EIT_PID); 
    371406        } 
     407        if (find(cur_pids.begin(), cur_pids.end(), 
     408                 (uint) DVB_PR_SPORT_EIT_PID) != cur_pids.end()) 
     409        { 
     410            del_pids.push_back(DVB_PR_SPORT_EIT_PID); 
     411        } 
     412        if (find(cur_pids.begin(), cur_pids.end(), 
     413                 (uint) DVB_PR_DIRECT_EIT_PID) != cur_pids.end()) 
     414        { 
     415            del_pids.push_back(DVB_PR_DIRECT_EIT_PID); 
     416        } 
    372417    } 
    373418 
    374419    return add_pids.size() || del_pids.size(); 
  • libs/libmythtv/mpeg/mpegtables.h

     
    187187    // Dishnet longterm EIT is on pid 0x300 
    188188    DVB_DNLONG_EIT_PID = 0x0300, 
    189189 
     190    // Premiere EIT for Direct/Sport PPV 
     191    DVB_PR_DIRECT_EIT_PID = 0x0b11, 
     192    DVB_PR_SPORT_EIT_PID = 0x0b12, 
     193 
    190194    ATSC_PSIP_PID = 0x1ffb, 
    191195}; 
    192196 
     
    236240        // Dishnet Longterm EIT data 
    237241        DN_EITbego = 0x80, // always on pid 0x300 
    238242        DN_EITendo = 0xfe, // always on pid 0x300 
     243         
     244        // Premiere Eit for Direct and Sport 
     245        PR_EIT     = 0xA0, 
    239246 
    240247        // ARIB 
    241248        ARIBbeg  = 0x80, 
  • libs/libmythtv/mpeg/dvbdescriptors.h

     
    16741674}; 
    16751675 
    16761676 
     1677class PremiereTransmissionDescriptor : public MPEGDescriptor 
     1678{ 
     1679  public: 
     1680    PremiereTransmissionDescriptor(const unsigned char* data) : MPEGDescriptor(data) 
     1681    { 
     1682    //       Name             bits  loc  expected value 
     1683    // descriptor_tag           8   0.0       0xF2 
     1684        assert(DescriptorID::pr_event_transmission == DescriptorTag()); 
     1685    // descriptor_length        8   1.0 
     1686    } 
     1687 
     1688    // transport id            16   2.0 
     1689    uint TSID() const 
     1690        { return (_data[2] << 8) | _data[3]; } 
     1691    // network id              16   4.0 
     1692    uint OriginalNetworkID() const 
     1693        { return (_data[4] << 8) | _data[5]; } 
     1694    // service id              16   6.0 
     1695    uint ServiceID() const 
     1696        { return (_data[6] << 8) | _data[7]; } 
     1697 
     1698    // for(i=0;i<N;i+=2+1+count)  
     1699    // start date              16   8.0 
     1700    const unsigned char* StartDate(uint i) const 
     1701        { return &_data[8 + i]; }   
     1702    // transmission count       8  10.0 
     1703    uint TransmissionCount(uint i) const 
     1704        { return (_data[10 + i]); } 
     1705    // start_time              24  11.0+x 
     1706    const unsigned char* StartTime(uint i) const 
     1707        { return &_data[11 + i];  } 
     1708       
     1709    QString toString() const { return QString("TransmissionDescriptor(stub)"); } 
     1710}; 
     1711 
     1712 
    16771713#endif 
  • libs/libmythtv/mpeg/dvbtables.h

     
    221221    // last_section_number      8   7.0 
    222222        Parse(); 
    223223    } 
     224    virtual ~DVBEventInformationTable(){} 
    224225 
    225226    // service_id              16   3.0 
    226     uint ServiceID(void) const { return TableIDExtension(); } 
     227    virtual uint ServiceID(void) const { return TableIDExtension(); } 
    227228 
    228229    // transport_stream_id     16   8.0 
    229     uint TSID(void) const 
     230    virtual uint TSID(void) const 
    230231        { return (psipdata()[0]<<8) | psipdata()[1]; } 
    231232 
    232233    // original_network_id     16  10.0 
    233     uint OriginalNetworkID(void) const 
     234    virtual uint OriginalNetworkID(void) const 
    234235        { return (psipdata()[2]<<8) | psipdata()[3]; } 
    235236 
    236237    // segment_last_section_num 8  12.0 
     
    240241    uint LastTableID(void) const 
    241242        { return psipdata()[5]; } 
    242243 
    243     uint EventCount() const { return _ptrs.size()-1; } 
     244    virtual uint EventCount() const { return _ptrs.size()-1; } 
    244245 
    245246    // for(i=0;i<N;i++) { 
    246247    //   event_id              16   0.0+x 
     
    260261    //   duration              24   7.0+x 
    261262    const unsigned char *Duration(uint i) const 
    262263        { return _ptrs[i]+7; } 
    263     uint DurationInSeconds(uint i) const 
     264    virtual uint DurationInSeconds(uint i) const 
    264265    { 
    265266        return ((byteBCD2int(Duration(i)[0]) * 3600) + 
    266267                (byteBCD2int(Duration(i)[1]) * 60) + 
     
    271272    //   free_CA_mode           1  10.3+x 
    272273    bool IsScrambled(uint i) const { return bool(_ptrs[i][10] & 0x10); } 
    273274    //   descriptors_loop_len  12  10.4+x 
    274     uint DescriptorsLength(uint i) const 
     275    virtual uint DescriptorsLength(uint i) const 
    275276        { return ((_ptrs[i][10]<<8) | (_ptrs[i][11])) & 0xfff; } 
    276277    //   for(i=0;i<N;i++)       y  12.0+x 
    277278    //     { descriptor() } 
    278     const unsigned char* Descriptors(uint i) const 
     279    virtual const unsigned char* Descriptors(uint i) const 
    279280        { return _ptrs[i] + 12; } 
    280281    //   } 
    281282    //CRC_32 32 rpchof 
    282283 
    283     void Parse(void) const; 
     284    virtual void Parse(void) const; 
    284285 
    285286    static bool IsEIT(uint table_id); 
    286287 
     
    314315    time_t UTCUnix(void) const { return dvbdate2unix(UTCdata()); } 
    315316}; 
    316317 
     318class DVBPremiereEventInformationTable : public DVBEventInformationTable  
     319{  
     320  public:  
     321    DVBPremiereEventInformationTable(const DVBEventInformationTable& table) : DVBEventInformationTable(table)  
     322    {  
     323    // table_id                 8   0.0       0xA0  
     324        assert(IsEIT(TableID()));  
     325    // section_syntax_indicator 1   1.0          1  
     326    // private_indicator        1   1.1          1  
     327    // reserved                 2   1.2          3  
     328// section_length          12   1.4  
     329    // reserved                 2   5.0          3  
     330    // version_number           5   5.2  
     331    // current_next_indicator   1   5.7          1  
     332    // section_number           8   6.0  
     333    // last_section_number      8   7.0  
     334        Parse();  
     335    }  
     336    ~DVBPremiereEventInformationTable(){}  
     337  
     338    // content_id              32   0.0  
     339    uint ContentID(void) const  
     340        { return (psipdata()[0]<<24) | (psipdata()[1]<<16) | (psipdata()[2]<<8) | psipdata()[3]; }  
     341  
     342    // return dummy values for compatitbility  
     343    uint ServiceID(void) const { return 18; }  
     344    uint OriginalNetworkID(void) const { return 133; }  
     345    uint TSID(void) const { return 4; }  
     346    uint EventCount(void) const { return 1; }  
     347  
     348    // event_duration          24   4.0  
     349    uint DurationInSeconds(uint i) const   
     350        { return ((byteBCD2int(psipdata()[4]) * 3600) +  
     351                  (byteBCD2int(psipdata()[5]) * 60) +  
     352                  (byteBCD2int(psipdata()[6]))); }  
     353  
     354    // descriptor length        7   8.0  
     355    uint DescriptorsLength(uint i) const  
     356        { return ((psipdata()[7] & 0x0F) << 8) | psipdata()[8]; }  
     357  
     358    // descriptor length        x   9.0  
     359    const unsigned char* Descriptors(uint i) const  
     360     { return &psipdata()[9]; }  
     361  
     362    void Parse(void) const {};  
     363};  
    317364#endif // _DVB_TABLES_H_ 
  • libs/libmythtv/mpeg/mpegdescriptors.h

     
    129129        DCC_arriving_request        = 0xA9, 
    130130        DRM_control                 = 0xAA, 
    131131        atsc_content_identifier     = 0xB6, 
     132 
     133        // PREMIERE 
     134        pr_event_transmission       = 0xF2, 
    132135    }; 
    133136}; 
    134137