void cLiveStreamer::Action(void) { int size = 0; unsigned char *buf = NULL; m_startup = true; // reset timer m_last_tick.Set(0); INFOLOG("streamer thread started."); while (Running()) { size = 0; buf = Get(size); // try to switch channel if we aren't attached yet { cMutexLock lock(&m_FilterMutex); if (!IsAttached()) { TryChannelSwitch(); } } if(!IsStarting() && (m_last_tick.Elapsed() > (uint64_t)(m_scanTimeout*1000)) && !m_SignalLost) { INFOLOG("timeout. signal lost!"); sendStatus(XVDR_STREAM_STATUS_SIGNALLOST); m_SignalLost = true; // retune to restore cMutexLock lock(&m_FilterMutex); if(m_PatFilter != NULL && m_Device != NULL) { m_Device->Detach(m_PatFilter); delete m_PatFilter; m_PatFilter = NULL; } if(IsAttached()) { Detach(); } } // no data if (buf == NULL || size <= TS_SIZE) continue; // Sync to TS packet int used = 0; while (size > TS_SIZE) { if (buf[0] == TS_SYNC_BYTE && buf[TS_SIZE] == TS_SYNC_BYTE) break; used++; buf++; size--; } Del(used); while (size >= TS_SIZE) { if(!Running()) break; // TS packet sync not found ! if (buf[0] != TS_SYNC_BYTE) break; unsigned int ts_pid = TsPid(buf); { cMutexLock lock(&m_FilterMutex); cTSDemuxer *demuxer = FindStreamDemuxer(ts_pid); if (demuxer) demuxer->ProcessTSPacket(buf); } buf += TS_SIZE; size -= TS_SIZE; Del(TS_SIZE); } } INFOLOG("streamer thread ended."); }
void cLiveStreamer::Action(void) { int size = 0; unsigned char *buf = NULL; m_startup = true; while (Running()) { size = 0; buf = Get(size); { cMutexLock lock(&m_FilterMutex); if (!IsAttached()) { INFOLOG("returning from streamer thread, receiver is no more attached"); Clear(); sendDetach(); return; } } if(!IsStarting() && (m_last_tick.Elapsed() > (uint64_t)(m_scanTimeout*1000)) && !m_SignalLost) { INFOLOG("timeout. signal lost!"); sendStatus(XVDR_STREAM_STATUS_SIGNALLOST); m_SignalLost = true; } // no data if (buf == NULL || size <= TS_SIZE) continue; // Sync to TS packet int used = 0; while (size > TS_SIZE) { if (buf[0] == TS_SYNC_BYTE && buf[TS_SIZE] == TS_SYNC_BYTE) break; used++; buf++; size--; } Del(used); while (size >= TS_SIZE) { if(!Running()) break; // TS packet sync not found ! if (buf[0] != TS_SYNC_BYTE) break; unsigned int ts_pid = TsPid(buf); { cMutexLock lock(&m_FilterMutex); cTSDemuxer *demuxer = FindStreamDemuxer(ts_pid); if (demuxer) demuxer->ProcessTSPacket(buf); } buf += TS_SIZE; size -= TS_SIZE; Del(TS_SIZE); } } }