void HLSStreamHandler::run(void) { RunProlog(); int cnt = 0; LOG(VB_GENERAL, LOG_INFO, LOC + "run() -- begin"); SetRunning(true, false, false); if (!m_hls) return; m_hls->Throttle(false); while (_running_desired) { if (!m_hls->IsOpen(m_tuning.GetURL(0).toString())) { if (!m_hls->Open(m_tuning.GetURL(0).toString())) { LOG(VB_CHANNEL, LOG_INFO, LOC + "run: HLS OpenFile() failed"); usleep(500000); continue; } m_hls->Throttle(true); } int size = m_hls->Read(m_buffer, BUFFER_SIZE); if (size < 0) { // error if (++cnt > 10) { Stop(); break; } continue; } else cnt = 0; if (size == 0) { usleep(250000); // .25 second continue; } if (m_buffer[0] != 0x47) { LOG(VB_RECORD, LOG_INFO, LOC + QString("Packet not starting with SYNC Byte (got 0x%1)") .arg((char)m_buffer[0], 2, QLatin1Char('0'))); continue; } int remainder = 0; { QMutexLocker locker(&_listener_lock); HLSStreamHandler::StreamDataList::const_iterator sit; sit = _stream_data_list.begin(); for (; sit != _stream_data_list.end(); ++sit) { remainder = sit.key()->ProcessData(m_buffer, size); } } if (remainder != 0) { LOG(VB_RECORD, LOG_INFO, LOC + QString("data_length = %1 remainder = %2") .arg(size).arg(remainder)); } if (m_hls->IsThrottled()) usleep(1000000); else if (size < BUFFER_SIZE) usleep(100000); // tenth of a second. else usleep(1000); } m_hls->Throttle(false); SetRunning(false, false, false); RunEpilog(); LOG(VB_GENERAL, LOG_INFO, LOC + "run() -- done"); }
void HLSStreamHandler::run(void) { RunProlog(); QString url = m_tuning.GetURL(0).toString(); int err_cnt = 0; int nil_cnt = 0; int open_sleep = 500000; LOG(VB_GENERAL, LOG_INFO, LOC + "run() -- begin"); SetRunning(true, false, false); if (!m_hls) return; m_hls->Throttle(false); int remainder = 0; while (_running_desired) { if (!m_hls->IsOpen(url)) { if (!m_hls->Open(url, m_tuning.GetBitrate(0))) { if (m_hls->FatalError()) break; usleep(open_sleep); if (open_sleep < 20000000) open_sleep += 500000; continue; } open_sleep = 500000; m_hls->Throttle(m_throttle); m_throttle = false; } int size = m_hls->Read(&m_readbuffer[remainder], BUFFER_SIZE - remainder); size += remainder; if (size < 0) { // error if (++err_cnt > 10) { LOG(VB_RECORD, LOG_ERR, LOC + "HLSReader failed"); Stop(); break; } continue; } err_cnt = 0; if (size == 0) { if (nil_cnt < 4) ++nil_cnt; usleep(250000 * nil_cnt - 1); // range .25 to 1 second, minus 1 continue; } nil_cnt = 0; if (m_readbuffer[0] != 0x47) { LOG(VB_RECORD, LOG_INFO, LOC + QString("Packet not starting with SYNC Byte (got 0x%1)") .arg((char)m_readbuffer[0], 2, QLatin1Char('0'))); continue; } { QMutexLocker locker(&_listener_lock); HLSStreamHandler::StreamDataList::const_iterator sit; sit = _stream_data_list.begin(); for (; sit != _stream_data_list.end(); ++sit) remainder = sit.key()->ProcessData(m_readbuffer, size); } if (remainder > 0) { if (size > remainder) // unprocessed bytes memmove(m_readbuffer, &(m_readbuffer[size - remainder]), remainder); LOG(VB_RECORD, LOG_INFO, LOC + QString("data_length = %1 remainder = %2") .arg(size).arg(remainder)); } if (m_hls->IsThrottled()) usleep(999999); else if (size < BUFFER_SIZE) { LOG(VB_RECORD, LOG_DEBUG, LOC + QString("Requested %1 bytes, got %2 bytes.") .arg(BUFFER_SIZE).arg(size)); usleep(10000); // hundredth of a second. } else usleep(1000); } m_hls->Throttle(false); SetRunning(false, false, false); RunEpilog(); LOG(VB_GENERAL, LOG_INFO, LOC + "run() -- done"); }