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 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" | 11 #include "webrtc/modules/rtp_rtcp/source/rtp_sender_video.h" |
12 | 12 |
13 #include <stdlib.h> | 13 #include <stdlib.h> |
14 #include <string.h> | 14 #include <string.h> |
15 | 15 |
16 #include <memory> | 16 #include <memory> |
17 #include <vector> | 17 #include <vector> |
18 #include <utility> | 18 #include <utility> |
19 | 19 |
20 #include "webrtc/base/checks.h" | 20 #include "webrtc/base/checks.h" |
21 #include "webrtc/base/logging.h" | 21 #include "webrtc/base/logging.h" |
22 #include "webrtc/base/trace_event.h" | 22 #include "webrtc/base/trace_event.h" |
23 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" | 23 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
24 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 24 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
25 #include "webrtc/modules/rtp_rtcp/source/producer_fec.h" | |
26 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h" | 25 #include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h" |
27 #include "webrtc/modules/rtp_rtcp/source/rtp_format_vp8.h" | 26 #include "webrtc/modules/rtp_rtcp/source/rtp_format_vp8.h" |
28 #include "webrtc/modules/rtp_rtcp/source/rtp_format_vp9.h" | 27 #include "webrtc/modules/rtp_rtcp/source/rtp_format_vp9.h" |
29 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" | 28 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extensions.h" |
30 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h" | 29 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h" |
31 | 30 |
32 namespace webrtc { | 31 namespace webrtc { |
33 | 32 |
34 namespace { | 33 namespace { |
35 constexpr size_t kRedForFecHeaderLength = 1; | 34 constexpr size_t kRedForFecHeaderLength = 1; |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 new RtpPacketToSend(*media_packet)); | 115 new RtpPacketToSend(*media_packet)); |
117 BuildRedPayload(*media_packet, red_packet.get()); | 116 BuildRedPayload(*media_packet, red_packet.get()); |
118 | 117 |
119 std::vector<std::unique_ptr<RedPacket>> fec_packets; | 118 std::vector<std::unique_ptr<RedPacket>> fec_packets; |
120 StorageType fec_storage = kDontRetransmit; | 119 StorageType fec_storage = kDontRetransmit; |
121 { | 120 { |
122 // Only protect while creating RED and FEC packets, not when sending. | 121 // Only protect while creating RED and FEC packets, not when sending. |
123 rtc::CritScope cs(&crit_); | 122 rtc::CritScope cs(&crit_); |
124 red_packet->SetPayloadType(red_payload_type_); | 123 red_packet->SetPayloadType(red_payload_type_); |
125 if (protect) { | 124 if (protect) { |
126 producer_fec_.AddRtpPacketAndGenerateFec(media_packet->data(), | 125 ulpfec_generator_.AddRtpPacketAndGenerateFec( |
127 media_packet->payload_size(), | 126 media_packet->data(), media_packet->payload_size(), |
128 media_packet->headers_size()); | 127 media_packet->headers_size()); |
129 } | 128 } |
130 uint16_t num_fec_packets = producer_fec_.NumAvailableFecPackets(); | 129 uint16_t num_fec_packets = ulpfec_generator_.NumAvailableFecPackets(); |
131 if (num_fec_packets > 0) { | 130 if (num_fec_packets > 0) { |
132 uint16_t first_fec_sequence_number = | 131 uint16_t first_fec_sequence_number = |
133 rtp_sender_->AllocateSequenceNumber(num_fec_packets); | 132 rtp_sender_->AllocateSequenceNumber(num_fec_packets); |
134 fec_packets = producer_fec_.GetUlpfecPacketsAsRed( | 133 fec_packets = ulpfec_generator_.GetUlpfecPacketsAsRed( |
135 red_payload_type_, fec_payload_type_, first_fec_sequence_number, | 134 red_payload_type_, fec_payload_type_, first_fec_sequence_number, |
136 media_packet->headers_size()); | 135 media_packet->headers_size()); |
137 RTC_DCHECK_EQ(num_fec_packets, fec_packets.size()); | 136 RTC_DCHECK_EQ(num_fec_packets, fec_packets.size()); |
138 if (retransmission_settings_ & kRetransmitFECPackets) | 137 if (retransmission_settings_ & kRetransmitFECPackets) |
139 fec_storage = kAllowRetransmission; | 138 fec_storage = kAllowRetransmission; |
140 } | 139 } |
141 } | 140 } |
142 // Send |red_packet| instead of |packet| for allocated sequence number. | 141 // Send |red_packet| instead of |packet| for allocated sequence number. |
143 size_t red_packet_size = red_packet->size(); | 142 size_t red_packet_size = red_packet->size(); |
144 if (rtp_sender_->SendToNetwork(std::move(red_packet), media_packet_storage, | 143 if (rtp_sender_->SendToNetwork(std::move(red_packet), media_packet_storage, |
145 RtpPacketSender::kLowPriority)) { | 144 RtpPacketSender::kLowPriority)) { |
146 rtc::CritScope cs(&stats_crit_); | 145 rtc::CritScope cs(&stats_crit_); |
147 video_bitrate_.Update(red_packet_size, clock_->TimeInMilliseconds()); | 146 video_bitrate_.Update(red_packet_size, clock_->TimeInMilliseconds()); |
148 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 147 TRACE_EVENT_INSTANT2(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), |
149 "Video::PacketRed", "timestamp", rtp_timestamp, | 148 "Video::PacketRed", "timestamp", rtp_timestamp, |
150 "seqnum", media_seq_num); | 149 "seqnum", media_seq_num); |
151 } else { | 150 } else { |
152 LOG(LS_WARNING) << "Failed to send RED packet " << media_seq_num; | 151 LOG(LS_WARNING) << "Failed to send RED packet " << media_seq_num; |
153 } | 152 } |
154 for (const auto& fec_packet : fec_packets) { | 153 for (const auto& fec_packet : fec_packets) { |
155 // TODO(danilchap): Make producer_fec_ generate RtpPacketToSend to avoid | 154 // TODO(danilchap): Make ulpfec_generator_ generate RtpPacketToSend to avoid |
156 // reparsing them. | 155 // reparsing them. |
157 std::unique_ptr<RtpPacketToSend> rtp_packet( | 156 std::unique_ptr<RtpPacketToSend> rtp_packet( |
158 new RtpPacketToSend(*media_packet)); | 157 new RtpPacketToSend(*media_packet)); |
159 RTC_CHECK(rtp_packet->Parse(fec_packet->data(), fec_packet->length())); | 158 RTC_CHECK(rtp_packet->Parse(fec_packet->data(), fec_packet->length())); |
160 rtp_packet->set_capture_time_ms(media_packet->capture_time_ms()); | 159 rtp_packet->set_capture_time_ms(media_packet->capture_time_ms()); |
161 uint16_t fec_sequence_number = rtp_packet->SequenceNumber(); | 160 uint16_t fec_sequence_number = rtp_packet->SequenceNumber(); |
162 if (rtp_sender_->SendToNetwork(std::move(rtp_packet), fec_storage, | 161 if (rtp_sender_->SendToNetwork(std::move(rtp_packet), fec_storage, |
163 RtpPacketSender::kLowPriority)) { | 162 RtpPacketSender::kLowPriority)) { |
164 rtc::CritScope cs(&stats_crit_); | 163 rtc::CritScope cs(&stats_crit_); |
165 fec_bitrate_.Update(fec_packet->length(), clock_->TimeInMilliseconds()); | 164 fec_bitrate_.Update(fec_packet->length(), clock_->TimeInMilliseconds()); |
(...skipping 29 matching lines...) Expand all Loading... |
195 | 194 |
196 size_t RTPSenderVideo::FecPacketOverhead() const { | 195 size_t RTPSenderVideo::FecPacketOverhead() const { |
197 rtc::CritScope cs(&crit_); | 196 rtc::CritScope cs(&crit_); |
198 size_t overhead = 0; | 197 size_t overhead = 0; |
199 if (red_payload_type_ != 0) { | 198 if (red_payload_type_ != 0) { |
200 // Overhead is FEC headers plus RED for FEC header plus anything in RTP | 199 // Overhead is FEC headers plus RED for FEC header plus anything in RTP |
201 // header beyond the 12 bytes base header (CSRC list, extensions...) | 200 // header beyond the 12 bytes base header (CSRC list, extensions...) |
202 // This reason for the header extensions to be included here is that | 201 // This reason for the header extensions to be included here is that |
203 // from an FEC viewpoint, they are part of the payload to be protected. | 202 // from an FEC viewpoint, they are part of the payload to be protected. |
204 // (The base RTP header is already protected by the FEC header.) | 203 // (The base RTP header is already protected by the FEC header.) |
205 return producer_fec_.MaxPacketOverhead() + kRedForFecHeaderLength + | 204 return ulpfec_generator_.MaxPacketOverhead() + kRedForFecHeaderLength + |
206 (rtp_sender_->RtpHeaderLength() - kRtpHeaderSize); | 205 (rtp_sender_->RtpHeaderLength() - kRtpHeaderSize); |
207 } | 206 } |
208 if (fec_enabled_) | 207 if (fec_enabled_) |
209 overhead += producer_fec_.MaxPacketOverhead(); | 208 overhead += ulpfec_generator_.MaxPacketOverhead(); |
210 return overhead; | 209 return overhead; |
211 } | 210 } |
212 | 211 |
213 void RTPSenderVideo::SetFecParameters(const FecProtectionParams* delta_params, | 212 void RTPSenderVideo::SetFecParameters(const FecProtectionParams* delta_params, |
214 const FecProtectionParams* key_params) { | 213 const FecProtectionParams* key_params) { |
215 rtc::CritScope cs(&crit_); | 214 rtc::CritScope cs(&crit_); |
216 RTC_DCHECK(delta_params); | 215 RTC_DCHECK(delta_params); |
217 RTC_DCHECK(key_params); | 216 RTC_DCHECK(key_params); |
218 if (fec_enabled_) { | 217 if (fec_enabled_) { |
219 delta_fec_params_ = *delta_params; | 218 delta_fec_params_ = *delta_params; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
270 video_type, max_data_payload_length, | 269 video_type, max_data_payload_length, |
271 video_header ? &(video_header->codecHeader) : nullptr, frame_type)); | 270 video_header ? &(video_header->codecHeader) : nullptr, frame_type)); |
272 | 271 |
273 StorageType storage; | 272 StorageType storage; |
274 int red_payload_type; | 273 int red_payload_type; |
275 bool first_frame = first_frame_sent_(); | 274 bool first_frame = first_frame_sent_(); |
276 { | 275 { |
277 rtc::CritScope cs(&crit_); | 276 rtc::CritScope cs(&crit_); |
278 FecProtectionParams* fec_params = | 277 FecProtectionParams* fec_params = |
279 frame_type == kVideoFrameKey ? &key_fec_params_ : &delta_fec_params_; | 278 frame_type == kVideoFrameKey ? &key_fec_params_ : &delta_fec_params_; |
280 producer_fec_.SetFecParameters(fec_params); | 279 ulpfec_generator_.SetFecParameters(fec_params); |
281 storage = packetizer->GetStorageType(retransmission_settings_); | 280 storage = packetizer->GetStorageType(retransmission_settings_); |
282 red_payload_type = red_payload_type_; | 281 red_payload_type = red_payload_type_; |
283 } | 282 } |
284 | 283 |
285 // TODO(changbin): we currently don't support to configure the codec to | 284 // TODO(changbin): we currently don't support to configure the codec to |
286 // output multiple partitions for VP8. Should remove below check after the | 285 // output multiple partitions for VP8. Should remove below check after the |
287 // issue is fixed. | 286 // issue is fixed. |
288 const RTPFragmentationHeader* frag = | 287 const RTPFragmentationHeader* frag = |
289 (video_type == kRtpVideoVp8) ? NULL : fragmentation; | 288 (video_type == kRtpVideoVp8) ? NULL : fragmentation; |
290 | 289 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 rtc::CritScope cs(&crit_); | 344 rtc::CritScope cs(&crit_); |
346 return retransmission_settings_; | 345 return retransmission_settings_; |
347 } | 346 } |
348 | 347 |
349 void RTPSenderVideo::SetSelectiveRetransmissions(uint8_t settings) { | 348 void RTPSenderVideo::SetSelectiveRetransmissions(uint8_t settings) { |
350 rtc::CritScope cs(&crit_); | 349 rtc::CritScope cs(&crit_); |
351 retransmission_settings_ = settings; | 350 retransmission_settings_ = settings; |
352 } | 351 } |
353 | 352 |
354 } // namespace webrtc | 353 } // namespace webrtc |
OLD | NEW |