diff --git a/source/agent/audio/audioMixer/AcmEncoder.cpp b/source/agent/audio/audioMixer/AcmEncoder.cpp index 5297a42f6..9d328c8e1 100644 --- a/source/agent/audio/audioMixer/AcmEncoder.cpp +++ b/source/agent/audio/audioMixer/AcmEncoder.cpp @@ -21,6 +21,7 @@ AcmEncoder::AcmEncoder(const FrameFormat format) , m_valid(false) , m_running(false) , m_incomingFrameCount(0) + , m_lastTimestamp(0) { AudioCodingModule::Config config; m_audioCodingModule.reset(AudioCodingModule::Create(config)); @@ -175,7 +176,17 @@ int32_t AcmEncoder::SendData(FrameType frame_type, frame.additionalInfo.audio.channels = getAudioChannels(frame.format); frame.payload = const_cast(payload_data); frame.length = payload_len_bytes; - frame.timeStamp = (AudioTime::currentTime()) * m_rtpSampleRate / 1000; + + int64_t computedTimestamp = AudioTime::currentTime() * m_rtpSampleRate / 1000; + int64_t sizeFor10Ms = m_rtpSampleRate * 10 / 1000 * frame.additionalInfo.audio.channels; //size for 10 ms, such as 48000 * 10/1000 * 2 = 960 + int64_t tolerance = sizeFor10Ms * 10; //100ms + if (m_lastTimestamp > 0 && abs((computedTimestamp - m_lastTimestamp) - sizeFor10Ms) <= tolerance) { //for normal case, computedTimestamp - m_lastTimestamp should equlas to sizeFor10Ms + frame.timeStamp = m_lastTimestamp + sizeFor10Ms; + } else { + frame.timeStamp = computedTimestamp; + ELOG_INFO("sendData(), this: %p, timestamp: %ud, diff(%ld) is bigger than tolerance(%ld), current diff: %ld", (void *)this, frame.timeStamp, computedTimestamp - m_lastTimestamp - sizeFor10Ms, tolerance, computedTimestamp - m_lastTimestamp); + } + m_lastTimestamp = frame.timeStamp; ELOG_TRACE_T("deliverFrame(%s), sampleRate(%d), channels(%d), timeStamp(%d), length(%d), %s", getFormatStr(frame.format), diff --git a/source/agent/audio/audioMixer/AcmEncoder.h b/source/agent/audio/audioMixer/AcmEncoder.h index b6b67a6cb..26d077dcb 100644 --- a/source/agent/audio/audioMixer/AcmEncoder.h +++ b/source/agent/audio/audioMixer/AcmEncoder.h @@ -57,6 +57,8 @@ class AcmEncoder : public AudioEncoder, uint32_t m_incomingFrameCount; boost::shared_ptr m_frame; + + uint32_t m_lastTimestamp; }; } /* namespace mcu */ diff --git a/source/agent/audio/audioMixer/AudioTime.cpp b/source/agent/audio/audioMixer/AudioTime.cpp index ae26aff1c..4b9cf72cb 100644 --- a/source/agent/audio/audioMixer/AudioTime.cpp +++ b/source/agent/audio/audioMixer/AudioTime.cpp @@ -8,9 +8,9 @@ namespace mcu { -uint32_t AudioTime::sTimestampOffset = 0; +uint64_t AudioTime::sTimestampOffset = 0; -void AudioTime::setTimestampOffset(uint32_t offset) +void AudioTime::setTimestampOffset(uint64_t offset) { sTimestampOffset = offset; } diff --git a/source/agent/audio/audioMixer/AudioTime.h b/source/agent/audio/audioMixer/AudioTime.h index 1ba0eedf5..5f7700c96 100644 --- a/source/agent/audio/audioMixer/AudioTime.h +++ b/source/agent/audio/audioMixer/AudioTime.h @@ -11,13 +11,12 @@ namespace mcu { class AudioTime { - public: static int64_t currentTime(void); //Millisecond - static void setTimestampOffset(uint32_t offset); + static void setTimestampOffset(uint64_t offset); private: - static uint32_t sTimestampOffset; + static uint64_t sTimestampOffset; };