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