blob: 617ab40742d2221f8e81d6fe4c2cc60381780e91 [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
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +000011#include "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>
15
16#include "engine_configurations.h" // NOLINT
17#include "system_wrappers/interface/critical_section_wrapper.h"
18#include "modules/rtp_rtcp/interface/rtp_rtcp.h"
19#include "modules/video_coding/main/interface/video_coding.h"
20#include "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"
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +000022#include "system_wrappers/interface/trace.h"
23#include "video_engine/vie_channel.h"
24#include "video_engine/vie_channel_manager.h"
25#include "video_engine/vie_defines.h"
26#include "video_engine/vie_encoder.h"
27#include "video_engine/include/vie_errors.h"
28#include "video_engine/vie_impl.h"
29#include "video_engine/vie_input_manager.h"
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +000030#include "video_engine/vie_shared_data.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000031
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000032namespace webrtc {
niklase@google.com470e71d2011-07-07 08:21:25 +000033
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000034ViEBase* ViEBase::GetInterface(VideoEngine* video_engine) {
35 if (!video_engine) {
36 return NULL;
37 }
andrew@webrtc.orgd72262d2013-05-09 02:12:07 +000038 VideoEngineImpl* vie_impl = static_cast<VideoEngineImpl*>(video_engine);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000039 ViEBaseImpl* vie_base_impl = vie_impl;
40 (*vie_base_impl)++; // Increase ref count.
niklase@google.com470e71d2011-07-07 08:21:25 +000041
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000042 return vie_base_impl;
niklase@google.com470e71d2011-07-07 08:21:25 +000043}
44
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000045int ViEBaseImpl::Release() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000046 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, shared_data_.instance_id(),
niklase@google.com470e71d2011-07-07 08:21:25 +000047 "ViEBase::Release()");
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000048 (*this)--; // Decrease ref count.
niklase@google.com470e71d2011-07-07 08:21:25 +000049
pbos@webrtc.orgb238d122013-04-09 13:41:51 +000050 int32_t ref_count = GetCount();
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000051 if (ref_count < 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000052 WEBRTC_TRACE(kTraceWarning, kTraceVideo, shared_data_.instance_id(),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000053 "ViEBase release too many times");
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000054 shared_data_.SetLastError(kViEAPIDoesNotExist);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000055 return -1;
56 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000057 WEBRTC_TRACE(kTraceInfo, kTraceVideo, shared_data_.instance_id(),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000058 "ViEBase reference count: %d", ref_count);
59 return ref_count;
niklase@google.com470e71d2011-07-07 08:21:25 +000060}
61
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000062ViEBaseImpl::ViEBaseImpl() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000063 WEBRTC_TRACE(kTraceMemory, kTraceVideo, shared_data_.instance_id(),
niklase@google.com470e71d2011-07-07 08:21:25 +000064 "ViEBaseImpl::ViEBaseImpl() Ctor");
65}
66
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000067ViEBaseImpl::~ViEBaseImpl() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000068 WEBRTC_TRACE(kTraceMemory, kTraceVideo, shared_data_.instance_id(),
niklase@google.com470e71d2011-07-07 08:21:25 +000069 "ViEBaseImpl::ViEBaseImpl() Dtor");
niklase@google.com470e71d2011-07-07 08:21:25 +000070}
71
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000072int ViEBaseImpl::Init() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000073 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, shared_data_.instance_id(),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000074 "Init");
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000075 if (shared_data_.Initialized()) {
76 WEBRTC_TRACE(kTraceWarning, kTraceVideo, shared_data_.instance_id(),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000077 "Init called twice");
niklase@google.com470e71d2011-07-07 08:21:25 +000078 return 0;
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000079 }
80
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000081 shared_data_.SetInitialized();
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000082 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +000083}
84
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000085int ViEBaseImpl::SetVoiceEngine(VoiceEngine* voice_engine) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000086 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000087 "%s", __FUNCTION__);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000088 if (!(shared_data_.Initialized())) {
89 shared_data_.SetLastError(kViENotInitialized);
90 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000091 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000092 shared_data_.instance_id());
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000093 return -1;
94 }
niklase@google.com470e71d2011-07-07 08:21:25 +000095
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +000096 if (shared_data_.channel_manager()->SetVoiceEngine(voice_engine) != 0) {
97 shared_data_.SetLastError(kViEBaseVoEFailure);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +000098 return -1;
99 }
100 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000101}
102
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000103int ViEBaseImpl::CreateChannel(int& video_channel) { // NOLINT
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000104 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000105 "%s", __FUNCTION__);
niklase@google.com470e71d2011-07-07 08:21:25 +0000106
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000107 if (!(shared_data_.Initialized())) {
108 shared_data_.SetLastError(kViENotInitialized);
109 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000110 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000111 shared_data_.instance_id());
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000112 return -1;
113 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000114
mflodman@webrtc.orgab2610f2012-06-29 10:05:28 +0000115 if (shared_data_.channel_manager()->CreateChannel(&video_channel) == -1) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000116 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000117 "%s: Could not create channel", __FUNCTION__);
118 video_channel = -1;
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000119 shared_data_.SetLastError(kViEBaseChannelCreationFailed);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000120 return -1;
121 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000122 WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000123 "%s: channel created: %d", __FUNCTION__, video_channel);
124 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000125}
126
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000127int ViEBaseImpl::CreateChannel(int& video_channel, // NOLINT
128 int original_channel) {
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +0000129 return CreateChannel(video_channel, original_channel, true);
130}
niklase@google.com470e71d2011-07-07 08:21:25 +0000131
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000132int ViEBaseImpl::CreateReceiveChannel(int& video_channel, // NOLINT
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +0000133 int original_channel) {
134 return CreateChannel(video_channel, original_channel, false);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000135}
niklase@google.com470e71d2011-07-07 08:21:25 +0000136
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000137int ViEBaseImpl::DeleteChannel(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000138 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000139 "%s(%d)", __FUNCTION__, video_channel);
140
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000141 if (!(shared_data_.Initialized())) {
142 shared_data_.SetLastError(kViENotInitialized);
143 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000144 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000145 shared_data_.instance_id());
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000146 return -1;
147 }
148
149 {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000150 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000151 ViEChannel* vie_channel = cs.Channel(video_channel);
152 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000153 WEBRTC_TRACE(kTraceError, kTraceVideo,
154 ViEId(shared_data_.instance_id()),
155 "%s: channel %d doesn't exist", __FUNCTION__, video_channel);
156 shared_data_.SetLastError(kViEBaseInvalidChannelId);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000157 return -1;
158 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000159
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000160 // Deregister the ViEEncoder if no other channel is using it.
161 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
162 if (cs.ChannelUsingViEEncoder(video_channel) == false) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000163 ViEInputManagerScoped is(*(shared_data_.input_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000164 ViEFrameProviderBase* provider = is.FrameProvider(vie_encoder);
165 if (provider) {
166 provider->DeregisterFrameCallback(vie_encoder);
167 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000168 }
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000169 }
170
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000171 if (shared_data_.channel_manager()->DeleteChannel(video_channel) == -1) {
172 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000173 "%s: Could not delete channel %d", __FUNCTION__,
174 video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000175 shared_data_.SetLastError(kViEBaseUnknownError);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000176 return -1;
177 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000178 WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000179 "%s: channel deleted: %d", __FUNCTION__, video_channel);
180 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000181}
182
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000183int ViEBaseImpl::ConnectAudioChannel(const int video_channel,
184 const int audio_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000185 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000186 "%s(%d)", __FUNCTION__, video_channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000187
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000188 if (!(shared_data_.Initialized())) {
189 shared_data_.SetLastError(kViENotInitialized);
190 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000191 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000192 shared_data_.instance_id());
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000193 return -1;
194 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000195
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000196 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000197 if (!cs.Channel(video_channel)) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000198 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000199 "%s: channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000200 shared_data_.SetLastError(kViEBaseInvalidChannelId);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000201 return -1;
202 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000203
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000204 if (shared_data_.channel_manager()->ConnectVoiceChannel(video_channel,
205 audio_channel) != 0) {
206 shared_data_.SetLastError(kViEBaseVoEFailure);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000207 return -1;
208 }
209 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000210}
211
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000212int ViEBaseImpl::DisconnectAudioChannel(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000213 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000214 "%s(%d)", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000215 if (!(shared_data_.Initialized())) {
216 shared_data_.SetLastError(kViENotInitialized);
217 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000218 "%s - ViE instance %d not initialized", __FUNCTION__,
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000219 shared_data_.instance_id());
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000220 return -1;
221 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000222 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000223 if (!cs.Channel(video_channel)) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000224 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000225 "%s: channel %d doesn't exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000226 shared_data_.SetLastError(kViEBaseInvalidChannelId);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000227 return -1;
228 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000229
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000230 if (shared_data_.channel_manager()->DisconnectVoiceChannel(
231 video_channel) != 0) {
232 shared_data_.SetLastError(kViEBaseVoEFailure);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000233 return -1;
234 }
235 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000236}
237
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000238int ViEBaseImpl::StartSend(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000239 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
240 ViEId(shared_data_.instance_id(), video_channel),
241 "%s(channel: %d)", __FUNCTION__, video_channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000242
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000243 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000244 ViEChannel* vie_channel = cs.Channel(video_channel);
245 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000246 WEBRTC_TRACE(kTraceError, kTraceVideo,
247 ViEId(shared_data_.instance_id(), video_channel),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000248 "%s: Channel %d does not exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000249 shared_data_.SetLastError(kViEBaseInvalidChannelId);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000250 return -1;
251 }
mflodman@webrtc.org1a739ba2012-02-28 16:11:33 +0000252
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000253 ViEEncoder* vie_encoder = cs.Encoder(video_channel);
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +0000254 assert(vie_encoder != NULL);
255 if (vie_encoder->Owner() != video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000256 WEBRTC_TRACE(kTraceError, kTraceVideo,
257 ViEId(shared_data_.instance_id(), video_channel),
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +0000258 "Can't start ssend on a receive only channel.");
259 shared_data_.SetLastError(kViEBaseReceiveOnlyChannel);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000260 return -1;
261 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000262
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000263 // Pause and trigger a key frame.
264 vie_encoder->Pause();
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000265 int32_t error = vie_channel->StartSend();
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000266 if (error != 0) {
267 vie_encoder->Restart();
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000268 WEBRTC_TRACE(kTraceError, kTraceVideo,
269 ViEId(shared_data_.instance_id(), video_channel),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000270 "%s: Could not start sending on channel %d", __FUNCTION__,
271 video_channel);
272 if (error == kViEBaseAlreadySending) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000273 shared_data_.SetLastError(kViEBaseAlreadySending);
niklase@google.com470e71d2011-07-07 08:21:25 +0000274 }
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000275 shared_data_.SetLastError(kViEBaseUnknownError);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000276 return -1;
277 }
278 vie_encoder->SendKeyFrame();
279 vie_encoder->Restart();
280 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000281}
282
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000283int ViEBaseImpl::StopSend(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000284 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
285 ViEId(shared_data_.instance_id(), video_channel),
286 "%s(channel: %d)", __FUNCTION__, video_channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000287
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000288 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000289 ViEChannel* vie_channel = cs.Channel(video_channel);
290 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000291 WEBRTC_TRACE(kTraceError, kTraceVideo,
292 ViEId(shared_data_.instance_id(), video_channel),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000293 "%s: Channel %d does not exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000294 shared_data_.SetLastError(kViEBaseInvalidChannelId);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000295 return -1;
296 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000297
pbos@webrtc.orgb238d122013-04-09 13:41:51 +0000298 int32_t error = vie_channel->StopSend();
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000299 if (error != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000300 WEBRTC_TRACE(kTraceError, kTraceVideo,
301 ViEId(shared_data_.instance_id(), video_channel),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000302 "%s: Could not stop sending on channel %d", __FUNCTION__,
303 video_channel);
304 if (error == kViEBaseNotSending) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000305 shared_data_.SetLastError(kViEBaseNotSending);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000306 } else {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000307 shared_data_.SetLastError(kViEBaseUnknownError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000308 }
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000309 return -1;
310 }
311 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000312}
313
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000314int ViEBaseImpl::StartReceive(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000315 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
316 ViEId(shared_data_.instance_id(), video_channel),
317 "%s(channel: %d)", __FUNCTION__, video_channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000318
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000319 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000320 ViEChannel* vie_channel = cs.Channel(video_channel);
321 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000322 WEBRTC_TRACE(kTraceError, kTraceVideo,
323 ViEId(shared_data_.instance_id(), video_channel),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000324 "%s: Channel %d does not exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000325 shared_data_.SetLastError(kViEBaseInvalidChannelId);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000326 return -1;
327 }
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000328 if (vie_channel->StartReceive() != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000329 shared_data_.SetLastError(kViEBaseUnknownError);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000330 return -1;
331 }
332 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000333}
334
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000335int ViEBaseImpl::StopReceive(const int video_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000336 WEBRTC_TRACE(kTraceApiCall, kTraceVideo,
337 ViEId(shared_data_.instance_id(), video_channel),
338 "%s(channel: %d)", __FUNCTION__, video_channel);
niklase@google.com470e71d2011-07-07 08:21:25 +0000339
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000340 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000341 ViEChannel* vie_channel = cs.Channel(video_channel);
342 if (!vie_channel) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000343 WEBRTC_TRACE(kTraceError, kTraceVideo,
344 ViEId(shared_data_.instance_id(), video_channel),
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000345 "%s: Channel %d does not exist", __FUNCTION__, video_channel);
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000346 shared_data_.SetLastError(kViEBaseInvalidChannelId);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000347 return -1;
348 }
349 if (vie_channel->StopReceive() != 0) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000350 shared_data_.SetLastError(kViEBaseUnknownError);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000351 return -1;
352 }
353 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000354}
355
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000356int ViEBaseImpl::GetVersion(char version[1024]) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000357 WEBRTC_TRACE(kTraceApiCall, kTraceVideo, ViEId(shared_data_.instance_id()),
niklase@google.com470e71d2011-07-07 08:21:25 +0000358 "GetVersion(version=?)");
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000359 assert(kViEVersionMaxMessageSize == 1024);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000360 if (!version) {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000361 shared_data_.SetLastError(kViEBaseInvalidArgument);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000362 return -1;
363 }
niklase@google.com470e71d2011-07-07 08:21:25 +0000364
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000365 // Add WebRTC Version.
366 std::stringstream version_stream;
elham@webrtc.orgdf3da842013-05-03 23:11:37 +0000367 version_stream << "VideoEngine 3.30.0" << std::endl;
niklase@google.com470e71d2011-07-07 08:21:25 +0000368
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000369 // Add build info.
370 version_stream << "Build: svn:" << WEBRTC_SVNREVISION << " " << BUILDINFO
371 << std::endl;
niklase@google.com470e71d2011-07-07 08:21:25 +0000372
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000373#ifdef WEBRTC_EXTERNAL_TRANSPORT
374 version_stream << "External transport build" << std::endl;
375#endif
376 int version_length = version_stream.tellp();
377 assert(version_length < 1024);
378 memcpy(version, version_stream.str().c_str(), version_length);
leozwang@webrtc.org6c08f262012-07-13 22:00:16 +0000379 version[version_length] = '\0';
niklase@google.com470e71d2011-07-07 08:21:25 +0000380
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000381 WEBRTC_TRACE(kTraceStateInfo, kTraceVideo,
382 ViEId(shared_data_.instance_id()), "GetVersion() => %s",
383 version);
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000384 return 0;
niklase@google.com470e71d2011-07-07 08:21:25 +0000385}
386
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000387int ViEBaseImpl::LastError() {
mflodman@webrtc.orgb11424b2012-01-25 13:42:03 +0000388 return shared_data_.LastErrorInternal();
niklase@google.com470e71d2011-07-07 08:21:25 +0000389}
390
mflodman@webrtc.org9ba151b2012-06-21 10:02:13 +0000391int ViEBaseImpl::CreateChannel(int& video_channel, // NOLINT
392 int original_channel, bool sender) {
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +0000393 if (!(shared_data_.Initialized())) {
394 shared_data_.SetLastError(kViENotInitialized);
395 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
396 "%s - ViE instance %d not initialized", __FUNCTION__,
397 shared_data_.instance_id());
398 return -1;
399 }
400
401 ViEChannelManagerScoped cs(*(shared_data_.channel_manager()));
402 if (!cs.Channel(original_channel)) {
403 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
404 "%s - original_channel does not exist.", __FUNCTION__,
405 shared_data_.instance_id());
406 shared_data_.SetLastError(kViEBaseInvalidChannelId);
407 return -1;
408 }
409
mflodman@webrtc.orgab2610f2012-06-29 10:05:28 +0000410 if (shared_data_.channel_manager()->CreateChannel(&video_channel,
mflodman@webrtc.org9ec883e2012-03-05 17:12:41 +0000411 original_channel,
412 sender) == -1) {
413 WEBRTC_TRACE(kTraceError, kTraceVideo, ViEId(shared_data_.instance_id()),
414 "%s: Could not create channel", __FUNCTION__);
415 video_channel = -1;
416 shared_data_.SetLastError(kViEBaseChannelCreationFailed);
417 return -1;
418 }
419 WEBRTC_TRACE(kTraceInfo, kTraceVideo, ViEId(shared_data_.instance_id()),
420 "%s: channel created: %d", __FUNCTION__, video_channel);
421 return 0;
422}
423
mflodman@webrtc.org27a82a62011-11-30 18:04:26 +0000424} // namespace webrtc