Index: webrtc/voice_engine/channel.cc |
diff --git a/webrtc/voice_engine/channel.cc b/webrtc/voice_engine/channel.cc |
index 8992425b537b0e32d329a470d58fe50d2619171d..164b99fd60a63b3733f9687af9c4d23d2ea011d8 100644 |
--- a/webrtc/voice_engine/channel.cc |
+++ b/webrtc/voice_engine/channel.cc |
@@ -717,6 +717,7 @@ Channel::Channel(int32_t channelId, |
_fileCritSect(*CriticalSectionWrapper::CreateCriticalSection()), |
_callbackCritSect(*CriticalSectionWrapper::CreateCriticalSection()), |
volume_settings_critsect_(*CriticalSectionWrapper::CreateCriticalSection()), |
+ video_sync_critsect_(*CriticalSectionWrapper::CreateCriticalSection()), |
_instanceId(instanceId), |
_channelId(channelId), |
rtp_header_parser_(RtpHeaderParser::Create()), |
@@ -899,6 +900,7 @@ Channel::~Channel() |
delete &_callbackCritSect; |
delete &_fileCritSect; |
delete &volume_settings_critsect_; |
+ delete &video_sync_critsect_; |
} |
int32_t |
@@ -3561,6 +3563,7 @@ void Channel::GetDecodingCallStatistics(AudioDecodingCallStats* stats) const { |
bool Channel::GetDelayEstimate(int* jitter_buffer_delay_ms, |
int* playout_buffer_delay_ms) const { |
+ CriticalSectionScoped cs(&video_sync_critsect_); |
if (_average_jitter_buffer_delay_us == 0) { |
WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,_channelId), |
"Channel::GetDelayEstimate() no valid estimate."); |
@@ -3640,26 +3643,30 @@ void Channel::UpdatePlayoutTimestamp(bool rtcp) { |
return; |
} |
- jitter_buffer_playout_timestamp_ = playout_timestamp; |
+ { |
+ CriticalSectionScoped cs(&video_sync_critsect_); |
+ jitter_buffer_playout_timestamp_ = playout_timestamp; |
- // Remove the playout delay. |
- playout_timestamp -= (delay_ms * (GetPlayoutFrequency() / 1000)); |
+ // Remove the playout delay. |
+ playout_timestamp -= (delay_ms * (GetPlayoutFrequency() / 1000)); |
- WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,_channelId), |
- "Channel::UpdatePlayoutTimestamp() => playoutTimestamp = %lu", |
- playout_timestamp); |
+ WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_instanceId,_channelId), |
+ "Channel::UpdatePlayoutTimestamp() => playoutTimestamp = %lu", |
+ playout_timestamp); |
- if (rtcp) { |
- playout_timestamp_rtcp_ = playout_timestamp; |
- } else { |
- playout_timestamp_rtp_ = playout_timestamp; |
+ if (rtcp) { |
+ playout_timestamp_rtcp_ = playout_timestamp; |
+ } else { |
+ playout_timestamp_rtp_ = playout_timestamp; |
+ } |
+ playout_delay_ms_ = delay_ms; |
} |
- playout_delay_ms_ = delay_ms; |
} |
int Channel::GetPlayoutTimestamp(unsigned int& timestamp) { |
WEBRTC_TRACE(kTraceInfo, kTraceVoice, VoEId(_instanceId,_channelId), |
"Channel::GetPlayoutTimestamp()"); |
+ CriticalSectionScoped cs(&video_sync_critsect_); |
if (playout_timestamp_rtp_ == 0) { |
_engineStatisticsPtr->SetLastError( |
VE_CANNOT_RETRIEVE_VALUE, kTraceError, |
@@ -3929,6 +3936,8 @@ void Channel::UpdatePacketDelay(uint32_t rtp_timestamp, |
"Channel::UpdatePacketDelay(timestamp=%lu, sequenceNumber=%u)", |
rtp_timestamp, sequence_number); |
+ CriticalSectionScoped cs(&video_sync_critsect_); |
+ |
// Get frequency of last received payload |
int rtp_receive_frequency = GetPlayoutFrequency(); |