Ticket #1049: sdt_monitoring.patch

File sdt_monitoring.patch, 13.8 KB (added by Janne <janne-mythtv@…>, 18 years ago)

patch against mythtv-eit branch

  • libs/libmythtv/channelbase.cpp

    old new ChannelBase::ChannelBase(TVRec *parent) 
    3535    pParent(parent), channelorder("channum + 0"), curchannelname(""),
    3636    currentInputID(-1), commfree(false), cardid(0),
    3737    currentATSCMajorChannel(-1), currentATSCMinorChannel(-1),
     38    currentOriginalNetworkID(-1), currentTransportID(-1),
    3839    currentProgramNum(-1)
    3940{
    4041}
  • libs/libmythtv/channelbase.h

    old new class ChannelBase 
    159159    /// \brief Returns minor channel, -1 if unknown.
    160160    virtual int GetMinorChannel(void) const
    161161        { return currentATSCMinorChannel; };
     162    /// \brief Returns DVB original_network_id, -1 if unknown.
     163    virtual int GetOriginalNetworkID(void) const
     164        { return currentOriginalNetworkID; };
     165    /// \brief Returns DVB transport_stream_id, -1 if unknown.
     166    virtual int GetTransportID(void) const
     167        { return currentTransportID; };
     168        //                           
    162169
    163170    // \brief Set cardid for scanning
    164171    void SetCardID(uint _cardid) { cardid = _cardid; }
    class ChannelBase 
    186193    int     currentATSCMajorChannel;
    187194    int     currentATSCMinorChannel;
    188195    int     currentProgramNum;
     196    int     currentOriginalNetworkID;
     197    int     currentTransportID;
    189198};
    190199
    191200#endif
  • libs/libmythtv/dtvsignalmonitor.cpp

    old new void DTVSignalMonitor::SetProgramNumber( 
    191191    }
    192192}
    193193
     194void DTVSignalMonitor::SetDVBService(int onid, int tsid, int sid)
     195{
     196    DBG_SM(QString("SetDVBService(original_network_id: %1, transport_id: %2, "
     197                   "service_id: %3)")
     198           .arg(onid).arg(tsid).arg(sid), "");
     199    if (onid != originalNetworkID || tsid != transportID || sid != programNumber)
     200    {
     201        cerr << "setting desired streams" << endl;
     202        RemoveFlags(kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch |
     203                    kDTVSigMon_SDTSeen | kDTVSigMon_SDTMatch   );
     204        originalNetworkID = onid;
     205        transportID       = tsid;
     206        programNumber     = sid;
     207        if (GetDVBStreamData())
     208        {
     209            cerr << "Activating SDT monitoring" << endl;
     210            GetDVBStreamData()->SetDesiredService(originalNetworkID, transportID, programNumber);
     211            AddFlags(kDTVSigMon_WaitForPMT | kDTVSigMon_WaitForSDT);
     212            GetDVBStreamData()->AddListeningPID(DVB_SDT_PID);
     213        }
     214    }
     215}
     216
     217
    194218void DTVSignalMonitor::SetStreamData(MPEGStreamData *data)
    195219{
    196220    if (stream_data)
    void DTVSignalMonitor::HandleSDT(uint, c 
    377401    DBG_SM("SetSDT()", QString("tsid = %1 orig_net_id = %2")
    378402           .arg(sdt->TSID()).arg(sdt->OriginalNetworkID()));
    379403    AddFlags(kDTVSigMon_SDTSeen);
    380     if (!GetDVBStreamData())
     404    int onid = sdt->OriginalNetworkID();
     405    int tsid = sdt->TSID();
     406    if (onid == originalNetworkID && tsid == transportID)
     407    {
     408        AddFlags(kDTVSigMon_SDTMatch);
    381409        return;
     410    }
    382411}
    383412
    384413ATSCStreamData *DTVSignalMonitor::GetATSCStreamData()
  • libs/libmythtv/dtvsignalmonitor.h

    old new class DTVSignalMonitor : public SignalMo 
    3737    void SetProgramNumber(int progNum);
    3838    int  GetProgramNumber() const { return programNumber; }
    3939
     40    void SetDVBService(int onid, int tsid, int sid);
     41    int  GetServiceID() const         { return programNumber; }
     42    int  GetTransportID() const       { return transportID; }
     43    int  GetOriginalNetworkID() const { return originalNetworkID; }
     44
    4045    void SetFTAOnly(bool fta)    { ignoreEncrypted = fta;  }
    4146    bool GetFTAOnly() const      { return ignoreEncrypted; }
    4247
    class DTVSignalMonitor : public SignalMo 
    111116    int                majorChannel;
    112117    int                minorChannel;
    113118    int                programNumber;
     119    int                transportID;
     120    int                originalNetworkID;
    114121    bool               ignoreEncrypted;
    115122    QString            error;
    116123};
  • libs/libmythtv/dvbchannel.cpp

    old new bool DVBChannel::GetChannelOptions(const 
    296296    // Reset Channel data
    297297    currentATSCMajorChannel = currentATSCMinorChannel = -1;
    298298    currentProgramNum = -1;
     299    currentOriginalNetworkID = currentTransportID = -1;
    299300
    300301    QString thequery =
    301         QString("SELECT chanid, serviceid, mplexid, atscsrcid, cardinputid "
    302                 "FROM channel, cardinput, capturecard "
     302        QString("SELECT chanid, serviceid, channel.mplexid, atscsrcid, "
     303                "       cardinputid, networkid, transportid "
     304                "FROM channel, cardinput, capturecard, dtv_multiplex "
    303305                "WHERE channel.channum='%1' AND "
     306                "      channel.mplexid    = dtv_multiplex.mplexid AND "
     307                "      channel.sourceid   = dtv_multiplex.sourceid AND "
    304308                "      cardinput.sourceid = channel.sourceid AND "
    305309                "      capturecard.cardid = cardinput.cardid AND "
    306310                "      capturecard.cardtype = 'DVB' AND "
    bool DVBChannel::GetChannelOptions(const 
    332336                currentATSCMinorChannel = query.value(3).toInt() & 0xff;
    333337                currentProgramNum = -1;
    334338            }
     339            else if (query.value(5).toInt() > 0)
     340            {
     341                currentOriginalNetworkID = query.value(5).toInt();
     342                currentTransportID       = query.value(6).toInt();
     343            }
    335344        }
    336345    }
    337346
     347
    338348    if (!found)
    339349    {
    340350        VERBOSE(VB_IMPORTANT, LOC_ERR + "Unable to find channel in database.");
  • libs/libmythtv/tv_rec.cpp

    old new bool TVRec::SetupDTVSignalMonitor(void) 
    16301630        return true;
    16311631    }
    16321632
    1633     // Check if this is an MPEG Channel
     1633    // Check if this is an DVB channel
     1634    uint onid = channel->GetOriginalNetworkID();
     1635    uint tsid = channel->GetTransportID();       
    16341636    int progNum = channel->GetProgramNumber();
    1635     if (progNum >= 0)
     1637    if (onid > 0 && tsid > 0 && progNum >= 0)
    16361638    {
    16371639        uint neededVideo = 0;
    16381640        uint neededAudio = 0;
    bool TVRec::SetupDTVSignalMonitor(void) 
    16401642        DVBStreamData *dsd = dynamic_cast<DVBStreamData*>(sd);
    16411643        if (!dsd)
    16421644        {
    1643             sd = dsd = new DVBStreamData();
     1645            sd = dsd = new DVBStreamData(onid, tsid, progNum);
    16441646            sd->SetCaching(true);
    16451647            if (GetDTVRecorder())
    16461648                GetDTVRecorder()->SetStreamData(dsd);
    bool TVRec::SetupDTVSignalMonitor(void) 
    16561658            neededAudio = (setting->getValue() == "audio") ? 1 : 0;
    16571659        }
    16581660
    1659         QString msg = QString("MPEG program number: %1").arg(progNum);
     1661        QString msg = QString("DVB service %1 on original_network_id %2 transport_stream_id %3")
     1662                          .arg(progNum).arg(onid).arg(tsid);
    16601663        VERBOSE(VB_RECORD, LOC + msg);
    16611664
    16621665#ifdef USING_DVB
    bool TVRec::SetupDTVSignalMonitor(void) 
    16711674            GetCaptureCardNum(), channel->GetCurrentInput());
    16721675
    16731676        sm->SetStreamData(sd);
    1674         sm->SetProgramNumber(progNum);
     1677        sm->SetDVBService(onid, tsid, progNum);
    16751678        sd->SetVideoStreamsRequired(neededVideo);
    16761679        sd->SetVideoStreamsRequired(neededAudio);
    16771680        sm->SetFTAOnly(fta);
     1681
     1682        sm->AddFlags(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT | kDTVSigMon_WaitForSDT);
     1683
     1684        VERBOSE(VB_RECORD, LOC + "Successfully set up DVB table monitoring.");
     1685        return true;
     1686    }
     1687
     1688    // Check if this is an MPEG channel
     1689    if (progNum >= 0)
     1690    {
     1691        if (!sd)
     1692        {
     1693            sd = new MPEGStreamData(progNum, true);
     1694            sd->SetCaching(true);
     1695            if (GetDTVRecorder())
     1696                GetDTVRecorder()->SetStreamData(sd);
     1697        }
     1698
     1699        QString msg = QString("MPEG program number: %1").arg(progNum);
     1700        VERBOSE(VB_RECORD, LOC + msg);
     1701
     1702#ifdef USING_DVB
     1703        // Some DVB devices munge the PMT and/or PAT so the CRC check fails.
     1704        // We need to tell the stream data class to not check the CRC on
     1705        // these devices.
     1706        if (GetDVBChannel())
     1707            sd->SetIgnoreCRC(GetDVBChannel()->HasCRCBug());
     1708#endif // USING_DVB
     1709
     1710        bool fta = CardUtil::IgnoreEncrypted(
     1711            GetCaptureCardNum(), channel->GetCurrentInput());
     1712
     1713        sm->SetStreamData(sd);
     1714        sm->SetProgramNumber(progNum);
     1715        sd->SetVideoStreamsRequired(1);
     1716        sm->SetFTAOnly(fta);
     1717
    16781718        sm->AddFlags(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT);
    16791719
    16801720        VERBOSE(VB_RECORD, LOC + "Successfully set up MPEG table monitoring.");
  • libs/libmythtv/mpeg/dvbstreamdata.cpp

    old new using namespace std; 
    77#include "dvbtables.h"
    88#include "eithelper.h"
    99
    10 DVBStreamData::DVBStreamData(bool cacheTables)
    11     : MPEGStreamData(-1, cacheTables),
     10// service_id is equal to the mrogram_number in the PMT
     11DVBStreamData::DVBStreamData(int desired_onid, int desired_tsid,
     12                             int desired_program, bool cacheTables)
     13    : MPEGStreamData(desired_program, cacheTables),
     14      _desired_onid(desired_onid), _desired_tsid(desired_tsid),
    1215      _dvb_eit_dishnet_long(false),
    1316      _nit_version(-2), _nito_version(-2)
    1417{
    DVBStreamData::DVBStreamData(bool cacheT 
    2023
    2124DVBStreamData::~DVBStreamData()
    2225{
    23     Reset();
     26    Reset(_desired_onid, _desired_tsid, _desired_program);
    2427
    2528    QMutexLocker locker(&_listener_lock);
    2629    _dvb_main_listeners.clear();
    DVBStreamData::~DVBStreamData() 
    2932    _dvb_has_eit.clear();
    3033}
    3134
     35void DVBStreamData::SetDesiredService(int onid, int tsid, int sid)
     36{
     37    bool reset    = true;
     38    int networkID = 0;
     39
     40    if (HasCachedAllSDT(tsid, true))
     41    {
     42        const sdt_ptr_t first_sdt = GetCachedSDT(tsid, 0, true);
     43        networkID = first_sdt->OriginalNetworkID();
     44        if (networkID == onid)
     45        {
     46            reset = false;
     47            _desired_onid = onid;
     48            _desired_tsid = tsid;
     49            uint last_section = first_sdt->LastSection();
     50            ProcessSDT(_desired_tsid, first_sdt);
     51            ReturnCachedTable(first_sdt);
     52            for (uint i = 1; i <= last_section; ++i)
     53            {
     54                const sdt_ptr_t sdt = GetCachedSDT(_desired_tsid, i, true);
     55                ProcessSDT(_desired_tsid, sdt);
     56                ReturnCachedTable(sdt);
     57            }
     58            SetDesiredProgram(sid);
     59        }
     60    }
     61
     62    if (reset)
     63        Reset(onid, tsid, sid);
     64}
     65
     66
    3267/** \fn DVBStreamData::IsRedundant(uint,const PSIPTable&) const
    3368 *  \brief Returns true if table already seen.
    3469 *  \todo This is just a stub.
    bool DVBStreamData::IsRedundant(uint pid 
    114149    return false;
    115150}
    116151
    117 void DVBStreamData::Reset(void)
     152void DVBStreamData::Reset(int desired_onid, int desired_tsid, int desired_sid)
    118153{
    119     MPEGStreamData::Reset(-1);
     154    MPEGStreamData::Reset(desired_sid);
     155
     156    _desired_onid = desired_onid;
     157    _desired_tsid = desired_tsid;
    120158
    121159    SetVersionNIT(-1,0);
    122160    _sdt_versions.clear();
  • libs/libmythtv/mpeg/dvbstreamdata.h

    old new typedef QMap<uint, bool>  
    2222class DVBStreamData : virtual public MPEGStreamData
    2323{
    2424  public:
    25     DVBStreamData(bool cacheTables = false);
     25    DVBStreamData(int desired_onid, int desired_tsid,
     26                  int desired_program, bool cacheTables = false);
    2627    ~DVBStreamData();
    2728
    28     void Reset();
     29    void Reset(int desired_onid, int desired_tsid, int desired_sid);
     30
     31    // DVB table monitoring
     32    void SetDesiredService(int onid, int tsid, int sid);
     33    int DesiredOriginalNetworkID(void) const       { return _desired_onid; }
     34    int DesiredTransportID(void) const             { return _desired_tsid; }
    2935
    3036    // Table processing
    3137    bool HandleTables(uint pid, const PSIPTable&);
    class DVBStreamData : virtual public MPE 
    157163    void CacheSDT(ServiceDescriptionTable*);
    158164
    159165  private:
     166    /// DVB table monitoring
     167    int                       _desired_onid;
     168    int                       _desired_tsid;
     169   
    160170    /// Decode DishNet's long-term DVB EIT
    161171    bool                      _dvb_eit_dishnet_long;
    162172    /// Tell us if the DVB service has EIT
  • libs/libmythtv/mpeg/scanstreamdata.cpp

    old new  
    77ScanStreamData::ScanStreamData()
    88    : MPEGStreamData(-1, true),
    99      ATSCStreamData(-1,-1, true),
    10       DVBStreamData(true)
     10      DVBStreamData(-1, -1, -1, true)
    1111{
    1212}
    1313
    void ScanStreamData::Reset(void) 
    3636{
    3737    MPEGStreamData::Reset(-1);
    3838    ATSCStreamData::Reset(-1,-1);
    39     DVBStreamData::Reset();
     39    DVBStreamData::Reset(-1, -1, -1);
    4040
    4141    AddListeningPID(MPEG_PAT_PID);
    4242    AddListeningPID(ATSC_PSIP_PID);