106e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org/* 206e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 306e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org * 406e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org * Use of this source code is governed by a BSD-style license 506e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org * that can be found in the LICENSE file in the root of the source 606e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org * tree. An additional intellectual property rights grant can be found 706e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org * in the file PATENTS. All contributing project authors may 806e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org * be found in the AUTHORS file in the root of the source tree. 906e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org */ 105e0cbcf74e3c41e28c4b7210704d0d51754f815bmflodman@webrtc.org#ifndef WEBRTC_CALL_H_ 115e0cbcf74e3c41e28c4b7210704d0d51754f815bmflodman@webrtc.org#define WEBRTC_CALL_H_ 1206e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 1306e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org#include <string> 1406e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org#include <vector> 1506e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 1606e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org#include "webrtc/common_types.h" 1724e2089750e9e51228b82d6c7ebf4fa064c797bapbos@webrtc.org#include "webrtc/video_receive_stream.h" 1824e2089750e9e51228b82d6c7ebf4fa064c797bapbos@webrtc.org#include "webrtc/video_send_stream.h" 1906e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 2006e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.orgnamespace webrtc { 2106e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 2206e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.orgclass VoiceEngine; 2306e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 2406e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.orgconst char* Version(); 2506e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 2606e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.orgclass PacketReceiver { 2706e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org public: 28bc57e0f1a00227c0cec3d429fc58cc442d07b509pbos@webrtc.org enum DeliveryStatus { 29bc57e0f1a00227c0cec3d429fc58cc442d07b509pbos@webrtc.org DELIVERY_OK, 30bc57e0f1a00227c0cec3d429fc58cc442d07b509pbos@webrtc.org DELIVERY_UNKNOWN_SSRC, 31bc57e0f1a00227c0cec3d429fc58cc442d07b509pbos@webrtc.org DELIVERY_PACKET_ERROR, 32bc57e0f1a00227c0cec3d429fc58cc442d07b509pbos@webrtc.org }; 33bc57e0f1a00227c0cec3d429fc58cc442d07b509pbos@webrtc.org 34bc57e0f1a00227c0cec3d429fc58cc442d07b509pbos@webrtc.org virtual DeliveryStatus DeliverPacket(const uint8_t* packet, 35bc57e0f1a00227c0cec3d429fc58cc442d07b509pbos@webrtc.org size_t length) = 0; 3606e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 3706e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org protected: 3806e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org virtual ~PacketReceiver() {} 3906e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org}; 4006e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 418ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org// Callback interface for reporting when a system overuse is detected. 428ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org// The detection is based on the jitter of incoming captured frames. 438ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.orgclass OveruseCallback { 448ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org public: 458ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org // Called as soon as an overuse is detected. 468ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org virtual void OnOveruse() = 0; 478ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org // Called periodically when the system is not overused any longer. 488ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org virtual void OnNormalUse() = 0; 498ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org 508ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org protected: 518ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org virtual ~OveruseCallback() {} 528ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org}; 538ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org 54bf6d5729629fc98dbbf8a4965cec1efe93cad895pbos@webrtc.org// A Call instance can contain several send and/or receive streams. All streams 55bf6d5729629fc98dbbf8a4965cec1efe93cad895pbos@webrtc.org// are assumed to have the same remote endpoint and will share bitrate estimates 56bf6d5729629fc98dbbf8a4965cec1efe93cad895pbos@webrtc.org// etc. 57bf6d5729629fc98dbbf8a4965cec1efe93cad895pbos@webrtc.orgclass Call { 5806e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org public: 599b707ca664bd22f7a8bfad14a06f9ffdc6129d3dpbos@webrtc.org enum NetworkState { 609b707ca664bd22f7a8bfad14a06f9ffdc6129d3dpbos@webrtc.org kNetworkUp, 619b707ca664bd22f7a8bfad14a06f9ffdc6129d3dpbos@webrtc.org kNetworkDown, 629b707ca664bd22f7a8bfad14a06f9ffdc6129d3dpbos@webrtc.org }; 63bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org struct Config { 64c1797061756f40b9b1f3f3e82fc040ce18ecd43cpbos@webrtc.org explicit Config(newapi::Transport* send_transport) 6547f0c4192df67999055b47f6a5d5314ce6a4ac4bstefan@webrtc.org : webrtc_config(NULL), 6647f0c4192df67999055b47f6a5d5314ce6a4ac4bstefan@webrtc.org send_transport(send_transport), 67c2014fdfc05b2682e4de266c7b2aba1b9a736d79pbos@webrtc.org voice_engine(NULL), 68f89ce467d1977ea1d867be4e5be2ccd9a206113cmflodman@webrtc.org overuse_callback(NULL), 69f89ce467d1977ea1d867be4e5be2ccd9a206113cmflodman@webrtc.org start_bitrate_bps(-1) {} 70bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org 7147f0c4192df67999055b47f6a5d5314ce6a4ac4bstefan@webrtc.org webrtc::Config* webrtc_config; 7247f0c4192df67999055b47f6a5d5314ce6a4ac4bstefan@webrtc.org 73c1797061756f40b9b1f3f3e82fc040ce18ecd43cpbos@webrtc.org newapi::Transport* send_transport; 74c2014fdfc05b2682e4de266c7b2aba1b9a736d79pbos@webrtc.org 75bf6d5729629fc98dbbf8a4965cec1efe93cad895pbos@webrtc.org // VoiceEngine used for audio/video synchronization for this Call. 76c2014fdfc05b2682e4de266c7b2aba1b9a736d79pbos@webrtc.org VoiceEngine* voice_engine; 77c2014fdfc05b2682e4de266c7b2aba1b9a736d79pbos@webrtc.org 788ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org // Callback for overuse and normal usage based on the jitter of incoming 798ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org // captured frames. 'NULL' disables the callback. 808ef65486bf136f11d8dc9c637f94d7c08b687120asapersson@webrtc.org OveruseCallback* overuse_callback; 81f89ce467d1977ea1d867be4e5be2ccd9a206113cmflodman@webrtc.org 82f89ce467d1977ea1d867be4e5be2ccd9a206113cmflodman@webrtc.org // Start bitrate used before a valid bitrate estimate is calculated. '-1' 83f89ce467d1977ea1d867be4e5be2ccd9a206113cmflodman@webrtc.org // lets the call decide start bitrate. 84f89ce467d1977ea1d867be4e5be2ccd9a206113cmflodman@webrtc.org // Note: This currently only affects video. 85f89ce467d1977ea1d867be4e5be2ccd9a206113cmflodman@webrtc.org int start_bitrate_bps; 86bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org }; 87bf76ae2bdfc0b4e8e875f6cce1c85d4d66357bebmflodman@webrtc.org 88bf6d5729629fc98dbbf8a4965cec1efe93cad895pbos@webrtc.org static Call* Create(const Call::Config& config); 89c2014fdfc05b2682e4de266c7b2aba1b9a736d79pbos@webrtc.org 9047f0c4192df67999055b47f6a5d5314ce6a4ac4bstefan@webrtc.org static Call* Create(const Call::Config& config, 9147f0c4192df67999055b47f6a5d5314ce6a4ac4bstefan@webrtc.org const webrtc::Config& webrtc_config); 9247f0c4192df67999055b47f6a5d5314ce6a4ac4bstefan@webrtc.org 93964d78e5c80ec8e4cbaeece5f119806b1ef9ea22pbos@webrtc.org virtual VideoSendStream* CreateVideoSendStream( 94bdfcddf7091e92134143e9a2d9ccce908e43979epbos@webrtc.org const VideoSendStream::Config& config, 9558b5140b7535ae66c618cc64b0a955b8d47cc86cpbos@webrtc.org const VideoEncoderConfig& encoder_config) = 0; 9606e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 9712a93e063c94500f8fe0a045fc381a816fdf3c69pbos@webrtc.org virtual void DestroyVideoSendStream(VideoSendStream* send_stream) = 0; 9806e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 99964d78e5c80ec8e4cbaeece5f119806b1ef9ea22pbos@webrtc.org virtual VideoReceiveStream* CreateVideoReceiveStream( 1006f1c3ef8c07f6a5ac0ba2deae54cf63812310ad4pbos@webrtc.org const VideoReceiveStream::Config& config) = 0; 10112a93e063c94500f8fe0a045fc381a816fdf3c69pbos@webrtc.org virtual void DestroyVideoReceiveStream( 10212a93e063c94500f8fe0a045fc381a816fdf3c69pbos@webrtc.org VideoReceiveStream* receive_stream) = 0; 10306e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 10406e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org // All received RTP and RTCP packets for the call should be inserted to this 10506e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org // PacketReceiver. The PacketReceiver pointer is valid as long as the 106bf6d5729629fc98dbbf8a4965cec1efe93cad895pbos@webrtc.org // Call instance exists. 10706e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org virtual PacketReceiver* Receiver() = 0; 10806e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 10906e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org // Returns the estimated total send bandwidth. Note: this can differ from the 11006e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org // actual encoded bitrate. 11106e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org virtual uint32_t SendBitrateEstimate() = 0; 11206e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 11306e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org // Returns the total estimated receive bandwidth for the call. Note: this can 11406e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org // differ from the actual receive bitrate. 11506e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org virtual uint32_t ReceiveBitrateEstimate() = 0; 11606e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 1179b707ca664bd22f7a8bfad14a06f9ffdc6129d3dpbos@webrtc.org virtual void SignalNetworkState(NetworkState state) = 0; 1189b707ca664bd22f7a8bfad14a06f9ffdc6129d3dpbos@webrtc.org 119bf6d5729629fc98dbbf8a4965cec1efe93cad895pbos@webrtc.org virtual ~Call() {} 12006e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org}; 12106e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org} // namespace webrtc 12206e802659df16b778e01b258232ebeae7273fd8cmflodman@webrtc.org 1235e0cbcf74e3c41e28c4b7210704d0d51754f815bmflodman@webrtc.org#endif // WEBRTC_CALL_H_ 124