Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(206)

Side by Side Diff: webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc

Issue 2449783002: Rename ProducerFec to UlpfecGenerator. (Closed)
Patch Set: Rebase. Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « webrtc/modules/rtp_rtcp/source/rtp_sender_video.h ('k') | webrtc/modules/rtp_rtcp/source/ulpfec_generator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698