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/video_engine/vie_network_impl.h" 12 13 #include <stdio.h> 14 #if (defined(WIN32_) || defined(WIN64_)) 15 #include <qos.h> 16 #endif 17 18 #include "webrtc/engine_configurations.h" 19 #include "webrtc/system_wrappers/interface/logging.h" 20 #include "webrtc/video_engine/include/vie_errors.h" 21 #include "webrtc/video_engine/vie_channel.h" 22 #include "webrtc/video_engine/vie_channel_manager.h" 23 #include "webrtc/video_engine/vie_defines.h" 24 #include "webrtc/video_engine/vie_encoder.h" 25 #include "webrtc/video_engine/vie_impl.h" 26 #include "webrtc/video_engine/vie_shared_data.h" 27 28 namespace webrtc { 29 30 ViENetwork* ViENetwork::GetInterface(VideoEngine* video_engine) { 31 if (!video_engine) { 32 return NULL; 33 } 34 VideoEngineImpl* vie_impl = static_cast<VideoEngineImpl*>(video_engine); 35 ViENetworkImpl* vie_networkImpl = vie_impl; 36 // Increase ref count. 37 (*vie_networkImpl)++; 38 return vie_networkImpl; 39 } 40 41 int ViENetworkImpl::Release() { 42 // Decrease ref count. 43 (*this)--; 44 45 int32_t ref_count = GetCount(); 46 if (ref_count < 0) { 47 LOG(LS_ERROR) << "ViENetwork release too many times"; 48 shared_data_->SetLastError(kViEAPIDoesNotExist); 49 return -1; 50 } 51 return ref_count; 52 } 53 54 void ViENetworkImpl::SetNetworkTransmissionState(const int video_channel, 55 const bool is_transmitting) { 56 LOG_F(LS_INFO) << "channel: " << video_channel 57 << " transmitting: " << (is_transmitting ? "yes" : "no"); 58 ViEChannelManagerScoped cs(*(shared_data_->channel_manager())); 59 ViEEncoder* vie_encoder = cs.Encoder(video_channel); 60 if (!vie_encoder) { 61 shared_data_->SetLastError(kViENetworkInvalidChannelId); 62 return; 63 } 64 vie_encoder->SetNetworkTransmissionState(is_transmitting); 65 } 66 67 ViENetworkImpl::ViENetworkImpl(ViESharedData* shared_data) 68 : shared_data_(shared_data) {} 69 70 ViENetworkImpl::~ViENetworkImpl() {} 71 72 int ViENetworkImpl::RegisterSendTransport(const int video_channel, 73 Transport& transport) { 74 LOG_F(LS_INFO) << "channel: " << video_channel; 75 ViEChannelManagerScoped cs(*(shared_data_->channel_manager())); 76 ViEChannel* vie_channel = cs.Channel(video_channel); 77 if (!vie_channel) { 78 shared_data_->SetLastError(kViENetworkInvalidChannelId); 79 return -1; 80 } 81 if (vie_channel->Sending()) { 82 LOG_F(LS_ERROR) << "Already sending on channel: " << video_channel; 83 shared_data_->SetLastError(kViENetworkAlreadySending); 84 return -1; 85 } 86 if (vie_channel->RegisterSendTransport(&transport) != 0) { 87 shared_data_->SetLastError(kViENetworkUnknownError); 88 return -1; 89 } 90 return 0; 91 } 92 93 int ViENetworkImpl::DeregisterSendTransport(const int video_channel) { 94 LOG_F(LS_INFO) << "channel: " << video_channel; 95 ViEChannelManagerScoped cs(*(shared_data_->channel_manager())); 96 ViEChannel* vie_channel = cs.Channel(video_channel); 97 if (!vie_channel) { 98 shared_data_->SetLastError(kViENetworkInvalidChannelId); 99 return -1; 100 } 101 if (vie_channel->Sending()) { 102 LOG_F(LS_ERROR) << "Actively sending on channel: " << video_channel; 103 shared_data_->SetLastError(kViENetworkAlreadySending); 104 return -1; 105 } 106 if (vie_channel->DeregisterSendTransport() != 0) { 107 shared_data_->SetLastError(kViENetworkUnknownError); 108 return -1; 109 } 110 return 0; 111 } 112 113 int ViENetworkImpl::ReceivedRTPPacket(const int video_channel, const void* data, 114 const int length, 115 const PacketTime& packet_time) { 116 ViEChannelManagerScoped cs(*(shared_data_->channel_manager())); 117 ViEChannel* vie_channel = cs.Channel(video_channel); 118 if (!vie_channel) { 119 shared_data_->SetLastError(kViENetworkInvalidChannelId); 120 return -1; 121 } 122 return vie_channel->ReceivedRTPPacket(data, length, packet_time); 123 } 124 125 int ViENetworkImpl::ReceivedRTCPPacket(const int video_channel, 126 const void* data, const int length) { 127 ViEChannelManagerScoped cs(*(shared_data_->channel_manager())); 128 ViEChannel* vie_channel = cs.Channel(video_channel); 129 if (!vie_channel) { 130 shared_data_->SetLastError(kViENetworkInvalidChannelId); 131 return -1; 132 } 133 return vie_channel->ReceivedRTCPPacket(data, length); 134 } 135 136 int ViENetworkImpl::SetMTU(int video_channel, unsigned int mtu) { 137 LOG_F(LS_INFO) << "channel: " << video_channel << " mtu: " << mtu; 138 ViEChannelManagerScoped cs(*(shared_data_->channel_manager())); 139 ViEChannel* vie_channel = cs.Channel(video_channel); 140 if (!vie_channel) { 141 shared_data_->SetLastError(kViENetworkInvalidChannelId); 142 return -1; 143 } 144 if (vie_channel->SetMTU(mtu) != 0) { 145 shared_data_->SetLastError(kViENetworkUnknownError); 146 return -1; 147 } 148 return 0; 149 } 150 151 int ViENetworkImpl::ReceivedBWEPacket(const int video_channel, 152 int64_t arrival_time_ms, int payload_size, const RTPHeader& header) { 153 ViEChannelManagerScoped cs(*(shared_data_->channel_manager())); 154 ViEChannel* vie_channel = cs.Channel(video_channel); 155 if (!vie_channel) { 156 shared_data_->SetLastError(kViENetworkInvalidChannelId); 157 return -1; 158 } 159 160 vie_channel->ReceivedBWEPacket(arrival_time_ms, payload_size, header); 161 return 0; 162 } 163 164 bool ViENetworkImpl::SetBandwidthEstimationConfig( 165 int video_channel, const webrtc::Config& config) { 166 LOG_F(LS_INFO) << "channel: " << video_channel; 167 return shared_data_->channel_manager()->SetBandwidthEstimationConfig( 168 video_channel, config); 169 } 170 } // namespace webrtc 171