Ticket #2874: encryption_sigmon_v2.diff

File encryption_sigmon_v2.diff, 24.1 KB (added by Janne <janne-mythtv@…>, 17 years ago)
  • mythtv/libs/libmythtv/dtvsignalmonitor.cpp

    diff --git a/mythtv/libs/libmythtv/dtvsignalmonitor.cpp b/mythtv/libs/libmythtv/dtvsignalmonitor.cpp
    index 52ddf2f..665eebd 100644
    a b  
    11#include <unistd.h>
    22
    33#include "dtvchannel.h"
     4#include "dvbchannel.h"
    45#include "dtvsignalmonitor.h"
    56#include "scanstreamdata.h"
    67#include "mpegtables.h"
    DTVSignalMonitor::DTVSignalMonitor(int db_cardnum, 
    3031      seenVCT(tr("Seen")+" VCT", "seen_vct", 1, true, 0, 1, 0),
    3132      seenNIT(tr("Seen")+" NIT", "seen_nit", 1, true, 0, 1, 0),
    3233      seenSDT(tr("Seen")+" SDT", "seen_sdt", 1, true, 0, 1, 0),
     34      seenCrypt(tr("Seen")+" Crypt", "seen_crypt", 1, true, 0, 1, 0),
    3335      matchingPAT(tr("Matching")+" PAT", "matching_pat", 1, true, 0, 1, 0),
    3436      matchingPMT(tr("Matching")+" PMT", "matching_pmt", 1, true, 0, 1, 0),
    3537      matchingMGT(tr("Matching")+" MGT", "matching_mgt", 1, true, 0, 1, 0),
    3638      matchingVCT(tr("Matching")+" VCT", "matching_vct", 1, true, 0, 1, 0),
    3739      matchingNIT(tr("Matching")+" NIT", "matching_nit", 1, true, 0, 1, 0),
    3840      matchingSDT(tr("Matching")+" SDT", "matching_sdt", 1, true, 0, 1, 0),
     41      matchingCrypt(tr("Matching")+" Crypt", "matching_crypt",
     42                    1, true, 0, 1, 0),
    3943      majorChannel(-1), minorChannel(-1),
    4044      networkID(0), transportID(0),
    4145      detectedNetworkID(0), detectedTransportID(0),
    QStringList DTVSignalMonitor::GetStatusList(bool kick) 
    112116        list<<seenSDT.GetName()<<seenSDT.GetStatus();
    113117        list<<matchingSDT.GetName()<<matchingSDT.GetStatus();
    114118    }
     119    if (flags & kDTVSigMon_WaitForCrypt)
     120    {
     121        list<<seenCrypt.GetName()<<seenCrypt.GetStatus();
     122        list<<matchingCrypt.GetName()<<matchingCrypt.GetStatus();
     123    }
    115124    if (error != "")
    116125    {
    117126        list<<"error"<<error;
    void DTVSignalMonitor::UpdateMonitorValues(void) 
    140149    seenVCT.SetValue(    (flags & kDTVSigMon_VCTSeen)  ? 1 : 0);
    141150    seenNIT.SetValue(    (flags & kDTVSigMon_NITSeen)  ? 1 : 0);
    142151    seenSDT.SetValue(    (flags & kDTVSigMon_SDTSeen)  ? 1 : 0);
     152    seenCrypt.SetValue(  (flags & kDTVSigMon_CryptSeen)? 1 : 0);
    143153    matchingPAT.SetValue((flags & kDTVSigMon_PATMatch) ? 1 : 0);
    144154    matchingPMT.SetValue((flags & kDTVSigMon_PMTMatch) ? 1 : 0);
    145155    matchingMGT.SetValue((flags & kDTVSigMon_MGTMatch) ? 1 : 0);
    146156    matchingVCT.SetValue((flags & kDTVSigMon_VCTMatch) ? 1 : 0);
    147157    matchingNIT.SetValue((flags & kDTVSigMon_NITMatch) ? 1 : 0);
    148158    matchingSDT.SetValue((flags & kDTVSigMon_SDTMatch) ? 1 : 0);
     159    matchingCrypt.SetValue((flags & kDTVSigMon_CryptMatch) ? 1 : 0);
    149160}
    150161
    151162void DTVSignalMonitor::UpdateListeningForEIT(void)
    void DTVSignalMonitor::SetChannel(int major, int minor) 
    177188    DBG_SM(QString("SetChannel(%1, %2)").arg(major).arg(minor), "");
    178189    if (GetATSCStreamData() && (majorChannel != major || minorChannel != minor))
    179190    {
    180         RemoveFlags(kDTVSigMon_PATSeen | kDTVSigMon_PATMatch |
    181                     kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch |
    182                     kDTVSigMon_VCTSeen | kDTVSigMon_VCTMatch);
     191        RemoveFlags(kDTVSigMon_PATSeen   | kDTVSigMon_PATMatch |
     192                    kDTVSigMon_PMTSeen   | kDTVSigMon_PMTMatch |
     193                    kDTVSigMon_VCTSeen   | kDTVSigMon_VCTMatch |
     194                    kDTVSigMon_CryptSeen | kDTVSigMon_CryptMatch);
    183195        majorChannel = major;
    184196        minorChannel = minor;
    185197        GetATSCStreamData()->SetDesiredChannel(major, minor);
    void DTVSignalMonitor::SetProgramNumber(int progNum) 
    192204    DBG_SM(QString("SetProgramNumber(%1)").arg(progNum), "");
    193205    if (programNumber != progNum)
    194206    {
    195         RemoveFlags(kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch);
     207        RemoveFlags(kDTVSigMon_PMTSeen   | kDTVSigMon_PMTMatch |
     208                    kDTVSigMon_CryptSeen | kDTVSigMon_CryptMatch);
    196209        programNumber = progNum;
    197210        if (GetStreamData())
    198211            GetStreamData()->SetDesiredProgram(programNumber);
    void DTVSignalMonitor::SetDVBService(uint netid, uint tsid, int serviceid) 
    211224        return;
    212225    }
    213226
    214     RemoveFlags(kDTVSigMon_PMTSeen | kDTVSigMon_PMTMatch |
    215                 kDTVSigMon_SDTSeen | kDTVSigMon_SDTMatch);
     227    RemoveFlags(kDTVSigMon_PMTSeen   | kDTVSigMon_PMTMatch |
     228                kDTVSigMon_SDTSeen   | kDTVSigMon_SDTMatch |
     229                kDTVSigMon_CryptSeen | kDTVSigMon_CryptMatch);
    216230
    217231    transportID   = tsid;
    218232    networkID     = netid;
    void DTVSignalMonitor::HandlePMT(uint, const ProgramMapTable *pmt) 
    328342    if ((hasVideo >= GetStreamData()->GetVideoStreamsRequired()) &&
    329343        (hasAudio >= GetStreamData()->GetAudioStreamsRequired()))
    330344    {
     345        if (pmt->IsEncrypted())
     346        {
     347#ifdef USING_DVB
     348            DVBChannel* dvbchan = dynamic_cast<DVBChannel*>(GetDTVChannel());
     349            if (dvbchan)
     350                dvbchan->SetPMT(pmt);
     351#endif
     352            AddFlags(kDTVSigMon_WaitForCrypt);
     353            GetStreamData()->TestDecryption(pmt);
     354        }
    331355        AddFlags(kDTVSigMon_PMTMatch);
    332356    }
    333357    else
    void DTVSignalMonitor::HandleSDT(uint, const ServiceDescriptionTable *sdt) 
    432456    }
    433457}
    434458
     459void DTVSignalMonitor::HandleEncryptionStatus(uint, bool enc_status)
     460{
     461    AddFlags(kDTVSigMon_CryptSeen);
     462    if (!enc_status)
     463        AddFlags(kDTVSigMon_CryptMatch);
     464}
     465
    435466ATSCStreamData *DTVSignalMonitor::GetATSCStreamData()
    436467{
    437468    return dynamic_cast<ATSCStreamData*>(stream_data);
    bool DTVSignalMonitor::IsAllGood(void) const 
    479510            return false;
    480511    if ((flags & kDTVSigMon_WaitForSDT) && !matchingSDT.IsGood())
    481512            return false;
     513    if ((flags & kDTVSigMon_WaitForCrypt) && !matchingCrypt.IsGood())
     514            return false;
    482515
    483516    return true;
    484517}
  • mythtv/libs/libmythtv/dtvsignalmonitor.h

    diff --git a/mythtv/libs/libmythtv/dtvsignalmonitor.h b/mythtv/libs/libmythtv/dtvsignalmonitor.h
    index 4547b22..d52225e 100644
    a b class DTVSignalMonitor : public SignalMonitor, 
    8686    void HandlePAT(const ProgramAssociationTable*);
    8787    void HandleCAT(const ConditionalAccessTable*) {}
    8888    void HandlePMT(uint, const ProgramMapTable*);
     89    void HandleEncryptionStatus(uint, bool enc_status);
    8990
    9091    // ATSC Main
    9192    void HandleSTT(const SystemTimeTable*) {}
    class DTVSignalMonitor : public SignalMonitor, 
    118119    SignalMonitorValue seenVCT;
    119120    SignalMonitorValue seenNIT;
    120121    SignalMonitorValue seenSDT;
     122    SignalMonitorValue seenCrypt;
    121123    SignalMonitorValue matchingPAT;
    122124    SignalMonitorValue matchingPMT;
    123125    SignalMonitorValue matchingMGT;
    124126    SignalMonitorValue matchingVCT;
    125127    SignalMonitorValue matchingNIT;
    126128    SignalMonitorValue matchingSDT;
     129    SignalMonitorValue matchingCrypt;
    127130
    128131    // ATSC tuning info
    129132    int                majorChannel;
  • mythtv/libs/libmythtv/dvbrecorder.h

    diff --git a/mythtv/libs/libmythtv/dvbrecorder.h b/mythtv/libs/libmythtv/dvbrecorder.h
    index 69fba97..7104af2 100644
    a b class DVBRecorder : public DTVRecorder, 
    8181    void HandlePAT(const ProgramAssociationTable*);
    8282    void HandleCAT(const ConditionalAccessTable*) {}
    8383    void HandlePMT(uint pid, const ProgramMapTable*);
     84    void HandleEncryptionStatus(uint, bool) { }
    8485
    8586    void SetStreamData(MPEGStreamData*);
    8687    MPEGStreamData* GetStreamData(void) { return _stream_data; }
  • mythtv/libs/libmythtv/hdhrrecorder.h

    diff --git a/mythtv/libs/libmythtv/hdhrrecorder.h b/mythtv/libs/libmythtv/hdhrrecorder.h
    index e541710..128390e 100644
    a b class HDHRRecorder : public DTVRecorder, 
    4646    void HandlePAT(const ProgramAssociationTable*);
    4747    void HandleCAT(const ConditionalAccessTable*) {}
    4848    void HandlePMT(uint pid, const ProgramMapTable*);
     49    void HandleEncryptionStatus(uint, bool) {}
    4950
    5051    // MPEG Single Program Stream Listener
    5152    void HandleSingleProgramPAT(ProgramAssociationTable *pat);
  • mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp

    diff --git a/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp b/mythtv/libs/libmythtv/mpeg/mpegstreamdata.cpp
    index 246ef84..3549929 100644
    a b int MPEGStreamData::ProcessData(unsigned char *buffer, int len) 
    727727bool MPEGStreamData::ProcessTSPacket(const TSPacket& tspacket)
    728728{
    729729    bool ok = !tspacket.TransportError();
    730     if (ok && !tspacket.ScramplingControl() && tspacket.HasPayload() &&
    731         IsListeningPID(tspacket.PID()))
     730
     731    if (IsEncryptionTestPID(tspacket.PID()))
     732    {
     733        ProcessEncryptedPacket(tspacket);
     734    }
     735    else if (ok && !tspacket.ScramplingControl() && tspacket.HasPayload() &&
     736             IsListeningPID(tspacket.PID()))
    732737    {
    733738        HandleTSTables(&tspacket);
    734739    }
     740
    735741    return ok;
    736742}
    737743
    bool MPEGStreamData::IsAudioPID(uint pid) const 
    778784    return it != _pids_audio.end();
    779785}
    780786
     787bool MPEGStreamData::IsEncryptionTestPID(uint pid) const
     788{
     789    QMap<uint, bool>::const_iterator it = _pids_encryption.find(pid);
     790    return it != _pids_encryption.end();
     791}
     792
    781793void MPEGStreamData::SavePartialPES(uint pid, PESPacket* packet)
    782794{
    783795    pid_pes_map_t::iterator it = _partial_pes_packet_cache.find(pid);
    void MPEGStreamData::RemoveMPEGSPListener(MPEGSingleProgramStreamListener *val) 
    11891201        }
    11901202    }
    11911203}
     1204
     1205void MPEGStreamData::AddEncryptionTestPID(uint pid)
     1206{
     1207    AddListeningPID(pid);
     1208    _pids_encryption[pid] = false;
     1209    _pids_encrypted_packets[pid] = 0;
     1210    _pids_decrypted_packets[pid] = 0;
     1211}
     1212
     1213void MPEGStreamData::RemoveEncryptionTestPID(uint pid)
     1214{
     1215    RemoveListeningPID(pid);
     1216    _pids_encryption.erase(pid);
     1217    _pids_encrypted_packets.erase(pid);
     1218    _pids_decrypted_packets.erase(pid);
     1219}
     1220
     1221void MPEGStreamData::TestDecryption(const ProgramMapTable* pmt)
     1222{
     1223    VERBOSE(VB_RECORD,
     1224            QString("Setting decryption Signal Monitoring "
     1225                    "for program id %1 up.").arg(pmt->ProgramNumber()));
     1226
     1227    bool encrypted = pmt->IsProgramEncrypted();
     1228    for (uint i = 0; i < pmt->StreamCount(); i++)
     1229        if ((encrypted || pmt->IsStreamEncrypted(i)) &&
     1230            (pmt->IsVideo(i, _sistandard) || pmt->IsAudio(i, _sistandard)))
     1231            AddEncryptionTestPID(pmt->StreamPID(i));
     1232}
     1233
     1234#define SAFE_DECRYPTED_PACKETS 8
     1235#define SAFE_ENCRYPTED_PACKETS 10000
     1236
     1237/** \fn MPEGStreamData::ProcessEncryptedPacket(const TSPacket& tspacket)
     1238 *  \brief counts en/decrypted packets to decide if a stream is en/decrypted
     1239 */
     1240void MPEGStreamData::ProcessEncryptedPacket(const TSPacket& tspacket)
     1241{
     1242    uint pid = tspacket.PID();
     1243
     1244    if (tspacket.ScramplingControl())
     1245    {
     1246        _pids_decrypted_packets[pid] = 0;
     1247
     1248        // if a fair amount of encrypted packets is passed assume that
     1249        // the stream is not decryptable now
     1250        if (++_pids_encrypted_packets[pid] > SAFE_ENCRYPTED_PACKETS &&
     1251            !_pids_encryption[pid])
     1252        {
     1253            _pids_encryption[pid] = true;
     1254            VERBOSE(VB_IMPORTANT,
     1255                    QString("Couldn't decrypt stream on PID %1.").arg(pid));
     1256
     1257            _listener_lock.lock();
     1258            for (uint i = 0; i < _mpeg_listeners.size(); i++)
     1259                _mpeg_listeners[i]->HandleEncryptionStatus(0, true);
     1260            _listener_lock.unlock();
     1261        }
     1262    }
     1263    else
     1264    {
     1265        _pids_encrypted_packets[pid] = 0;
     1266        if (++_pids_decrypted_packets[pid] > SAFE_DECRYPTED_PACKETS)
     1267        {
     1268            RemoveEncryptionTestPID(pid);
     1269            VERBOSE(VB_RECORD,
     1270                    QString("Stream on PID %1 is now unencrypted").arg(pid));
     1271        }
     1272    }
     1273
     1274    // report only success if all stream com unencrypted
     1275    if (_pids_encryption.size() < 1)
     1276    {
     1277        _listener_lock.lock();
     1278        for (uint i = 0; i < _mpeg_listeners.size(); i++)
     1279            _mpeg_listeners[i]->HandleEncryptionStatus(0, false);
     1280        _listener_lock.unlock();
     1281    }
     1282}
  • mythtv/libs/libmythtv/mpeg/mpegstreamdata.h

    diff --git a/mythtv/libs/libmythtv/mpeg/mpegstreamdata.h b/mythtv/libs/libmythtv/mpeg/mpegstreamdata.h
    index fd053a2..6b9cbae 100644
    a b class MPEGStreamData : public EITSource 
    6868    virtual bool ProcessTSPacket(const TSPacket& tspacket);
    6969    virtual int  ProcessData(unsigned char *buffer, int len);
    7070    inline  void HandleAdaptationFieldControl(const TSPacket* tspacket);
     71    virtual void TestDecryption(const ProgramMapTable* pmt);
    7172
    7273    // Listening
    7374    virtual void AddListeningPID(uint pid)  { _pids_listening[pid] = true; }
    7475    virtual void AddNotListeningPID(uint pid){_pids_notlistening[pid] = true;}
    7576    virtual void AddWritingPID(uint pid)    { _pids_writing[pid] = true;   }
    7677    virtual void AddAudioPID(uint pid)      { _pids_audio[pid] = true;     }
     78    virtual void AddEncryptionTestPID(uint pid);
    7779
    7880    virtual void RemoveListeningPID(uint pid) { _pids_listening.erase(pid);  }
    7981    virtual void RemoveNotListeningPID(uint pid)
    8082        { _pids_notlistening.erase(pid); }
    8183    virtual void RemoveWritingPID(uint pid) { _pids_writing.erase(pid);    }
    8284    virtual void RemoveAudioPID(uint pid)   { _pids_audio.erase(pid);      }
     85    virtual void RemoveEncryptionTestPID(uint pid);
    8386
    8487    virtual bool IsListeningPID(uint pid) const;
    8588    virtual bool IsNotListeningPID(uint pid) const;
    8689    virtual bool IsWritingPID(uint pid) const;
    8790    virtual bool IsAudioPID(uint pid) const;
     91    virtual bool IsEncryptionTestPID(uint pid) const;
    8892
    8993    virtual QMap<uint, bool> ListeningPIDs(void) const
    9094        { return _pids_listening; }
    9195
     96    virtual QMap<uint, bool> EncryptionTestPID(void) const
     97        { return _pids_encryption; }
     98
     99
    92100    // Table versions
    93101    void SetVersionPAT(uint tsid, int version, uint last_section)
    94102    {
    class MPEGStreamData : public EITSource 
    214222    void DeletePartialPES(uint pid);
    215223    void ProcessPAT(const ProgramAssociationTable *pat);
    216224    void ProcessPMT(const ProgramMapTable *pmt);
     225    void ProcessEncryptedPacket(const TSPacket&);
    217226
    218227    static int ResyncStream(unsigned char *buffer, int curr_pos, int len);
    219228
    class MPEGStreamData : public EITSource 
    237246    QMap<uint, bool>          _pids_notlistening;
    238247    QMap<uint, bool>          _pids_writing;
    239248    QMap<uint, bool>          _pids_audio;
     249    QMap<uint, bool>          _pids_encryption;
     250    QMap<uint, uint>          _pids_encrypted_packets;
     251    QMap<uint, uint>          _pids_decrypted_packets;
    240252
    241253    // Signals
    242254    mutable QMutex            _listener_lock;
  • mythtv/libs/libmythtv/mpeg/mpegtables.cpp

    diff --git a/mythtv/libs/libmythtv/mpeg/mpegtables.cpp b/mythtv/libs/libmythtv/mpeg/mpegtables.cpp
    index 91fe025..00b1fc9 100644
    a b bool ProgramMapTable::IsAudio(uint i, QString sistandard) const 
    281281 */
    282282bool ProgramMapTable::IsEncrypted(void) const
    283283{
     284    bool encrypted = IsProgramEncrypted();
     285
     286    for (uint i = 0; !encrypted && i < StreamCount(); i++)
     287        encrypted |= IsStreamEncrypted(i);
     288
     289    return encrypted;
     290}
     291
     292/** \fn ProgramMapTable::IsProgramEncrypted(void) const
     293 *  \brief Returns true iff PMT's ProgramInfo contains CA descriptor.
     294 */
     295bool ProgramMapTable::IsProgramEncrypted(void) const
     296{
    284297    desc_list_t descs = MPEGDescriptor::ParseOnlyInclude(
    285298        ProgramInfo(), ProgramInfoLength(), DescriptorID::conditional_access);
    286299
    bool ProgramMapTable::IsEncrypted(void) const 
    295308        //VERBOSE(VB_IMPORTANT, "DTVsm: "<<cad.toString());
    296309    }
    297310
    298     for (uint i = 0; i < StreamCount(); i++)
    299     {
    300         desc_list_t descs = MPEGDescriptor::ParseOnlyInclude(
    301             StreamInfo(i), StreamInfoLength(i),
    302             DescriptorID::conditional_access);
     311    return encrypted;
     312}
    303313
    304         for (uint j = 0; j < descs.size(); j++)
    305         {
    306             ConditionalAccessDescriptor cad(descs[j]);
    307             encryption_system[cad.PID()] = cad.SystemID();
    308             encrypted |= cad.SystemID();
     314/** \fn ProgramMapTable::IsStreamEncrypted(uint i) const
     315 *  \brief Returns true iff PMT contains CA descriptor.
     316 *
     317 *  \param i index of stream
     318 */
     319bool ProgramMapTable::IsStreamEncrypted(uint i) const
     320{
     321    desc_list_t descs = MPEGDescriptor::ParseOnlyInclude(
     322        StreamInfo(i), StreamInfoLength(i), DescriptorID::conditional_access);
    309323
    310             //VERBOSE(VB_IMPORTANT, "DTVsm: "<<cad.toString());
    311         }
     324    bool encrypted = false;
     325    QMap<uint,uint> encryption_system;
     326    for (uint j = 0; j < descs.size(); j++)
     327    {
     328        ConditionalAccessDescriptor cad(descs[j]);
     329        encryption_system[cad.PID()] = cad.SystemID();
     330        encrypted |= cad.SystemID();
     331
     332        //VERBOSE(VB_IMPORTANT, "DTVsm: "<<cad.toString());
    312333    }
    313334
    314335    return encrypted;
  • mythtv/libs/libmythtv/mpeg/mpegtables.h

    diff --git a/mythtv/libs/libmythtv/mpeg/mpegtables.h b/mythtv/libs/libmythtv/mpeg/mpegtables.h
    index 3ac796f..5416bac 100644
    a b class ProgramMapTable : public PSIPTable 
    461461        Parse();
    462462    }
    463463
    464     ProgramMapTable(const PSIPTable& table) : PSIPTable(table)
     464        ProgramMapTable(const PSIPTable& table) : PSIPTable(table)
    465465    {
    466466        assert(TableID::PMT == TableID());
    467467        Parse();
    class ProgramMapTable : public PSIPTable 
    528528    bool IsVideo(uint i, QString sistandard) const;
    529529    bool IsAudio(uint i, QString sistandard) const;
    530530    bool IsEncrypted(void) const;
     531    bool IsProgramEncrypted(void) const;
     532    bool IsStreamEncrypted(uint) const;
    531533    /// Returns true iff PMT contains a still-picture video stream
    532534    bool IsStillPicture(QString sistandard) const;
    533535    /// Returns a string representation of type at stream index i
  • mythtv/libs/libmythtv/mpeg/streamlisteners.h

    diff --git a/mythtv/libs/libmythtv/mpeg/streamlisteners.h b/mythtv/libs/libmythtv/mpeg/streamlisteners.h
    index 7a719ec..684bebd 100644
    a b  
     1// -*- Mode: c++ -*-
    12#ifndef _STREAMLISTENERS_H_
    23#define _STREAMLISTENERS_H_
    34
    class MPEGStreamListener 
    4142    virtual void HandlePAT(const ProgramAssociationTable*) = 0;
    4243    virtual void HandleCAT(const ConditionalAccessTable*) = 0;
    4344    virtual void HandlePMT(uint program_num, const ProgramMapTable*) = 0;
     45    virtual void HandleEncryptionStatus(uint program_number, bool) = 0;
    4446};
    4547
    4648class MPEGSingleProgramStreamListener
  • mythtv/libs/libmythtv/signalmonitor.h

    diff --git a/mythtv/libs/libmythtv/signalmonitor.h b/mythtv/libs/libmythtv/signalmonitor.h
    index 0ecb13a..c551dbf 100644
    a b class SignalMonitor : public QObject 
    148148    static const uint64_t kDTVSigMon_SDTSeen    = 0x0000000080ULL;
    149149    /// We've seen the FireWire STB power state
    150150    static const uint64_t kFWSigMon_PowerSeen   = 0x0000000100ULL;
     151    /// We can encrypt the stream
     152    static const uint64_t kDTVSigMon_CryptSeen  = 0x0000000200ULL;
    151153
    152154    /// We've seen a PAT matching our requirements
    153155    static const uint64_t kDTVSigMon_PATMatch   = 0x0000001000ULL;
    class SignalMonitor : public QObject 
    167169    static const uint64_t kDTVSigMon_SDTMatch   = 0x0000080000ULL;
    168170    /// We've seen a FireWire STB power state matching our requirements
    169171    static const uint64_t kFWSigMon_PowerMatch  = 0x0000100000ULL;
     172    /// We can encrypt the stream
     173    static const uint64_t kDTVSigMon_CryptMatch = 0x0000200000ULL;
    170174
    171175    static const uint64_t kDTVSigMon_WaitForPAT = 0x0001000000ULL;
    172176    static const uint64_t kDTVSigMon_WaitForPMT = 0x0002000000ULL;
    class SignalMonitor : public QObject 
    176180    static const uint64_t kDTVSigMon_WaitForSDT = 0x0020000000ULL;
    177181    static const uint64_t kDTVSigMon_WaitForSig = 0x0040000000ULL;
    178182    static const uint64_t kFWSigMon_WaitForPower= 0x0080000000ULL;
     183    static const uint64_t kDTVSigMon_WaitForCrypt=0x0100000000ULL;
    179184
    180     static const uint64_t kDTVSigMon_WaitForAll = 0x00FF000000ULL;
     185    static const uint64_t kDTVSigMon_WaitForAll = 0x01FF000000ULL;
    181186
    182187    /// Wait for the Signal to Noise Ratio to rise above a threshhold
    183     static const uint64_t kDVBSigMon_WaitForSNR = 0x0100000000ULL;
     188    static const uint64_t kDVBSigMon_WaitForSNR = 0x1000000000ULL;
    184189    /// Wait for the Bit Error Rate to fall below a threshhold
    185     static const uint64_t kDVBSigMon_WaitForBER = 0x0200000000ULL;
     190    static const uint64_t kDVBSigMon_WaitForBER = 0x2000000000ULL;
    186191    /// Wait for uncorrected FEC blocks to fall below a threshhold
    187     static const uint64_t kDVBSigMon_WaitForUB  = 0x0400000000ULL;
     192    static const uint64_t kDVBSigMon_WaitForUB  = 0x4000000000ULL;
    188193    /// Wait for rotor to complete turning the antenna
    189     static const uint64_t kDVBSigMon_WaitForPos = 0x0800000000ULL;
     194    static const uint64_t kDVBSigMon_WaitForPos = 0x8000000000ULL;
    190195
    191196  protected:
    192197    pthread_t    monitor_thread;
    inline QString sm_flags_to_string(uint64_t flags) 
    228233        str += "SDT,";
    229234    if (SignalMonitor::kFWSigMon_PowerSeen   & flags)
    230235        str += "STB,";
     236    if (SignalMonitor::kDTVSigMon_CryptSeen  & flags)
     237        str += "Crypt,";
    231238
    232239    str += ") Match(";
    233240    if (SignalMonitor::kDTVSigMon_PATMatch   & flags)
    inline QString sm_flags_to_string(uint64_t flags) 
    248255        str += "SDT,";
    249256    if (SignalMonitor::kFWSigMon_PowerMatch  & flags)
    250257        str += "STB,";
     258    if (SignalMonitor::kDTVSigMon_CryptMatch & flags)
     259        str += "Crypt,";
    251260
    252261    str += ") Wait(";
    253262    if (SignalMonitor::kDTVSigMon_WaitForPAT & flags)
    inline QString sm_flags_to_string(uint64_t flags) 
    266275        str += "Sig,";
    267276    if (SignalMonitor::kFWSigMon_WaitForPower& flags)
    268277        str += "STB,";
     278    if (SignalMonitor::kDTVSigMon_WaitForCrypt & flags)
     279        str += "Crypt,";
    269280
    270281    if (SignalMonitor::kDVBSigMon_WaitForSNR & flags)
    271282        str += "SNR,";
  • mythtv/libs/libmythtv/signalmonitorvalue.h

    diff --git a/mythtv/libs/libmythtv/signalmonitorvalue.h b/mythtv/libs/libmythtv/signalmonitorvalue.h
    index 67d1d52..ef0e296 100644
    a b  
     1// -*- Mode: c++ -*-
    12#ifndef SIGNALMONITORVALUES_H
    23#define SIGNALMONITORVALUES_H
    34
  • mythtv/libs/libmythtv/siscan.h

    diff --git a/mythtv/libs/libmythtv/siscan.h b/mythtv/libs/libmythtv/siscan.h
    index 9af8abc..044eb96 100644
    a b class SIScan : public QObject, 
    8585    void HandlePAT(const ProgramAssociationTable*);
    8686    void HandleCAT(const ConditionalAccessTable*) { }
    8787    void HandlePMT(uint, const ProgramMapTable*) { }
     88    void HandleEncryptionStatus(uint, bool) { }
    8889
    8990    // ATSC Main
    9091    void HandleSTT(const SystemTimeTable*) {}
  • mythtv/libs/libmythtv/tv_play.cpp

    diff --git a/mythtv/libs/libmythtv/tv_play.cpp b/mythtv/libs/libmythtv/tv_play.cpp
    index 34ff5eb..2959ecf 100644
    a b void TV::UpdateOSDSignal(const QStringList& strlist) 
    46864686    float snr  = 0.0f;
    46874687    uint  ber  = 0xffffffff;
    46884688    int   pos  = -1;
    4689     QString pat(""), pmt(""), mgt(""), vct(""), nit(""), sdt("");
     4689    QString pat(""), pmt(""), mgt(""), vct(""), nit(""), sdt(""), crypt("");
    46904690    QString err = QString::null, msg = QString::null;
    46914691    for (it = slist.begin(); it != slist.end(); ++it)
    46924692    {
    void TV::UpdateOSDSignal(const QStringList& strlist) 
    47364736            sdt = it->IsGood() ? "s" : "_";
    47374737        else if ("matching_sdt" == it->GetShortName())
    47384738            sdt = it->IsGood() ? "S" : sdt;
     4739        else if ("seen_crypt" == it->GetShortName())
     4740            crypt = it->IsGood() ? "c" : "_";
     4741        else if ("matching_crypt" == it->GetShortName())
     4742            crypt = it->IsGood() ? "C" : crypt;
    47394743    }
    47404744    if (sig)
    47414745        infoMap["signal"] = QString::number(sig); // use normalized value
    void TV::UpdateOSDSignal(const QStringList& strlist) 
    47534757    if ((pos >= 0) && (pos < 100))
    47544758        sigDesc += " | " + tr("Rotor %1\%").arg(pos,2);
    47554759
    4756     sigDesc = sigDesc + QString(" | (%1%2%3%4%5%6%7) %8")
     4760    sigDesc = sigDesc + QString(" | (%1%2%3%4%5%6%7%8) %9")
    47574761        .arg(slock).arg(pat).arg(pmt).arg(mgt).arg(vct)
    4758         .arg(nit).arg(sdt).arg(sigMsg);
     4762        .arg(nit).arg(sdt).arg(crypt).arg(sigMsg);
    47594763
    47604764    if (!err.isEmpty())
    47614765        sigDesc = err;