| 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 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 24 #include "webrtc/modules/rtp_rtcp/source/producer_fec.h" | 24 #include "webrtc/modules/rtp_rtcp/source/producer_fec.h" |
| 25 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h" | 25 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h" |
| 26 #include "webrtc/modules/rtp_rtcp/source/rtp_format_vp8.h" | 26 #include "webrtc/modules/rtp_rtcp/source/rtp_format_vp8.h" |
| 27 #include "webrtc/modules/rtp_rtcp/source/rtp_format_vp9.h" | 27 #include "webrtc/modules/rtp_rtcp/source/rtp_format_vp9.h" |
| 28 | 28 |
| 29 namespace webrtc { | 29 namespace webrtc { |
| 30 enum { REDForFECHeaderLength = 1 }; | 30 enum { REDForFECHeaderLength = 1 }; |
| 31 | 31 |
| 32 RTPSenderVideo::RTPSenderVideo(Clock* clock, RTPSenderInterface* rtpSender) | 32 RTPSenderVideo::RTPSenderVideo(Clock* clock, RTPSenderInterface* rtpSender) |
| 33 : _rtpSender(*rtpSender), | 33 : _rtpSender(*rtpSender), |
| 34 clock_(clock), |
| 34 _videoType(kRtpVideoGeneric), | 35 _videoType(kRtpVideoGeneric), |
| 35 _retransmissionSettings(kRetransmitBaseLayer), | 36 _retransmissionSettings(kRetransmitBaseLayer), |
| 36 // Generic FEC | 37 // Generic FEC |
| 37 fec_(), | 38 fec_(), |
| 38 fec_enabled_(false), | 39 fec_enabled_(false), |
| 39 red_payload_type_(0), | 40 red_payload_type_(0), |
| 40 fec_payload_type_(0), | 41 fec_payload_type_(0), |
| 41 delta_fec_params_(), | 42 delta_fec_params_(), |
| 42 key_fec_params_(), | 43 key_fec_params_(), |
| 43 producer_fec_(&fec_), | 44 producer_fec_(&fec_), |
| 44 _fecOverheadRate(clock, NULL), | 45 fec_bitrate_(1000, RateStatistics::kBpsScale), |
| 45 _videoBitrate(clock, NULL) { | 46 video_bitrate_(1000, RateStatistics::kBpsScale) { |
| 46 memset(&delta_fec_params_, 0, sizeof(delta_fec_params_)); | 47 memset(&delta_fec_params_, 0, sizeof(delta_fec_params_)); |
| 47 memset(&key_fec_params_, 0, sizeof(key_fec_params_)); | 48 memset(&key_fec_params_, 0, sizeof(key_fec_params_)); |
| 48 delta_fec_params_.max_fec_frames = key_fec_params_.max_fec_frames = 1; | 49 delta_fec_params_.max_fec_frames = key_fec_params_.max_fec_frames = 1; |
| 49 delta_fec_params_.fec_mask_type = key_fec_params_.fec_mask_type = | 50 delta_fec_params_.fec_mask_type = key_fec_params_.fec_mask_type = |
| 50 kFecMaskRandom; | 51 kFecMaskRandom; |
| 51 } | 52 } |
| 52 | 53 |
| 53 RTPSenderVideo::~RTPSenderVideo() { | 54 RTPSenderVideo::~RTPSenderVideo() { |
| 54 } | 55 } |
| 55 | 56 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 void RTPSenderVideo::SendVideoPacket(uint8_t* data_buffer, | 89 void RTPSenderVideo::SendVideoPacket(uint8_t* data_buffer, |
| 89 const size_t payload_length, | 90 const size_t payload_length, |
| 90 const size_t rtp_header_length, | 91 const size_t rtp_header_length, |
| 91 uint16_t seq_num, | 92 uint16_t seq_num, |
| 92 const uint32_t capture_timestamp, | 93 const uint32_t capture_timestamp, |
| 93 int64_t capture_time_ms, | 94 int64_t capture_time_ms, |
| 94 StorageType storage) { | 95 StorageType storage) { |
| 95 if (_rtpSender.SendToNetwork(data_buffer, payload_length, rtp_header_length, | 96 if (_rtpSender.SendToNetwork(data_buffer, payload_length, rtp_header_length, |
| 96 capture_time_ms, storage, | 97 capture_time_ms, storage, |
| 97 RtpPacketSender::kLowPriority) == 0) { | 98 RtpPacketSender::kLowPriority) == 0) { |
| 98 _videoBitrate.Update(payload_length + rtp_header_length); | 99 rtc::CritScope cs(&stats_crit_); |
| 100 video_bitrate_.Update(payload_length + rtp_header_length, |
| 101 clock_->TimeInMilliseconds()); |
| 99 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 102 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
| 100 "Video::PacketNormal", "timestamp", capture_timestamp, | 103 "Video::PacketNormal", "timestamp", capture_timestamp, |
| 101 "seqnum", seq_num); | 104 "seqnum", seq_num); |
| 102 } else { | 105 } else { |
| 103 LOG(LS_WARNING) << "Failed to send video packet " << seq_num; | 106 LOG(LS_WARNING) << "Failed to send video packet " << seq_num; |
| 104 } | 107 } |
| 105 } | 108 } |
| 106 | 109 |
| 107 void RTPSenderVideo::SendVideoPacketAsRed(uint8_t* data_buffer, | 110 void RTPSenderVideo::SendVideoPacketAsRed(uint8_t* data_buffer, |
| 108 const size_t payload_length, | 111 const size_t payload_length, |
| (...skipping 25 matching lines...) Expand all Loading... |
| 134 rtp_header_length); | 137 rtp_header_length); |
| 135 RTC_DCHECK_EQ(num_fec_packets, fec_packets.size()); | 138 RTC_DCHECK_EQ(num_fec_packets, fec_packets.size()); |
| 136 if (_retransmissionSettings & kRetransmitFECPackets) | 139 if (_retransmissionSettings & kRetransmitFECPackets) |
| 137 fec_storage = kAllowRetransmission; | 140 fec_storage = kAllowRetransmission; |
| 138 } | 141 } |
| 139 } | 142 } |
| 140 if (_rtpSender.SendToNetwork( | 143 if (_rtpSender.SendToNetwork( |
| 141 red_packet->data(), red_packet->length() - rtp_header_length, | 144 red_packet->data(), red_packet->length() - rtp_header_length, |
| 142 rtp_header_length, capture_time_ms, media_packet_storage, | 145 rtp_header_length, capture_time_ms, media_packet_storage, |
| 143 RtpPacketSender::kLowPriority) == 0) { | 146 RtpPacketSender::kLowPriority) == 0) { |
| 144 _videoBitrate.Update(red_packet->length()); | 147 rtc::CritScope cs(&stats_crit_); |
| 148 video_bitrate_.Update(red_packet->length(), clock_->TimeInMilliseconds()); |
| 145 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 149 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
| 146 "Video::PacketRed", "timestamp", capture_timestamp, | 150 "Video::PacketRed", "timestamp", capture_timestamp, |
| 147 "seqnum", media_seq_num); | 151 "seqnum", media_seq_num); |
| 148 } else { | 152 } else { |
| 149 LOG(LS_WARNING) << "Failed to send RED packet " << media_seq_num; | 153 LOG(LS_WARNING) << "Failed to send RED packet " << media_seq_num; |
| 150 } | 154 } |
| 151 for (RedPacket* fec_packet : fec_packets) { | 155 for (RedPacket* fec_packet : fec_packets) { |
| 152 if (_rtpSender.SendToNetwork( | 156 if (_rtpSender.SendToNetwork( |
| 153 fec_packet->data(), fec_packet->length() - rtp_header_length, | 157 fec_packet->data(), fec_packet->length() - rtp_header_length, |
| 154 rtp_header_length, capture_time_ms, fec_storage, | 158 rtp_header_length, capture_time_ms, fec_storage, |
| 155 RtpPacketSender::kLowPriority) == 0) { | 159 RtpPacketSender::kLowPriority) == 0) { |
| 156 _fecOverheadRate.Update(fec_packet->length()); | 160 rtc::CritScope cs(&stats_crit_); |
| 161 fec_bitrate_.Update(fec_packet->length(), clock_->TimeInMilliseconds()); |
| 157 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 162 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
| 158 "Video::PacketFec", "timestamp", capture_timestamp, | 163 "Video::PacketFec", "timestamp", capture_timestamp, |
| 159 "seqnum", next_fec_sequence_number); | 164 "seqnum", next_fec_sequence_number); |
| 160 } else { | 165 } else { |
| 161 LOG(LS_WARNING) << "Failed to send FEC packet " | 166 LOG(LS_WARNING) << "Failed to send FEC packet " |
| 162 << next_fec_sequence_number; | 167 << next_fec_sequence_number; |
| 163 } | 168 } |
| 164 delete fec_packet; | 169 delete fec_packet; |
| 165 ++next_fec_sequence_number; | 170 ++next_fec_sequence_number; |
| 166 } | 171 } |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 } | 335 } |
| 331 } | 336 } |
| 332 first = false; | 337 first = false; |
| 333 } | 338 } |
| 334 | 339 |
| 335 TRACE_EVENT_ASYNC_END1( | 340 TRACE_EVENT_ASYNC_END1( |
| 336 "webrtc", "Video", capture_time_ms, "timestamp", _rtpSender.Timestamp()); | 341 "webrtc", "Video", capture_time_ms, "timestamp", _rtpSender.Timestamp()); |
| 337 return 0; | 342 return 0; |
| 338 } | 343 } |
| 339 | 344 |
| 340 void RTPSenderVideo::ProcessBitrate() { | |
| 341 _videoBitrate.Process(); | |
| 342 _fecOverheadRate.Process(); | |
| 343 } | |
| 344 | |
| 345 uint32_t RTPSenderVideo::VideoBitrateSent() const { | 345 uint32_t RTPSenderVideo::VideoBitrateSent() const { |
| 346 return _videoBitrate.BitrateLast(); | 346 rtc::CritScope cs(&stats_crit_); |
| 347 return video_bitrate_.Rate(clock_->TimeInMilliseconds()).value_or(0); |
| 347 } | 348 } |
| 348 | 349 |
| 349 uint32_t RTPSenderVideo::FecOverheadRate() const { | 350 uint32_t RTPSenderVideo::FecOverheadRate() const { |
| 350 return _fecOverheadRate.BitrateLast(); | 351 rtc::CritScope cs(&stats_crit_); |
| 352 return fec_bitrate_.Rate(clock_->TimeInMilliseconds()).value_or(0); |
| 351 } | 353 } |
| 352 | 354 |
| 353 int RTPSenderVideo::SelectiveRetransmissions() const { | 355 int RTPSenderVideo::SelectiveRetransmissions() const { |
| 354 rtc::CritScope cs(&crit_); | 356 rtc::CritScope cs(&crit_); |
| 355 return _retransmissionSettings; | 357 return _retransmissionSettings; |
| 356 } | 358 } |
| 357 | 359 |
| 358 void RTPSenderVideo::SetSelectiveRetransmissions(uint8_t settings) { | 360 void RTPSenderVideo::SetSelectiveRetransmissions(uint8_t settings) { |
| 359 rtc::CritScope cs(&crit_); | 361 rtc::CritScope cs(&crit_); |
| 360 _retransmissionSettings = settings; | 362 _retransmissionSettings = settings; |
| 361 } | 363 } |
| 362 | 364 |
| 363 } // namespace webrtc | 365 } // namespace webrtc |
| OLD | NEW |