diff options
| author | Matthias P. Braendli <matthias.braendli@mpb.li> | 2019-12-04 14:53:54 +0100 | 
|---|---|---|
| committer | Matthias P. Braendli <matthias.braendli@mpb.li> | 2019-12-04 14:53:54 +0100 | 
| commit | c89b5e3c0d9515f07892af464bd6c60fb3427c36 (patch) | |
| tree | 18c7573859606dada82e56d5115cd5d1e71129db /src/AVTInput.cpp | |
| parent | 814ec3abaede73ea38c7130333c7bc0a18e05d91 (diff) | |
| download | ODR-SourceCompanion-c89b5e3c0d9515f07892af464bd6c60fb3427c36.tar.gz ODR-SourceCompanion-c89b5e3c0d9515f07892af464bd6c60fb3427c36.tar.bz2 ODR-SourceCompanion-c89b5e3c0d9515f07892af464bd6c60fb3427c36.zip | |
Timestamp arrival of UDP packets
Diffstat (limited to 'src/AVTInput.cpp')
| -rw-r--r-- | src/AVTInput.cpp | 18 | 
1 files changed, 13 insertions, 5 deletions
| diff --git a/src/AVTInput.cpp b/src/AVTInput.cpp index 11dd4cc..d39f2ef 100644 --- a/src/AVTInput.cpp +++ b/src/AVTInput.cpp @@ -368,6 +368,7 @@ bool AVTInput::_readFrame()      size_t dataSize = 0;      auto packet = _input_socket.receive(MAX_AVT_FRAME_SIZE); +    const timestamp_t ts = std::chrono::system_clock::now();      const size_t readBytes = packet.buffer.size();      if (readBytes > 0) { @@ -380,7 +381,7 @@ bool AVTInput::_readFrame()          if (dataPtr) {              if (dataSize == _dab24msFrameSize) { -                _ordered.push(frameNumber, dataPtr, dataSize); +                _ordered.push(frameNumber, dataPtr, dataSize, ts);              }              else ERROR("Wrong frame size from encoder %zu != %zu\n", dataSize, _dab24msFrameSize);          } @@ -392,10 +393,8 @@ bool AVTInput::_readFrame()      return readBytes > 0;  } -ssize_t AVTInput::getNextFrame(std::vector<uint8_t> &buf) +size_t AVTInput::getNextFrame(std::vector<uint8_t> &buf, std::chrono::system_clock::time_point& ts)  { -    ssize_t nbBytes = 0; -      //printf("A: _padFrameQueue size=%zu\n", _padFrameQueue.size());      // Read all messages from encoder (in priority) @@ -409,16 +408,19 @@ ssize_t AVTInput::getNextFrame(std::vector<uint8_t> &buf)      int32_t returnedIndex = -1;      while (_nbFrames < 5) { -        auto part = _ordered.pop(&returnedIndex); +        const auto queue_data = _ordered.pop(&returnedIndex); +        const auto& part = queue_data.buf;          if (part.empty()) {              break;          }          while (_checkMessage()) {}; +          if (not _frameAligned) {              if (returnedIndex % 5 == 0) {                  _frameAligned = true; +                _frameZeroTimestamp = queue_data.capture_timestamp;                  memcpy(_currentFrame.data() + _currentFrameSize, part.data(), part.size());                  _currentFrameSize += part.size(); @@ -430,6 +432,10 @@ ssize_t AVTInput::getNextFrame(std::vector<uint8_t> &buf)                  memcpy(_currentFrame.data() + _currentFrameSize, part.data(), part.size());                  _currentFrameSize += part.size();                  _nbFrames++; + +                // UDP packets arrive with jitter, we intentionally only consider +                // their timestamp after a discontinuity. +                _frameZeroTimestamp += std::chrono::milliseconds(24);              }              else {                  _nbFrames = 0; @@ -441,11 +447,13 @@ ssize_t AVTInput::getNextFrame(std::vector<uint8_t> &buf)          }      } +    size_t nbBytes = 0;      if (_nbFrames == 5 && _currentFrameSize <= buf.size()) {          memcpy(&buf[0], _currentFrame.data(), _currentFrameSize);          nbBytes = _currentFrameSize;          _currentFrameSize = 0;          _nbFrames = 0; +        ts = _frameZeroTimestamp;      }      //printf("C: _padFrameQueue size=%zu\n", _padFrameQueue.size()); | 
