コード例 #1
0
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();
}
コード例 #2
0
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;
}
コード例 #3
0
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;
}
コード例 #4
0
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;
}
コード例 #5
0
ファイル: hdhrstreamhandler.cpp プロジェクト: awithers/mythtv
/** \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();
}
コード例 #6
0
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;
}
コード例 #7
0
ファイル: hdhrstreamhandler.cpp プロジェクト: Openivo/mythtv
/** \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();
}
コード例 #8
0
ファイル: mainwindow.cpp プロジェクト: yzxyzh/dbAccessor
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();
}
コード例 #9
0
ファイル: mainwindow.cpp プロジェクト: yzxyzh/dbAccessor
void MainWindow::DummyReceiver()
{
    UpdateFilters(0);
}