1 /* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #include "webrtc/voice_engine/voe_video_sync_impl.h" 12 13 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" 14 #include "webrtc/system_wrappers/include/trace.h" 15 #include "webrtc/voice_engine/channel.h" 16 #include "webrtc/voice_engine/include/voe_errors.h" 17 #include "webrtc/voice_engine/voice_engine_impl.h" 18 19 namespace webrtc { 20 21 VoEVideoSync* VoEVideoSync::GetInterface(VoiceEngine* voiceEngine) { 22 #ifndef WEBRTC_VOICE_ENGINE_VIDEO_SYNC_API 23 return NULL; 24 #else 25 if (NULL == voiceEngine) { 26 return NULL; 27 } 28 VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine); 29 s->AddRef(); 30 return s; 31 #endif 32 } 33 34 #ifdef WEBRTC_VOICE_ENGINE_VIDEO_SYNC_API 35 36 VoEVideoSyncImpl::VoEVideoSyncImpl(voe::SharedData* shared) : _shared(shared) { 37 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1), 38 "VoEVideoSyncImpl::VoEVideoSyncImpl() - ctor"); 39 } 40 41 VoEVideoSyncImpl::~VoEVideoSyncImpl() { 42 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1), 43 "VoEVideoSyncImpl::~VoEVideoSyncImpl() - dtor"); 44 } 45 46 int VoEVideoSyncImpl::GetPlayoutTimestamp(int channel, 47 unsigned int& timestamp) { 48 if (!_shared->statistics().Initialized()) { 49 _shared->SetLastError(VE_NOT_INITED, kTraceError); 50 return -1; 51 } 52 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 53 voe::Channel* channel_ptr = ch.channel(); 54 if (channel_ptr == NULL) { 55 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 56 "GetPlayoutTimestamp() failed to locate channel"); 57 return -1; 58 } 59 return channel_ptr->GetPlayoutTimestamp(timestamp); 60 } 61 62 int VoEVideoSyncImpl::SetInitTimestamp(int channel, unsigned int timestamp) { 63 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 64 "SetInitTimestamp(channel=%d, timestamp=%lu)", channel, 65 timestamp); 66 67 if (!_shared->statistics().Initialized()) { 68 _shared->SetLastError(VE_NOT_INITED, kTraceError); 69 return -1; 70 } 71 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 72 voe::Channel* channelPtr = ch.channel(); 73 if (channelPtr == NULL) { 74 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 75 "SetInitTimestamp() failed to locate channel"); 76 return -1; 77 } 78 return channelPtr->SetInitTimestamp(timestamp); 79 } 80 81 int VoEVideoSyncImpl::SetInitSequenceNumber(int channel, short sequenceNumber) { 82 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 83 "SetInitSequenceNumber(channel=%d, sequenceNumber=%hd)", channel, 84 sequenceNumber); 85 86 if (!_shared->statistics().Initialized()) { 87 _shared->SetLastError(VE_NOT_INITED, kTraceError); 88 return -1; 89 } 90 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 91 voe::Channel* channelPtr = ch.channel(); 92 if (channelPtr == NULL) { 93 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 94 "SetInitSequenceNumber() failed to locate channel"); 95 return -1; 96 } 97 return channelPtr->SetInitSequenceNumber(sequenceNumber); 98 } 99 100 int VoEVideoSyncImpl::SetMinimumPlayoutDelay(int channel, int delayMs) { 101 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1), 102 "SetMinimumPlayoutDelay(channel=%d, delayMs=%d)", channel, 103 delayMs); 104 105 if (!_shared->statistics().Initialized()) { 106 _shared->SetLastError(VE_NOT_INITED, kTraceError); 107 return -1; 108 } 109 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 110 voe::Channel* channelPtr = ch.channel(); 111 if (channelPtr == NULL) { 112 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 113 "SetMinimumPlayoutDelay() failed to locate channel"); 114 return -1; 115 } 116 return channelPtr->SetMinimumPlayoutDelay(delayMs); 117 } 118 119 int VoEVideoSyncImpl::GetDelayEstimate(int channel, 120 int* jitter_buffer_delay_ms, 121 int* playout_buffer_delay_ms) { 122 if (!_shared->statistics().Initialized()) { 123 _shared->SetLastError(VE_NOT_INITED, kTraceError); 124 return -1; 125 } 126 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 127 voe::Channel* channelPtr = ch.channel(); 128 if (channelPtr == NULL) { 129 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 130 "GetDelayEstimate() failed to locate channel"); 131 return -1; 132 } 133 if (!channelPtr->GetDelayEstimate(jitter_buffer_delay_ms, 134 playout_buffer_delay_ms)) { 135 return -1; 136 } 137 return 0; 138 } 139 140 int VoEVideoSyncImpl::GetPlayoutBufferSize(int& bufferMs) { 141 if (!_shared->statistics().Initialized()) { 142 _shared->SetLastError(VE_NOT_INITED, kTraceError); 143 return -1; 144 } 145 AudioDeviceModule::BufferType type(AudioDeviceModule::kFixedBufferSize); 146 uint16_t sizeMS(0); 147 if (_shared->audio_device()->PlayoutBuffer(&type, &sizeMS) != 0) { 148 _shared->SetLastError(VE_AUDIO_DEVICE_MODULE_ERROR, kTraceError, 149 "GetPlayoutBufferSize() failed to read buffer size"); 150 return -1; 151 } 152 bufferMs = sizeMS; 153 return 0; 154 } 155 156 int VoEVideoSyncImpl::GetRtpRtcp(int channel, 157 RtpRtcp** rtpRtcpModule, 158 RtpReceiver** rtp_receiver) { 159 if (!_shared->statistics().Initialized()) { 160 _shared->SetLastError(VE_NOT_INITED, kTraceError); 161 return -1; 162 } 163 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 164 voe::Channel* channelPtr = ch.channel(); 165 if (channelPtr == NULL) { 166 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 167 "GetPlayoutTimestamp() failed to locate channel"); 168 return -1; 169 } 170 return channelPtr->GetRtpRtcp(rtpRtcpModule, rtp_receiver); 171 } 172 173 int VoEVideoSyncImpl::GetLeastRequiredDelayMs(int channel) const { 174 if (!_shared->statistics().Initialized()) { 175 _shared->SetLastError(VE_NOT_INITED, kTraceError); 176 return -1; 177 } 178 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel); 179 voe::Channel* channel_ptr = ch.channel(); 180 if (channel_ptr == NULL) { 181 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError, 182 "GetLeastRequiredDelayMs() failed to locate channel"); 183 return -1; 184 } 185 return channel_ptr->LeastRequiredDelayMs(); 186 } 187 188 #endif // #ifdef WEBRTC_VOICE_ENGINE_VIDEO_SYNC_API 189 190 } // namespace webrtc 191