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_network_impl.h"
12
13 #include "webrtc/base/checks.h"
14 #include "webrtc/base/format_macros.h"
15 #include "webrtc/base/logging.h"
16 #include "webrtc/system_wrappers/include/critical_section_wrapper.h"
17 #include "webrtc/system_wrappers/include/trace.h"
18 #include "webrtc/voice_engine/channel.h"
19 #include "webrtc/voice_engine/include/voe_errors.h"
20 #include "webrtc/voice_engine/voice_engine_impl.h"
21
22 namespace webrtc {
23
GetInterface(VoiceEngine * voiceEngine)24 VoENetwork* VoENetwork::GetInterface(VoiceEngine* voiceEngine) {
25 if (!voiceEngine) {
26 return nullptr;
27 }
28 VoiceEngineImpl* s = static_cast<VoiceEngineImpl*>(voiceEngine);
29 s->AddRef();
30 return s;
31 }
32
VoENetworkImpl(voe::SharedData * shared)33 VoENetworkImpl::VoENetworkImpl(voe::SharedData* shared) : _shared(shared) {
34 }
35
36 VoENetworkImpl::~VoENetworkImpl() = default;
37
RegisterExternalTransport(int channel,Transport & transport)38 int VoENetworkImpl::RegisterExternalTransport(int channel,
39 Transport& transport) {
40 RTC_DCHECK(_shared->statistics().Initialized());
41 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
42 voe::Channel* channelPtr = ch.channel();
43 if (!channelPtr) {
44 LOG_F(LS_ERROR) << "Failed to locate channel: " << channel;
45 return -1;
46 }
47 return channelPtr->RegisterExternalTransport(transport);
48 }
49
DeRegisterExternalTransport(int channel)50 int VoENetworkImpl::DeRegisterExternalTransport(int channel) {
51 RTC_CHECK(_shared->statistics().Initialized());
52 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
53 voe::Channel* channelPtr = ch.channel();
54 if (!channelPtr) {
55 LOG_F(LS_ERROR) << "Failed to locate channel: " << channel;
56 return -1;
57 }
58 return channelPtr->DeRegisterExternalTransport();
59 }
60
ReceivedRTPPacket(int channel,const void * data,size_t length)61 int VoENetworkImpl::ReceivedRTPPacket(int channel,
62 const void* data,
63 size_t length) {
64 return ReceivedRTPPacket(channel, data, length, webrtc::PacketTime());
65 }
66
ReceivedRTPPacket(int channel,const void * data,size_t length,const PacketTime & packet_time)67 int VoENetworkImpl::ReceivedRTPPacket(int channel,
68 const void* data,
69 size_t length,
70 const PacketTime& packet_time) {
71 RTC_CHECK(_shared->statistics().Initialized());
72 RTC_CHECK(data);
73 // L16 at 32 kHz, stereo, 10 ms frames (+12 byte RTP header) -> 1292 bytes
74 if ((length < 12) || (length > 1292)) {
75 LOG_F(LS_ERROR) << "Invalid packet length: " << length;
76 return -1;
77 }
78 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
79 voe::Channel* channelPtr = ch.channel();
80 if (!channelPtr) {
81 LOG_F(LS_ERROR) << "Failed to locate channel: " << channel;
82 return -1;
83 }
84 if (!channelPtr->ExternalTransport()) {
85 LOG_F(LS_ERROR) << "No external transport for channel: " << channel;
86 return -1;
87 }
88 return channelPtr->ReceivedRTPPacket((const int8_t*)data, length,
89 packet_time);
90 }
91
ReceivedRTCPPacket(int channel,const void * data,size_t length)92 int VoENetworkImpl::ReceivedRTCPPacket(int channel,
93 const void* data,
94 size_t length) {
95 RTC_CHECK(_shared->statistics().Initialized());
96 RTC_CHECK(data);
97 if (length < 4) {
98 LOG_F(LS_ERROR) << "Invalid packet length: " << length;
99 return -1;
100 }
101 voe::ChannelOwner ch = _shared->channel_manager().GetChannel(channel);
102 voe::Channel* channelPtr = ch.channel();
103 if (!channelPtr) {
104 LOG_F(LS_ERROR) << "Failed to locate channel: " << channel;
105 return -1;
106 }
107 if (!channelPtr->ExternalTransport()) {
108 LOG_F(LS_ERROR) << "No external transport for channel: " << channel;
109 return -1;
110 }
111 return channelPtr->ReceivedRTCPPacket((const int8_t*)data, length);
112 }
113
114 } // namespace webrtc
115