| 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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 } | 85 } |
| 86 | 86 |
| 87 uint8_t* RedPacket::data() const { | 87 uint8_t* RedPacket::data() const { |
| 88 return data_.get(); | 88 return data_.get(); |
| 89 } | 89 } |
| 90 | 90 |
| 91 size_t RedPacket::length() const { | 91 size_t RedPacket::length() const { |
| 92 return length_; | 92 return length_; |
| 93 } | 93 } |
| 94 | 94 |
| 95 ProducerFec::ProducerFec(ForwardErrorCorrection* fec) | 95 ProducerFec::ProducerFec() |
| 96 : fec_(fec), | 96 : num_protected_frames_(0), |
| 97 media_packets_(), | |
| 98 generated_fec_packets_(), | |
| 99 num_protected_frames_(0), | |
| 100 num_important_packets_(0), | 97 num_important_packets_(0), |
| 101 min_num_media_packets_(1), | 98 min_num_media_packets_(1) { |
| 102 params_(), | |
| 103 new_params_() { | |
| 104 memset(¶ms_, 0, sizeof(params_)); | 99 memset(¶ms_, 0, sizeof(params_)); |
| 105 memset(&new_params_, 0, sizeof(new_params_)); | 100 memset(&new_params_, 0, sizeof(new_params_)); |
| 106 } | 101 } |
| 107 | 102 |
| 108 ProducerFec::~ProducerFec() { | 103 ProducerFec::~ProducerFec() { |
| 109 DeleteMediaPackets(); | 104 DeleteMediaPackets(); |
| 110 } | 105 } |
| 111 | 106 |
| 112 std::unique_ptr<RedPacket> ProducerFec::BuildRedPacket( | 107 std::unique_ptr<RedPacket> ProducerFec::BuildRedPacket( |
| 113 const uint8_t* data_buffer, | 108 const uint8_t* data_buffer, |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 (num_protected_frames_ == params_.max_fec_frames || | 168 (num_protected_frames_ == params_.max_fec_frames || |
| 174 (ExcessOverheadBelowMax() && MinimumMediaPacketsReached()))) { | 169 (ExcessOverheadBelowMax() && MinimumMediaPacketsReached()))) { |
| 175 RTC_DCHECK_LE(num_important_packets_, | 170 RTC_DCHECK_LE(num_important_packets_, |
| 176 static_cast<int>(ForwardErrorCorrection::kMaxMediaPackets)); | 171 static_cast<int>(ForwardErrorCorrection::kMaxMediaPackets)); |
| 177 // TODO(pbos): Consider whether unequal protection should be enabled or not, | 172 // TODO(pbos): Consider whether unequal protection should be enabled or not, |
| 178 // it is currently always disabled. | 173 // it is currently always disabled. |
| 179 // | 174 // |
| 180 // Since unequal protection is disabled, the value of | 175 // Since unequal protection is disabled, the value of |
| 181 // |num_important_packets_| has no importance when calling GenerateFec(). | 176 // |num_important_packets_| has no importance when calling GenerateFec(). |
| 182 constexpr bool kUseUnequalProtection = false; | 177 constexpr bool kUseUnequalProtection = false; |
| 183 int ret = fec_->GenerateFec(media_packets_, params_.fec_rate, | 178 int ret = fec_.GenerateFec(media_packets_, params_.fec_rate, |
| 184 num_important_packets_, kUseUnequalProtection, | 179 num_important_packets_, kUseUnequalProtection, |
| 185 params_.fec_mask_type, &generated_fec_packets_); | 180 params_.fec_mask_type, &generated_fec_packets_); |
| 186 if (generated_fec_packets_.empty()) { | 181 if (generated_fec_packets_.empty()) { |
| 187 num_protected_frames_ = 0; | 182 num_protected_frames_ = 0; |
| 188 DeleteMediaPackets(); | 183 DeleteMediaPackets(); |
| 189 } | 184 } |
| 190 return ret; | 185 return ret; |
| 191 } | 186 } |
| 192 return 0; | 187 return 0; |
| 193 } | 188 } |
| 194 | 189 |
| 195 bool ProducerFec::ExcessOverheadBelowMax() const { | 190 bool ProducerFec::ExcessOverheadBelowMax() const { |
| (...skipping 14 matching lines...) Expand all Loading... |
| 210 } | 205 } |
| 211 | 206 |
| 212 bool ProducerFec::FecAvailable() const { | 207 bool ProducerFec::FecAvailable() const { |
| 213 return !generated_fec_packets_.empty(); | 208 return !generated_fec_packets_.empty(); |
| 214 } | 209 } |
| 215 | 210 |
| 216 size_t ProducerFec::NumAvailableFecPackets() const { | 211 size_t ProducerFec::NumAvailableFecPackets() const { |
| 217 return generated_fec_packets_.size(); | 212 return generated_fec_packets_.size(); |
| 218 } | 213 } |
| 219 | 214 |
| 215 size_t ProducerFec::MaxPacketOverhead() const { |
| 216 return fec_.MaxPacketOverhead(); |
| 217 } |
| 218 |
| 220 std::vector<std::unique_ptr<RedPacket>> ProducerFec::GetFecPacketsAsRed( | 219 std::vector<std::unique_ptr<RedPacket>> ProducerFec::GetFecPacketsAsRed( |
| 221 int red_payload_type, | 220 int red_payload_type, |
| 222 int ulpfec_payload_type, | 221 int ulpfec_payload_type, |
| 223 uint16_t first_seq_num, | 222 uint16_t first_seq_num, |
| 224 size_t rtp_header_length) { | 223 size_t rtp_header_length) { |
| 225 std::vector<std::unique_ptr<RedPacket>> red_packets; | 224 std::vector<std::unique_ptr<RedPacket>> red_packets; |
| 226 red_packets.reserve(generated_fec_packets_.size()); | 225 red_packets.reserve(generated_fec_packets_.size()); |
| 227 RTC_DCHECK(!media_packets_.empty()); | 226 RTC_DCHECK(!media_packets_.empty()); |
| 228 ForwardErrorCorrection::Packet* last_media_packet = | 227 ForwardErrorCorrection::Packet* last_media_packet = |
| 229 media_packets_.back().get(); | 228 media_packets_.back().get(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 251 return red_packets; | 250 return red_packets; |
| 252 } | 251 } |
| 253 | 252 |
| 254 int ProducerFec::Overhead() const { | 253 int ProducerFec::Overhead() const { |
| 255 // Overhead is defined as relative to the number of media packets, and not | 254 // Overhead is defined as relative to the number of media packets, and not |
| 256 // relative to total number of packets. This definition is inherited from the | 255 // relative to total number of packets. This definition is inherited from the |
| 257 // protection factor produced by video_coding module and how the FEC | 256 // protection factor produced by video_coding module and how the FEC |
| 258 // generation is implemented. | 257 // generation is implemented. |
| 259 RTC_DCHECK(!media_packets_.empty()); | 258 RTC_DCHECK(!media_packets_.empty()); |
| 260 int num_fec_packets = | 259 int num_fec_packets = |
| 261 fec_->GetNumberOfFecPackets(media_packets_.size(), params_.fec_rate); | 260 fec_.NumFecPackets(media_packets_.size(), params_.fec_rate); |
| 262 // Return the overhead in Q8. | 261 // Return the overhead in Q8. |
| 263 return (num_fec_packets << 8) / media_packets_.size(); | 262 return (num_fec_packets << 8) / media_packets_.size(); |
| 264 } | 263 } |
| 265 | 264 |
| 266 void ProducerFec::DeleteMediaPackets() { | 265 void ProducerFec::DeleteMediaPackets() { |
| 267 media_packets_.clear(); | 266 media_packets_.clear(); |
| 268 } | 267 } |
| 269 | 268 |
| 270 } // namespace webrtc | 269 } // namespace webrtc |
| OLD | NEW |