bool FirewireRecorder::ProcessTSPacket(const TSPacket &tspacket) { if (tspacket.TransportError()) return true; if (tspacket.Scrambled()) return true; if (tspacket.HasAdaptationField()) GetStreamData()->HandleAdaptationFieldControl(&tspacket); if (tspacket.HasPayload()) { const unsigned int lpid = tspacket.PID(); // Pass or reject packets based on PID, and parse info from them if (lpid == GetStreamData()->VideoPIDSingleProgram()) { _buffer_packets = !FindMPEG2Keyframes(&tspacket); BufferedWrite(tspacket); } else if (GetStreamData()->IsAudioPID(lpid)) { _buffer_packets = !FindAudioKeyframes(&tspacket); BufferedWrite(tspacket); } else if (GetStreamData()->IsListeningPID(lpid)) GetStreamData()->HandleTSTables(&tspacket); else if (GetStreamData()->IsWritingPID(lpid)) BufferedWrite(tspacket); } return true; }
bool FirewireRecorder::ProcessTSPacket(const TSPacket &tspacket) { const uint pid = tspacket.PID(); if (pid == 0x1fff) // Stuffing return true; if (tspacket.TransportError()) return true; if (tspacket.Scrambled()) return true; if (tspacket.HasAdaptationField()) GetStreamData()->HandleAdaptationFieldControl(&tspacket); if (GetStreamData()->IsVideoPID(tspacket.PID())) return ProcessVideoTSPacket(tspacket); if (GetStreamData()->IsAudioPID(tspacket.PID())) return ProcessAudioTSPacket(tspacket); if (GetStreamData()->IsWritingPID(tspacket.PID())) BufferedWrite(tspacket); if (GetStreamData()->IsListeningPID(tspacket.PID()) && tspacket.HasPayload()) GetStreamData()->HandleTSTables(&tspacket); return true; }
bool Storage::TerminalCommandHandler(string commandName, vector<string> commandArgs){ if(commandName == "save"){ int slotNum = atoi(commandArgs[0].c_str()); int len = strlen(commandArgs[1].c_str()); if(len % 4 != 0) len = len +4 - (len%4); char data[len]; strcpy(data, commandArgs[1].c_str()); BufferedWrite((unsigned char*)data, slotNum, len); logt("STORAGE", "len: %d is saved in %d", len, slotNum); } else if (commandName == "load"){ int slotNum = atoi(commandArgs[0].c_str()); int len = atoi(commandArgs[1].c_str()); if(len % 4 != 0) len = len +4 - (len%4); u8 dest_data[len]; BufferedRead(dest_data, slotNum, len); logt("STORAGE", "%s (%d) has been loaded from %d", dest_data, len, slotNum); } else { return false; } return true; }
void IPTVRecorder::HandleSingleProgramPMT(ProgramMapTable *pmt) { if (!pmt) return; int next = (pmt->tsheader()->ContinuityCounter()+1)&0xf; pmt->tsheader()->SetContinuityCounter(next); BufferedWrite(*(reinterpret_cast<const TSPacket*>(pmt->tsheader()))); }
bool IPTVRecorder::ProcessTSPacket(const TSPacket& tspacket) { if (!_stream_data) return true; if (tspacket.TransportError() || tspacket.Scrambled()) return true; if (tspacket.HasAdaptationField()) _stream_data->HandleAdaptationFieldControl(&tspacket); if (tspacket.HasPayload()) { const unsigned int lpid = tspacket.PID(); // Pass or reject packets based on PID, and parse info from them if (lpid == _stream_data->VideoPIDSingleProgram()) { ProgramMapTable *pmt = _stream_data->PMTSingleProgram(); uint video_stream_type = pmt->StreamType(pmt->FindPID(lpid)); if (video_stream_type == StreamID::H264Video) _buffer_packets = !FindH264Keyframes(&tspacket); else if (StreamID::IsVideo(video_stream_type)) _buffer_packets = !FindMPEG2Keyframes(&tspacket); if ((video_stream_type != StreamID::H264Video) || _seen_sps) BufferedWrite(tspacket); } else if (_stream_data->IsAudioPID(lpid)) { _buffer_packets = !FindAudioKeyframes(&tspacket); BufferedWrite(tspacket); } else if (_stream_data->IsListeningPID(lpid)) _stream_data->HandleTSTables(&tspacket); else if (_stream_data->IsWritingPID(lpid)) BufferedWrite(tspacket); } return true; }
void Storage::ProcessQueue() { if(bufferedOperationInProgress || taskQueue->_numElements < 1){ return; } else { bufferedOperationInProgress = true; } //Get one item from the queue and execute it sizedData data = taskQueue->PeekNext(); taskitem* task = (taskitem*)data.data; if(task->operation == operation::OPERATION_READ) BufferedRead(task->data, task->storageBlock, task->dataLength); else if(task->operation == operation::OPERATION_WRITE) BufferedWrite(task->data, task->storageBlock, task->dataLength); }