• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
GetInterface(VoiceEngine * voiceEngine)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 
VoEVideoSyncImpl(voe::SharedData * shared)36 VoEVideoSyncImpl::VoEVideoSyncImpl(voe::SharedData* shared) : _shared(shared) {
37   WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
38                "VoEVideoSyncImpl::VoEVideoSyncImpl() - ctor");
39 }
40 
~VoEVideoSyncImpl()41 VoEVideoSyncImpl::~VoEVideoSyncImpl() {
42   WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
43                "VoEVideoSyncImpl::~VoEVideoSyncImpl() - dtor");
44 }
45 
GetPlayoutTimestamp(int channel,unsigned int & timestamp)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 
SetInitTimestamp(int channel,unsigned int timestamp)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 
SetInitSequenceNumber(int channel,short sequenceNumber)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 
SetMinimumPlayoutDelay(int channel,int delayMs)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 
GetDelayEstimate(int channel,int * jitter_buffer_delay_ms,int * playout_buffer_delay_ms)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 
GetPlayoutBufferSize(int & bufferMs)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 
GetRtpRtcp(int channel,RtpRtcp ** rtpRtcpModule,RtpReceiver ** rtp_receiver)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 
GetLeastRequiredDelayMs(int channel) const173 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