/** \fn DVBStreamHandler::SupportsTSMonitoring(void) * \brief Returns true if TS monitoring is supported. * * NOTE: If you are using a DEC2000-t device you need to * apply the patches provided by Peter Beutner for it, see * http://www.gossamer-threads.com/lists/mythtv/dev/166172 * These patches should make it in to Linux 2.6.15 or 2.6.16. */ bool DVBStreamHandler::SupportsTSMonitoring(void) { const uint pat_pid = 0x0; { QMutexLocker locker(&_rec_supports_ts_monitoring_lock); QMap<QString,bool>::const_iterator it; it = _rec_supports_ts_monitoring.find(_dvb_dev); if (it != _rec_supports_ts_monitoring.end()) return *it; } QByteArray dvr_dev_path = _dvr_dev_path.toAscii(); int dvr_fd = open(dvr_dev_path.constData(), O_RDONLY | O_NONBLOCK); if (dvr_fd < 0) { QMutexLocker locker(&_rec_supports_ts_monitoring_lock); _rec_supports_ts_monitoring[_dvb_dev] = false; return false; } bool supports_ts = false; if (AddPIDFilter(new PIDInfo(pat_pid))) { supports_ts = true; RemovePIDFilter(pat_pid); } close(dvr_fd); QMutexLocker locker(&_rec_supports_ts_monitoring_lock); _rec_supports_ts_monitoring[_dvb_dev] = supports_ts; return supports_ts; }
bool DVBStreamHandler::UpdateFiltersFromStreamData(void) { UpdateListeningForEIT(); pid_map_t pids; { QMutexLocker read_locker(&_listener_lock); for (uint i = 0; i < _stream_data_list.size(); i++) _stream_data_list[i]->GetPIDs(pids); } QMap<uint, PIDInfo*> add_pids; vector<uint> del_pids; { QMutexLocker read_locker(&_pid_lock); // PIDs that need to be added.. pid_map_t::const_iterator lit = pids.constBegin(); for (; lit != pids.constEnd(); ++lit) { if (*lit && (_pid_info.find(lit.key()) == _pid_info.end())) { add_pids[lit.key()] = new PIDInfo( lit.key(), StreamID::PrivSec, DMX_PES_OTHER); } } // PIDs that need to be removed.. PIDInfoMap::const_iterator fit = _pid_info.begin(); for (; fit != _pid_info.end(); ++fit) { bool in_pids = pids.find(fit.key()) != pids.end(); if (!in_pids) del_pids.push_back(fit.key()); } } // Remove PIDs bool ok = true; vector<uint>::iterator dit = del_pids.begin(); for (; dit != del_pids.end(); ++dit) ok &= RemovePIDFilter(*dit); // Add PIDs QMap<uint, PIDInfo*>::iterator ait = add_pids.begin(); for (; ait != add_pids.end(); ++ait) ok &= AddPIDFilter(*ait); // Cycle filters if it's been a while if (_cycle_timer.elapsed() > 1000) CycleFiltersByPriority(); return ok; }
bool HDHRStreamHandler::UpdateFiltersFromStreamData(void) { UpdateListeningForEIT(); pid_map_t pids; { QMutexLocker read_locker(&_listener_lock); for (uint i = 0; i < _stream_data_list.size(); i++) _stream_data_list[i]->GetPIDs(pids); } uint_vec_t add_pids; vector<uint> del_pids; { QMutexLocker read_locker(&_pid_lock); // PIDs that need to be added.. pid_map_t::const_iterator lit = pids.constBegin(); for (; lit != pids.constEnd(); ++lit) { vector<uint>::iterator it; it = lower_bound(_pid_info.begin(), _pid_info.end(), lit.key()); if (it == _pid_info.end() || *it != lit.key()) add_pids.push_back(lit.key()); } // PIDs that need to be removed.. vector<uint>::const_iterator fit = _pid_info.begin(); for (; fit != _pid_info.end(); ++fit) { bool in_pids = pids.find(*fit) != pids.end(); if (!in_pids) del_pids.push_back(*fit); } } bool need_update = false; // Remove PIDs bool ok = true; vector<uint>::iterator dit = del_pids.begin(); for (; dit != del_pids.end(); ++dit) { need_update = true; ok &= RemovePIDFilter(*dit, false); } // Add PIDs vector<uint>::iterator ait = add_pids.begin(); for (; ait != add_pids.end(); ++ait) { need_update = true; ok &= AddPIDFilter(*ait, false); } if (need_update) return UpdateFilters() && ok; return ok; }