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