blob: 70c548857b8c1550d2977e676762f171e6b7be65 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
xians@webrtc.org79af7342012-01-31 12:22:14 +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
andrew@webrtc.org8c845cb2013-05-02 15:28:02 +000011#include "webrtc/voice_engine/voe_network_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000012
andrew@webrtc.org8c845cb2013-05-02 15:28:02 +000013#include "webrtc/system_wrappers/interface/critical_section_wrapper.h"
14#include "webrtc/system_wrappers/interface/logging.h"
15#include "webrtc/system_wrappers/interface/trace.h"
16#include "webrtc/voice_engine/channel.h"
17#include "webrtc/voice_engine/include/voe_errors.h"
18#include "webrtc/voice_engine/voice_engine_impl.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000019
20namespace webrtc
21{
22
23VoENetwork* VoENetwork::GetInterface(VoiceEngine* voiceEngine)
24{
niklase@google.com470e71d2011-07-07 08:21:25 +000025 if (NULL == voiceEngine)
26 {
27 return NULL;
28 }
tommi@webrtc.org0989fb72013-02-15 15:07:32 +000029 VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
tommi@webrtc.orga990e122012-04-26 15:28:22 +000030 s->AddRef();
31 return s;
niklase@google.com470e71d2011-07-07 08:21:25 +000032}
33
tommi@webrtc.org851becd2012-04-04 14:57:19 +000034VoENetworkImpl::VoENetworkImpl(voe::SharedData* shared) : _shared(shared)
niklase@google.com470e71d2011-07-07 08:21:25 +000035{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000036 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +000037 "VoENetworkImpl() - ctor");
38}
39
40VoENetworkImpl::~VoENetworkImpl()
41{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000042 WEBRTC_TRACE(kTraceMemory, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +000043 "~VoENetworkImpl() - dtor");
44}
45
niklase@google.com470e71d2011-07-07 08:21:25 +000046int VoENetworkImpl::RegisterExternalTransport(int channel,
47 Transport& transport)
48{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000049 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +000050 "SetExternalTransport(channel=%d, transport=0x%x)",
51 channel, &transport);
tommi@webrtc.org851becd2012-04-04 14:57:19 +000052 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +000053 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +000054 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +000055 return -1;
56 }
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000057 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
58 voe::Channel* channelPtr = ch.channel();
niklase@google.com470e71d2011-07-07 08:21:25 +000059 if (channelPtr == NULL)
60 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +000061 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +000062 "SetExternalTransport() failed to locate channel");
63 return -1;
64 }
65 return channelPtr->RegisterExternalTransport(transport);
66}
67
68int VoENetworkImpl::DeRegisterExternalTransport(int channel)
69{
tommi@webrtc.org851becd2012-04-04 14:57:19 +000070 WEBRTC_TRACE(kTraceApiCall, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +000071 "DeRegisterExternalTransport(channel=%d)", channel);
tommi@webrtc.org851becd2012-04-04 14:57:19 +000072 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +000073 {
henrika@webrtc.org9b6eefc2013-09-24 15:42:49 +000074 WEBRTC_TRACE(kTraceError, kTraceVoice,
75 VoEId(_shared->instance_id(), -1),
76 "DeRegisterExternalTransport() - invalid state");
niklase@google.com470e71d2011-07-07 08:21:25 +000077 }
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +000078 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
79 voe::Channel* channelPtr = ch.channel();
niklase@google.com470e71d2011-07-07 08:21:25 +000080 if (channelPtr == NULL)
81 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +000082 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +000083 "DeRegisterExternalTransport() failed to locate channel");
84 return -1;
85 }
86 return channelPtr->DeRegisterExternalTransport();
87}
88
89int VoENetworkImpl::ReceivedRTPPacket(int channel,
90 const void* data,
solenberg@webrtc.orgb1f50102014-03-24 10:38:25 +000091 unsigned int length) {
92 return ReceivedRTPPacket(channel, data, length, webrtc::PacketTime());
93}
94
95int VoENetworkImpl::ReceivedRTPPacket(int channel,
96 const void* data,
97 unsigned int length,
98 const PacketTime& packet_time)
niklase@google.com470e71d2011-07-07 08:21:25 +000099{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000100 WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000101 "ReceivedRTPPacket(channel=%d, length=%u)", channel, length);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000102 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000103 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000104 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000105 return -1;
106 }
andrew@webrtc.org8c845cb2013-05-02 15:28:02 +0000107 // L16 at 32 kHz, stereo, 10 ms frames (+12 byte RTP header) -> 1292 bytes
108 if ((length < 12) || (length > 1292))
niklase@google.com470e71d2011-07-07 08:21:25 +0000109 {
andrew@webrtc.org8c845cb2013-05-02 15:28:02 +0000110 _shared->SetLastError(VE_INVALID_PACKET);
111 LOG(LS_ERROR) << "Invalid packet length: " << length;
niklase@google.com470e71d2011-07-07 08:21:25 +0000112 return -1;
113 }
114 if (NULL == data)
115 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000116 _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000117 "ReceivedRTPPacket() invalid data vector");
118 return -1;
119 }
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +0000120 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
121 voe::Channel* channelPtr = ch.channel();
niklase@google.com470e71d2011-07-07 08:21:25 +0000122 if (channelPtr == NULL)
123 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000124 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000125 "ReceivedRTPPacket() failed to locate channel");
126 return -1;
127 }
128
129 if (!channelPtr->ExternalTransport())
130 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000131 _shared->SetLastError(VE_INVALID_OPERATION, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000132 "ReceivedRTPPacket() external transport is not enabled");
133 return -1;
134 }
solenberg@webrtc.orgb1f50102014-03-24 10:38:25 +0000135 return channelPtr->ReceivedRTPPacket((const int8_t*) data, length,
136 packet_time);
niklase@google.com470e71d2011-07-07 08:21:25 +0000137}
138
139int VoENetworkImpl::ReceivedRTCPPacket(int channel, const void* data,
140 unsigned int length)
141{
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000142 WEBRTC_TRACE(kTraceStream, kTraceVoice, VoEId(_shared->instance_id(), -1),
niklase@google.com470e71d2011-07-07 08:21:25 +0000143 "ReceivedRTCPPacket(channel=%d, length=%u)", channel, length);
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000144 if (!_shared->statistics().Initialized())
niklase@google.com470e71d2011-07-07 08:21:25 +0000145 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000146 _shared->SetLastError(VE_NOT_INITED, kTraceError);
niklase@google.com470e71d2011-07-07 08:21:25 +0000147 return -1;
148 }
149 if (length < 4)
150 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000151 _shared->SetLastError(VE_INVALID_PACKET, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000152 "ReceivedRTCPPacket() invalid packet length");
153 return -1;
154 }
155 if (NULL == data)
156 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000157 _shared->SetLastError(VE_INVALID_ARGUMENT, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000158 "ReceivedRTCPPacket() invalid data vector");
159 return -1;
160 }
pbos@webrtc.org676ff1e2013-08-07 17:57:36 +0000161 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
162 voe::Channel* channelPtr = ch.channel();
niklase@google.com470e71d2011-07-07 08:21:25 +0000163 if (channelPtr == NULL)
164 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000165 _shared->SetLastError(VE_CHANNEL_NOT_VALID, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000166 "ReceivedRTCPPacket() failed to locate channel");
167 return -1;
168 }
169 if (!channelPtr->ExternalTransport())
170 {
tommi@webrtc.org851becd2012-04-04 14:57:19 +0000171 _shared->SetLastError(VE_INVALID_OPERATION, kTraceError,
niklase@google.com470e71d2011-07-07 08:21:25 +0000172 "ReceivedRTCPPacket() external transport is not enabled");
173 return -1;
174 }
pbos@webrtc.org6141e132013-04-09 10:09:10 +0000175 return channelPtr->ReceivedRTCPPacket((const int8_t*) data, length);
niklase@google.com470e71d2011-07-07 08:21:25 +0000176}
pbos@webrtc.orgd900e8b2013-07-03 15:12:26 +0000177} // namespace webrtc