1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/vie_network_impl.h"
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
13912b7f727086279bfa950dce96953fe018f49580pwestin@webrtc.org#include <stdio.h>
14912b7f727086279bfa950dce96953fe018f49580pwestin@webrtc.org#if (defined(WIN32_) || defined(WIN64_))
15912b7f727086279bfa950dce96953fe018f49580pwestin@webrtc.org#include <qos.h>
16912b7f727086279bfa950dce96953fe018f49580pwestin@webrtc.org#endif
17912b7f727086279bfa950dce96953fe018f49580pwestin@webrtc.org
18065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/engine_configurations.h"
193468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org#include "webrtc/system_wrappers/interface/logging.h"
20065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/include/vie_errors.h"
21065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/vie_channel.h"
22065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/vie_channel_manager.h"
23065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/vie_defines.h"
24065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/vie_encoder.h"
25065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/vie_impl.h"
26065b64d41755bcde64d8db6920ba16049af46177pwestin@webrtc.org#include "webrtc/video_engine/vie_shared_data.h"
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgViENetwork* ViENetwork::GetInterface(VideoEngine* video_engine) {
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!video_engine) {
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return NULL;
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
347ab726855f2ceb9ff6365e3240668d58f45e6761andrew@webrtc.org  VideoEngineImpl* vie_impl = static_cast<VideoEngineImpl*>(video_engine);
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViENetworkImpl* vie_networkImpl = vie_impl;
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Increase ref count.
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  (*vie_networkImpl)++;
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return vie_networkImpl;
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViENetworkImpl::Release() {
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Decrease ref count.
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  (*this)--;
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
4567879bc2e69d7907b7ceb92135a34f77fe643e7fpbos@webrtc.org  int32_t ref_count = GetCount();
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (ref_count < 0) {
473468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org    LOG(LS_ERROR) << "ViENetwork release too many times";
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViEAPIDoesNotExist);
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return ref_count;
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
54dca71b270896a8501d9f12506e7da48cde9abb20stefan@webrtc.orgvoid ViENetworkImpl::SetNetworkTransmissionState(const int video_channel,
55dca71b270896a8501d9f12506e7da48cde9abb20stefan@webrtc.org                                                 const bool is_transmitting) {
563468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org  LOG_F(LS_INFO) << "channel: " << video_channel
573468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org                 << " transmitting: " << (is_transmitting ? "yes" : "no");
58dca71b270896a8501d9f12506e7da48cde9abb20stefan@webrtc.org  ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
59dca71b270896a8501d9f12506e7da48cde9abb20stefan@webrtc.org  ViEEncoder* vie_encoder = cs.Encoder(video_channel);
60dca71b270896a8501d9f12506e7da48cde9abb20stefan@webrtc.org  if (!vie_encoder) {
61dca71b270896a8501d9f12506e7da48cde9abb20stefan@webrtc.org    shared_data_->SetLastError(kViENetworkInvalidChannelId);
62dca71b270896a8501d9f12506e7da48cde9abb20stefan@webrtc.org    return;
63dca71b270896a8501d9f12506e7da48cde9abb20stefan@webrtc.org  }
64dca71b270896a8501d9f12506e7da48cde9abb20stefan@webrtc.org  vie_encoder->SetNetworkTransmissionState(is_transmitting);
65dca71b270896a8501d9f12506e7da48cde9abb20stefan@webrtc.org}
66dca71b270896a8501d9f12506e7da48cde9abb20stefan@webrtc.org
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgViENetworkImpl::ViENetworkImpl(ViESharedData* shared_data)
683468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org    : shared_data_(shared_data) {}
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
703468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.orgViENetworkImpl::~ViENetworkImpl() {}
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViENetworkImpl::RegisterSendTransport(const int video_channel,
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                          Transport& transport) {
743468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org  LOG_F(LS_INFO) << "channel: " << video_channel;
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEChannel* vie_channel = cs.Channel(video_channel);
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_channel) {
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViENetworkInvalidChannelId);
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_channel->Sending()) {
823468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org    LOG_F(LS_ERROR) << "Already sending on channel: " << video_channel;
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViENetworkAlreadySending);
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_channel->RegisterSendTransport(&transport) != 0) {
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViENetworkUnknownError);
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViENetworkImpl::DeregisterSendTransport(const int video_channel) {
943468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org  LOG_F(LS_INFO) << "channel: " << video_channel;
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEChannel* vie_channel = cs.Channel(video_channel);
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_channel) {
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViENetworkInvalidChannelId);
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_channel->Sending()) {
1023468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org    LOG_F(LS_ERROR) << "Actively sending on channel: " << video_channel;
103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViENetworkAlreadySending);
104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_channel->DeregisterSendTransport() != 0) {
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViENetworkUnknownError);
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViENetworkImpl::ReceivedRTPPacket(const int video_channel, const void* data,
114efeb8ce7e183005e557a2d107203e2057cec26a8wu@webrtc.org                                      const int length,
115efeb8ce7e183005e557a2d107203e2057cec26a8wu@webrtc.org                                      const PacketTime& packet_time) {
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEChannel* vie_channel = cs.Channel(video_channel);
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_channel) {
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViENetworkInvalidChannelId);
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
122efeb8ce7e183005e557a2d107203e2057cec26a8wu@webrtc.org  return vie_channel->ReceivedRTPPacket(data, length, packet_time);
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViENetworkImpl::ReceivedRTCPPacket(const int video_channel,
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                       const void* data, const int length) {
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEChannel* vie_channel = cs.Channel(video_channel);
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_channel) {
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViENetworkInvalidChannelId);
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return vie_channel->ReceivedRTCPPacket(data, length);
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint ViENetworkImpl::SetMTU(int video_channel, unsigned int mtu) {
1373468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org  LOG_F(LS_INFO) << "channel: " << video_channel << " mtu: " << mtu;
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ViEChannel* vie_channel = cs.Channel(video_channel);
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (!vie_channel) {
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViENetworkInvalidChannelId);
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  if (vie_channel->SetMTU(mtu) != 0) {
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    shared_data_->SetLastError(kViENetworkUnknownError);
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    return -1;
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  return 0;
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
150fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org
151fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.orgint ViENetworkImpl::ReceivedBWEPacket(const int video_channel,
152fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org    int64_t arrival_time_ms, int payload_size, const RTPHeader& header) {
153fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org  ViEChannelManagerScoped cs(*(shared_data_->channel_manager()));
154fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org  ViEChannel* vie_channel = cs.Channel(video_channel);
155fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org  if (!vie_channel) {
156fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org    shared_data_->SetLastError(kViENetworkInvalidChannelId);
157fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org    return -1;
158fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org  }
159fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org
1602d3624ceb06407a4440433f816612fc150bfea42solenberg@webrtc.org  vie_channel->ReceivedBWEPacket(arrival_time_ms, payload_size, header);
161fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org  return 0;
162fec6b6e5999edec8c90efae54357f1aae6a4c7ddsolenberg@webrtc.org}
1635d8c95410ed920ebc224686bb8db2fc358c0e0c0stefan@webrtc.org
1645d8c95410ed920ebc224686bb8db2fc358c0e0c0stefan@webrtc.orgbool ViENetworkImpl::SetBandwidthEstimationConfig(
1655d8c95410ed920ebc224686bb8db2fc358c0e0c0stefan@webrtc.org    int video_channel, const webrtc::Config& config) {
1663468f20608200e23fa0ad7435490260419cf70c5pbos@webrtc.org  LOG_F(LS_INFO) << "channel: " << video_channel;
1675d8c95410ed920ebc224686bb8db2fc358c0e0c0stefan@webrtc.org  return shared_data_->channel_manager()->SetBandwidthEstimationConfig(
1685d8c95410ed920ebc224686bb8db2fc358c0e0c0stefan@webrtc.org      video_channel, config);
1695d8c95410ed920ebc224686bb8db2fc358c0e0c0stefan@webrtc.org}
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
171