diff --git a/src/modules/video_coding/main/source/frame_buffer.cc b/src/modules/video_coding/main/source/frame_buffer.cc index 5fcf1a41ca..dfded86643 100644 --- a/src/modules/video_coding/main/source/frame_buffer.cc +++ b/src/modules/video_coding/main/source/frame_buffer.cc @@ -42,6 +42,7 @@ _nackCount(rhs._nackCount), _latestPacketTimeMs(rhs._latestPacketTimeMs) { _sessionInfo = rhs._sessionInfo; + _sessionInfo.UpdateDataPointers(rhs._buffer, _buffer); } webrtc::FrameType @@ -165,7 +166,7 @@ VCMFrameBuffer::InsertPacket(const VCMPacket& packet, WebRtc_Word64 timeInMs, { return kSizeError; } - _sessionInfo.UpdateDataPointers(_buffer - prevBuffer); + _sessionInfo.UpdateDataPointers(prevBuffer, _buffer); } CopyCodecSpecific(&packet.codecSpecificHeader); @@ -361,7 +362,7 @@ VCMFrameBuffer::ExtractFromStorage(const EncodedVideoData& frameFromStorage) { return VCM_MEMORY; } - _sessionInfo.UpdateDataPointers(_buffer - prevBuffer); + _sessionInfo.UpdateDataPointers(prevBuffer, _buffer); memcpy(_buffer, frameFromStorage.payloadData, frameFromStorage.payloadSize); _length = frameFromStorage.payloadSize; return VCM_OK; diff --git a/src/modules/video_coding/main/source/session_info.cc b/src/modules/video_coding/main/source/session_info.cc index 66b1dc2779..4a5d16948f 100644 --- a/src/modules/video_coding/main/source/session_info.cc +++ b/src/modules/video_coding/main/source/session_info.cc @@ -26,10 +26,13 @@ VCMSessionInfo::VCMSessionInfo() packets_not_decodable_(0) { } -void VCMSessionInfo::UpdateDataPointers(ptrdiff_t address_delta) { +void VCMSessionInfo::UpdateDataPointers(const uint8_t* old_base_ptr, + const uint8_t* new_base_ptr) { for (PacketIterator it = packets_.begin(); it != packets_.end(); ++it) - if ((*it).dataPtr != NULL) - (*it).dataPtr = (*it).dataPtr + address_delta; + if ((*it).dataPtr != NULL) { + assert(old_base_ptr != NULL && new_base_ptr != NULL); + (*it).dataPtr = new_base_ptr + ((*it).dataPtr - old_base_ptr); + } } int VCMSessionInfo::LowSequenceNumber() const { diff --git a/src/modules/video_coding/main/source/session_info.h b/src/modules/video_coding/main/source/session_info.h index 0dc842f38a..fd4ae88fa2 100644 --- a/src/modules/video_coding/main/source/session_info.h +++ b/src/modules/video_coding/main/source/session_info.h @@ -11,7 +11,6 @@ #ifndef WEBRTC_MODULES_VIDEO_CODING_SESSION_INFO_H_ #define WEBRTC_MODULES_VIDEO_CODING_SESSION_INFO_H_ -#include #include #include "modules/interface/module_common_types.h" @@ -24,7 +23,8 @@ class VCMSessionInfo { public: VCMSessionInfo(); - void UpdateDataPointers(ptrdiff_t address_delta); + void UpdateDataPointers(const uint8_t* old_base_ptr, + const uint8_t* new_base_ptr); // NACK - Building the NACK lists. // Build hard NACK list: Zero out all entries in list up to and including // _lowSeqNum.