blob: 8636435f654bbfbbe5b4351e59b1101ab7213792 [file] [log] [blame]
henrike@webrtc.org28e20752013-07-10 00:45:36 +00001/*
kjellander1afca732016-02-07 20:46:45 -08002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00003 *
kjellander1afca732016-02-07 20:46:45 -08004 * 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.
henrike@webrtc.org28e20752013-07-10 00:45:36 +00009 */
10
kjellandera96e2d72016-02-04 23:52:28 -080011#ifndef WEBRTC_MEDIA_BASE_RTPDATAENGINE_H_
12#define WEBRTC_MEDIA_BASE_RTPDATAENGINE_H_
henrike@webrtc.org28e20752013-07-10 00:45:36 +000013
kwiberg686a8ef2016-02-26 03:00:35 -080014#include <memory>
henrike@webrtc.org28e20752013-07-10 00:45:36 +000015#include <string>
16#include <vector>
17
buildbot@webrtc.orga09a9992014-08-13 17:26:08 +000018#include "webrtc/base/timing.h"
kjellandera96e2d72016-02-04 23:52:28 -080019#include "webrtc/media/base/constants.h"
20#include "webrtc/media/base/mediachannel.h"
21#include "webrtc/media/base/mediaengine.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000022
23namespace cricket {
24
25struct DataCodec;
26
27class RtpDataEngine : public DataEngineInterface {
28 public:
29 RtpDataEngine();
30
31 virtual DataMediaChannel* CreateChannel(DataChannelType data_channel_type);
32
33 virtual const std::vector<DataCodec>& data_codecs() {
34 return data_codecs_;
35 }
36
37 // Mostly for testing with a fake clock. Ownership is passed in.
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000038 void SetTiming(rtc::Timing* timing) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000039 timing_.reset(timing);
40 }
41
42 private:
43 std::vector<DataCodec> data_codecs_;
kwiberg686a8ef2016-02-26 03:00:35 -080044 std::unique_ptr<rtc::Timing> timing_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000045};
46
47// Keep track of sequence number and timestamp of an RTP stream. The
48// sequence number starts with a "random" value and increments. The
49// timestamp starts with a "random" value and increases monotonically
50// according to the clockrate.
51class RtpClock {
52 public:
Peter Boström0c4e06b2015-10-07 12:23:21 +020053 RtpClock(int clockrate, uint16_t first_seq_num, uint32_t timestamp_offset)
henrike@webrtc.org28e20752013-07-10 00:45:36 +000054 : clockrate_(clockrate),
55 last_seq_num_(first_seq_num),
Peter Boström0c4e06b2015-10-07 12:23:21 +020056 timestamp_offset_(timestamp_offset) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000057
58 // Given the current time (in number of seconds which must be
59 // monotonically increasing), Return the next sequence number and
60 // timestamp.
Peter Boström0c4e06b2015-10-07 12:23:21 +020061 void Tick(double now, int* seq_num, uint32_t* timestamp);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000062
63 private:
64 int clockrate_;
Peter Boström0c4e06b2015-10-07 12:23:21 +020065 uint16_t last_seq_num_;
66 uint32_t timestamp_offset_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000067};
68
69class RtpDataMediaChannel : public DataMediaChannel {
70 public:
71 // Timing* Used for the RtpClock
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000072 explicit RtpDataMediaChannel(rtc::Timing* timing);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073 // Sets Timing == NULL, so you'll need to call set_timer() before
74 // using it. This is needed by FakeMediaEngine.
75 RtpDataMediaChannel();
76 virtual ~RtpDataMediaChannel();
77
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000078 void set_timing(rtc::Timing* timing) {
henrike@webrtc.org28e20752013-07-10 00:45:36 +000079 timing_ = timing;
80 }
81
Fredrik Solenbergb071a192015-09-17 16:42:56 +020082 virtual bool SetSendParameters(const DataSendParameters& params);
83 virtual bool SetRecvParameters(const DataRecvParameters& params);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000084 virtual bool AddSendStream(const StreamParams& sp);
Peter Boström0c4e06b2015-10-07 12:23:21 +020085 virtual bool RemoveSendStream(uint32_t ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000086 virtual bool AddRecvStream(const StreamParams& sp);
Peter Boström0c4e06b2015-10-07 12:23:21 +020087 virtual bool RemoveRecvStream(uint32_t ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000088 virtual bool SetSend(bool send) {
89 sending_ = send;
90 return true;
91 }
92 virtual bool SetReceive(bool receive) {
93 receiving_ = receive;
94 return true;
95 }
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000096 virtual void OnPacketReceived(rtc::Buffer* packet,
97 const rtc::PacketTime& packet_time);
98 virtual void OnRtcpReceived(rtc::Buffer* packet,
99 const rtc::PacketTime& packet_time) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000100 virtual void OnReadyToSend(bool ready) {}
101 virtual bool SendData(
102 const SendDataParams& params,
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000103 const rtc::Buffer& payload,
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000104 SendDataResult* result);
105
106 private:
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000107 void Construct(rtc::Timing* timing);
Fredrik Solenbergb071a192015-09-17 16:42:56 +0200108 bool SetMaxSendBandwidth(int bps);
109 bool SetSendCodecs(const std::vector<DataCodec>& codecs);
110 bool SetRecvCodecs(const std::vector<DataCodec>& codecs);
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000111
112 bool sending_;
113 bool receiving_;
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +0000114 rtc::Timing* timing_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000115 std::vector<DataCodec> send_codecs_;
116 std::vector<DataCodec> recv_codecs_;
117 std::vector<StreamParams> send_streams_;
118 std::vector<StreamParams> recv_streams_;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200119 std::map<uint32_t, RtpClock*> rtp_clock_by_send_ssrc_;
kwiberg686a8ef2016-02-26 03:00:35 -0800120 std::unique_ptr<rtc::RateLimiter> send_limiter_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000121};
122
123} // namespace cricket
124
kjellandera96e2d72016-02-04 23:52:28 -0800125#endif // WEBRTC_MEDIA_BASE_RTPDATAENGINE_H_