1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
2f6bb77a6f0d250f8c4c2c4dbf059556c00cf8eafpwestin@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Use of this source code is governed by a BSD-style license
5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  that can be found in the LICENSE file in the root of the source
6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  tree. An additional intellectual property rights grant can be found
7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  in the file PATENTS.  All contributing project authors may
8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  be found in the AUTHORS file in the root of the source tree.
9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
11470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_
12470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_
1312dc1a38ca54a000e4fecfbc6d41138b895c9ca5pbos@webrtc.org
14b8b6fbb7a5d2f5a14f7f6f81c253747aa28e4c7fdanilchap#include <list>
1500741874360df26043df929da784530bc77984aapwestin@webrtc.org#include <map>
16b8b6fbb7a5d2f5a14f7f6f81c253747aa28e4c7fdanilchap#include <utility>
17b8b6fbb7a5d2f5a14f7f6f81c253747aa28e4c7fdanilchap#include <vector>
1800741874360df26043df929da784530bc77984aapwestin@webrtc.org
1947a740bc5e36bcaf19385f9d4c0afb0cad070a05danilchap#include "webrtc/base/random.h"
2038344ed2806c8fed60d67d280ca44c32e36707c0pbos@webrtc.org#include "webrtc/base/thread_annotations.h"
21571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org#include "webrtc/common_types.h"
22ff761fba8274d93bd73e76c8b8a1f2d0776dd840Henrik Kjellander#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
23c38eef896a483c5d4a2975d76060c9942031a94aphoglund@webrtc.org#include "webrtc/modules/rtp_rtcp/source/bitrate.h"
24571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org#include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h"
257e9315b42ebe8f7df860030af93618de81326503stefan@webrtc.org#include "webrtc/modules/rtp_rtcp/source/rtp_packet_history.h"
26571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org#include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
27fcf54bdabbdf495cef7aa587b5cabdcb899ba24fmflodman#include "webrtc/modules/rtp_rtcp/source/rtp_utility.h"
28571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org#include "webrtc/modules/rtp_rtcp/source/ssrc_database.h"
292d566686a23fe93ada58f1c38a0d4b9a0d68556epbos#include "webrtc/transport.h"
30470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
31470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comnamespace webrtc {
3243da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org
330bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.orgclass BitrateAggregator;
34470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass CriticalSectionWrapper;
35470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass RTPSenderAudio;
36470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comclass RTPSenderVideo;
37470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
38c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.orgclass RTPSenderInterface {
39c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org public:
40c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org  RTPSenderInterface() {}
41c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org  virtual ~RTPSenderInterface() {}
42470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
4364c1e8cda5cb4db85c5c296bf2f6a8181af7de9dGuo-wei Shieh  enum CVOMode {
4464c1e8cda5cb4db85c5c296bf2f6a8181af7de9dGuo-wei Shieh    kCVONone,
4564c1e8cda5cb4db85c5c296bf2f6a8181af7de9dGuo-wei Shieh    kCVOInactive,  // CVO rtp header extension is registered but haven't
4664c1e8cda5cb4db85c5c296bf2f6a8181af7de9dGuo-wei Shieh                   // received any frame with rotation pending.
4764c1e8cda5cb4db85c5c296bf2f6a8181af7de9dGuo-wei Shieh    kCVOActivated,  // CVO rtp header extension will be present in the rtp
4864c1e8cda5cb4db85c5c296bf2f6a8181af7de9dGuo-wei Shieh                    // packets.
4964c1e8cda5cb4db85c5c296bf2f6a8181af7de9dGuo-wei Shieh  };
5064c1e8cda5cb4db85c5c296bf2f6a8181af7de9dGuo-wei Shieh
512f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  virtual uint32_t SSRC() const = 0;
522f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  virtual uint32_t Timestamp() const = 0;
53470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
542bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  virtual int32_t BuildRTPheader(uint8_t* data_buffer,
55d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                                 int8_t payload_type,
56d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                                 bool marker_bit,
57d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                                 uint32_t capture_timestamp,
582bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org                                 int64_t capture_time_ms,
59d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                                 bool timestamp_provided = true,
60d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                                 bool inc_sequence_number = true) = 0;
61470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
624591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  virtual size_t RTPHeaderLength() const = 0;
63fcf54bdabbdf495cef7aa587b5cabdcb899ba24fmflodman  // Returns the next sequence number to use for a packet and allocates
64fcf54bdabbdf495cef7aa587b5cabdcb899ba24fmflodman  // 'packets_to_send' number of sequence numbers. It's important all allocated
65fcf54bdabbdf495cef7aa587b5cabdcb899ba24fmflodman  // sequence numbers are used in sequence to avoid perceived packet loss.
66fcf54bdabbdf495cef7aa587b5cabdcb899ba24fmflodman  virtual uint16_t AllocateSequenceNumber(uint16_t packets_to_send) = 0;
672f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  virtual uint16_t SequenceNumber() const = 0;
684591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  virtual size_t MaxPayloadLength() const = 0;
694591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  virtual size_t MaxDataPayloadLength() const = 0;
702f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  virtual uint16_t PacketOverHead() const = 0;
712f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  virtual uint16_t ActualSendBitrateKbit() const = 0;
72c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org
73ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang  virtual int32_t SendToNetwork(uint8_t* data_buffer,
74ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang                                size_t payload_length,
75ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang                                size_t rtp_header_length,
76ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang                                int64_t capture_time_ms,
77ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang                                StorageType storage,
78ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang                                RtpPacketSender::Priority priority) = 0;
794536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org
804536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org  virtual bool UpdateVideoRotation(uint8_t* rtp_packet,
814536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org                                   size_t rtp_packet_length,
824536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org                                   const RTPHeader& rtp_header,
834536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org                                   VideoRotation rotation) const = 0;
844536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org  virtual bool IsRtpHeaderExtensionRegistered(RTPExtensionType type) = 0;
8564c1e8cda5cb4db85c5c296bf2f6a8181af7de9dGuo-wei Shieh  virtual CVOMode ActivateCVORtpHeaderExtension() = 0;
86470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com};
87470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
880bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.orgclass RTPSender : public RTPSenderInterface {
89c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org public:
90ac547a653862744d0aae560713f8418ad2852085Peter Boström  RTPSender(bool audio,
91d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org            Clock* clock,
92d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org            Transport* transport,
93d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org            RtpAudioFeedback* audio_feedback,
94ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang            RtpPacketSender* paced_sender,
95ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang            TransportSequenceNumberAllocator* sequence_number_allocator,
965e023eb337eed9746ecea7fc6fbb0fca386f1961sprang            TransportFeedbackObserver* transport_feedback_callback,
978f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org            BitrateStatisticsObserver* bitrate_callback,
98168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org            FrameCountObserver* frame_count_observer,
99168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org            SendSideDelayObserver* send_side_delay_observer);
100c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org  virtual ~RTPSender();
101470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
102c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org  void ProcessBitrate();
103470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
10414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  uint16_t ActualSendBitrateKbit() const override;
105470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1062f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  uint32_t VideoBitrateSent() const;
1072f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  uint32_t FecOverheadRate() const;
1082f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  uint32_t NackOverheadRate() const;
109d0bdab012827caf43131c3c6866a19a0937c0d5dstefan@webrtc.org
110a15fbfdcdee391bd87bb1c2721f0fbb824f5fbfbstefan@webrtc.org  void SetTargetBitrate(uint32_t bitrate);
111a15fbfdcdee391bd87bb1c2721f0fbb824f5fbfbstefan@webrtc.org  uint32_t GetTargetBitrate();
112470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1134591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  // Includes size of RTP and FEC headers.
11414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  size_t MaxDataPayloadLength() const override;
115470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1162f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  int32_t RegisterPayload(
11743da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org      const char payload_name[RTP_PAYLOAD_NAME_SIZE],
1182f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org      const int8_t payload_type, const uint32_t frequency,
1196955870806624479723addfae6dcf5d13968796cPeter Kasting      const size_t channels, const uint32_t rate);
120470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1212f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  int32_t DeRegisterSendPayload(const int8_t payload_type);
122470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
123c3c29113d1733a4f97ca4b8e212f22f718a876b7andresp@webrtc.org  void SetSendPayloadType(int8_t payload_type);
124c3c29113d1733a4f97ca4b8e212f22f718a876b7andresp@webrtc.org
1252f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  int8_t SendPayloadType() const;
126470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
127c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org  int SendPayloadFrequency() const;
128470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
12959f20bb735562d245357609799578edeed46be32pbos@webrtc.org  void SetSendingStatus(bool enabled);
130470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
131d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  void SetSendingMediaStatus(bool enabled);
132c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org  bool SendingMedia() const;
133470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1342f4b14e3f31b34a50310357c6c7be86c3bca1537pbos@webrtc.org  void GetDataCounters(StreamDataCounters* rtp_stats,
1352f4b14e3f31b34a50310357c6c7be86c3bca1537pbos@webrtc.org                       StreamDataCounters* rtx_stats) const;
136470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1372f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  uint32_t StartTimestamp() const;
1382f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  void SetStartTimestamp(uint32_t timestamp, bool force);
139470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1402f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  uint32_t GenerateNewSSRC();
141d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  void SetSSRC(uint32_t ssrc);
142470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
14314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  uint16_t SequenceNumber() const override;
1442f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  void SetSequenceNumber(uint16_t seq);
145470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
1469334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org  void SetCsrcs(const std::vector<uint32_t>& csrcs);
147470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
148d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  int32_t SetMaxPayloadLength(size_t length, uint16_t packet_over_head);
14943da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org
150d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  int32_t SendOutgoingData(FrameType frame_type,
151d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                           int8_t payload_type,
152d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                           uint32_t timestamp,
1532bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org                           int64_t capture_time_ms,
1542bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org                           const uint8_t* payload_data,
155d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                           size_t payload_size,
1562bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org                           const RTPFragmentationHeader* fragmentation,
1574536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org                           const RTPVideoHeader* rtp_hdr = NULL);
1588281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org
15943da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  // RTP header extension
160d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  int32_t SetTransmissionTimeOffset(int32_t transmission_time_offset);
161d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  int32_t SetAbsoluteSendTime(uint32_t absolute_send_time);
1624536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org  void SetVideoRotation(VideoRotation rotation);
16330933904797ab220a7a1532a535904f9d8ee3149sprang@webrtc.org  int32_t SetTransportSequenceNumber(uint16_t sequence_number);
164470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
165d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  int32_t RegisterRtpHeaderExtension(RTPExtensionType type, uint8_t id);
166162abd3562d7b08ab36569800d757b52739b9249danilchap  bool IsRtpHeaderExtensionRegistered(RTPExtensionType type) override;
167d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  int32_t DeregisterRtpHeaderExtension(RTPExtensionType type);
1685249cc8f77532f3af4f25ad4c5f68dfc4ae8955fasapersson@webrtc.org
1694591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t RtpHeaderExtensionTotalLength() const;
1705249cc8f77532f3af4f25ad4c5f68dfc4ae8955fasapersson@webrtc.org
1714536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org  uint16_t BuildRTPHeaderExtension(uint8_t* data_buffer, bool marker_bit) const;
1725249cc8f77532f3af4f25ad4c5f68dfc4ae8955fasapersson@webrtc.org
173ebdb0e3ad0a787bee066d12cdcd115a38b0a10d1wu@webrtc.org  uint8_t BuildTransmissionTimeOffsetExtension(uint8_t *data_buffer) const;
174ebdb0e3ad0a787bee066d12cdcd115a38b0a10d1wu@webrtc.org  uint8_t BuildAudioLevelExtension(uint8_t* data_buffer) const;
175ebdb0e3ad0a787bee066d12cdcd115a38b0a10d1wu@webrtc.org  uint8_t BuildAbsoluteSendTimeExtension(uint8_t* data_buffer) const;
1764536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org  uint8_t BuildVideoRotationExtension(uint8_t* data_buffer) const;
177867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  uint8_t BuildTransportSequenceNumberExtension(uint8_t* data_buffer,
178867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang                                                uint16_t sequence_number) const;
179867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang
180867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  // Verifies that the specified extension is registered, and that it is
181867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  // present in rtp packet. If extension is not registered kNotRegistered is
182867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  // returned. If extension cannot be found in the rtp header, or if it is
183867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  // malformed, kError is returned. Otherwise *extension_offset is set to the
184867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  // offset of the extension from the beginning of the rtp packet and kOk is
185867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  // returned.
186867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  enum class ExtensionStatus {
187867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang    kNotRegistered,
188867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang    kOk,
189867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang    kError,
190867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  };
191867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  ExtensionStatus VerifyExtension(RTPExtensionType extension_type,
192867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang                                  uint8_t* rtp_packet,
193867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang                                  size_t rtp_packet_length,
194867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang                                  const RTPHeader& rtp_header,
195867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang                                  size_t extension_length_bytes,
196867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang                                  size_t* extension_offset) const
197867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang      EXCLUSIVE_LOCKS_REQUIRED(send_critsect_.get());
1985249cc8f77532f3af4f25ad4c5f68dfc4ae8955fasapersson@webrtc.org
199d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  bool UpdateAudioLevel(uint8_t* rtp_packet,
200d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                        size_t rtp_packet_length,
201d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                        const RTPHeader& rtp_header,
202d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                        bool is_voiced,
203d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                        uint8_t dBov) const;
2040b3c35a258699c797661eb2385d3c1be9dc6ffe6asapersson@webrtc.org
205162abd3562d7b08ab36569800d757b52739b9249danilchap  bool UpdateVideoRotation(uint8_t* rtp_packet,
206162abd3562d7b08ab36569800d757b52739b9249danilchap                           size_t rtp_packet_length,
207162abd3562d7b08ab36569800d757b52739b9249danilchap                           const RTPHeader& rtp_header,
208162abd3562d7b08ab36569800d757b52739b9249danilchap                           VideoRotation rotation) const override;
2094536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org
2109b82f5a6ed2ceb04f72b66c1d3cca67a2bbcec3astefan@webrtc.org  bool TimeToSendPacket(uint16_t sequence_number, int64_t capture_time_ms,
2119b82f5a6ed2ceb04f72b66c1d3cca67a2bbcec3astefan@webrtc.org                        bool retransmission);
2124591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t TimeToSendPadding(size_t bytes);
2130b3c35a258699c797661eb2385d3c1be9dc6ffe6asapersson@webrtc.org
21443da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  // NACK.
215571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org  int SelectiveRetransmissions() const;
216571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org  int SetSelectiveRetransmissions(uint8_t settings);
217becf9c897c41eea3f021f99d87889c32c78b0de9stefan@webrtc.org  void OnReceivedNACK(const std::list<uint16_t>& nack_sequence_numbers,
21816825b1a828bb4ff40f7682040e43a239b7b8ca3pkasting@chromium.org                      int64_t avg_rtt);
2190b3c35a258699c797661eb2385d3c1be9dc6ffe6asapersson@webrtc.org
220d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  void SetStorePacketsStatus(bool enable, uint16_t number_to_store);
221470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
222571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org  bool StorePackets() const;
223470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
22416825b1a828bb4ff40f7682040e43a239b7b8ca3pkasting@chromium.org  int32_t ReSendPacket(uint16_t packet_id, int64_t min_resend_time = 0);
225470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
226d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  bool ProcessNACKBitRate(uint32_t now);
227470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
22843da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  // RTX.
2290b0c24177bac6eaa27cd520595ba799e48e84a0cpbos@webrtc.org  void SetRtxStatus(int mode);
2300b0c24177bac6eaa27cd520595ba799e48e84a0cpbos@webrtc.org  int RtxStatus() const;
2319f5ebb525130f207229dfa350ce8c2bdd22163c7mflodman@webrtc.org
2322bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  uint32_t RtxSsrc() const;
233ef92755780253c6a7940c89598a206e58e05b810stefan@webrtc.org  void SetRtxSsrc(uint32_t ssrc);
234ef92755780253c6a7940c89598a206e58e05b810stefan@webrtc.org
235e62202fedf57b74cc263246c0586ee353978caf8Shao Changbin  void SetRtxPayloadType(int payload_type, int associated_payload_type);
236e62202fedf57b74cc263246c0586ee353978caf8Shao Changbin  std::pair<int, int> RtxPayloadType() const;
2378281e7dd4a8ac4b00aededd8ebf52e93f1d980e8pwestin@webrtc.org
23843da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  // Functions wrapping RTPSenderInterface.
23914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  int32_t BuildRTPheader(uint8_t* data_buffer,
24014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                         int8_t payload_type,
24114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                         bool marker_bit,
24214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                         uint32_t capture_timestamp,
24314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                         int64_t capture_time_ms,
24414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                         const bool timestamp_provided = true,
24514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                         const bool inc_sequence_number = true) override;
24614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org
24714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  size_t RTPHeaderLength() const override;
248fcf54bdabbdf495cef7aa587b5cabdcb899ba24fmflodman  uint16_t AllocateSequenceNumber(uint16_t packets_to_send) override;
24914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  size_t MaxPayloadLength() const override;
25014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  uint16_t PacketOverHead() const override;
251c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org
25243da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  // Current timestamp.
25314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  uint32_t Timestamp() const override;
25414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  uint32_t SSRC() const override;
25514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org
25614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org  int32_t SendToNetwork(uint8_t* data_buffer,
25714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                        size_t payload_length,
25814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                        size_t rtp_header_length,
25914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                        int64_t capture_time_ms,
26014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                        StorageType storage,
261ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang                        RtpPacketSender::Priority priority) override;
26243da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org
26343da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  // Audio.
26443da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org
26543da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  // Send a DTMF tone using RFC 2833 (4733).
266d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  int32_t SendTelephoneEvent(uint8_t key, uint16_t time_ms, uint8_t level);
267c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org
268571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org  // Set audio packet size, used to determine when it's time to send a DTMF
26943da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  // packet in silence (CNG).
270d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  int32_t SetAudioPacketSize(uint16_t packet_size_samples);
271470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
27243da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  // Store the audio level in d_bov for
273571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org  // header-extension-for-audio-level-indication.
274d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  int32_t SetAudioLevel(uint8_t level_d_bov);
275470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
27643da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  // Set payload type for Redundant Audio Data RFC 2198.
277d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  int32_t SetRED(int8_t payload_type);
278470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
27943da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  // Get payload type for Redundant Audio Data RFC 2198.
2802f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  int32_t RED(int8_t *payload_type) const;
281470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
282571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org  RtpVideoCodecTypes VideoCodecType() const;
283470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
2842f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  uint32_t MaxConfiguredBitrateVideo() const;
285c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org
28643da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  // FEC.
287ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos  void SetGenericFECStatus(bool enable,
288ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos                           uint8_t payload_type_red,
289ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos                           uint8_t payload_type_fec);
290c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org
291ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos  void GenericFECStatus(bool* enable,
292ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos                        uint8_t* payload_type_red,
293ba8c15b857c0f341d9c1e02d41b6ccd56f9f1030pbos                        uint8_t* payload_type_fec) const;
294c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org
2952f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  int32_t SetFecParameters(const FecProtectionParams *delta_params,
2962f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org                           const FecProtectionParams *key_params);
297c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org
298586b19bdb615dde34cdcf107272d8857fe2f5631Stefan Holmer  size_t SendPadData(size_t bytes,
299586b19bdb615dde34cdcf107272d8857fe2f5631Stefan Holmer                     bool timestamp_provided,
300586b19bdb615dde34cdcf107272d8857fe2f5631Stefan Holmer                     uint32_t timestamp,
301586b19bdb615dde34cdcf107272d8857fe2f5631Stefan Holmer                     int64_t capture_time_ms);
302c4726d06fa0553b4d673ecbbd632effc37e0f2e3stefan@webrtc.org
303ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org  // Called on update of RTP statistics.
304ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org  void RegisterRtpStatisticsCallback(StreamDataCountersCallback* callback);
305ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org  StreamDataCountersCallback* GetRtpStatisticsCallback() const;
306ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org
3076811b6e308d16f160ba4c32650f195d5d3d9a2b1sprang@webrtc.org  uint32_t BitrateSent() const;
3086811b6e308d16f160ba4c32650f195d5d3d9a2b1sprang@webrtc.org
3092bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  void SetRtpState(const RtpState& rtp_state);
3102bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  RtpState GetRtpState() const;
3112bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  void SetRtxRtpState(const RtpState& rtp_state);
3122bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  RtpState GetRtxRtpState() const;
31364c1e8cda5cb4db85c5c296bf2f6a8181af7de9dGuo-wei Shieh  CVOMode ActivateCVORtpHeaderExtension() override;
3142bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org
315c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org protected:
316d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  int32_t CheckPayloadType(int8_t payload_type, RtpVideoCodecTypes* video_type);
317c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org
318c66e8b3f31db39d96bec6dc9ee9439455415a2bepwestin@webrtc.org private:
3190a3c1471b873ea7f81bff2faa7cf0d9e563c7d53stefan@webrtc.org  // Maps capture time in milliseconds to send-side delay in milliseconds.
3200a3c1471b873ea7f81bff2faa7cf0d9e563c7d53stefan@webrtc.org  // Send-side delay is the difference between transmission time and capture
3210a3c1471b873ea7f81bff2faa7cf0d9e563c7d53stefan@webrtc.org  // time.
3220a3c1471b873ea7f81bff2faa7cf0d9e563c7d53stefan@webrtc.org  typedef std::map<int64_t, int> SendDelayMap;
3230a3c1471b873ea7f81bff2faa7cf0d9e563c7d53stefan@webrtc.org
3249334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org  size_t CreateRtpHeader(uint8_t* header,
3259334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org                         int8_t payload_type,
3269334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org                         uint32_t ssrc,
3279334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org                         bool marker_bit,
3289334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org                         uint32_t timestamp,
3299334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org                         uint16_t sequence_number,
3309334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org                         const std::vector<uint32_t>& csrcs) const;
331a817962bab1602a0229cb1d450bae55f22d9bd74stefan@webrtc.org
33211d8176cb3383a2f96e118ff054e92e97a8d9db4stefan@webrtc.org  void UpdateNACKBitRate(uint32_t bytes, int64_t now);
333571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org
3347e9315b42ebe8f7df860030af93618de81326503stefan@webrtc.org  bool PrepareAndSendPacket(uint8_t* buffer,
3354591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org                            size_t length,
3367e9315b42ebe8f7df860030af93618de81326503stefan@webrtc.org                            int64_t capture_time_ms,
3377c6ff2da261699628e7253d9d10068bc531fe0f8stefan@webrtc.org                            bool send_over_rtx,
3387c6ff2da261699628e7253d9d10068bc531fe0f8stefan@webrtc.org                            bool is_retransmit);
3397e9315b42ebe8f7df860030af93618de81326503stefan@webrtc.org
3404591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  // Return the number of bytes sent.  Note that both of these functions may
3414591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  // return a larger value that their argument.
3424591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t TrySendRedundantPayloads(size_t bytes);
3437e9315b42ebe8f7df860030af93618de81326503stefan@webrtc.org
344586b19bdb615dde34cdcf107272d8857fe2f5631Stefan Holmer  void BuildPaddingPacket(uint8_t* packet,
345586b19bdb615dde34cdcf107272d8857fe2f5631Stefan Holmer                          size_t header_length,
346586b19bdb615dde34cdcf107272d8857fe2f5631Stefan Holmer                          size_t padding_length);
347571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org
3484591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  void BuildRtxPacket(uint8_t* buffer, size_t* length,
3492f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org                      uint8_t* buffer_rtx);
350bda7f305c5d7d675f1c35813bd2b2a5732775bb9mikhal@webrtc.org
3511d8a506405734d0cef9653704b036ca4f1388960stefan  bool SendPacketToNetwork(const uint8_t* packet,
3521d8a506405734d0cef9653704b036ca4f1388960stefan                           size_t size,
3531d8a506405734d0cef9653704b036ca4f1388960stefan                           const PacketOptions& options);
354b0061f94b23062aa10c45f967dff622287bd68dcpwestin@webrtc.org
3550a3c1471b873ea7f81bff2faa7cf0d9e563c7d53stefan@webrtc.org  void UpdateDelayStatistics(int64_t capture_time_ms, int64_t now_ms);
3560a3c1471b873ea7f81bff2faa7cf0d9e563c7d53stefan@webrtc.org
3574536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org  // Find the byte position of the RTP extension as indicated by |type| in
3584536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org  // |rtp_packet|. Return false if such extension doesn't exist.
3594536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org  bool FindHeaderExtensionPosition(RTPExtensionType type,
3604536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org                                   const uint8_t* rtp_packet,
3614536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org                                   size_t rtp_packet_length,
3624536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org                                   const RTPHeader& rtp_header,
3634536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org                                   size_t* position) const;
3644536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org
365d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  void UpdateTransmissionTimeOffset(uint8_t* rtp_packet,
366d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                                    size_t rtp_packet_length,
367d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                                    const RTPHeader& rtp_header,
368d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                                    int64_t time_diff_ms) const;
369d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org  void UpdateAbsoluteSendTime(uint8_t* rtp_packet,
370d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                              size_t rtp_packet_length,
371d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                              const RTPHeader& rtp_header,
372d16e839c6d29831e79312180085b6a19149df43fpbos@webrtc.org                              int64_t now_ms) const;
373867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  // Update the transport sequence number of the packet using a new sequence
374ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang  // number allocated by SequenceNumberAllocator. Returns the assigned sequence
375ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang  // number, or 0 if extension could not be updated.
376867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang  uint16_t UpdateTransportSequenceNumber(uint8_t* rtp_packet,
377867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang                                         size_t rtp_packet_length,
378867fb5224e1ba6a1c2cd523c005499a93ed61a08sprang                                         const RTPHeader& rtp_header) const;
379420b2567f38241099907d30d8bece1c4db50262dstefan@webrtc.org
380ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org  void UpdateRtpStats(const uint8_t* buffer,
38197d0489058ae7a983f7306f32cfd49a2356c6488asapersson@webrtc.org                      size_t packet_length,
382ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org                      const RTPHeader& header,
383ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org                      bool is_rtx,
384ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org                      bool is_retransmit);
385ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org  bool IsFecPacket(const uint8_t* buffer, const RTPHeader& header) const;
386ebad765ee00b90c48507bff1997ea8c1070a9316sprang@webrtc.org
3876811b6e308d16f160ba4c32650f195d5d3d9a2b1sprang@webrtc.org  Clock* clock_;
388dcebf2daa76aebd021dbb778f3908375b819e59asprang@webrtc.org  int64_t clock_delta_ms_;
38947a740bc5e36bcaf19385f9d4c0afb0cad070a05danilchap  Random random_ GUARDED_BY(send_critsect_);
3900bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org
39100b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<BitrateAggregator> bitrates_;
3920bae1fab4adb9bb8164e53142bf419049eafec38stefan@webrtc.org  Bitrate total_bitrate_sent_;
3936811b6e308d16f160ba4c32650f195d5d3d9a2b1sprang@webrtc.org
39443da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  const bool audio_configured_;
39500b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<RTPSenderAudio> audio_;
39600b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<RTPSenderVideo> video_;
397571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org
398ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang  RtpPacketSender* const paced_sender_;
399ebbf8a805b45613b4cb118e4eb0cebe7eeee69acsprang  TransportSequenceNumberAllocator* const transport_sequence_number_allocator_;
4005e023eb337eed9746ecea7fc6fbb0fca386f1961sprang  TransportFeedbackObserver* const transport_feedback_observer_;
401dcebf2daa76aebd021dbb778f3908375b819e59asprang@webrtc.org  int64_t last_capture_time_ms_sent_;
40200b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<CriticalSectionWrapper> send_critsect_;
403571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org
40443da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  Transport *transport_;
4055a320fb06fadb8378b76112556473af7b9e0c82asprang@webrtc.org  bool sending_media_ GUARDED_BY(send_critsect_);
406571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org
4074591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t max_payload_length_;
4082f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  uint16_t packet_over_head_;
409571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org
410efcad39f778276296ef45e2f14427154841e911fsprang@webrtc.org  int8_t payload_type_ GUARDED_BY(send_critsect_);
41162bafae6618fe3aefbd18657062abc98a40c3375pbos@webrtc.org  std::map<int8_t, RtpUtility::Payload*> payload_type_map_;
412571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org
41343da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  RtpHeaderExtensionMap rtp_header_extension_map_;
4142f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  int32_t transmission_time_offset_;
4157ebbea14a956c87f6f6aebb839486b9f12fcdf52solenberg@webrtc.org  uint32_t absolute_send_time_;
4164536289353cdcc315cc5e6218893e4843cf528e6guoweis@webrtc.org  VideoRotation rotation_;
41764c1e8cda5cb4db85c5c296bf2f6a8181af7de9dGuo-wei Shieh  CVOMode cvo_mode_;
41830933904797ab220a7a1532a535904f9d8ee3149sprang@webrtc.org  uint16_t transport_sequence_number_;
419571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org
420571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org  // NACK
4212f44673d665899ca788ae44247a9a7f4764f5e2bpbos@webrtc.org  uint32_t nack_byte_count_times_[NACK_BYTECOUNT_SIZE];
4224591fbd09f9cb6e83433c49a12dd8524c2806502pkasting@chromium.org  size_t nack_byte_count_[NACK_BYTECOUNT_SIZE];
42343da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org  Bitrate nack_bitrate_;
424571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org
4257e9315b42ebe8f7df860030af93618de81326503stefan@webrtc.org  RTPPacketHistory packet_history_;
426571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org
427571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org  // Statistics
42800b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<CriticalSectionWrapper> statistics_crit_;
4292bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  SendDelayMap send_delays_ GUARDED_BY(statistics_crit_);
430ce4e9a356200170abcdd44ff2af95f87a6781b8epbos@webrtc.org  FrameCounts frame_counts_ GUARDED_BY(statistics_crit_);
4312bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  StreamDataCounters rtp_stats_ GUARDED_BY(statistics_crit_);
4322bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  StreamDataCounters rtx_rtp_stats_ GUARDED_BY(statistics_crit_);
4332bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  StreamDataCountersCallback* rtp_stats_callback_ GUARDED_BY(statistics_crit_);
4348f1512140ed57ce57635a1cd561b631dfdc5e05fandresp@webrtc.org  FrameCountObserver* const frame_count_observer_;
435168f23faa5b8a49d4dd709c6649e77d5fecf36bfstefan@webrtc.org  SendSideDelayObserver* const send_side_delay_observer_;
436571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org
437571a1c035be6b0afd7f357001bef775c51ec9364pwestin@webrtc.org  // RTP variables
4382bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  bool start_timestamp_forced_ GUARDED_BY(send_critsect_);
4392bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  uint32_t start_timestamp_ GUARDED_BY(send_critsect_);
4402bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  SSRCDatabase& ssrc_db_ GUARDED_BY(send_critsect_);
4412bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  uint32_t remote_ssrc_ GUARDED_BY(send_critsect_);
4422bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  bool sequence_number_forced_ GUARDED_BY(send_critsect_);
4432bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  uint16_t sequence_number_ GUARDED_BY(send_critsect_);
4442bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  uint16_t sequence_number_rtx_ GUARDED_BY(send_critsect_);
4452bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  bool ssrc_forced_ GUARDED_BY(send_critsect_);
4462bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  uint32_t ssrc_ GUARDED_BY(send_critsect_);
4472bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  uint32_t timestamp_ GUARDED_BY(send_critsect_);
4482bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  int64_t capture_time_ms_ GUARDED_BY(send_critsect_);
4492bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  int64_t last_timestamp_time_ms_ GUARDED_BY(send_critsect_);
4508b94e3da0f35638529d6640e4dfcd7f04057d3f4stefan@webrtc.org  bool media_has_been_sent_ GUARDED_BY(send_critsect_);
4512bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  bool last_packet_marker_bit_ GUARDED_BY(send_critsect_);
4529334ac2d78f760b37f512ef6c12bff220d1654c1pbos@webrtc.org  std::vector<uint32_t> csrcs_ GUARDED_BY(send_critsect_);
4532bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  int rtx_ GUARDED_BY(send_critsect_);
4542bb1bdab8d11f5445693c028335fb3ace631f636pbos@webrtc.org  uint32_t ssrc_rtx_ GUARDED_BY(send_critsect_);
455e62202fedf57b74cc263246c0586ee353978caf8Shao Changbin  // TODO(changbin): Remove rtx_payload_type_ once interop with old clients that
456e62202fedf57b74cc263246c0586ee353978caf8Shao Changbin  // only understand one RTX PT is no longer needed.
457e62202fedf57b74cc263246c0586ee353978caf8Shao Changbin  int rtx_payload_type_ GUARDED_BY(send_critsect_);
458e62202fedf57b74cc263246c0586ee353978caf8Shao Changbin  // Mapping rtx_payload_type_map_[associated] = rtx.
459e62202fedf57b74cc263246c0586ee353978caf8Shao Changbin  std::map<int8_t, int8_t> rtx_payload_type_map_ GUARDED_BY(send_critsect_);
460d09d0748270f40c35330837069523245839b7258andresp@webrtc.org
461d09d0748270f40c35330837069523245839b7258andresp@webrtc.org  // Note: Don't access this variable directly, always go through
462d09d0748270f40c35330837069523245839b7258andresp@webrtc.org  // SetTargetBitrateKbps or GetTargetBitrateKbps. Also remember
463d09d0748270f40c35330837069523245839b7258andresp@webrtc.org  // that by the time the function returns there is no guarantee
464d09d0748270f40c35330837069523245839b7258andresp@webrtc.org  // that the target bitrate is still valid.
46500b8f6b3643332cce1ee711715f7fbb824d793cakwiberg@webrtc.org  rtc::scoped_ptr<CriticalSectionWrapper> target_bitrate_critsect_;
466aa0e56e8e8384dea0a2dea2945d019777371577fstefan@webrtc.org  uint32_t target_bitrate_ GUARDED_BY(target_bitrate_critsect_);
467470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com};
468470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
46943da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org}  // namespace webrtc
47043da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org
47143da54a458a7a992c702d85f0327e1d394ec5cf3phoglund@webrtc.org#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_
472