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/producer_fec.h" | 11 #include "webrtc/modules/rtp_rtcp/source/producer_fec.h" |
12 | 12 |
13 #include <memory> | 13 #include <memory> |
14 #include <utility> | 14 #include <utility> |
15 | 15 |
16 #include "webrtc/base/basictypes.h" | 16 #include "webrtc/base/basictypes.h" |
17 #include "webrtc/base/checks.h" | 17 #include "webrtc/base/checks.h" |
18 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 18 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
19 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h" | 19 #include "webrtc/modules/rtp_rtcp/source/forward_error_correction.h" |
| 20 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_to_send.h" |
20 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" | 21 #include "webrtc/modules/rtp_rtcp/source/rtp_utility.h" |
21 | 22 |
22 namespace webrtc { | 23 namespace webrtc { |
23 | 24 |
24 constexpr size_t kRedForFecHeaderLength = 1; | 25 constexpr size_t kRedForFecHeaderLength = 1; |
25 | 26 |
26 // This controls the maximum amount of excess overhead (actual - target) | 27 // This controls the maximum amount of excess overhead (actual - target) |
27 // allowed in order to trigger GenerateFec(), before |params_.max_fec_frames| | 28 // allowed in order to trigger GenerateFec(), before |params_.max_fec_frames| |
28 // is reached. Overhead here is defined as relative to number of media packets. | 29 // is reached. Overhead here is defined as relative to number of media packets. |
29 constexpr int kMaxExcessOverhead = 50; // Q8. | 30 constexpr int kMaxExcessOverhead = 50; // Q8. |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 params_(), | 103 params_(), |
103 new_params_() { | 104 new_params_() { |
104 memset(¶ms_, 0, sizeof(params_)); | 105 memset(¶ms_, 0, sizeof(params_)); |
105 memset(&new_params_, 0, sizeof(new_params_)); | 106 memset(&new_params_, 0, sizeof(new_params_)); |
106 } | 107 } |
107 | 108 |
108 ProducerFec::~ProducerFec() { | 109 ProducerFec::~ProducerFec() { |
109 DeleteMediaPackets(); | 110 DeleteMediaPackets(); |
110 } | 111 } |
111 | 112 |
| 113 void ProducerFec::BuildRedPacket(int red_payload_type, |
| 114 const RtpPacketToSend& media_packet, |
| 115 RtpPacketToSend* red_packet) { |
| 116 RTC_DCHECK_GE(red_packet->capacity(), |
| 117 media_packet.size() + kRedForFecHeaderLength); |
| 118 red_packet->CopyHeaderFrom(media_packet); |
| 119 red_packet->SetPayloadType(red_payload_type); |
| 120 uint8_t* red_payload = red_packet->AllocatePayload( |
| 121 kRedForFecHeaderLength + media_packet.payload_size()); |
| 122 red_payload[0] = media_packet.PayloadType(); |
| 123 memcpy(&red_payload[kRedForFecHeaderLength], media_packet.payload(), |
| 124 media_packet.payload_size()); |
| 125 red_packet->set_capture_time_ms(media_packet.capture_time_ms()); |
| 126 } |
| 127 |
112 std::unique_ptr<RedPacket> ProducerFec::BuildRedPacket( | 128 std::unique_ptr<RedPacket> ProducerFec::BuildRedPacket( |
113 const uint8_t* data_buffer, | 129 const uint8_t* data_buffer, |
114 size_t payload_length, | 130 size_t payload_length, |
115 size_t rtp_header_length, | 131 size_t rtp_header_length, |
116 int red_payload_type) { | 132 int red_payload_type) { |
117 std::unique_ptr<RedPacket> red_packet(new RedPacket( | 133 std::unique_ptr<RedPacket> red_packet(new RedPacket( |
118 payload_length + kRedForFecHeaderLength + rtp_header_length)); | 134 payload_length + kRedForFecHeaderLength + rtp_header_length)); |
119 int payload_type = data_buffer[1] & 0x7f; | 135 int payload_type = data_buffer[1] & 0x7f; |
120 red_packet->CreateHeader(data_buffer, rtp_header_length, red_payload_type, | 136 red_packet->CreateHeader(data_buffer, rtp_header_length, red_payload_type, |
121 payload_type); | 137 payload_type); |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 fec_->GetNumberOfFecPackets(media_packets_.size(), params_.fec_rate); | 277 fec_->GetNumberOfFecPackets(media_packets_.size(), params_.fec_rate); |
262 // Return the overhead in Q8. | 278 // Return the overhead in Q8. |
263 return (num_fec_packets << 8) / media_packets_.size(); | 279 return (num_fec_packets << 8) / media_packets_.size(); |
264 } | 280 } |
265 | 281 |
266 void ProducerFec::DeleteMediaPackets() { | 282 void ProducerFec::DeleteMediaPackets() { |
267 media_packets_.clear(); | 283 media_packets_.clear(); |
268 } | 284 } |
269 | 285 |
270 } // namespace webrtc | 286 } // namespace webrtc |
OLD | NEW |