niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 1 | /* |
stefan@webrtc.org | 9c84b0d | 2012-02-09 13:14:04 +0000 | [diff] [blame] | 2 | * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 3 | * |
| 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 |
| 6 | * tree. An additional intellectual property rights grant can be found |
| 7 | * in the file PATENTS. All contributing project authors may |
| 8 | * be found in the AUTHORS file in the root of the source tree. |
| 9 | */ |
| 10 | |
Mirko Bonadei | 92ea95e | 2017-09-15 06:47:31 +0200 | [diff] [blame] | 11 | #ifndef MODULES_RTP_RTCP_SOURCE_RTP_SENDER_VIDEO_H_ |
| 12 | #define MODULES_RTP_RTCP_SOURCE_RTP_SENDER_VIDEO_H_ |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 13 | |
sprang | a8ae6f2 | 2017-09-04 07:23:56 -0700 | [diff] [blame] | 14 | #include <map> |
danilchap | 7411061 | 2016-10-02 10:54:29 -0700 | [diff] [blame] | 15 | #include <memory> |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 16 | |
Mirko Bonadei | 92ea95e | 2017-09-15 06:47:31 +0200 | [diff] [blame] | 17 | #include "api/optional.h" |
Mirko Bonadei | 7120742 | 2017-09-15 13:58:09 +0200 | [diff] [blame] | 18 | #include "common_types.h" // NOLINT(build/include) |
Mirko Bonadei | 92ea95e | 2017-09-15 06:47:31 +0200 | [diff] [blame] | 19 | #include "modules/rtp_rtcp/include/flexfec_sender.h" |
| 20 | #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
| 21 | #include "modules/rtp_rtcp/source/rtp_rtcp_config.h" |
| 22 | #include "modules/rtp_rtcp/source/rtp_sender.h" |
| 23 | #include "modules/rtp_rtcp/source/rtp_utility.h" |
| 24 | #include "modules/rtp_rtcp/source/ulpfec_generator.h" |
| 25 | #include "modules/rtp_rtcp/source/video_codec_information.h" |
| 26 | #include "rtc_base/criticalsection.h" |
| 27 | #include "rtc_base/onetimeevent.h" |
| 28 | #include "rtc_base/rate_statistics.h" |
| 29 | #include "rtc_base/sequenced_task_checker.h" |
| 30 | #include "rtc_base/thread_annotations.h" |
Mirko Bonadei | 7120742 | 2017-09-15 13:58:09 +0200 | [diff] [blame] | 31 | #include "typedefs.h" // NOLINT(build/include) |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 32 | |
| 33 | namespace webrtc { |
sprang | a8ae6f2 | 2017-09-04 07:23:56 -0700 | [diff] [blame] | 34 | class RtpPacketizer; |
danilchap | 7411061 | 2016-10-02 10:54:29 -0700 | [diff] [blame] | 35 | class RtpPacketToSend; |
pwestin@webrtc.org | 95cf479 | 2012-01-20 06:59:06 +0000 | [diff] [blame] | 36 | |
pbos@webrtc.org | b5e6bfc | 2014-09-12 11:05:55 +0000 | [diff] [blame] | 37 | class RTPSenderVideo { |
| 38 | public: |
sprang | a8ae6f2 | 2017-09-04 07:23:56 -0700 | [diff] [blame] | 39 | static constexpr int64_t kTLRateWindowSizeMs = 2500; |
| 40 | |
brandtr | dbdb3f1 | 2016-11-10 05:04:48 -0800 | [diff] [blame] | 41 | RTPSenderVideo(Clock* clock, |
| 42 | RTPSender* rtpSender, |
| 43 | FlexfecSender* flexfec_sender); |
pbos@webrtc.org | b5e6bfc | 2014-09-12 11:05:55 +0000 | [diff] [blame] | 44 | virtual ~RTPSenderVideo(); |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 45 | |
pbos@webrtc.org | b5e6bfc | 2014-09-12 11:05:55 +0000 | [diff] [blame] | 46 | virtual RtpVideoCodecTypes VideoCodecType() const; |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 47 | |
mflodman | fcf54bd | 2015-04-14 21:28:08 +0200 | [diff] [blame] | 48 | static RtpUtility::Payload* CreateVideoPayload( |
Sergey Ulanov | ec4f068 | 2016-07-28 15:19:10 -0700 | [diff] [blame] | 49 | const char payload_name[RTP_PAYLOAD_NAME_SIZE], |
| 50 | int8_t payload_type); |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 51 | |
Sergey Ulanov | 525df3f | 2016-08-02 17:46:41 -0700 | [diff] [blame] | 52 | bool SendVideo(RtpVideoCodecTypes video_type, |
| 53 | FrameType frame_type, |
| 54 | int8_t payload_type, |
| 55 | uint32_t capture_timestamp, |
| 56 | int64_t capture_time_ms, |
| 57 | const uint8_t* payload_data, |
| 58 | size_t payload_size, |
| 59 | const RTPFragmentationHeader* fragmentation, |
sprang | a8ae6f2 | 2017-09-04 07:23:56 -0700 | [diff] [blame] | 60 | const RTPVideoHeader* video_header, |
| 61 | int64_t expected_retransmission_time_ms); |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 62 | |
pbos@webrtc.org | b5e6bfc | 2014-09-12 11:05:55 +0000 | [diff] [blame] | 63 | void SetVideoCodecType(RtpVideoCodecTypes type); |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 64 | |
brandtr | f1bb476 | 2016-11-07 03:05:06 -0800 | [diff] [blame] | 65 | // ULPFEC. |
| 66 | void SetUlpfecConfig(int red_payload_type, int ulpfec_payload_type); |
| 67 | void GetUlpfecConfig(int* red_payload_type, int* ulpfec_payload_type) const; |
pbos@webrtc.org | b5e6bfc | 2014-09-12 11:05:55 +0000 | [diff] [blame] | 68 | |
brandtr | 9dfff29 | 2016-11-14 05:14:50 -0800 | [diff] [blame] | 69 | // FlexFEC/ULPFEC. |
brandtr | 1743a19 | 2016-11-07 03:36:05 -0800 | [diff] [blame] | 70 | void SetFecParameters(const FecProtectionParams& delta_params, |
| 71 | const FecProtectionParams& key_params); |
pbos@webrtc.org | b5e6bfc | 2014-09-12 11:05:55 +0000 | [diff] [blame] | 72 | |
brandtr | 9dfff29 | 2016-11-14 05:14:50 -0800 | [diff] [blame] | 73 | // FlexFEC. |
| 74 | rtc::Optional<uint32_t> FlexfecSsrc() const; |
| 75 | |
pbos@webrtc.org | b5e6bfc | 2014-09-12 11:05:55 +0000 | [diff] [blame] | 76 | uint32_t VideoBitrateSent() const; |
| 77 | uint32_t FecOverheadRate() const; |
| 78 | |
| 79 | int SelectiveRetransmissions() const; |
mflodman | fcf54bd | 2015-04-14 21:28:08 +0200 | [diff] [blame] | 80 | void SetSelectiveRetransmissions(uint8_t settings); |
pbos@webrtc.org | b5e6bfc | 2014-09-12 11:05:55 +0000 | [diff] [blame] | 81 | |
sprang | a8ae6f2 | 2017-09-04 07:23:56 -0700 | [diff] [blame] | 82 | protected: |
| 83 | static uint8_t GetTemporalId(const RTPVideoHeader& header); |
| 84 | StorageType GetStorageType(uint8_t temporal_id, |
| 85 | int32_t retransmission_settings, |
| 86 | int64_t expected_retransmission_time_ms); |
| 87 | |
danilchap | 162abd3 | 2015-12-10 02:39:40 -0800 | [diff] [blame] | 88 | private: |
sprang | a8ae6f2 | 2017-09-04 07:23:56 -0700 | [diff] [blame] | 89 | struct TemporalLayerStats { |
| 90 | TemporalLayerStats() |
| 91 | : frame_rate_fp1000s(kTLRateWindowSizeMs, 1000 * 1000), |
| 92 | last_frame_time_ms(0) {} |
| 93 | // Frame rate, in frames per 1000 seconds. This essentially turns the fps |
| 94 | // value into a fixed point value with three decimals. Improves precision at |
| 95 | // low frame rates. |
| 96 | RateStatistics frame_rate_fp1000s; |
| 97 | int64_t last_frame_time_ms; |
| 98 | }; |
| 99 | |
danilchap | 56359be | 2017-09-07 07:53:45 -0700 | [diff] [blame] | 100 | size_t CalculateFecPacketOverhead() const RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_); |
danilchap | 2a615fc | 2016-11-11 02:27:35 -0800 | [diff] [blame] | 101 | |
danilchap | 7411061 | 2016-10-02 10:54:29 -0700 | [diff] [blame] | 102 | void SendVideoPacket(std::unique_ptr<RtpPacketToSend> packet, |
mflodman | fcf54bd | 2015-04-14 21:28:08 +0200 | [diff] [blame] | 103 | StorageType storage); |
pbos@webrtc.org | b5e6bfc | 2014-09-12 11:05:55 +0000 | [diff] [blame] | 104 | |
brandtr | 131bc49 | 2016-11-10 05:01:11 -0800 | [diff] [blame] | 105 | void SendVideoPacketAsRedMaybeWithUlpfec( |
| 106 | std::unique_ptr<RtpPacketToSend> media_packet, |
| 107 | StorageType media_packet_storage, |
| 108 | bool protect_media_packet); |
| 109 | |
| 110 | // TODO(brandtr): Remove the FlexFEC functions when FlexfecSender has been |
| 111 | // moved to PacedSender. |
| 112 | void SendVideoPacketWithFlexfec(std::unique_ptr<RtpPacketToSend> media_packet, |
| 113 | StorageType media_packet_storage, |
| 114 | bool protect_media_packet); |
pbos@webrtc.org | b5e6bfc | 2014-09-12 11:05:55 +0000 | [diff] [blame] | 115 | |
danilchap | 56359be | 2017-09-07 07:53:45 -0700 | [diff] [blame] | 116 | bool red_enabled() const RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_) { |
brandtr | f1bb476 | 2016-11-07 03:05:06 -0800 | [diff] [blame] | 117 | return red_payload_type_ >= 0; |
| 118 | } |
| 119 | |
danilchap | 56359be | 2017-09-07 07:53:45 -0700 | [diff] [blame] | 120 | bool ulpfec_enabled() const RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_) { |
brandtr | f1bb476 | 2016-11-07 03:05:06 -0800 | [diff] [blame] | 121 | return ulpfec_payload_type_ >= 0; |
| 122 | } |
| 123 | |
brandtr | 131bc49 | 2016-11-10 05:01:11 -0800 | [diff] [blame] | 124 | bool flexfec_enabled() const { return flexfec_sender_ != nullptr; } |
| 125 | |
sprang | a8ae6f2 | 2017-09-04 07:23:56 -0700 | [diff] [blame] | 126 | bool UpdateConditionalRetransmit(uint8_t temporal_id, |
| 127 | int64_t expected_retransmission_time_ms) |
danilchap | 56359be | 2017-09-07 07:53:45 -0700 | [diff] [blame] | 128 | RTC_EXCLUSIVE_LOCKS_REQUIRED(stats_crit_); |
sprang | a8ae6f2 | 2017-09-04 07:23:56 -0700 | [diff] [blame] | 129 | |
danilchap | 5fb291a | 2016-08-09 07:43:25 -0700 | [diff] [blame] | 130 | RTPSender* const rtp_sender_; |
sprang | cd349d9 | 2016-07-13 09:11:28 -0700 | [diff] [blame] | 131 | Clock* const clock_; |
pbos@webrtc.org | b5e6bfc | 2014-09-12 11:05:55 +0000 | [diff] [blame] | 132 | |
mflodman | fcf54bd | 2015-04-14 21:28:08 +0200 | [diff] [blame] | 133 | // Should never be held when calling out of this class. |
sprang | cd349d9 | 2016-07-13 09:11:28 -0700 | [diff] [blame] | 134 | rtc::CriticalSection crit_; |
mflodman | fcf54bd | 2015-04-14 21:28:08 +0200 | [diff] [blame] | 135 | |
brandtr | d804895 | 2016-11-07 02:08:51 -0800 | [diff] [blame] | 136 | RtpVideoCodecTypes video_type_; |
danilchap | 56359be | 2017-09-07 07:53:45 -0700 | [diff] [blame] | 137 | int32_t retransmission_settings_ RTC_GUARDED_BY(crit_); |
| 138 | VideoRotation last_rotation_ RTC_GUARDED_BY(crit_); |
pbos@webrtc.org | b5e6bfc | 2014-09-12 11:05:55 +0000 | [diff] [blame] | 139 | |
brandtr | f1bb476 | 2016-11-07 03:05:06 -0800 | [diff] [blame] | 140 | // RED/ULPFEC. |
danilchap | 56359be | 2017-09-07 07:53:45 -0700 | [diff] [blame] | 141 | int red_payload_type_ RTC_GUARDED_BY(crit_); |
| 142 | int ulpfec_payload_type_ RTC_GUARDED_BY(crit_); |
| 143 | UlpfecGenerator ulpfec_generator_ RTC_GUARDED_BY(crit_); |
brandtr | 131bc49 | 2016-11-10 05:01:11 -0800 | [diff] [blame] | 144 | |
| 145 | // FlexFEC. |
| 146 | FlexfecSender* const flexfec_sender_; |
| 147 | |
| 148 | // FEC parameters, applicable to either ULPFEC or FlexFEC. |
danilchap | 56359be | 2017-09-07 07:53:45 -0700 | [diff] [blame] | 149 | FecProtectionParams delta_fec_params_ RTC_GUARDED_BY(crit_); |
| 150 | FecProtectionParams key_fec_params_ RTC_GUARDED_BY(crit_); |
pbos@webrtc.org | b5e6bfc | 2014-09-12 11:05:55 +0000 | [diff] [blame] | 151 | |
sprang | cd349d9 | 2016-07-13 09:11:28 -0700 | [diff] [blame] | 152 | rtc::CriticalSection stats_crit_; |
pbos@webrtc.org | b5e6bfc | 2014-09-12 11:05:55 +0000 | [diff] [blame] | 153 | // Bitrate used for FEC payload, RED headers, RTP headers for FEC packets |
| 154 | // and any padding overhead. |
danilchap | 56359be | 2017-09-07 07:53:45 -0700 | [diff] [blame] | 155 | RateStatistics fec_bitrate_ RTC_GUARDED_BY(stats_crit_); |
sprang | cd349d9 | 2016-07-13 09:11:28 -0700 | [diff] [blame] | 156 | // Bitrate used for video payload and RTP headers. |
danilchap | 56359be | 2017-09-07 07:53:45 -0700 | [diff] [blame] | 157 | RateStatistics video_bitrate_ RTC_GUARDED_BY(stats_crit_); |
sprang | a8ae6f2 | 2017-09-04 07:23:56 -0700 | [diff] [blame] | 158 | |
| 159 | std::map<int, TemporalLayerStats> frame_stats_by_temporal_layer_ |
danilchap | 56359be | 2017-09-07 07:53:45 -0700 | [diff] [blame] | 160 | RTC_GUARDED_BY(stats_crit_); |
sprang | a8ae6f2 | 2017-09-04 07:23:56 -0700 | [diff] [blame] | 161 | |
skvlad | 98bb664 | 2016-04-07 15:36:45 -0700 | [diff] [blame] | 162 | OneTimeEvent first_frame_sent_; |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 163 | }; |
Sergey Ulanov | ec4f068 | 2016-07-28 15:19:10 -0700 | [diff] [blame] | 164 | |
pbos@webrtc.org | d900e8b | 2013-07-03 15:12:26 +0000 | [diff] [blame] | 165 | } // namespace webrtc |
niklase@google.com | 470e71d | 2011-07-07 08:21:25 +0000 | [diff] [blame] | 166 | |
Mirko Bonadei | 92ea95e | 2017-09-15 06:47:31 +0200 | [diff] [blame] | 167 | #endif // MODULES_RTP_RTCP_SOURCE_RTP_SENDER_VIDEO_H_ |