Ticket #2418: prem_eit_032007.diff

File prem_eit_032007.diff, 15.2 KB (added by jochen, 14 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