bool HDHRStreamHandler::RemoveAllPIDFilters(void) { QMutexLocker write_locker(&_pid_lock); #ifdef DEBUG_PID_FILTERS VERBOSE(VB_RECORD, LOC + "RemoveAllPIDFilters()"); #endif // DEBUG_PID_FILTERS _pid_info.clear(); return UpdateFilters(); }
bool StreamHandler::RemoveAllPIDFilters(void) { QMutexLocker write_locker(&_pid_lock); #ifdef DEBUG_PID_FILTERS LOG(VB_RECORD, LOG_DEBUG, LOC + "RemoveAllPIDFilters()"); #endif // DEBUG_PID_FILTERS vector<int> del_pids; PIDInfoMap::iterator it = _pid_info.begin(); for (; it != _pid_info.end(); ++it) del_pids.push_back(it.key()); bool ok = true; vector<int>::iterator dit = del_pids.begin(); for (; dit != del_pids.end(); ++dit) ok &= RemovePIDFilter(*dit); return UpdateFilters() && ok; }
bool HDHRStreamHandler::RemovePIDFilter(uint pid, bool do_update) { #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); vector<uint>::iterator it; it = lower_bound(_pid_info.begin(), _pid_info.end(), pid); if ((it == _pid_info.end()) || (*it != pid)) return false; _pid_info.erase(it); if (do_update) return UpdateFilters(); return true; }
bool HDHRStreamHandler::AddPIDFilter(uint pid, bool do_update) { #ifdef DEBUG_PID_FILTERS VERBOSE(VB_RECORD, LOC + QString("AddPIDFilter(0x%1)") .arg(pid, 0, 16)); #endif // DEBUG_PID_FILTERS QMutexLocker writing_locker(&_pid_lock); vector<uint>::iterator it; it = lower_bound(_pid_info.begin(), _pid_info.end(), pid); if (it != _pid_info.end() && *it == pid) return true; _pid_info.insert(it, pid); if (do_update) return UpdateFilters(); return true; }
/** \fn HDHRStreamHandler::run(void) * \brief Reads HDHomeRun socket for tables & data */ void HDHRStreamHandler::run(void) { RunProlog(); /* Create TS socket. */ if (!hdhomerun_device_stream_start(_hdhomerun_device)) { LOG(VB_GENERAL, LOG_ERR, LOC + "Starting recording (set target failed). Aborting."); _error = true; RunEpilog(); return; } hdhomerun_device_stream_flush(_hdhomerun_device); SetRunning(true, false, false); LOG(VB_RECORD, LOG_INFO, LOC + "RunTS(): begin"); int remainder = 0; QTime last_update; while (_running_desired && !_error) { int elapsed = !last_update.isValid() ? -1 : last_update.elapsed(); elapsed = (elapsed < 0) ? 1000 : elapsed; if (elapsed > 100) { UpdateFiltersFromStreamData(); if (_tune_mode != hdhrTuneModeVChannel) UpdateFilters(); last_update.restart(); } size_t read_size = 64 * 1024; // read about 64KB read_size /= VIDEO_DATA_PACKET_SIZE; read_size *= VIDEO_DATA_PACKET_SIZE; size_t data_length; unsigned char *data_buffer = hdhomerun_device_stream_recv( _hdhomerun_device, read_size, &data_length); if (!data_buffer) { usleep(20000); continue; } // Assume data_length is a multiple of 188 (packet size) _listener_lock.lock(); if (_stream_data_list.empty()) { _listener_lock.unlock(); continue; } StreamDataList::const_iterator sit = _stream_data_list.begin(); for (; sit != _stream_data_list.end(); ++sit) remainder = sit.key()->ProcessData(data_buffer, data_length); _listener_lock.unlock(); if (remainder != 0) { LOG(VB_RECORD, LOG_INFO, LOC + QString("RunTS(): data_length = %1 remainder = %2") .arg(data_length).arg(remainder)); } } LOG(VB_RECORD, LOG_INFO, LOC + "RunTS(): " + "shutdown"); RemoveAllPIDFilters(); hdhomerun_device_stream_stop(_hdhomerun_device); LOG(VB_RECORD, LOG_INFO, LOC + "RunTS(): " + "end"); SetRunning(false, false, false); RunEpilog(); }
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; }
/** \fn HDHRStreamHandler::run(void) * \brief Reads HDHomeRun socket for tables & data */ void HDHRStreamHandler::run(void) { threadRegister("HDHRStreamHandler"); /* Create TS socket. */ if (!hdhomerun_device_stream_start(_hdhomerun_device)) { LOG(VB_GENERAL, LOG_ERR, LOC + "Starting recording (set target failed). Aborting."); _error = true; threadDeregister(); return; } hdhomerun_device_stream_flush(_hdhomerun_device); SetRunning(true, false, false); /* Calculate buffer size */ uint buffersize = gCoreContext->GetNumSetting( "HDRingbufferSize", 50 * TSPacket::kSize) * 1024; buffersize /= VIDEO_DATA_PACKET_SIZE; buffersize *= VIDEO_DATA_PACKET_SIZE; buffersize = max(49 * TSPacket::kSize * 128, buffersize); LOG(VB_RECORD, LOG_INFO, LOC + "RunTS(): begin"); int remainder = 0; while (_running_desired && !_error) { UpdateFiltersFromStreamData(); UpdateFilters(); size_t read_size = 64 * 1024; // read about 64KB read_size /= VIDEO_DATA_PACKET_SIZE; read_size *= VIDEO_DATA_PACKET_SIZE; size_t data_length; unsigned char *data_buffer = hdhomerun_device_stream_recv( _hdhomerun_device, read_size, &data_length); if (!data_buffer) { usleep(5000); continue; } // Assume data_length is a multiple of 188 (packet size) _listener_lock.lock(); if (_stream_data_list.empty()) { _listener_lock.unlock(); continue; } StreamDataList::const_iterator sit = _stream_data_list.begin(); for (; sit != _stream_data_list.end(); ++sit) remainder = sit.key()->ProcessData(data_buffer, data_length); _listener_lock.unlock(); if (remainder != 0) { LOG(VB_RECORD, LOG_INFO, LOC + QString("RunTS(): data_length = %1 remainder = %2") .arg(data_length).arg(remainder)); } } LOG(VB_RECORD, LOG_INFO, LOC + "RunTS(): " + "shutdown"); RemoveAllPIDFilters(); hdhomerun_device_stream_stop(_hdhomerun_device); LOG(VB_RECORD, LOG_INFO, LOC + "RunTS(): " + "end"); SetRunning(false, false, false); threadDeregister(); }
void MainWindow::ReadDBFromFile() { //读入数据 QString filename = QFileDialog::getOpenFileName(this,"open database","","database (db.xml)"); string filenameStr = filename.toStdString(); if("" == filenameStr) return; cout<<"filename = "<<filenameStr<<endl; TiXmlDocument doc; if(!doc.LoadFile(filenameStr)) { ShowError("读取指定数据库失败。"); return; } //清空已有的数据 dataBase.clear(); Reset(); TiXmlElement* firstElem = doc.FirstChildElement()->FirstChildElement(); while (NULL!=firstElem) { TiXmlElement* pathElem = firstElem->FirstChildElement(); TiXmlElement* segPathElem = pathElem->NextSiblingElement(); TiXmlElement* phaseElem = segPathElem->NextSiblingElement(); TiXmlElement* qualityElem = phaseElem->NextSiblingElement(); TiXmlElement* tumorQualityElem = qualityElem->NextSiblingElement(); TiXmlElement* layerElem = tumorQualityElem->NextSiblingElement(); TiXmlElement* isSegErrorElem = layerElem->NextSiblingElement(); TiXmlElement* descriptionElem = isSegErrorElem->NextSiblingElement(); //cout<<"description = "<<(string)descriptionElem->Value()<<endl; dbAtom newAtom; newAtom.path = pathElem->GetText(); newAtom.segPath = segPathElem->GetText(); newAtom.phase = atoi(phaseElem->GetText()); newAtom.quality = atoi(qualityElem->GetText()); newAtom.tumorQuality = atoi(tumorQualityElem->GetText()); int currLayer = atoi(layerElem->GetText()); //newAtom.layer = (currLayer>100)+(currLayer>200)+(currLayer>400); newAtom.layer = currLayer; if(0 == strcmp("TRUE", isSegErrorElem->GetText())) { newAtom.isError = 0;//有错是0,没错是1 }else{ newAtom.isError = 1; } if(NULL != descriptionElem->FirstChild()) newAtom.description = descriptionElem->GetText(); else newAtom.description = "无描述"; //newAtom.PrintSelf(std::cout); this->dataBase.push_back(newAtom); firstElem = firstElem->NextSiblingElement(); } UpdateFilters(0); //SetupDB(); }
void MainWindow::DummyReceiver() { UpdateFilters(0); }