OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_ | 11 #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_ |
12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_ | 12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_ |
13 #include <assert.h> | 13 #include <assert.h> |
14 #include <math.h> | 14 #include <math.h> |
15 | 15 |
16 #include <map> | 16 #include <map> |
17 | 17 |
18 #include "webrtc/base/thread_annotations.h" | 18 #include "webrtc/base/thread_annotations.h" |
19 #include "webrtc/common_types.h" | 19 #include "webrtc/common_types.h" |
20 #include "webrtc/modules/pacing/include/paced_sender.h" | 20 #include "webrtc/modules/pacing/include/paced_sender.h" |
| 21 #include "webrtc/modules/pacing/include/packet_router.h" |
21 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" | 22 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" |
22 #include "webrtc/modules/rtp_rtcp/source/bitrate.h" | 23 #include "webrtc/modules/rtp_rtcp/source/bitrate.h" |
23 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" | 24 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" |
24 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_history.h" | 25 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_history.h" |
25 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h" | 26 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h" |
26 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 27 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
27 #include "webrtc/modules/rtp_rtcp/source/ssrc_database.h" | 28 #include "webrtc/modules/rtp_rtcp/source/ssrc_database.h" |
28 | 29 |
29 #define MAX_INIT_RTP_SEQ_NUMBER 32767 // 2^15 -1. | 30 #define MAX_INIT_RTP_SEQ_NUMBER 32767 // 2^15 -1. |
30 | 31 |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 }; | 85 }; |
85 | 86 |
86 class RTPSender : public RTPSenderInterface { | 87 class RTPSender : public RTPSenderInterface { |
87 public: | 88 public: |
88 RTPSender(int32_t id, | 89 RTPSender(int32_t id, |
89 bool audio, | 90 bool audio, |
90 Clock* clock, | 91 Clock* clock, |
91 Transport* transport, | 92 Transport* transport, |
92 RtpAudioFeedback* audio_feedback, | 93 RtpAudioFeedback* audio_feedback, |
93 PacedSender* paced_sender, | 94 PacedSender* paced_sender, |
| 95 PacketRouter* packet_router, |
94 BitrateStatisticsObserver* bitrate_callback, | 96 BitrateStatisticsObserver* bitrate_callback, |
95 FrameCountObserver* frame_count_observer, | 97 FrameCountObserver* frame_count_observer, |
96 SendSideDelayObserver* send_side_delay_observer); | 98 SendSideDelayObserver* send_side_delay_observer); |
97 virtual ~RTPSender(); | 99 virtual ~RTPSender(); |
98 | 100 |
99 void ProcessBitrate(); | 101 void ProcessBitrate(); |
100 | 102 |
101 uint16_t ActualSendBitrateKbit() const override; | 103 uint16_t ActualSendBitrateKbit() const override; |
102 | 104 |
103 uint32_t VideoBitrateSent() const; | 105 uint32_t VideoBitrateSent() const; |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 int32_t DeregisterRtpHeaderExtension(RTPExtensionType type); | 166 int32_t DeregisterRtpHeaderExtension(RTPExtensionType type); |
165 | 167 |
166 size_t RtpHeaderExtensionTotalLength() const; | 168 size_t RtpHeaderExtensionTotalLength() const; |
167 | 169 |
168 uint16_t BuildRTPHeaderExtension(uint8_t* data_buffer, bool marker_bit) const; | 170 uint16_t BuildRTPHeaderExtension(uint8_t* data_buffer, bool marker_bit) const; |
169 | 171 |
170 uint8_t BuildTransmissionTimeOffsetExtension(uint8_t *data_buffer) const; | 172 uint8_t BuildTransmissionTimeOffsetExtension(uint8_t *data_buffer) const; |
171 uint8_t BuildAudioLevelExtension(uint8_t* data_buffer) const; | 173 uint8_t BuildAudioLevelExtension(uint8_t* data_buffer) const; |
172 uint8_t BuildAbsoluteSendTimeExtension(uint8_t* data_buffer) const; | 174 uint8_t BuildAbsoluteSendTimeExtension(uint8_t* data_buffer) const; |
173 uint8_t BuildVideoRotationExtension(uint8_t* data_buffer) const; | 175 uint8_t BuildVideoRotationExtension(uint8_t* data_buffer) const; |
174 uint8_t BuildTransportSequenceNumberExtension(uint8_t* data_buffer) const; | 176 uint8_t BuildTransportSequenceNumberExtension(uint8_t* data_buffer, |
| 177 uint16_t sequence_number) const; |
| 178 |
| 179 // Verifies that the specified extension is registered, and that it is |
| 180 // present in rtp packet. If extension is not registered kNotRegistered is |
| 181 // returned. If extension cannot be found in the rtp header, or if it is |
| 182 // malformed, kError is returned. Otherwise *extension_offset is set to the |
| 183 // offset of the extension from the beginning of the rtp packet and kOk is |
| 184 // returned. |
| 185 enum class ExtensionStatus { |
| 186 kNotRegistered, |
| 187 kOk, |
| 188 kError, |
| 189 }; |
| 190 ExtensionStatus VerifyExtension(RTPExtensionType extension_type, |
| 191 uint8_t* rtp_packet, |
| 192 size_t rtp_packet_length, |
| 193 const RTPHeader& rtp_header, |
| 194 size_t extension_length_bytes, |
| 195 size_t* extension_offset) const |
| 196 EXCLUSIVE_LOCKS_REQUIRED(send_critsect_.get()); |
175 | 197 |
176 bool UpdateAudioLevel(uint8_t* rtp_packet, | 198 bool UpdateAudioLevel(uint8_t* rtp_packet, |
177 size_t rtp_packet_length, | 199 size_t rtp_packet_length, |
178 const RTPHeader& rtp_header, | 200 const RTPHeader& rtp_header, |
179 bool is_voiced, | 201 bool is_voiced, |
180 uint8_t dBov) const; | 202 uint8_t dBov) const; |
181 | 203 |
182 virtual bool UpdateVideoRotation(uint8_t* rtp_packet, | 204 virtual bool UpdateVideoRotation(uint8_t* rtp_packet, |
183 size_t rtp_packet_length, | 205 size_t rtp_packet_length, |
184 const RTPHeader& rtp_header, | 206 const RTPHeader& rtp_header, |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 size_t* position) const; | 360 size_t* position) const; |
339 | 361 |
340 void UpdateTransmissionTimeOffset(uint8_t* rtp_packet, | 362 void UpdateTransmissionTimeOffset(uint8_t* rtp_packet, |
341 size_t rtp_packet_length, | 363 size_t rtp_packet_length, |
342 const RTPHeader& rtp_header, | 364 const RTPHeader& rtp_header, |
343 int64_t time_diff_ms) const; | 365 int64_t time_diff_ms) const; |
344 void UpdateAbsoluteSendTime(uint8_t* rtp_packet, | 366 void UpdateAbsoluteSendTime(uint8_t* rtp_packet, |
345 size_t rtp_packet_length, | 367 size_t rtp_packet_length, |
346 const RTPHeader& rtp_header, | 368 const RTPHeader& rtp_header, |
347 int64_t now_ms) const; | 369 int64_t now_ms) const; |
| 370 // Update the transport sequence number of the packet using a new sequence |
| 371 // number allocated by PacketRouter. Returns the assigned sequence number, |
| 372 // or 0 if extension could not be updated. |
| 373 uint16_t UpdateTransportSequenceNumber(uint8_t* rtp_packet, |
| 374 size_t rtp_packet_length, |
| 375 const RTPHeader& rtp_header) const; |
348 | 376 |
349 void UpdateRtpStats(const uint8_t* buffer, | 377 void UpdateRtpStats(const uint8_t* buffer, |
350 size_t packet_length, | 378 size_t packet_length, |
351 const RTPHeader& header, | 379 const RTPHeader& header, |
352 bool is_rtx, | 380 bool is_rtx, |
353 bool is_retransmit); | 381 bool is_retransmit); |
354 bool IsFecPacket(const uint8_t* buffer, const RTPHeader& header) const; | 382 bool IsFecPacket(const uint8_t* buffer, const RTPHeader& header) const; |
355 | 383 |
356 Clock* clock_; | 384 Clock* clock_; |
357 int64_t clock_delta_ms_; | 385 int64_t clock_delta_ms_; |
358 | 386 |
359 rtc::scoped_ptr<BitrateAggregator> bitrates_; | 387 rtc::scoped_ptr<BitrateAggregator> bitrates_; |
360 Bitrate total_bitrate_sent_; | 388 Bitrate total_bitrate_sent_; |
361 | 389 |
362 int32_t id_; | 390 int32_t id_; |
363 | 391 |
364 const bool audio_configured_; | 392 const bool audio_configured_; |
365 rtc::scoped_ptr<RTPSenderAudio> audio_; | 393 rtc::scoped_ptr<RTPSenderAudio> audio_; |
366 rtc::scoped_ptr<RTPSenderVideo> video_; | 394 rtc::scoped_ptr<RTPSenderVideo> video_; |
367 | 395 |
368 PacedSender *paced_sender_; | 396 PacedSender* const paced_sender_; |
| 397 PacketRouter* const packet_router_; |
369 int64_t last_capture_time_ms_sent_; | 398 int64_t last_capture_time_ms_sent_; |
370 rtc::scoped_ptr<CriticalSectionWrapper> send_critsect_; | 399 rtc::scoped_ptr<CriticalSectionWrapper> send_critsect_; |
371 | 400 |
372 Transport *transport_; | 401 Transport *transport_; |
373 bool sending_media_ GUARDED_BY(send_critsect_); | 402 bool sending_media_ GUARDED_BY(send_critsect_); |
374 | 403 |
375 size_t max_payload_length_; | 404 size_t max_payload_length_; |
376 uint16_t packet_over_head_; | 405 uint16_t packet_over_head_; |
377 | 406 |
378 int8_t payload_type_ GUARDED_BY(send_critsect_); | 407 int8_t payload_type_ GUARDED_BY(send_critsect_); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 // SetTargetBitrateKbps or GetTargetBitrateKbps. Also remember | 459 // SetTargetBitrateKbps or GetTargetBitrateKbps. Also remember |
431 // that by the time the function returns there is no guarantee | 460 // that by the time the function returns there is no guarantee |
432 // that the target bitrate is still valid. | 461 // that the target bitrate is still valid. |
433 rtc::scoped_ptr<CriticalSectionWrapper> target_bitrate_critsect_; | 462 rtc::scoped_ptr<CriticalSectionWrapper> target_bitrate_critsect_; |
434 uint32_t target_bitrate_ GUARDED_BY(target_bitrate_critsect_); | 463 uint32_t target_bitrate_ GUARDED_BY(target_bitrate_critsect_); |
435 }; | 464 }; |
436 | 465 |
437 } // namespace webrtc | 466 } // namespace webrtc |
438 | 467 |
439 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_ | 468 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_H_ |
OLD | NEW |