Chromium Code Reviews| 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 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 114 } | 114 } |
| 115 RTC_DCHECK(!vad_->enabled()); | 115 RTC_DCHECK(!vad_->enabled()); |
| 116 if (config.enable_post_decode_vad) { | 116 if (config.enable_post_decode_vad) { |
| 117 vad_->Enable(); | 117 vad_->Enable(); |
| 118 } | 118 } |
| 119 } | 119 } |
| 120 | 120 |
| 121 NetEqImpl::~NetEqImpl() = default; | 121 NetEqImpl::~NetEqImpl() = default; |
| 122 | 122 |
| 123 int NetEqImpl::InsertPacket(const WebRtcRTPHeader& rtp_header, | 123 int NetEqImpl::InsertPacket(const WebRtcRTPHeader& rtp_header, |
| 124 const uint8_t* payload, | 124 rtc::ArrayView<const uint8_t> payload, |
| 125 size_t length_bytes, | |
| 126 uint32_t receive_timestamp) { | 125 uint32_t receive_timestamp) { |
| 127 CriticalSectionScoped lock(crit_sect_.get()); | 126 CriticalSectionScoped lock(crit_sect_.get()); |
| 128 LOG(LS_VERBOSE) << "InsertPacket: ts=" << rtp_header.header.timestamp << | 127 LOG(LS_VERBOSE) << "InsertPacket: ts=" << rtp_header.header.timestamp |
| 129 ", sn=" << rtp_header.header.sequenceNumber << | 128 << ", sn=" << rtp_header.header.sequenceNumber |
| 130 ", pt=" << static_cast<int>(rtp_header.header.payloadType) << | 129 << ", pt=" << static_cast<int>(rtp_header.header.payloadType) |
| 131 ", ssrc=" << rtp_header.header.ssrc << | 130 << ", ssrc=" << rtp_header.header.ssrc |
| 132 ", len=" << length_bytes; | 131 << ", len=" << payload.size(); |
| 133 int error = InsertPacketInternal(rtp_header, payload, length_bytes, | 132 int error = |
| 134 receive_timestamp, false); | 133 InsertPacketInternal(rtp_header, payload, receive_timestamp, false); |
| 135 if (error != 0) { | 134 if (error != 0) { |
| 136 error_code_ = error; | 135 error_code_ = error; |
| 137 return kFail; | 136 return kFail; |
| 138 } | 137 } |
| 139 return kOK; | 138 return kOK; |
| 140 } | 139 } |
| 141 | 140 |
| 142 int NetEqImpl::InsertSyncPacket(const WebRtcRTPHeader& rtp_header, | 141 int NetEqImpl::InsertSyncPacket(const WebRtcRTPHeader& rtp_header, |
| 143 uint32_t receive_timestamp) { | 142 uint32_t receive_timestamp) { |
| 144 CriticalSectionScoped lock(crit_sect_.get()); | 143 CriticalSectionScoped lock(crit_sect_.get()); |
| 145 LOG(LS_VERBOSE) << "InsertPacket-Sync: ts=" | 144 LOG(LS_VERBOSE) << "InsertPacket-Sync: ts=" |
| 146 << rtp_header.header.timestamp << | 145 << rtp_header.header.timestamp << |
| 147 ", sn=" << rtp_header.header.sequenceNumber << | 146 ", sn=" << rtp_header.header.sequenceNumber << |
| 148 ", pt=" << static_cast<int>(rtp_header.header.payloadType) << | 147 ", pt=" << static_cast<int>(rtp_header.header.payloadType) << |
| 149 ", ssrc=" << rtp_header.header.ssrc; | 148 ", ssrc=" << rtp_header.header.ssrc; |
| 150 | 149 |
| 151 const uint8_t kSyncPayload[] = { 's', 'y', 'n', 'c' }; | 150 const uint8_t kSyncPayload[] = { 's', 'y', 'n', 'c' }; |
| 152 int error = InsertPacketInternal( | 151 int error = |
| 153 rtp_header, kSyncPayload, sizeof(kSyncPayload), receive_timestamp, true); | 152 InsertPacketInternal(rtp_header, kSyncPayload, receive_timestamp, true); |
| 154 | 153 |
| 155 if (error != 0) { | 154 if (error != 0) { |
| 156 error_code_ = error; | 155 error_code_ = error; |
| 157 return kFail; | 156 return kFail; |
| 158 } | 157 } |
| 159 return kOK; | 158 return kOK; |
| 160 } | 159 } |
| 161 | 160 |
| 162 int NetEqImpl::GetAudio(size_t max_length, int16_t* output_audio, | 161 int NetEqImpl::GetAudio(size_t max_length, int16_t* output_audio, |
| 163 size_t* samples_per_channel, int* num_channels, | 162 size_t* samples_per_channel, int* num_channels, |
| (...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 438 } | 437 } |
| 439 | 438 |
| 440 const SyncBuffer* NetEqImpl::sync_buffer_for_test() const { | 439 const SyncBuffer* NetEqImpl::sync_buffer_for_test() const { |
| 441 CriticalSectionScoped lock(crit_sect_.get()); | 440 CriticalSectionScoped lock(crit_sect_.get()); |
| 442 return sync_buffer_.get(); | 441 return sync_buffer_.get(); |
| 443 } | 442 } |
| 444 | 443 |
| 445 // Methods below this line are private. | 444 // Methods below this line are private. |
| 446 | 445 |
| 447 int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header, | 446 int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header, |
| 448 const uint8_t* payload, | 447 rtc::ArrayView<const uint8_t> payload, |
| 449 size_t length_bytes, | |
| 450 uint32_t receive_timestamp, | 448 uint32_t receive_timestamp, |
| 451 bool is_sync_packet) { | 449 bool is_sync_packet) { |
| 452 if (!payload) { | 450 if (payload.empty()) { |
| 453 LOG_F(LS_ERROR) << "payload == NULL"; | 451 LOG_F(LS_ERROR) << "payload == NULL"; |
|
hlundin-webrtc
2015/11/10 10:14:35
"payload == NULL" is not as correct as it used to
kwiberg-webrtc
2015/11/10 10:27:59
Done.
| |
| 454 return kInvalidPointer; | 452 return kInvalidPointer; |
| 455 } | 453 } |
| 456 // Sanity checks for sync-packets. | 454 // Sanity checks for sync-packets. |
| 457 if (is_sync_packet) { | 455 if (is_sync_packet) { |
| 458 if (decoder_database_->IsDtmf(rtp_header.header.payloadType) || | 456 if (decoder_database_->IsDtmf(rtp_header.header.payloadType) || |
| 459 decoder_database_->IsRed(rtp_header.header.payloadType) || | 457 decoder_database_->IsRed(rtp_header.header.payloadType) || |
| 460 decoder_database_->IsComfortNoise(rtp_header.header.payloadType)) { | 458 decoder_database_->IsComfortNoise(rtp_header.header.payloadType)) { |
| 461 LOG_F(LS_ERROR) << "Sync-packet with an unacceptable payload type " | 459 LOG_F(LS_ERROR) << "Sync-packet with an unacceptable payload type " |
| 462 << static_cast<int>(rtp_header.header.payloadType); | 460 << static_cast<int>(rtp_header.header.payloadType); |
| 463 return kSyncPacketNotAccepted; | 461 return kSyncPacketNotAccepted; |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 479 // Create |packet| within this separate scope, since it should not be used | 477 // Create |packet| within this separate scope, since it should not be used |
| 480 // directly once it's been inserted in the packet list. This way, |packet| | 478 // directly once it's been inserted in the packet list. This way, |packet| |
| 481 // is not defined outside of this block. | 479 // is not defined outside of this block. |
| 482 Packet* packet = new Packet; | 480 Packet* packet = new Packet; |
| 483 packet->header.markerBit = false; | 481 packet->header.markerBit = false; |
| 484 packet->header.payloadType = rtp_header.header.payloadType; | 482 packet->header.payloadType = rtp_header.header.payloadType; |
| 485 packet->header.sequenceNumber = rtp_header.header.sequenceNumber; | 483 packet->header.sequenceNumber = rtp_header.header.sequenceNumber; |
| 486 packet->header.timestamp = rtp_header.header.timestamp; | 484 packet->header.timestamp = rtp_header.header.timestamp; |
| 487 packet->header.ssrc = rtp_header.header.ssrc; | 485 packet->header.ssrc = rtp_header.header.ssrc; |
| 488 packet->header.numCSRCs = 0; | 486 packet->header.numCSRCs = 0; |
| 489 packet->payload_length = length_bytes; | 487 packet->payload_length = payload.size(); |
| 490 packet->primary = true; | 488 packet->primary = true; |
| 491 packet->waiting_time = 0; | 489 packet->waiting_time = 0; |
| 492 packet->payload = new uint8_t[packet->payload_length]; | 490 packet->payload = new uint8_t[packet->payload_length]; |
| 493 packet->sync_packet = is_sync_packet; | 491 packet->sync_packet = is_sync_packet; |
| 494 if (!packet->payload) { | 492 if (!packet->payload) { |
| 495 LOG_F(LS_ERROR) << "Payload pointer is NULL."; | 493 LOG_F(LS_ERROR) << "Payload pointer is NULL."; |
| 496 } | 494 } |
| 497 assert(payload); // Already checked above. | 495 assert(!payload.empty()); // Already checked above. |
| 498 memcpy(packet->payload, payload, packet->payload_length); | 496 memcpy(packet->payload, payload.data(), packet->payload_length); |
| 499 // Insert packet in a packet list. | 497 // Insert packet in a packet list. |
| 500 packet_list.push_back(packet); | 498 packet_list.push_back(packet); |
| 501 // Save main payloads header for later. | 499 // Save main payloads header for later. |
| 502 memcpy(&main_header, &packet->header, sizeof(main_header)); | 500 memcpy(&main_header, &packet->header, sizeof(main_header)); |
| 503 } | 501 } |
| 504 | 502 |
| 505 bool update_sample_rate_and_channels = false; | 503 bool update_sample_rate_and_channels = false; |
| 506 // Reinitialize NetEq if it's needed (changed SSRC or first call). | 504 // Reinitialize NetEq if it's needed (changed SSRC or first call). |
| 507 if ((main_header.ssrc != ssrc_) || first_packet_) { | 505 if ((main_header.ssrc != ssrc_) || first_packet_) { |
| 508 // Note: |first_packet_| will be cleared further down in this method, once | 506 // Note: |first_packet_| will be cleared further down in this method, once |
| (...skipping 1560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2069 | 2067 |
| 2070 void NetEqImpl::CreateDecisionLogic() { | 2068 void NetEqImpl::CreateDecisionLogic() { |
| 2071 decision_logic_.reset(DecisionLogic::Create(fs_hz_, output_size_samples_, | 2069 decision_logic_.reset(DecisionLogic::Create(fs_hz_, output_size_samples_, |
| 2072 playout_mode_, | 2070 playout_mode_, |
| 2073 decoder_database_.get(), | 2071 decoder_database_.get(), |
| 2074 *packet_buffer_.get(), | 2072 *packet_buffer_.get(), |
| 2075 delay_manager_.get(), | 2073 delay_manager_.get(), |
| 2076 buffer_level_filter_.get())); | 2074 buffer_level_filter_.get())); |
| 2077 } | 2075 } |
| 2078 } // namespace webrtc | 2076 } // namespace webrtc |
| OLD | NEW |