bool DVBStreamHandler::RemovePIDFilter(uint pid) { #ifdef DEBUG_PID_FILTERS VERBOSE(VB_RECORD, LOC + QString("RemovePIDFilter(0x%1)").arg(pid, 0, 16)); #endif // DEBUG_PID_FILTERS QMutexLocker write_locker(&_pid_lock); PIDInfoMap::iterator it = _pid_info.find(pid); if (it == _pid_info.end()) return false; PIDInfo *tmp = *it; _pid_info.erase(it); bool ok = true; if (tmp->IsOpen()) { ok = tmp->Close(_dvb_dev); _open_pid_filters--; CycleFiltersByPriority(); } delete tmp; return ok; }
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 DVBStreamHandler::AddPIDFilter(PIDInfo *info) { #ifdef DEBUG_PID_FILTERS VERBOSE(VB_RECORD, LOC + QString("AddPIDFilter(0x%1) priority %2") .arg(info->_pid, 0, 16).arg(GetPIDPriority(info->_pid))); #endif // DEBUG_PID_FILTERS QMutexLocker writing_locker(&_pid_lock); _pid_info[info->_pid] = info; CycleFiltersByPriority(); return true; }
bool StreamHandler::AddPIDFilter(PIDInfo *info) { #ifdef DEBUG_PID_FILTERS LOG(VB_RECORD, LOG_DEBUG, LOC + QString("AddPIDFilter(0x%1)") .arg(info->_pid, 0, 16)); #endif // DEBUG_PID_FILTERS QMutexLocker writing_locker(&m_pid_lock); m_pid_info[info->_pid] = info; CycleFiltersByPriority(); return true; }