Ticket #1049: sdt_monitoring.patch
File sdt_monitoring.patch, 13.8 KB (added by , 18 years ago) |
---|
-
libs/libmythtv/channelbase.cpp
old new ChannelBase::ChannelBase(TVRec *parent) 35 35 pParent(parent), channelorder("channum + 0"), curchannelname(""), 36 36 currentInputID(-1), commfree(false), cardid(0), 37 37 currentATSCMajorChannel(-1), currentATSCMinorChannel(-1), 38 currentOriginalNetworkID(-1), currentTransportID(-1), 38 39 currentProgramNum(-1) 39 40 { 40 41 } -
libs/libmythtv/channelbase.h
old new class ChannelBase 159 159 /// \brief Returns minor channel, -1 if unknown. 160 160 virtual int GetMinorChannel(void) const 161 161 { 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 // 162 169 163 170 // \brief Set cardid for scanning 164 171 void SetCardID(uint _cardid) { cardid = _cardid; } … … class ChannelBase 186 193 int currentATSCMajorChannel; 187 194 int currentATSCMinorChannel; 188 195 int currentProgramNum; 196 int currentOriginalNetworkID; 197 int currentTransportID; 189 198 }; 190 199 191 200 #endif -
libs/libmythtv/dtvsignalmonitor.cpp
old new void DTVSignalMonitor::SetProgramNumber( 191 191 } 192 192 } 193 193 194 void 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 194 218 void DTVSignalMonitor::SetStreamData(MPEGStreamData *data) 195 219 { 196 220 if (stream_data) … … void DTVSignalMonitor::HandleSDT(uint, c 377 401 DBG_SM("SetSDT()", QString("tsid = %1 orig_net_id = %2") 378 402 .arg(sdt->TSID()).arg(sdt->OriginalNetworkID())); 379 403 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); 381 409 return; 410 } 382 411 } 383 412 384 413 ATSCStreamData *DTVSignalMonitor::GetATSCStreamData() -
libs/libmythtv/dtvsignalmonitor.h
old new class DTVSignalMonitor : public SignalMo 37 37 void SetProgramNumber(int progNum); 38 38 int GetProgramNumber() const { return programNumber; } 39 39 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 40 45 void SetFTAOnly(bool fta) { ignoreEncrypted = fta; } 41 46 bool GetFTAOnly() const { return ignoreEncrypted; } 42 47 … … class DTVSignalMonitor : public SignalMo 111 116 int majorChannel; 112 117 int minorChannel; 113 118 int programNumber; 119 int transportID; 120 int originalNetworkID; 114 121 bool ignoreEncrypted; 115 122 QString error; 116 123 }; -
libs/libmythtv/dvbchannel.cpp
old new bool DVBChannel::GetChannelOptions(const 296 296 // Reset Channel data 297 297 currentATSCMajorChannel = currentATSCMinorChannel = -1; 298 298 currentProgramNum = -1; 299 currentOriginalNetworkID = currentTransportID = -1; 299 300 300 301 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 " 303 305 "WHERE channel.channum='%1' AND " 306 " channel.mplexid = dtv_multiplex.mplexid AND " 307 " channel.sourceid = dtv_multiplex.sourceid AND " 304 308 " cardinput.sourceid = channel.sourceid AND " 305 309 " capturecard.cardid = cardinput.cardid AND " 306 310 " capturecard.cardtype = 'DVB' AND " … … bool DVBChannel::GetChannelOptions(const 332 336 currentATSCMinorChannel = query.value(3).toInt() & 0xff; 333 337 currentProgramNum = -1; 334 338 } 339 else if (query.value(5).toInt() > 0) 340 { 341 currentOriginalNetworkID = query.value(5).toInt(); 342 currentTransportID = query.value(6).toInt(); 343 } 335 344 } 336 345 } 337 346 347 338 348 if (!found) 339 349 { 340 350 VERBOSE(VB_IMPORTANT, LOC_ERR + "Unable to find channel in database."); -
libs/libmythtv/tv_rec.cpp
old new bool TVRec::SetupDTVSignalMonitor(void) 1630 1630 return true; 1631 1631 } 1632 1632 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(); 1634 1636 int progNum = channel->GetProgramNumber(); 1635 if ( progNum >= 0)1637 if (onid > 0 && tsid > 0 && progNum >= 0) 1636 1638 { 1637 1639 uint neededVideo = 0; 1638 1640 uint neededAudio = 0; … … bool TVRec::SetupDTVSignalMonitor(void) 1640 1642 DVBStreamData *dsd = dynamic_cast<DVBStreamData*>(sd); 1641 1643 if (!dsd) 1642 1644 { 1643 sd = dsd = new DVBStreamData( );1645 sd = dsd = new DVBStreamData(onid, tsid, progNum); 1644 1646 sd->SetCaching(true); 1645 1647 if (GetDTVRecorder()) 1646 1648 GetDTVRecorder()->SetStreamData(dsd); … … bool TVRec::SetupDTVSignalMonitor(void) 1656 1658 neededAudio = (setting->getValue() == "audio") ? 1 : 0; 1657 1659 } 1658 1660 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); 1660 1663 VERBOSE(VB_RECORD, LOC + msg); 1661 1664 1662 1665 #ifdef USING_DVB … … bool TVRec::SetupDTVSignalMonitor(void) 1671 1674 GetCaptureCardNum(), channel->GetCurrentInput()); 1672 1675 1673 1676 sm->SetStreamData(sd); 1674 sm->Set ProgramNumber(progNum);1677 sm->SetDVBService(onid, tsid, progNum); 1675 1678 sd->SetVideoStreamsRequired(neededVideo); 1676 1679 sd->SetVideoStreamsRequired(neededAudio); 1677 1680 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 1678 1718 sm->AddFlags(kDTVSigMon_WaitForPAT | kDTVSigMon_WaitForPMT); 1679 1719 1680 1720 VERBOSE(VB_RECORD, LOC + "Successfully set up MPEG table monitoring."); -
libs/libmythtv/mpeg/dvbstreamdata.cpp
old new using namespace std; 7 7 #include "dvbtables.h" 8 8 #include "eithelper.h" 9 9 10 DVBStreamData::DVBStreamData(bool cacheTables) 11 : MPEGStreamData(-1, cacheTables), 10 // service_id is equal to the mrogram_number in the PMT 11 DVBStreamData::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), 12 15 _dvb_eit_dishnet_long(false), 13 16 _nit_version(-2), _nito_version(-2) 14 17 { … … DVBStreamData::DVBStreamData(bool cacheT 20 23 21 24 DVBStreamData::~DVBStreamData() 22 25 { 23 Reset( );26 Reset(_desired_onid, _desired_tsid, _desired_program); 24 27 25 28 QMutexLocker locker(&_listener_lock); 26 29 _dvb_main_listeners.clear(); … … DVBStreamData::~DVBStreamData() 29 32 _dvb_has_eit.clear(); 30 33 } 31 34 35 void 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 32 67 /** \fn DVBStreamData::IsRedundant(uint,const PSIPTable&) const 33 68 * \brief Returns true if table already seen. 34 69 * \todo This is just a stub. … … bool DVBStreamData::IsRedundant(uint pid 114 149 return false; 115 150 } 116 151 117 void DVBStreamData::Reset( void)152 void DVBStreamData::Reset(int desired_onid, int desired_tsid, int desired_sid) 118 153 { 119 MPEGStreamData::Reset(-1); 154 MPEGStreamData::Reset(desired_sid); 155 156 _desired_onid = desired_onid; 157 _desired_tsid = desired_tsid; 120 158 121 159 SetVersionNIT(-1,0); 122 160 _sdt_versions.clear(); -
libs/libmythtv/mpeg/dvbstreamdata.h
old new typedef QMap<uint, bool> 22 22 class DVBStreamData : virtual public MPEGStreamData 23 23 { 24 24 public: 25 DVBStreamData(bool cacheTables = false); 25 DVBStreamData(int desired_onid, int desired_tsid, 26 int desired_program, bool cacheTables = false); 26 27 ~DVBStreamData(); 27 28 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; } 29 35 30 36 // Table processing 31 37 bool HandleTables(uint pid, const PSIPTable&); … … class DVBStreamData : virtual public MPE 157 163 void CacheSDT(ServiceDescriptionTable*); 158 164 159 165 private: 166 /// DVB table monitoring 167 int _desired_onid; 168 int _desired_tsid; 169 160 170 /// Decode DishNet's long-term DVB EIT 161 171 bool _dvb_eit_dishnet_long; 162 172 /// Tell us if the DVB service has EIT -
libs/libmythtv/mpeg/scanstreamdata.cpp
old new 7 7 ScanStreamData::ScanStreamData() 8 8 : MPEGStreamData(-1, true), 9 9 ATSCStreamData(-1,-1, true), 10 DVBStreamData( true)10 DVBStreamData(-1, -1, -1, true) 11 11 { 12 12 } 13 13 … … void ScanStreamData::Reset(void) 36 36 { 37 37 MPEGStreamData::Reset(-1); 38 38 ATSCStreamData::Reset(-1,-1); 39 DVBStreamData::Reset( );39 DVBStreamData::Reset(-1, -1, -1); 40 40 41 41 AddListeningPID(MPEG_PAT_PID); 42 42 AddListeningPID(ATSC_PSIP_PID);