void FirewireRecorder::AddData(const unsigned char *data, uint len) { uint bufsz = buffer.size(); if ((SYNC_BYTE == data[0]) && (TSPacket::kSize == len) && (TSPacket::kSize > bufsz)) { if (bufsz) buffer.clear(); ProcessTSPacket(*(reinterpret_cast<const TSPacket*>(data))); return; } buffer.insert(buffer.end(), data, data + len); bufsz += len; int sync_at = -1; for (uint i = 0; (i < bufsz) && (sync_at < 0); i++) { if (buffer[i] == SYNC_BYTE) sync_at = i; } if (sync_at < 0) return; if (bufsz < 30 * TSPacket::kSize) return; // build up a little buffer while (sync_at + TSPacket::kSize < bufsz) { ProcessTSPacket(*(reinterpret_cast<const TSPacket*>( &buffer[0] + sync_at))); sync_at += TSPacket::kSize; } buffer.erase(buffer.begin(), buffer.begin() + sync_at); return; }
// =================================================== // AddData : feed data from RTSP flow to mythtv // =================================================== void IPTVRecorder::AddData(const unsigned char *data, unsigned int dataSize) { unsigned int readIndex = 0; // data may be compose from more than one packet, loop to consume all data while (readIndex < dataSize) { // If recorder is paused, stop there if (IsPaused()) return; // Find the next TS Header in data int tsPos = IPTVRecorder_findTSHeader( data + readIndex, dataSize - readIndex); // if no TS, something bad happens if (tsPos == -1) { VERBOSE(VB_IMPORTANT, LOC_ERR + "No TS header."); break; } // if TS Header not at start of data, we receive out of sync data if (tsPos > 0) { VERBOSE(VB_IMPORTANT, LOC_ERR + QString("TS packet at %1, not in sync.").arg(tsPos)); } // Check if the next packet in buffer is complete : // packet size is 188 bytes long if ((dataSize - tsPos - readIndex) < TSPacket::SIZE) { VERBOSE(VB_IMPORTANT, LOC_ERR + "TS packet at stradles end of buffer."); break; } // Cast current found TS Packet to TSPacket structure const void *newData = data + tsPos + readIndex; ProcessTSPacket(*reinterpret_cast<const TSPacket*>(newData)); // follow to next packet readIndex += tsPos + TSPacket::SIZE; } }