void cFileWriter::Action(void) { time_t t = time(NULL); unsigned int skipped = 0; while (Running()) { int Count; uchar *p = remux->Get(Count, &pictureType, 1); while(skipped < 10 && (remux->SFmode() == SF_UNKNOWN || remux->TSmode() == rAuto)){ // TB: give remuxer a chance to detect the stream type skipped++; Count = 0; continue; } if (p && Count) { // esyslog("COUNT %i\n", Count); if (!Running() && pictureType == I_FRAME) // finish the recording before the next 'I' frame break; if (NextFile()) { #if 1 // Add PAT+PMT at every filestart and every MB if ((!fileSize || diffSize > PATPMT_DISTANCE) && remux->TSmode()==SF_H264) { uchar patpmt[2*188]; int plen; plen=remux->GetPATPMT(patpmt, 2*188); if (plen) { if (recordFile->Write(patpmt, plen) < 0) { LOG_ERROR_STR(fileName->Name()); break; } fileSize+=plen; } diffSize=0; } #endif if (index && pictureType != NO_PICTURE) index->Write(pictureType, fileName->Number(), fileSize); if (recordFile->Write(p, Count) < 0) { LOG_ERROR_STR(fileName->Name()); break; } fileSize += Count; diffSize += Count; remux->Del(Count); } else break; t = time(NULL); } else if (time(NULL) - t > MAXBROKENTIMEOUT) { esyslog("ERROR: video data stream broken"); //cThread::EmergencyExit(true); Skins.Message(mtError, tr("can't record - check your configuration")); t = time(NULL); } } }
bool cFileWriter::RunningLowOnDiskSpace(void) { if (time(NULL) > lastDiskSpaceCheck + DISKCHECKINTERVAL) { int Free = FreeDiskSpaceMB(fileName->Name()); lastDiskSpaceCheck = time(NULL); if (Free < MINFREEDISKSPACE) { dsyslog("low disk space (%d MB, limit is %d MB)", Free, MINFREEDISKSPACE); return true; } } return false; }