blob: 37a84da16fa3b975a78eff3e1be36b1a57f2fc3d [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
kjellandera96e2d72016-02-04 23:52:28 -080018#include "webrtc/media/base/mediachannel.h"
kjellanderf4752772016-03-02 05:42:30 -080019#include "webrtc/media/base/mediaconstants.h"
kjellandera96e2d72016-02-04 23:52:28 -080020#include "webrtc/media/base/mediaengine.h"
henrike@webrtc.org28e20752013-07-10 00:45:36 +000021
22namespace cricket {
23
24struct DataCodec;
25
26class RtpDataEngine : public DataEngineInterface {
27 public:
28 RtpDataEngine();
29
30 virtual DataMediaChannel* CreateChannel(DataChannelType data_channel_type);
31
32 virtual const std::vector<DataCodec>& data_codecs() {
33 return data_codecs_;
34 }
35
henrike@webrtc.org28e20752013-07-10 00:45:36 +000036 private:
37 std::vector<DataCodec> data_codecs_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000038};
39
40// Keep track of sequence number and timestamp of an RTP stream. The
41// sequence number starts with a "random" value and increments. The
42// timestamp starts with a "random" value and increases monotonically
43// according to the clockrate.
44class RtpClock {
45 public:
Peter Boström0c4e06b2015-10-07 12:23:21 +020046 RtpClock(int clockrate, uint16_t first_seq_num, uint32_t timestamp_offset)
henrike@webrtc.org28e20752013-07-10 00:45:36 +000047 : clockrate_(clockrate),
48 last_seq_num_(first_seq_num),
Peter Boström0c4e06b2015-10-07 12:23:21 +020049 timestamp_offset_(timestamp_offset) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000050
51 // Given the current time (in number of seconds which must be
52 // monotonically increasing), Return the next sequence number and
53 // timestamp.
Peter Boström0c4e06b2015-10-07 12:23:21 +020054 void Tick(double now, int* seq_num, uint32_t* timestamp);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000055
56 private:
57 int clockrate_;
Peter Boström0c4e06b2015-10-07 12:23:21 +020058 uint16_t last_seq_num_;
59 uint32_t timestamp_offset_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +000060};
61
62class RtpDataMediaChannel : public DataMediaChannel {
63 public:
henrike@webrtc.org28e20752013-07-10 00:45:36 +000064 RtpDataMediaChannel();
65 virtual ~RtpDataMediaChannel();
66
Fredrik Solenbergb071a192015-09-17 16:42:56 +020067 virtual bool SetSendParameters(const DataSendParameters& params);
68 virtual bool SetRecvParameters(const DataRecvParameters& params);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000069 virtual bool AddSendStream(const StreamParams& sp);
Peter Boström0c4e06b2015-10-07 12:23:21 +020070 virtual bool RemoveSendStream(uint32_t ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000071 virtual bool AddRecvStream(const StreamParams& sp);
Peter Boström0c4e06b2015-10-07 12:23:21 +020072 virtual bool RemoveRecvStream(uint32_t ssrc);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000073 virtual bool SetSend(bool send) {
74 sending_ = send;
75 return true;
76 }
77 virtual bool SetReceive(bool receive) {
78 receiving_ = receive;
79 return true;
80 }
jbaucheec21bd2016-03-20 06:15:43 -070081 virtual void OnPacketReceived(rtc::CopyOnWriteBuffer* packet,
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000082 const rtc::PacketTime& packet_time);
jbaucheec21bd2016-03-20 06:15:43 -070083 virtual void OnRtcpReceived(rtc::CopyOnWriteBuffer* packet,
buildbot@webrtc.orgd4e598d2014-07-29 17:36:52 +000084 const rtc::PacketTime& packet_time) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000085 virtual void OnReadyToSend(bool ready) {}
michaelt79e05882016-11-08 02:50:09 -080086 virtual void OnTransportOverheadChanged(int transport_overhead_per_packet) {}
henrike@webrtc.org28e20752013-07-10 00:45:36 +000087 virtual bool SendData(
88 const SendDataParams& params,
jbaucheec21bd2016-03-20 06:15:43 -070089 const rtc::CopyOnWriteBuffer& payload,
henrike@webrtc.org28e20752013-07-10 00:45:36 +000090 SendDataResult* result);
91
92 private:
nissecdf37a92016-09-13 23:41:47 -070093 void Construct();
Fredrik Solenbergb071a192015-09-17 16:42:56 +020094 bool SetMaxSendBandwidth(int bps);
95 bool SetSendCodecs(const std::vector<DataCodec>& codecs);
96 bool SetRecvCodecs(const std::vector<DataCodec>& codecs);
henrike@webrtc.org28e20752013-07-10 00:45:36 +000097
98 bool sending_;
99 bool receiving_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000100 std::vector<DataCodec> send_codecs_;
101 std::vector<DataCodec> recv_codecs_;
102 std::vector<StreamParams> send_streams_;
103 std::vector<StreamParams> recv_streams_;
Peter Boström0c4e06b2015-10-07 12:23:21 +0200104 std::map<uint32_t, RtpClock*> rtp_clock_by_send_ssrc_;
kwiberg686a8ef2016-02-26 03:00:35 -0800105 std::unique_ptr<rtc::RateLimiter> send_limiter_;
henrike@webrtc.org28e20752013-07-10 00:45:36 +0000106};
107
108} // namespace cricket
109
kjellandera96e2d72016-02-04 23:52:28 -0800110#endif // WEBRTC_MEDIA_BASE_RTPDATAENGINE_H_