blob: 0b2f007027cd65d8b7ced084db6d143ef607ef81 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
mflodman@webrtc.org1a739ba2012-02-28 16:11:33 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000011#include "webrtc/video_engine/vie_base_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +000013#include <sstream>
14#include <string>
mflodman@webrtc.orgf3973e82013-12-13 09:40:45 +000015#include <utility>
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +000016
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000017#include "webrtc/engine_configurations.h"
18#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp.h"
19#include "webrtc/modules/video_coding/main/interface/video_coding.h"
20#include "webrtc/modules/video_processing/main/interface/video_processing.h"
andrew@webrtc.org9841d922012-10-31 05:22:11 +000021#include "webrtc/modules/video_render/include/video_render.h"
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000022#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
23#include "webrtc/system_wrappers/interface/trace.h"
24#include "webrtc/video_engine/include/vie_errors.h"
mflodman@webrtc.org6879c8a2013-07-23 11:35:00 +000025#include "webrtc/video_engine/vie_capturer.h"
pbos@webrtc.orgf5d4cb12013-05-17 13:44:48 +000026#include "webrtc/video_engine/vie_channel.h"
27#include "webrtc/video_engine/vie_channel_manager.h"
28#include "webrtc/video_engine/vie_defines.h"
29#include "webrtc/video_engine/vie_encoder.h"
30#include "webrtc/video_engine/vie_impl.h"
31#include "webrtc/video_engine/vie_input_manager.h"
32#include "webrtc/video_engine/vie_shared_data.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000033
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000034namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000035
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000036ViEBase* ViEBase::GetInterface(VideoEngine* video_engine) {
37 if (!video_engine) {
38 return NULL;
39 }
andrew@webrtc.orgd72262d2013-05-09 02:12:07 +000040 VideoEngineImpl* vie_impl = static_cast<VideoEngineImpl*>(video_engine);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000041 ViEBaseImpl* vie_base_impl = vie_impl;
42 (*vie_base_impl)++; // Increase ref count.
niklase@google.com470e71d2011-07-07 08:21:25 +000043
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000044 return vie_base_impl;
niklase@google.com470e71d2011-07-07 08:21:25 +000045}
46
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000047int ViEBaseImpl::Release() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000048 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, shared_data_.instance_id(),
niklase@google.com470e71d2011-07-07 08:21:25 +000049 "ViEBase::Release()");
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000050 (*this)--; // Decrease ref count.
niklase@google.com470e71d2011-07-07 08:21:25 +000051
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000052 int32_t ref_count = GetCount();
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000053 if (ref_count < 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000054 WEBRTC_TRACE(kTraceWarning, kTraceVideo, shared_data_.instance_id(),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000055 "ViEBase release too many times");
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000056 shared_data_.SetLastError(kViEAPIDoesNotExist);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000057 return -1;
58 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000059 WEBRTC_TRACE(kTraceInfo, kTraceVideo, shared_data_.instance_id(),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000060 "ViEBase reference count: %d", ref_count);
61 return ref_count;
niklase@google.com470e71d2011-07-07 08:21:25 +000062}
63
andresp@webrtc.org7707d062013-05-13 10:50:50 +000064ViEBaseImpl::ViEBaseImpl(const Config& config)
65 : shared_data_(config) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000066 WEBRTC_TRACE(kTraceMemory, kTraceVideo, shared_data_.instance_id(),
niklase@google.com470e71d2011-07-07 08:21:25 +000067 "ViEBaseImpl::ViEBaseImpl() Ctor");
68}
69
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000070ViEBaseImpl::~ViEBaseImpl() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000071 WEBRTC_TRACE(kTraceMemory, kTraceVideo, shared_data_.instance_id(),
niklase@google.com470e71d2011-07-07 08:21:25 +000072 "ViEBaseImpl::ViEBaseImpl() Dtor");
niklase@google.com470e71d2011-07-07 08:21:25 +000073}
74
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000075int ViEBaseImpl::Init() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000076 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, shared_data_.instance_id(),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000077 "Init");
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000078 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000079}
80
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000081int ViEBaseImpl::SetVoiceEngine(VoiceEngine* voice_engine) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000082 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000083 "%s", __FUNCTION__);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000084 if (shared_data_.channel_manager()->SetVoiceEngine(voice_engine) != 0) {
85 shared_data_.SetLastError(kViEBaseVoEFailure);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000086 return -1;
87 }
88 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000089}
90
mflodman@webrtc.org6879c8a2013-07-23 11:35:00 +000091int ViEBaseImpl::RegisterCpuOveruseObserver(int video_channel,
92 CpuOveruseObserver* observer) {
93 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
94 ViEChannel* vie_channel = cs.Channel(video_channel);
95 if (!vie_channel) {
96 WEBRTC_TRACE(kTraceError,
97 kTraceVideo,
98 ViEId(shared_data_.instance_id()),
99 "%s: channel %d doesn't exist",
100 __FUNCTION__,
101 video_channel);
102 shared_data_.SetLastError(kViEBaseInvalidChannelId);
103 return -1;
104 }
105 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
106 assert(vie_encoder);
107
108 ViEInputManagerScoped is(*(shared_data_.input_manager()));
109 ViEFrameProviderBase* provider = is.FrameProvider(vie_encoder);
110 if (provider) {
111 ViECapturer* capturer = is.Capture(provider->Id());
112 assert(capturer);
113 capturer->RegisterCpuOveruseObserver(observer);
114 }
115
116 shared_data_.overuse_observers()->insert(
117 std::pair<int, CpuOveruseObserver*>(video_channel, observer));
118 return 0;
119}
120
asapersson@webrtc.orgc7ff8f92013-11-26 11:12:33 +0000121int ViEBaseImpl::CpuOveruseMeasures(int video_channel,
122 int* capture_jitter_ms,
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +0000123 int* avg_encode_time_ms,
124 int* encode_usage_percent,
125 int* capture_queue_delay_ms_per_s) {
asapersson@webrtc.orgb24d3352013-11-20 13:51:40 +0000126 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
127 ViEChannel* vie_channel = cs.Channel(video_channel);
128 if (!vie_channel) {
129 WEBRTC_TRACE(kTraceError,
130 kTraceVideo,
131 ViEId(shared_data_.instance_id()),
132 "%s: channel %d doesn't exist",
133 __FUNCTION__,
134 video_channel);
135 shared_data_.SetLastError(kViEBaseInvalidChannelId);
136 return -1;
137 }
138 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
139 assert(vie_encoder);
140
141 ViEInputManagerScoped is(*(shared_data_.input_manager()));
142 ViEFrameProviderBase* provider = is.FrameProvider(vie_encoder);
143 if (provider) {
144 ViECapturer* capturer = is.Capture(provider->Id());
145 if (capturer) {
asapersson@webrtc.org9e5b0342013-12-04 13:47:44 +0000146 capturer->CpuOveruseMeasures(capture_jitter_ms,
147 avg_encode_time_ms,
148 encode_usage_percent,
149 capture_queue_delay_ms_per_s);
asapersson@webrtc.orgb24d3352013-11-20 13:51:40 +0000150 return 0;
151 }
152 }
153 return -1;
154}
155
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000156int ViEBaseImpl::CreateChannel(int& video_channel) { // NOLINT
henrik.lundin@webrtc.org41907742014-01-29 08:47:15 +0000157 return CreateChannel(video_channel, static_cast<const Config*>(NULL));
158}
159
160int ViEBaseImpl::CreateChannel(int& video_channel, // NOLINT
161 const Config* config) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000162 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000163 "%s", __FUNCTION__);
henrik.lundin@webrtc.org41907742014-01-29 08:47:15 +0000164 if (shared_data_.channel_manager()->CreateChannel(&video_channel,
165 config) == -1) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000166 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000167 "%s: Could not create channel", __FUNCTION__);
168 video_channel = -1;
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000169 shared_data_.SetLastError(kViEBaseChannelCreationFailed);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000170 return -1;
171 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000172 WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000173 "%s: channel created: %d", __FUNCTION__, video_channel);
174 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000175}
176
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000177int ViEBaseImpl::CreateChannel(int& video_channel, // NOLINT
178 int original_channel) {
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +0000179 return CreateChannel(video_channel, original_channel, true);
180}
niklase@google.com470e71d2011-07-07 08:21:25 +0000181
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000182int ViEBaseImpl::CreateReceiveChannel(int& video_channel, // NOLINT
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +0000183 int original_channel) {
184 return CreateChannel(video_channel, original_channel, false);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000185}
niklase@google.com470e71d2011-07-07 08:21:25 +0000186
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000187int ViEBaseImpl::DeleteChannel(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000188 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000189 "%s(%d)", __FUNCTION__, video_channel);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000190 {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000191 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000192 ViEChannel* vie_channel = cs.Channel(video_channel);
193 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000194 WEBRTC_TRACE(kTraceError, kTraceVideo,
195 ViEId(shared_data_.instance_id()),
196 "%s: channel %d doesn't exist", __FUNCTION__, video_channel);
197 shared_data_.SetLastError(kViEBaseInvalidChannelId);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000198 return -1;
199 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000200
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000201 // Deregister the ViEEncoder if no other channel is using it.
202 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
203 if (cs.ChannelUsingViEEncoder(video_channel) == false) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000204 ViEInputManagerScoped is(*(shared_data_.input_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000205 ViEFrameProviderBase* provider = is.FrameProvider(vie_encoder);
206 if (provider) {
207 provider->DeregisterFrameCallback(vie_encoder);
208 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000209 }
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000210 }
211
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000212 if (shared_data_.channel_manager()->DeleteChannel(video_channel) == -1) {
213 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000214 "%s: Could not delete channel %d", __FUNCTION__,
215 video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000216 shared_data_.SetLastError(kViEBaseUnknownError);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000217 return -1;
218 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000219 WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000220 "%s: channel deleted: %d", __FUNCTION__, video_channel);
221 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000222}
223
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000224int ViEBaseImpl::ConnectAudioChannel(const int video_channel,
225 const int audio_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000226 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000227 "%s(%d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000228 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000229 if (!cs.Channel(video_channel)) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000230 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000231 "%s: channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000232 shared_data_.SetLastError(kViEBaseInvalidChannelId);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000233 return -1;
234 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000235
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000236 if (shared_data_.channel_manager()->ConnectVoiceChannel(video_channel,
237 audio_channel) != 0) {
238 shared_data_.SetLastError(kViEBaseVoEFailure);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000239 return -1;
240 }
241 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000242}
243
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000244int ViEBaseImpl::DisconnectAudioChannel(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000245 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000246 "%s(%d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000247 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000248 if (!cs.Channel(video_channel)) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000249 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000250 "%s: channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000251 shared_data_.SetLastError(kViEBaseInvalidChannelId);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000252 return -1;
253 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000254
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000255 if (shared_data_.channel_manager()->DisconnectVoiceChannel(
256 video_channel) != 0) {
257 shared_data_.SetLastError(kViEBaseVoEFailure);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000258 return -1;
259 }
260 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000261}
262
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000263int ViEBaseImpl::StartSend(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000264 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
265 ViEId(shared_data_.instance_id(), video_channel),
266 "%s(channel: %d)", __FUNCTION__, video_channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000267
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000268 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000269 ViEChannel* vie_channel = cs.Channel(video_channel);
270 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000271 WEBRTC_TRACE(kTraceError, kTraceVideo,
272 ViEId(shared_data_.instance_id(), video_channel),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000273 "%s: Channel %d does not exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000274 shared_data_.SetLastError(kViEBaseInvalidChannelId);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000275 return -1;
276 }
mflodman@webrtc.org1a739ba2012-02-28 16:11:33 +0000277
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000278 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +0000279 assert(vie_encoder != NULL);
280 if (vie_encoder->Owner() != video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000281 WEBRTC_TRACE(kTraceError, kTraceVideo,
282 ViEId(shared_data_.instance_id(), video_channel),
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +0000283 "Can't start ssend on a receive only channel.");
284 shared_data_.SetLastError(kViEBaseReceiveOnlyChannel);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000285 return -1;
286 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000287
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000288 // Pause and trigger a key frame.
289 vie_encoder->Pause();
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000290 int32_t error = vie_channel->StartSend();
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000291 if (error != 0) {
292 vie_encoder->Restart();
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000293 WEBRTC_TRACE(kTraceError, kTraceVideo,
294 ViEId(shared_data_.instance_id(), video_channel),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000295 "%s: Could not start sending on channel %d", __FUNCTION__,
296 video_channel);
297 if (error == kViEBaseAlreadySending) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000298 shared_data_.SetLastError(kViEBaseAlreadySending);
niklase@google.com470e71d2011-07-07 08:21:25 +0000299 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000300 shared_data_.SetLastError(kViEBaseUnknownError);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000301 return -1;
302 }
303 vie_encoder->SendKeyFrame();
304 vie_encoder->Restart();
305 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000306}
307
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000308int ViEBaseImpl::StopSend(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000309 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
310 ViEId(shared_data_.instance_id(), video_channel),
311 "%s(channel: %d)", __FUNCTION__, video_channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000312
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000313 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000314 ViEChannel* vie_channel = cs.Channel(video_channel);
315 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000316 WEBRTC_TRACE(kTraceError, kTraceVideo,
317 ViEId(shared_data_.instance_id(), video_channel),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000318 "%s: Channel %d does not exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000319 shared_data_.SetLastError(kViEBaseInvalidChannelId);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000320 return -1;
321 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000322
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000323 int32_t error = vie_channel->StopSend();
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000324 if (error != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000325 WEBRTC_TRACE(kTraceError, kTraceVideo,
326 ViEId(shared_data_.instance_id(), video_channel),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000327 "%s: Could not stop sending on channel %d", __FUNCTION__,
328 video_channel);
329 if (error == kViEBaseNotSending) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000330 shared_data_.SetLastError(kViEBaseNotSending);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000331 } else {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000332 shared_data_.SetLastError(kViEBaseUnknownError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000333 }
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000334 return -1;
335 }
336 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000337}
338
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000339int ViEBaseImpl::StartReceive(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000340 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
341 ViEId(shared_data_.instance_id(), video_channel),
342 "%s(channel: %d)", __FUNCTION__, video_channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000343
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000344 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000345 ViEChannel* vie_channel = cs.Channel(video_channel);
346 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000347 WEBRTC_TRACE(kTraceError, kTraceVideo,
348 ViEId(shared_data_.instance_id(), video_channel),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000349 "%s: Channel %d does not exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000350 shared_data_.SetLastError(kViEBaseInvalidChannelId);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000351 return -1;
352 }
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000353 if (vie_channel->StartReceive() != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000354 shared_data_.SetLastError(kViEBaseUnknownError);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000355 return -1;
356 }
357 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000358}
359
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000360int ViEBaseImpl::StopReceive(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000361 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
362 ViEId(shared_data_.instance_id(), video_channel),
363 "%s(channel: %d)", __FUNCTION__, video_channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000364
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000365 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000366 ViEChannel* vie_channel = cs.Channel(video_channel);
367 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000368 WEBRTC_TRACE(kTraceError, kTraceVideo,
369 ViEId(shared_data_.instance_id(), video_channel),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000370 "%s: Channel %d does not exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000371 shared_data_.SetLastError(kViEBaseInvalidChannelId);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000372 return -1;
373 }
374 if (vie_channel->StopReceive() != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000375 shared_data_.SetLastError(kViEBaseUnknownError);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000376 return -1;
377 }
378 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000379}
380
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000381int ViEBaseImpl::GetVersion(char version[1024]) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000382 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_.instance_id()),
niklase@google.com470e71d2011-07-07 08:21:25 +0000383 "GetVersion(version=?)");
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000384 assert(kViEVersionMaxMessageSize == 1024);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000385 if (!version) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000386 shared_data_.SetLastError(kViEBaseInvalidArgument);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000387 return -1;
388 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000389
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000390 // Add WebRTC Version.
391 std::stringstream version_stream;
elham@webrtc.org3f170dd2014-02-20 22:31:07 +0000392 version_stream << "VideoEngine 3.50.0" << std::endl;
niklase@google.com470e71d2011-07-07 08:21:25 +0000393
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000394 // Add build info.
andrew@webrtc.org3054ba62013-12-04 17:00:44 +0000395 version_stream << "Build: " << BUILDINFO << std::endl;
niklase@google.com470e71d2011-07-07 08:21:25 +0000396
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000397#ifdef WEBRTC_EXTERNAL_TRANSPORT
398 version_stream << "External transport build" << std::endl;
399#endif
400 int version_length = version_stream.tellp();
401 assert(version_length < 1024);
402 memcpy(version, version_stream.str().c_str(), version_length);
leozwang@webrtc.org6c08f262012-07-13 22:00:16 +0000403 version[version_length] = '\0';
niklase@google.com470e71d2011-07-07 08:21:25 +0000404
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000405 WEBRTC_TRACE(kTraceStateInfo, kTraceVideo,
406 ViEId(shared_data_.instance_id()), "GetVersion() => %s",
407 version);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000408 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000409}
410
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000411int ViEBaseImpl::LastError() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000412 return shared_data_.LastErrorInternal();
niklase@google.com470e71d2011-07-07 08:21:25 +0000413}
414
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000415int ViEBaseImpl::CreateChannel(int& video_channel, // NOLINT
416 int original_channel, bool sender) {
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +0000417 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
418 if (!cs.Channel(original_channel)) {
419 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
420 "%s - original_channel does not exist.", __FUNCTION__,
421 shared_data_.instance_id());
422 shared_data_.SetLastError(kViEBaseInvalidChannelId);
423 return -1;
424 }
425
mflodman@webrtc.orgab2610f2012-06-29 10:05:28 +0000426 if (shared_data_.channel_manager()->CreateChannel(&video_channel,
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +0000427 original_channel,
428 sender) == -1) {
429 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
430 "%s: Could not create channel", __FUNCTION__);
431 video_channel = -1;
432 shared_data_.SetLastError(kViEBaseChannelCreationFailed);
433 return -1;
434 }
435 WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(shared_data_.instance_id()),
436 "%s: channel created: %d", __FUNCTION__, video_channel);
437 return 0;
438}
439
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000440} // namespace webrtc