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