Ticket #5562: t5562_populate_default_authority_r21414.diff

File t5562_populate_default_authority_r21414.diff, 17.7 KB (added by Janne Grunau, 11 years ago)
  • mythtv/libs/libmythtv/channelscan/channelimporter.cpp

    diff --git a/mythtv/libs/libmythtv/channelscan/channelimporter.cpp b/mythtv/libs/libmythtv/channelscan/channelimporter.cpp
    index 8b8086c..a44838d 100644
    a b ScanDTVTransportList ChannelImporter::InsertChannels( 
    358358                        chan.atsc_minor_channel,
    359359                        chan.use_on_air_guide,
    360360                        chan.hidden, chan.hidden_in_guide,
    361                         chan.freqid);
     361                        chan.freqid,
     362                        QString::null,
     363                        QString::null,
     364                        QString::null,
     365                        chan.default_authority);
    362366                }
    363367            }
    364368
    ScanDTVTransportList ChannelImporter::UpdateChannels( 
    484488                    chan.atsc_minor_channel,
    485489                    chan.use_on_air_guide,
    486490                    chan.hidden, chan.hidden_in_guide,
    487                     chan.freqid);
     491                    chan.freqid,
     492                    QString::null,
     493                    QString::null,
     494                    QString::null,
     495                    chan.default_authority);
    488496            }
    489497
    490498            if (filter)
  • mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp

    diff --git a/mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp b/mythtv/libs/libmythtv/channelscan/channelscan_sm.cpp
    index bed9db3..233d23e 100644
    a b  
    6565/// 10 seconds, so lets wait at least 30 seconds, in
    6666/// case of bad transmitter or lost packets.
    6767const uint ChannelScanSM::kDVBTableTimeout  = 30 * 1000;
     68/// The whole BAT & SDTo group comes round in 10s, so wait additional
     69/// 12 seconds to kDVBTableTimeout
     70const uint ChannelScanSM::kDVBoTableTimeout = ChannelScanSM::kDVBTableTimeout +
     71                                              12 * 1000;
    6872/// No logic here, lets just wait at least 10 seconds.
    6973const uint ChannelScanSM::kATSCTableTimeout = 10 * 1000;
    7074/// No logic here, lets just wait at least 15 seconds.
    ChannelScanSM::ChannelScanSM( 
    148152      wait_for_mpeg(false),
    149153      wait_for_atsc(false),
    150154      wait_for_dvb(false),
     155      wait_for_dvbo(false),
    151156      // Transports List
    152157      transportsScanned(0),
    153158      currentTestingDecryption(false),
    ChannelScanSM::ChannelScanSM( 
    183188        data->AddMPEGListener(this);
    184189        data->AddATSCMainListener(this);
    185190        data->AddDVBMainListener(this);
     191        data->AddDVBOtherListener(this);
    186192    }
    187193}
    188194
    void ChannelScanSM::HandleMGT(const MasterGuideTable *mgt) 
    372378    UpdateChannelInfo(true);
    373379}
    374380
    375 void ChannelScanSM::HandleSDT(uint, const ServiceDescriptionTable *sdt)
     381void ChannelScanSM::HandleSDT(uint tsid, const ServiceDescriptionTable *sdt)
    376382{
    377383    VERBOSE(VB_CHANSCAN, LOC +
    378384            QString("Got a Service Description Table for %1")
    void ChannelScanSM::HandleNIT(const NetworkInformationTable *nit) 
    396402            QString("Got a Network Information Table for %1")
    397403            .arg((*current).FriendlyName) + "\n" + nit->toString());
    398404
     405    uint netid = nit->NetworkID();
     406
     407    // If this is Astra 28.2 add start listening for Freesat BAT and SDTo
     408    if (!wait_for_dvbo && (netid == 2 || netid == 59))
     409    {
     410        GetDTVSignalMonitor()->GetScanStreamData()->SetFreesatAdditionalSI(true);
     411        wait_for_dvbo = true;
     412    }
     413
    399414    wait_for_dvb = true;
    400415    UpdateChannelInfo(true);
    401416}
    402417
     418void ChannelScanSM::HandleBAT(const BouquetAssociationTable *bat)
     419{
     420    VERBOSE(VB_CHANSCAN, LOC + "Got a Bouquet Association Table\n" +
     421            bat->toString());
     422
     423    for (uint i = 0; i < bat->TransportStreamCount(); i++)
     424    {
     425        uint tsid = bat->TSID(i);
     426        uint netid = bat->OriginalNetworkID(i);
     427        desc_list_t parsed =
     428            MPEGDescriptor::Parse(bat->TransportDescriptors(i),
     429                                  bat->TransportDescriptorsLength(i));
     430        // Look for default authority
     431        const unsigned char *def_auth =
     432            MPEGDescriptor::Find(parsed, DescriptorID::default_authority);
     433        const unsigned char *serv_list =
     434            MPEGDescriptor::Find(parsed, DescriptorID::service_list);
     435
     436        if (def_auth && serv_list)
     437        {
     438            DefaultAuthorityDescriptor authority(def_auth);
     439            ServiceListDescriptor services(serv_list);
     440
     441            for (uint j = 0; j < services.ServiceCount(); j++)
     442            {
     443               // If the default authority is given in the SDT this
     444               // overrides any definition in the BAT (or in the NIT)
     445               uint64_t index =
     446                   ((uint64_t)netid << 32) | (tsid << 16) | services.ServiceID(j);
     447               if (! defAuthorities.contains(index))
     448                   defAuthorities[index] = authority.DefaultAuthority();
     449            }
     450        }
     451    }
     452    UpdateChannelInfo(true);
     453}
     454
     455void ChannelScanSM::HandleSDTo(uint tsid, const ServiceDescriptionTable *sdt)
     456{
     457    VERBOSE(VB_CHANSCAN, LOC + "Got a Service Description Table (other)\n" +
     458            sdt->toString());
     459
     460    uint netid = sdt->OriginalNetworkID();
     461
     462    for (uint i = 0; i < sdt->ServiceCount(); i++)
     463    {
     464        uint serviceId = sdt->ServiceID(i);
     465        desc_list_t parsed =
     466            MPEGDescriptor::Parse(sdt->ServiceDescriptors(i),
     467                                  sdt->ServiceDescriptorsLength(i));
     468        // Look for default authority
     469        const unsigned char *def_auth =
     470            MPEGDescriptor::Find(parsed, DescriptorID::default_authority);
     471        if (def_auth)
     472        {
     473            DefaultAuthorityDescriptor authority(def_auth);
     474            defAuthorities[((uint64_t)netid << 32) | (tsid << 16) | serviceId] =
     475                authority.DefaultAuthority();
     476        }
     477    }
     478    UpdateChannelInfo(true);
     479}
     480
    403481void ChannelScanSM::HandleEncryptionStatus(uint pnum, bool encrypted)
    404482{
    405483    currentEncryptionStatus[pnum] = encrypted ? kEncEncrypted : kEncDecrypted;
    bool ChannelScanSM::UpdateChannelInfo(bool wait_until_complete) 
    784862        currentEncryptionStatus.clear();
    785863        currentEncryptionStatusChecked.clear();
    786864
    787         wait_for_mpeg = wait_for_atsc = wait_for_dvb = false;
     865        wait_for_mpeg = wait_for_atsc = wait_for_dvb = wait_for_dvbo = false;
    788866
    789867        if (scanning)
    790868        {
    static void update_info(ChannelInsertInfo &info, 
    849927}
    850928
    851929static void update_info(ChannelInsertInfo &info,
    852                         const ServiceDescriptionTable *sdt, uint i)
     930                        const ServiceDescriptionTable *sdt, uint i,
     931                        const QMap<uint64_t, QString> &defAuthorities)
    853932{
    854933    // HACK beg -- special exception for this network
    855934    //             (dbver == "1067")
    static void update_info(ChannelInsertInfo &info, 
    888967        (desc && !desc->IsDTV() && !desc->IsDigitalAudio());
    889968    info.is_audio_service = (desc && desc->IsDigitalAudio());
    890969
     970    info.service_id = sdt->ServiceID(i);
    891971    info.sdt_tsid   = sdt->TSID();
    892972    info.orig_netid = sdt->OriginalNetworkID();
    893973    info.in_sdt     = true;
     974
     975    desc_list_t parsed =
     976        MPEGDescriptor::Parse(sdt->ServiceDescriptors(i),
     977                                sdt->ServiceDescriptorsLength(i));
     978    // Look for default authority
     979    const unsigned char *def_auth =
     980        MPEGDescriptor::Find(parsed, DescriptorID::default_authority);
     981    if (def_auth)
     982    {
     983        DefaultAuthorityDescriptor authority(def_auth);
     984        info.default_authority = authority.DefaultAuthority();
     985    }
     986    else
     987    {
     988        uint64_t index = (uint64_t)info.orig_netid << 32 |
     989                         info.sdt_tsid << 16 | info.service_id;
     990        if (defAuthorities.contains(index))
     991            info.default_authority = defAuthorities[index];
     992    }
    894993}
    895994
    896995uint ChannelScanSM::GetCurrentTransportInfo(
    ChannelScanSM::GetChannelList(transport_scan_items_it_t trans_info, 
    10411140            {
    10421141                uint pnum = (*sdt_it)->ServiceID(i);
    10431142                PCM_INFO_INIT("dvb");
    1044                 update_info(info, *sdt_it, i);
     1143                update_info(info, *sdt_it, i, defAuthorities);
    10451144            }
    10461145        }
    10471146    }
    bool ChannelScanSM::HasTimedOut(void) 
    12961395        if (wait_for_dvb  && !sd->HasCachedAllNIT() && !sd->HasCachedAllSDTs())
    12971396            max_timeout = max(max_timeout, (int) kDVBTableTimeout);
    12981397
     1398        if (wait_for_dvbo)
     1399            max_timeout = max(max_timeout, (int) kDVBoTableTimeout);
     1400
    12991401        if (wait_for_atsc && !sd->HasCachedMGT()    && !sd->HasCachedAllVCTs())
    13001402            max_timeout = max(max_timeout, (int) kATSCTableTimeout);
    13011403
  • mythtv/libs/libmythtv/channelscan/channelscan_sm.h

    diff --git a/mythtv/libs/libmythtv/channelscan/channelscan_sm.h b/mythtv/libs/libmythtv/channelscan/channelscan_sm.h
    index 0c054e9..26b4d72 100644
    a b class AnalogSignalHandler : public SignalMonitorListener 
    8282
    8383class ChannelScanSM : public MPEGStreamListener,
    8484                      public ATSCMainStreamListener,
    85                       public DVBMainStreamListener
     85                      public DVBMainStreamListener,
     86                      public DVBOtherStreamListener
    8687{
    8788    friend class AnalogSignalHandler;
    8889
    class ChannelScanSM : public MPEGStreamListener, 
    144145    void HandleSDT(uint tsid, const ServiceDescriptionTable*);
    145146    void HandleTDT(const TimeDateTable*) {}
    146147
     148    // DVB Other
     149    void HandleNITo(const NetworkInformationTable*) {}
     150    void HandleSDTo(uint tsid, const ServiceDescriptionTable*);
     151    void HandleBAT(const BouquetAssociationTable*);
     152
    147153  private:
    148154    // some useful gets
    149155    DTVChannel       *GetDTVChannel(void);
    class ChannelScanSM : public MPEGStreamListener, 
    188194    static QString loc(const ChannelScanSM*);
    189195
    190196    static const uint kDVBTableTimeout;
     197    static const uint kDVBoTableTimeout;
    191198    static const uint kATSCTableTimeout;
    192199    static const uint kMPEGTableTimeout;
    193200
    class ChannelScanSM : public MPEGStreamListener, 
    213220    bool              wait_for_mpeg;
    214221    bool              wait_for_atsc;
    215222    bool              wait_for_dvb;
     223    bool              wait_for_dvbo;
    216224
    217225    // Transports List
    218226    int                         transportsScanned;
    class ChannelScanSM : public MPEGStreamListener, 
    223231    bool                        currentTestingDecryption;
    224232    QMap<uint, uint>            currentEncryptionStatus;
    225233    QMap<uint, bool>            currentEncryptionStatusChecked;
     234    QMap<uint64_t, QString>     defAuthorities;
    226235
    227236    /// Found Channel Info
    228237    ChannelList       channelList;
  • mythtv/libs/libmythtv/channelscan/scaninfo.cpp

    diff --git a/mythtv/libs/libmythtv/channelscan/scaninfo.cpp b/mythtv/libs/libmythtv/channelscan/scaninfo.cpp
    index e01035e..bfa3829 100644
    a b ScanDTVTransportList LoadScan(uint scanid) 
    119119            "    in_pat,             in_pmt,             in_vct,             "
    120120            "    in_nit,             in_sdt,             is_encrypted,       "
    121121            "    is_data_service,    is_audio_service,   is_opencable,       "
    122             "    could_be_opencable, decryption_status "
     122            "    could_be_opencable, decryption_status,  default_authority  "
    123123            "FROM channelscan_channel "
    124124            "WHERE transportid = :TRANSPORTID");
    125125        query2.bindValue(":TRANSPORTID", query.value(15).toUInt());
    ScanDTVTransportList LoadScan(uint scanid) 
    178178                query2.value(31).toBool()/*is_audio_service*/,
    179179                query2.value(32).toBool()/*is_opencable*/,
    180180                query2.value(33).toBool()/*could_be_opencable*/,
    181                 query2.value(34).toInt()/*decryption_status*/);
     181                query2.value(34).toInt()/*decryption_status*/,
     182                query2.value(35).toString()/*default_authority*/);
    182183
    183184            mux.channels.push_back(chan);
    184185        }
  • mythtv/libs/libmythtv/dbchannelinfo.cpp

    diff --git a/mythtv/libs/libmythtv/dbchannelinfo.cpp b/mythtv/libs/libmythtv/dbchannelinfo.cpp
    index aa500e3..cf6f623 100644
    a b bool ChannelInsertInfo::SaveScan(uint scanid, uint transportid) const 
    170170        "    in_pat,             in_pmt,             in_vct,             "
    171171        "    in_nit,             in_sdt,             is_encrypted,       "
    172172        "    is_data_service,    is_audio_service,   is_opencable,       "
    173         "    could_be_opencable, decryption_status                       "
     173        "    could_be_opencable, decryption_status,  default_authority   "
    174174        " )  "
    175175        "VALUES "
    176176        " ( :SCANID,            :TRANSPORTID,                            "
    bool ChannelInsertInfo::SaveScan(uint scanid, uint transportid) const 
    185185        "   :IN_PAT,            :IN_PMT,            :IN_VCT,             "
    186186        "   :IN_NIT,            :IN_SDT,            :IS_ENCRYPTED,       "
    187187        "   :IS_DATA_SERVICE,   :IS_AUDIO_SERVICE,  :IS_OPEBCABLE,       "
    188         "   :COULD_BE_OPENCABLE,:DECRYPTION_STATUS                       "
     188        "   :COULD_BE_OPENCABLE,:DECRYPTION_STATUS, :DEFAULT_AUTHORITY   "
    189189        " );");
    190190
    191191    query.bindValue(":SCANID", scanid);
    bool ChannelInsertInfo::SaveScan(uint scanid, uint transportid) const 
    225225    query.bindValue(":IS_OPEBCABLE", is_opencable);
    226226    query.bindValue(":COULD_BE_OPENCABLE", could_be_opencable);
    227227    query.bindValue(":DECRYPTION_STATUS", decryption_status);
     228    query.bindValue(":DEFAULT_AUTHORITY", default_authority);
    228229
    229230    if (!query.exec())
    230231    {
    ChannelInsertInfo::ChannelInsertInfo( 
    254255    bool    _in_nit,             bool    _in_sdt,
    255256    bool    _is_encrypted,       bool    _is_data_service,
    256257    bool    _is_audio_service,   bool    _is_opencable,
    257     bool    _could_be_opencable, int     _decryption_status) :
     258    bool    _could_be_opencable, int     _decryption_status,
     259    QString _default_authority) :
    258260    db_mplexid(_db_mplexid),
    259261    source_id(_source_id),
    260262    channel_id(_channel_id),
    ChannelInsertInfo::ChannelInsertInfo( 
    271273    icon(_icon),
    272274    format(_format),
    273275    xmltvid(_xmltvid),
     276    default_authority(_default_authority),
    274277    pat_tsid(_pat_tsid),
    275278    vct_tsid(_vct_tsid),
    276279    vct_chan_tsid(_vct_chan_tsid),
    ChannelInsertInfo::ChannelInsertInfo( 
    298301    icon.detach();
    299302    format.detach();
    300303    xmltvid.detach();
     304    default_authority.detach();
    301305    si_standard.detach();
    302306}
    303307
    ChannelInsertInfo &ChannelInsertInfo::operator=( 
    320324    icon               = other.icon;        icon.detach();
    321325    format             = other.format;      format.detach();
    322326    xmltvid            = other.xmltvid;     xmltvid.detach();
     327    default_authority  = other.default_authority; default_authority.detach();
    323328
    324329    // non-DB info
    325330    pat_tsid           = other.pat_tsid;
    void ChannelInsertInfo::ImportExtraInfo(const ChannelInsertInfo &other) 
    391396    {
    392397        xmltvid            = other.xmltvid;     xmltvid.detach();
    393398    }
     399    if (!other.default_authority.isEmpty() && default_authority.isEmpty())
     400    {
     401        default_authority  = other.default_authority; default_authority.detach();
     402    }
    394403    // non-DB info
    395404    if (other.pat_tsid && !pat_tsid)
    396405        pat_tsid           = other.pat_tsid;
  • mythtv/libs/libmythtv/dbchannelinfo.h

    diff --git a/mythtv/libs/libmythtv/dbchannelinfo.h b/mythtv/libs/libmythtv/dbchannelinfo.h
    index 5d1dc14..b2f9135 100644
    a b class MPUBLIC ChannelInsertInfo 
    9090        hidden(false), hidden_in_guide(false),
    9191        freqid(QString::null), icon(QString::null),
    9292        format(QString::null), xmltvid(QString::null),
     93        default_authority(QString::null),
    9394        pat_tsid(0), vct_tsid(0), vct_chan_tsid(0), sdt_tsid(0),
    9495        orig_netid(0), netid(0),
    9596        si_standard(QString::null),
    class MPUBLIC ChannelInsertInfo 
    128129
    129130        bool    _is_encrypted,       bool    _is_data_service,
    130131        bool    _is_audio_service,   bool    _is_opencable,
    131         bool    _could_be_opencable, int     _decryption_status);
     132        bool    _could_be_opencable, int     _decryption_status,
     133        QString _default_authority);
    132134
    133135    ChannelInsertInfo(const ChannelInsertInfo &other) { (*this = other); }
    134136    ChannelInsertInfo &operator=(const ChannelInsertInfo &other);
    class MPUBLIC ChannelInsertInfo 
    156158    QString icon;
    157159    QString format;
    158160    QString xmltvid;
     161    QString default_authority;
    159162
    160163    // non-DB info
    161164    uint    pat_tsid;
  • mythtv/libs/libmythtv/dtvmultiplex.cpp

    diff --git a/mythtv/libs/libmythtv/dtvmultiplex.cpp b/mythtv/libs/libmythtv/dtvmultiplex.cpp
    index ebe3be3..d28896b 100644
    a b bool ScanDTVTransport::FillFromDB(DTVTunerType type, uint mplexid) 
    425425        "       c.serviceid,     c.atsc_major_chan, c.atsc_minor_chan, "
    426426        "       c.useonairguide, c.visible,         c.freqid,          "
    427427        "       c.icon,          c.tvformat,        c.xmltvid,         "
    428         "       d.transportid,   d.networkid                          "
     428        "       d.transportid,   d.networkid,       c.default_authority "
    429429        "FROM channel AS c, dtv_multiplex AS d "
    430430        "WHERE c.mplexid = :MPLEXID AND"
    431431        "      c.mplexid = d.mplexid");
    bool ScanDTVTransport::FillFromDB(DTVTunerType type, uint mplexid) 
    455455            QString::null,
    456456            false, false, false, false,
    457457            false, false, false, false,
    458             false, false, false, 0);
     458            false, false, false, 0,
     459            query.value(18).toString() /* default_authority */);
    459460
    460461        channels.push_back(chan);
    461462    }