Ticket #10102: eit-multirec.patch
File eit-multirec.patch, 15.8 KB (added by , 12 years ago) |
---|
-
mythtv/libs/libmythtv/dtvsignalmonitor.cpp
commit bf695c703696a1ba5f64153afd96a64a074ecc7c Author: David Matthews <dm@prolingua.co.uk> Date: Fri Oct 14 16:50:12 2011 +0100 Reworking of EIT listening for multirec. This is a reworking of the code which combines the EIT listeners when making multiple recordings on the same multiplex. It fixes problems which showed up when testing the EITpf timing code. diff --git a/mythtv/libs/libmythtv/dtvsignalmonitor.cpp b/mythtv/libs/libmythtv/dtvsignalmonitor.cpp index 419a73a..79695db 100644
a b void DTVSignalMonitor::UpdateMonitorValues(void) 155 155 matchingCrypt.SetValue((flags & kDTVSigMon_CryptMatch) ? 1 : 0); 156 156 } 157 157 158 void DTVSignalMonitor::UpdateListeningForEIT(void)159 {160 vector<uint> add_eit, del_eit;161 162 if (GetStreamData()->HasEITPIDChanges(eit_pids) &&163 GetStreamData()->GetEITPIDChanges(eit_pids, add_eit, del_eit))164 {165 for (uint i = 0; i < del_eit.size(); i++)166 {167 uint_vec_t::iterator it;168 it = find(eit_pids.begin(), eit_pids.end(), del_eit[i]);169 if (it != eit_pids.end())170 eit_pids.erase(it);171 GetStreamData()->RemoveListeningPID(del_eit[i]);172 }173 174 for (uint i = 0; i < add_eit.size(); i++)175 {176 eit_pids.push_back(add_eit[i]);177 GetStreamData()->AddListeningPID(add_eit[i]);178 }179 }180 }181 182 158 void DTVSignalMonitor::SetChannel(int major, int minor) 183 159 { 184 160 DBG_SM(QString("SetChannel(%1, %2)").arg(major).arg(minor), ""); -
mythtv/libs/libmythtv/dtvsignalmonitor.h
diff --git a/mythtv/libs/libmythtv/dtvsignalmonitor.h b/mythtv/libs/libmythtv/dtvsignalmonitor.h index 6a7c29a..3c69ba1 100644
a b class DTVSignalMonitor : public SignalMonitor, 104 104 protected: 105 105 DTVChannel *GetDTVChannel(void); 106 106 void UpdateMonitorValues(void); 107 void UpdateListeningForEIT(void);108 107 109 108 protected: 110 109 MPEGStreamData *stream_data; -
mythtv/libs/libmythtv/mpeg/atscstreamdata.cpp
diff --git a/mythtv/libs/libmythtv/mpeg/atscstreamdata.cpp b/mythtv/libs/libmythtv/mpeg/atscstreamdata.cpp index 8aab9ed..bedb8f7 100644
a b bool ATSCStreamData::EITSectionSeen(uint pid, uint atsc_source_id, 400 400 return (bool) ((*it)[section>>3] & bit_sel[section & 0x7]); 401 401 } 402 402 403 bool ATSCStreamData::HasEITPIDChanges(const uint_vec_t &in_use_pids) const404 {405 QMutexLocker locker(&_listener_lock);406 uint eit_count = (uint) round(_atsc_eit_pids.size() * _eit_rate);407 uint ett_count = (uint) round(_atsc_ett_pids.size() * _eit_rate);408 return (in_use_pids.size() != (eit_count + ett_count) || _atsc_eit_reset);409 }410 411 403 bool ATSCStreamData::GetEITPIDChanges(const uint_vec_t &cur_pids, 412 404 uint_vec_t &add_pids, 413 405 uint_vec_t &del_pids) const 414 406 { 415 407 QMutexLocker locker(&_listener_lock); 416 408 417 _atsc_eit_reset = false;418 419 409 uint eit_count = (uint) round(_atsc_eit_pids.size() * _eit_rate); 420 410 uint ett_count = (uint) round(_atsc_ett_pids.size() * _eit_rate); 411 412 if (cur_pids.size() == (eit_count + ett_count) && !_atsc_eit_reset) 413 return false; 414 415 _atsc_eit_reset = false; 416 421 417 uint i; 422 418 423 419 #if 0 … … bool ATSCStreamData::GetEITPIDChanges(const uint_vec_t &cur_pids, 452 448 return add_pids.size() || del_pids.size(); 453 449 } 454 450 451 void ATSCStreamData::UpdateEITListeners(void) 452 { 453 vector<uint> add_eit, del_eit; 454 455 if (GetEITPIDChanges(_eit_pids, add_eit, del_eit)) 456 { 457 for (uint i = 0; i < del_eit.size(); i++) 458 { 459 uint_vec_t::iterator it; 460 it = find(_eit_pids.begin(), _eit_pids.end(), del_eit[i]); 461 if (it != _eit_pids.end()) 462 _eit_pids.erase(it); 463 RemoveListeningPID(del_eit[i]); 464 } 465 466 for (uint i = 0; i < add_eit.size(); i++) 467 { 468 _eit_pids.push_back(add_eit[i]); 469 AddListeningPID(add_eit[i]); 470 } 471 } 472 } 473 455 474 void ATSCStreamData::ProcessMGT(const MasterGuideTable *mgt) 456 475 { 457 476 QMutexLocker locker(&_listener_lock); -
mythtv/libs/libmythtv/mpeg/atscstreamdata.h
diff --git a/mythtv/libs/libmythtv/mpeg/atscstreamdata.h b/mythtv/libs/libmythtv/mpeg/atscstreamdata.h index 4686ee9..9e03be5 100644
a b class ATSCStreamData : virtual public MPEGStreamData 41 41 42 42 inline uint GetATSCMajorMinor(uint eit_sourceid) const; 43 43 inline bool HasATSCMajorMinorMap(void) const; 44 bool HasEITPIDChanges(const uint_vec_t &in_use_pid) const;44 void UpdateEITListeners(void); 45 45 bool GetEITPIDChanges(const uint_vec_t &in_use_pid, 46 46 uint_vec_t &pids_to_add, 47 47 uint_vec_t &pids_to_del) const; … … class ATSCStreamData : virtual public MPEGStreamData 127 127 mutable bool _atsc_eit_reset; 128 128 atsc_eit_pid_map_t _atsc_eit_pids; 129 129 atsc_ett_pid_map_t _atsc_ett_pids; 130 vector<uint> _eit_pids; 130 131 131 132 QMap<uint,uint> _sourceid_to_atsc_maj_min; 132 133 -
mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp
diff --git a/mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp b/mythtv/libs/libmythtv/mpeg/dvbstreamdata.cpp index b3ccb90..aa60ec3 100644
a b void DVBStreamData::ProcessSDT(uint tsid, const ServiceDescriptionTable *sdt) 416 416 _dvb_main_listeners[i]->HandleSDT(tsid, sdt); 417 417 } 418 418 419 bool DVBStreamData::HasEITPIDChanges(const uint_vec_t &in_use_pids) const 419 void DVBStreamData::UpdateEITListeners(void) 420 420 { 421 421 QMutexLocker locker(&_listener_lock); 422 bool want_eit = (_eit_rate >= 0.5f) && HasAnyEIT(); 423 bool has_eit = in_use_pids.size(); 424 return want_eit != has_eit; 425 } 422 bool want_eit = (_eit_rate >= 0.5f || _dvb_eit_listeners.size()) && HasAnyEIT(); 423 bool has_eit = _eit_pids.size(); 426 424 427 bool DVBStreamData::GetEITPIDChanges(const uint_vec_t &cur_pids, 428 uint_vec_t &add_pids, 429 uint_vec_t &del_pids) const 430 { 431 QMutexLocker locker(&_listener_lock); 425 if (want_eit == has_eit) 426 return; 432 427 433 if ((_eit_rate >= 0.5f ) && HasAnyEIT())428 if ((_eit_rate >= 0.5f || _dvb_eit_listeners.size()) && HasAnyEIT()) 434 429 { 435 if (find( cur_pids.begin(), cur_pids.end(),436 (uint) DVB_EIT_PID) == cur_pids.end())430 if (find(_eit_pids.begin(), _eit_pids.end(), 431 (uint) DVB_EIT_PID) == _eit_pids.end()) 437 432 { 438 add_pids.push_back(DVB_EIT_PID); 433 _eit_pids.push_back(DVB_EIT_PID); 434 AddListeningPID(DVB_EIT_PID); 439 435 } 440 436 441 437 if (_dvb_eit_dishnet_long && 442 find( cur_pids.begin(), cur_pids.end(),443 (uint) DVB_DNLONG_EIT_PID) == cur_pids.end())438 find(_eit_pids.begin(), _eit_pids.end(), 439 (uint) DVB_DNLONG_EIT_PID) == _eit_pids.end()) 444 440 { 445 add_pids.push_back(DVB_DNLONG_EIT_PID); 441 _eit_pids.push_back(DVB_DNLONG_EIT_PID); 442 AddListeningPID(DVB_DNLONG_EIT_PID); 446 443 } 447 444 448 445 if (_dvb_eit_dishnet_long && 449 find( cur_pids.begin(), cur_pids.end(),450 (uint) DVB_BVLONG_EIT_PID) == cur_pids.end())446 find(_eit_pids.begin(), _eit_pids.end(), 447 (uint) DVB_BVLONG_EIT_PID) == _eit_pids.end()) 451 448 { 452 add_pids.push_back(DVB_BVLONG_EIT_PID); 449 _eit_pids.push_back(DVB_BVLONG_EIT_PID); 450 AddListeningPID(DVB_BVLONG_EIT_PID); 453 451 } 454 452 455 453 if (_desired_netid == PREMIERE_ONID && 456 find( cur_pids.begin(), cur_pids.end(),457 (uint) PREMIERE_EIT_DIREKT_PID) == cur_pids.end())454 find(_eit_pids.begin(), _eit_pids.end(), 455 (uint) PREMIERE_EIT_DIREKT_PID) == _eit_pids.end()) 458 456 { 459 add_pids.push_back(PREMIERE_EIT_DIREKT_PID); 457 _eit_pids.push_back(PREMIERE_EIT_DIREKT_PID); 458 AddListeningPID(PREMIERE_EIT_DIREKT_PID); 460 459 } 461 460 462 461 if (_desired_netid == PREMIERE_ONID && 463 find( cur_pids.begin(), cur_pids.end(),464 (uint) PREMIERE_EIT_SPORT_PID) == cur_pids.end())462 find(_eit_pids.begin(), _eit_pids.end(), 463 (uint) PREMIERE_EIT_SPORT_PID) == _eit_pids.end()) 465 464 { 466 add_pids.push_back(PREMIERE_EIT_SPORT_PID); 465 _eit_pids.push_back(PREMIERE_EIT_SPORT_PID); 466 AddListeningPID(PREMIERE_EIT_SPORT_PID); 467 467 } 468 468 469 if (find( cur_pids.begin(), cur_pids.end(),470 (uint) FREESAT_EIT_PID) == cur_pids.end())469 if (find(_eit_pids.begin(), _eit_pids.end(), 470 (uint) FREESAT_EIT_PID) == _eit_pids.end()) 471 471 { 472 add_pids.push_back(FREESAT_EIT_PID); 472 _eit_pids.push_back(FREESAT_EIT_PID); 473 AddListeningPID(FREESAT_EIT_PID); 473 474 } 474 475 475 476 if (MCA_ONID == _desired_netid && MCA_EIT_TSID == _desired_tsid && 476 find( cur_pids.begin(), cur_pids.end(),477 (uint) MCA_EIT_PID) == cur_pids.end())477 find(_eit_pids.begin(), _eit_pids.end(), 478 (uint) MCA_EIT_PID) == _eit_pids.end()) 478 479 { 479 add_pids.push_back(MCA_EIT_PID); 480 _eit_pids.push_back(MCA_EIT_PID); 481 AddListeningPID(MCA_EIT_PID); 480 482 } 481 483 482 484 } 483 485 else 484 486 { 485 if (find(cur_pids.begin(), cur_pids.end(), 486 (uint) DVB_EIT_PID) != cur_pids.end()) 487 { 488 del_pids.push_back(DVB_EIT_PID); 489 } 490 491 if (_dvb_eit_dishnet_long && 492 find(cur_pids.begin(), cur_pids.end(), 493 (uint) DVB_DNLONG_EIT_PID) != cur_pids.end()) 487 for (uint i = 0; i < _eit_pids.size(); i++) 494 488 { 495 del_pids.push_back(DVB_DNLONG_EIT_PID); 496 } 497 498 if (_dvb_eit_dishnet_long && 499 find(cur_pids.begin(), cur_pids.end(), 500 (uint) DVB_BVLONG_EIT_PID) != cur_pids.end()) 501 { 502 del_pids.push_back(DVB_BVLONG_EIT_PID); 503 } 504 505 if (_desired_netid == PREMIERE_ONID && 506 find(cur_pids.begin(), cur_pids.end(), 507 (uint) PREMIERE_EIT_DIREKT_PID) != cur_pids.end()) 508 { 509 del_pids.push_back(PREMIERE_EIT_DIREKT_PID); 510 } 511 512 if (_desired_netid == PREMIERE_ONID && 513 find(cur_pids.begin(), cur_pids.end(), 514 (uint) PREMIERE_EIT_SPORT_PID) != cur_pids.end()) 515 { 516 del_pids.push_back(PREMIERE_EIT_SPORT_PID); 517 } 518 519 if (find(cur_pids.begin(), cur_pids.end(), 520 (uint) FREESAT_EIT_PID) == cur_pids.end()) 521 { 522 del_pids.push_back(FREESAT_EIT_PID); 523 } 524 525 if (MCA_ONID == _desired_netid && MCA_EIT_TSID == _desired_tsid && 526 find(cur_pids.begin(), cur_pids.end(), 527 (uint) MCA_EIT_PID) != cur_pids.end()) 528 { 529 del_pids.push_back(MCA_EIT_PID); 489 RemoveListeningPID(_eit_pids[i]); 530 490 } 491 _eit_pids.clear(); 531 492 } 532 533 return add_pids.size() || del_pids.size();534 493 } 535 494 536 495 void DVBStreamData::SetNITSectionSeen(uint section) -
mythtv/libs/libmythtv/mpeg/dvbstreamdata.h
diff --git a/mythtv/libs/libmythtv/mpeg/dvbstreamdata.h b/mythtv/libs/libmythtv/mpeg/dvbstreamdata.h index 3df7ac9..7aac61d 100644
a b class DVBStreamData : virtual public MPEGStreamData 44 44 inline void SetDishNetEIT(bool); 45 45 inline bool HasAnyEIT(void) const; 46 46 inline bool HasEIT(uint serviceid) const; 47 bool HasEITPIDChanges(const uint_vec_t &in_use_pids) const; 48 bool GetEITPIDChanges(const uint_vec_t &in_use_pids, 49 uint_vec_t &add_pids, 50 uint_vec_t &del_pids) const; 47 void UpdateEITListeners(void); 51 48 52 49 // Table versions 53 50 void SetVersionNIT(int version, uint last_section) … … class DVBStreamData : virtual public MPEGStreamData 243 240 // Caching 244 241 mutable nit_cache_t _cached_nit; // section -> sdt 245 242 mutable sdt_cache_t _cached_sdts; // tsid+section -> sdt 243 244 vector<uint> _eit_pids; 246 245 }; 247 246 248 247 inline void DVBStreamData::SetDishNetEIT(bool use_dishnet_eit) -
mythtv/libs/libmythtv/mpeg/mpegstreamdata.h
diff --git a/mythtv/libs/libmythtv/mpeg/mpegstreamdata.h b/mythtv/libs/libmythtv/mpeg/mpegstreamdata.h index 90f1e8f..fa3d881 100644
a b class MPEGStreamData : public EITSource 101 101 // EIT Source 102 102 virtual void SetEITHelper(EITHelper *eit_helper); 103 103 virtual void SetEITRate(float rate); 104 virtual bool HasEITPIDChanges(const uint_vec_t& /*in_use_pids*/) const 105 { return false; } 106 virtual bool GetEITPIDChanges(const uint_vec_t& /*in_use_pids*/, 107 uint_vec_t& /*add_pids*/, 108 uint_vec_t& /*del_pids*/) const 109 { return false; } 104 virtual void UpdateEITListeners(void) { } 110 105 111 106 // Table processing 112 107 void SetIgnoreCRC(bool haveCRCbug) { _have_CRC_bug = haveCRCbug; } -
mythtv/libs/libmythtv/mpeg/scanstreamdata.h
diff --git a/mythtv/libs/libmythtv/mpeg/scanstreamdata.h b/mythtv/libs/libmythtv/mpeg/scanstreamdata.h old mode 100644 new mode 100755 index 0b668d6..8e21052
a b class ScanStreamData : 20 20 21 21 void Reset(void); 22 22 23 bool HasEITPIDChanges(const uint_vec_t& /*in_use_pids*/) const 24 { return false; } 25 bool GetEITPIDChanges(const uint_vec_t& /*in_use_pids*/, 26 uint_vec_t& /*add_pids*/, 27 uint_vec_t& /*del_pids*/) const { return false; } 23 virtual void UpdateEITListeners(void) { } 28 24 29 25 QString GetSIStandard(QString guess = "mpeg") const; 30 26 -
mythtv/libs/libmythtv/streamhandler.cpp
diff --git a/mythtv/libs/libmythtv/streamhandler.cpp b/mythtv/libs/libmythtv/streamhandler.cpp index 2b0a7b6..6686033 100644
a b void StreamHandler::Start(void) 149 149 if (_running) 150 150 return; 151 151 152 _eit_pids.clear();153 154 152 _error = false; 155 153 SetRunningDesired(true); 156 154 MThread::start(); … … bool StreamHandler::RemoveAllPIDFilters(void) 275 273 276 274 void StreamHandler::UpdateListeningForEIT(void) 277 275 { 278 vector<uint> add_eit, del_eit;279 280 276 QMutexLocker read_locker(&_listener_lock); 281 277 282 278 StreamDataList::const_iterator it = _stream_data_list.begin(); 283 279 for (; it != _stream_data_list.end(); ++it) 284 280 { 285 281 MPEGStreamData *sd = it.key(); 286 if (sd->HasEITPIDChanges(_eit_pids) && 287 sd->GetEITPIDChanges(_eit_pids, add_eit, del_eit)) 288 { 289 for (uint i = 0; i < del_eit.size(); i++) 290 { 291 uint_vec_t::iterator it; 292 it = find(_eit_pids.begin(), _eit_pids.end(), del_eit[i]); 293 if (it != _eit_pids.end()) 294 _eit_pids.erase(it); 295 sd->RemoveListeningPID(del_eit[i]); 296 } 297 298 for (uint i = 0; i < add_eit.size(); i++) 299 { 300 _eit_pids.push_back(add_eit[i]); 301 sd->AddListeningPID(add_eit[i]); 302 } 303 } 282 sd->UpdateEITListeners(); 304 283 } 305 284 } 306 285 -
mythtv/libs/libmythtv/streamhandler.h
diff --git a/mythtv/libs/libmythtv/streamhandler.h b/mythtv/libs/libmythtv/streamhandler.h index 454e55f..59d1518 100644
a b class StreamHandler : protected MThread, public DeviceReaderCB 110 110 QWaitCondition _running_state_changed; 111 111 112 112 mutable QMutex _pid_lock; 113 vector<uint> _eit_pids;114 113 PIDInfoMap _pid_info; 115 114 uint _open_pid_filters; 116 115 MythTimer _cycle_timer;