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

Side by Side Diff: webrtc/modules/audio_coding/neteq/neteq_impl.cc

Issue 2289093003: NetEq: Changed Packet::payload to be an rtc::Buffer (Closed)
Patch Set: Created 4 years, 3 months 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
(...skipping 543 matching lines...) Expand 10 before | Expand all | Expand 10 after
554 // Create |packet| within this separate scope, since it should not be used 554 // Create |packet| within this separate scope, since it should not be used
555 // directly once it's been inserted in the packet list. This way, |packet| 555 // directly once it's been inserted in the packet list. This way, |packet|
556 // is not defined outside of this block. 556 // is not defined outside of this block.
557 Packet* packet = new Packet; 557 Packet* packet = new Packet;
558 packet->header.markerBit = false; 558 packet->header.markerBit = false;
559 packet->header.payloadType = rtp_header.header.payloadType; 559 packet->header.payloadType = rtp_header.header.payloadType;
560 packet->header.sequenceNumber = rtp_header.header.sequenceNumber; 560 packet->header.sequenceNumber = rtp_header.header.sequenceNumber;
561 packet->header.timestamp = rtp_header.header.timestamp; 561 packet->header.timestamp = rtp_header.header.timestamp;
562 packet->header.ssrc = rtp_header.header.ssrc; 562 packet->header.ssrc = rtp_header.header.ssrc;
563 packet->header.numCSRCs = 0; 563 packet->header.numCSRCs = 0;
564 packet->payload_length = payload.size(); 564 packet->payload = rtc::Buffer(payload.data(), payload.size());
kwiberg-webrtc 2016/08/30 16:04:36 You're copying data into an existing buffer, so
ossu 2016/08/30 16:27:13 Good point. Yeah, I was expecting the copy constru
kwiberg-webrtc 2016/08/30 16:37:05 Yes, we explicitly don't want a copy constructor.
565 packet->primary = true; 565 packet->primary = true;
566 // Waiting time will be set upon inserting the packet in the buffer. 566 // Waiting time will be set upon inserting the packet in the buffer.
567 RTC_DCHECK(!packet->waiting_time); 567 RTC_DCHECK(!packet->waiting_time);
568 packet->payload = new uint8_t[packet->payload_length];
569 packet->sync_packet = is_sync_packet; 568 packet->sync_packet = is_sync_packet;
570 if (!packet->payload) {
571 LOG_F(LS_ERROR) << "Payload pointer is NULL.";
572 }
573 assert(!payload.empty()); // Already checked above.
574 memcpy(packet->payload, payload.data(), packet->payload_length);
575 // Insert packet in a packet list. 569 // Insert packet in a packet list.
576 packet_list.push_back(packet); 570 packet_list.push_back(packet);
577 // Save main payloads header for later. 571 // Save main payloads header for later.
578 memcpy(&main_header, &packet->header, sizeof(main_header)); 572 memcpy(&main_header, &packet->header, sizeof(main_header));
579 } 573 }
580 574
581 bool update_sample_rate_and_channels = false; 575 bool update_sample_rate_and_channels = false;
582 // Reinitialize NetEq if it's needed (changed SSRC or first call). 576 // Reinitialize NetEq if it's needed (changed SSRC or first call).
583 if ((main_header.ssrc != ssrc_) || first_packet_) { 577 if ((main_header.ssrc != ssrc_) || first_packet_) {
584 // Note: |first_packet_| will be cleared further down in this method, once 578 // Note: |first_packet_| will be cleared further down in this method, once
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
634 628
635 // Scale timestamp to internal domain (only for some codecs). 629 // Scale timestamp to internal domain (only for some codecs).
636 timestamp_scaler_->ToInternal(&packet_list); 630 timestamp_scaler_->ToInternal(&packet_list);
637 631
638 // Process DTMF payloads. Cycle through the list of packets, and pick out any 632 // Process DTMF payloads. Cycle through the list of packets, and pick out any
639 // DTMF payloads found. 633 // DTMF payloads found.
640 PacketList::iterator it = packet_list.begin(); 634 PacketList::iterator it = packet_list.begin();
641 while (it != packet_list.end()) { 635 while (it != packet_list.end()) {
642 Packet* current_packet = (*it); 636 Packet* current_packet = (*it);
643 assert(current_packet); 637 assert(current_packet);
644 assert(current_packet->payload); 638 assert(!current_packet->payload.empty());
645 if (decoder_database_->IsDtmf(current_packet->header.payloadType)) { 639 if (decoder_database_->IsDtmf(current_packet->header.payloadType)) {
646 assert(!current_packet->sync_packet); // We had a sanity check for this. 640 assert(!current_packet->sync_packet); // We had a sanity check for this.
647 DtmfEvent event; 641 DtmfEvent event;
648 int ret = DtmfBuffer::ParseEvent( 642 int ret = DtmfBuffer::ParseEvent(current_packet->header.timestamp,
649 current_packet->header.timestamp, 643 current_packet->payload.data(),
650 current_packet->payload, 644 current_packet->payload.size(), &event);
651 current_packet->payload_length,
652 &event);
653 if (ret != DtmfBuffer::kOK) { 645 if (ret != DtmfBuffer::kOK) {
654 PacketBuffer::DeleteAllPackets(&packet_list); 646 PacketBuffer::DeleteAllPackets(&packet_list);
655 return kDtmfParsingError; 647 return kDtmfParsingError;
656 } 648 }
657 if (dtmf_buffer_->InsertEvent(event) != DtmfBuffer::kOK) { 649 if (dtmf_buffer_->InsertEvent(event) != DtmfBuffer::kOK) {
658 PacketBuffer::DeleteAllPackets(&packet_list); 650 PacketBuffer::DeleteAllPackets(&packet_list);
659 return kDtmfInsertError; 651 return kDtmfInsertError;
660 } 652 }
661 // TODO(hlundin): Let the destructor of Packet handle the payload.
662 delete [] current_packet->payload;
kwiberg-webrtc 2016/08/30 16:04:36 Whatever happens, this CL is going to earn you a h
ossu 2016/08/30 16:27:14 Yay! \o/
663 delete current_packet; 653 delete current_packet;
664 it = packet_list.erase(it); 654 it = packet_list.erase(it);
665 } else { 655 } else {
666 ++it; 656 ++it;
667 } 657 }
668 } 658 }
669 659
670 // Check for FEC in packets, and separate payloads into several packets. 660 // Check for FEC in packets, and separate payloads into several packets.
671 int ret = payload_splitter_->SplitFec(&packet_list, decoder_database_.get()); 661 int ret = payload_splitter_->SplitFec(&packet_list, decoder_database_.get());
672 if (ret != PayloadSplitter::kOK) { 662 if (ret != PayloadSplitter::kOK) {
(...skipping 24 matching lines...) Expand all
697 687
698 // Update bandwidth estimate, if the packet is not sync-packet nor comfort 688 // Update bandwidth estimate, if the packet is not sync-packet nor comfort
699 // noise. 689 // noise.
700 if (!packet_list.empty() && !packet_list.front()->sync_packet && 690 if (!packet_list.empty() && !packet_list.front()->sync_packet &&
701 !decoder_database_->IsComfortNoise(main_header.payloadType)) { 691 !decoder_database_->IsComfortNoise(main_header.payloadType)) {
702 // The list can be empty here if we got nothing but DTMF payloads. 692 // The list can be empty here if we got nothing but DTMF payloads.
703 AudioDecoder* decoder = 693 AudioDecoder* decoder =
704 decoder_database_->GetDecoder(main_header.payloadType); 694 decoder_database_->GetDecoder(main_header.payloadType);
705 assert(decoder); // Should always get a valid object, since we have 695 assert(decoder); // Should always get a valid object, since we have
706 // already checked that the payload types are known. 696 // already checked that the payload types are known.
707 decoder->IncomingPacket(packet_list.front()->payload, 697 decoder->IncomingPacket(packet_list.front()->payload.data(),
708 packet_list.front()->payload_length, 698 packet_list.front()->payload.size(),
709 packet_list.front()->header.sequenceNumber, 699 packet_list.front()->header.sequenceNumber,
710 packet_list.front()->header.timestamp, 700 packet_list.front()->header.timestamp,
711 receive_timestamp); 701 receive_timestamp);
712 } 702 }
713 703
714 if (nack_enabled_) { 704 if (nack_enabled_) {
715 RTC_DCHECK(nack_); 705 RTC_DCHECK(nack_);
716 if (update_sample_rate_and_channels) { 706 if (update_sample_rate_and_channels) {
717 nack_->Reset(); 707 nack_->Reset();
718 } 708 }
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
1462 !decoder_database_->IsComfortNoise(packet->header.payloadType)) { 1452 !decoder_database_->IsComfortNoise(packet->header.payloadType)) {
1463 assert(decoder); // At this point, we must have a decoder object. 1453 assert(decoder); // At this point, we must have a decoder object.
1464 // The number of channels in the |sync_buffer_| should be the same as the 1454 // The number of channels in the |sync_buffer_| should be the same as the
1465 // number decoder channels. 1455 // number decoder channels.
1466 assert(sync_buffer_->Channels() == decoder->Channels()); 1456 assert(sync_buffer_->Channels() == decoder->Channels());
1467 assert(decoded_buffer_length_ >= kMaxFrameSize * decoder->Channels()); 1457 assert(decoded_buffer_length_ >= kMaxFrameSize * decoder->Channels());
1468 assert(operation == kNormal || operation == kAccelerate || 1458 assert(operation == kNormal || operation == kAccelerate ||
1469 operation == kFastAccelerate || operation == kMerge || 1459 operation == kFastAccelerate || operation == kMerge ||
1470 operation == kPreemptiveExpand); 1460 operation == kPreemptiveExpand);
1471 packet_list->pop_front(); 1461 packet_list->pop_front();
1472 size_t payload_length = packet->payload_length; 1462 const size_t payload_length = packet->payload.size();
1473 int decode_length; 1463 int decode_length;
1474 if (packet->sync_packet) { 1464 if (packet->sync_packet) {
1475 // Decode to silence with the same frame size as the last decode. 1465 // Decode to silence with the same frame size as the last decode.
1476 memset(&decoded_buffer_[*decoded_length], 0, 1466 memset(&decoded_buffer_[*decoded_length], 0,
1477 decoder_frame_length_ * decoder->Channels() * 1467 decoder_frame_length_ * decoder->Channels() *
1478 sizeof(decoded_buffer_[0])); 1468 sizeof(decoded_buffer_[0]));
1479 decode_length = rtc::checked_cast<int>(decoder_frame_length_); 1469 decode_length = rtc::checked_cast<int>(decoder_frame_length_);
1480 } else if (!packet->primary) { 1470 } else if (!packet->primary) {
1481 // This is a redundant payload; call the special decoder method. 1471 // This is a redundant payload; call the special decoder method.
1482 decode_length = decoder->DecodeRedundant( 1472 decode_length = decoder->DecodeRedundant(
1483 packet->payload, packet->payload_length, fs_hz_, 1473 packet->payload.data(), packet->payload.size(), fs_hz_,
1484 (decoded_buffer_length_ - *decoded_length) * sizeof(int16_t), 1474 (decoded_buffer_length_ - *decoded_length) * sizeof(int16_t),
1485 &decoded_buffer_[*decoded_length], speech_type); 1475 &decoded_buffer_[*decoded_length], speech_type);
1486 } else { 1476 } else {
1487 decode_length = 1477 decode_length = decoder->Decode(
1488 decoder->Decode( 1478 packet->payload.data(), packet->payload.size(), fs_hz_,
1489 packet->payload, packet->payload_length, fs_hz_, 1479 (decoded_buffer_length_ - *decoded_length) * sizeof(int16_t),
1490 (decoded_buffer_length_ - *decoded_length) * sizeof(int16_t), 1480 &decoded_buffer_[*decoded_length], speech_type);
1491 &decoded_buffer_[*decoded_length], speech_type);
1492 } 1481 }
1493 1482
1494 delete[] packet->payload;
1495 delete packet; 1483 delete packet;
1496 packet = NULL; 1484 packet = NULL;
1497 if (decode_length > 0) { 1485 if (decode_length > 0) {
1498 *decoded_length += decode_length; 1486 *decoded_length += decode_length;
1499 // Update |decoder_frame_length_| with number of samples per channel. 1487 // Update |decoder_frame_length_| with number of samples per channel.
1500 decoder_frame_length_ = 1488 decoder_frame_length_ =
1501 static_cast<size_t>(decode_length) / decoder->Channels(); 1489 static_cast<size_t>(decode_length) / decoder->Channels();
1502 } else if (decode_length < 0) { 1490 } else if (decode_length < 0) {
1503 // Error. 1491 // Error.
1504 LOG(LS_WARNING) << "Decode " << decode_length << " " << payload_length; 1492 LOG(LS_WARNING) << "Decode " << decode_length << " " << payload_length;
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
1957 Packet* packet = packet_buffer_->GetNextPacket(&discard_count); 1945 Packet* packet = packet_buffer_->GetNextPacket(&discard_count);
1958 // |header| may be invalid after the |packet_buffer_| operation. 1946 // |header| may be invalid after the |packet_buffer_| operation.
1959 header = NULL; 1947 header = NULL;
1960 if (!packet) { 1948 if (!packet) {
1961 LOG(LS_ERROR) << "Should always be able to extract a packet here"; 1949 LOG(LS_ERROR) << "Should always be able to extract a packet here";
1962 assert(false); // Should always be able to extract a packet here. 1950 assert(false); // Should always be able to extract a packet here.
1963 return -1; 1951 return -1;
1964 } 1952 }
1965 stats_.PacketsDiscarded(discard_count); 1953 stats_.PacketsDiscarded(discard_count);
1966 stats_.StoreWaitingTime(packet->waiting_time->ElapsedMs()); 1954 stats_.StoreWaitingTime(packet->waiting_time->ElapsedMs());
1967 assert(packet->payload_length > 0); 1955 assert(!packet->payload.empty());
1968 packet_list->push_back(packet); // Store packet in list. 1956 packet_list->push_back(packet); // Store packet in list.
1969 1957
1970 if (first_packet) { 1958 if (first_packet) {
1971 first_packet = false; 1959 first_packet = false;
1972 if (nack_enabled_) { 1960 if (nack_enabled_) {
1973 RTC_DCHECK(nack_); 1961 RTC_DCHECK(nack_);
1974 // TODO(henrik.lundin): Should we update this for all decoded packets? 1962 // TODO(henrik.lundin): Should we update this for all decoded packets?
1975 nack_->UpdateLastDecodedPacket(packet->header.sequenceNumber, 1963 nack_->UpdateLastDecodedPacket(packet->header.sequenceNumber,
1976 packet->header.timestamp); 1964 packet->header.timestamp);
1977 } 1965 }
1978 prev_sequence_number = packet->header.sequenceNumber; 1966 prev_sequence_number = packet->header.sequenceNumber;
1979 prev_timestamp = packet->header.timestamp; 1967 prev_timestamp = packet->header.timestamp;
1980 prev_payload_type = packet->header.payloadType; 1968 prev_payload_type = packet->header.payloadType;
1981 } 1969 }
1982 1970
1983 // Store number of extracted samples. 1971 // Store number of extracted samples.
1984 int packet_duration = 0; 1972 int packet_duration = 0;
1985 AudioDecoder* decoder = decoder_database_->GetDecoder( 1973 AudioDecoder* decoder = decoder_database_->GetDecoder(
1986 packet->header.payloadType); 1974 packet->header.payloadType);
1987 if (decoder) { 1975 if (decoder) {
1988 if (packet->sync_packet) { 1976 if (packet->sync_packet) {
1989 packet_duration = rtc::checked_cast<int>(decoder_frame_length_); 1977 packet_duration = rtc::checked_cast<int>(decoder_frame_length_);
1990 } else { 1978 } else {
1991 if (packet->primary) { 1979 if (packet->primary) {
1992 packet_duration = decoder->PacketDuration(packet->payload, 1980 packet_duration = decoder->PacketDuration(packet->payload.data(),
1993 packet->payload_length); 1981 packet->payload.size());
1994 } else { 1982 } else {
1995 packet_duration = decoder-> 1983 packet_duration = decoder->PacketDurationRedundant(
1996 PacketDurationRedundant(packet->payload, packet->payload_length); 1984 packet->payload.data(), packet->payload.size());
1997 stats_.SecondaryDecodedSamples(packet_duration); 1985 stats_.SecondaryDecodedSamples(packet_duration);
1998 } 1986 }
1999 } 1987 }
2000 } else if (!decoder_database_->IsComfortNoise(packet->header.payloadType)) { 1988 } else if (!decoder_database_->IsComfortNoise(packet->header.payloadType)) {
2001 LOG(LS_WARNING) << "Unknown payload type " 1989 LOG(LS_WARNING) << "Unknown payload type "
2002 << static_cast<int>(packet->header.payloadType); 1990 << static_cast<int>(packet->header.payloadType);
2003 assert(false); 1991 assert(false);
2004 } 1992 }
2005 if (packet_duration <= 0) { 1993 if (packet_duration <= 0) {
2006 // Decoder did not return a packet duration. Assume that the packet 1994 // Decoder did not return a packet duration. Assume that the packet
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
2135 } 2123 }
2136 } 2124 }
2137 2125
2138 void NetEqImpl::CreateDecisionLogic() { 2126 void NetEqImpl::CreateDecisionLogic() {
2139 decision_logic_.reset(DecisionLogic::Create( 2127 decision_logic_.reset(DecisionLogic::Create(
2140 fs_hz_, output_size_samples_, playout_mode_, decoder_database_.get(), 2128 fs_hz_, output_size_samples_, playout_mode_, decoder_database_.get(),
2141 *packet_buffer_.get(), delay_manager_.get(), buffer_level_filter_.get(), 2129 *packet_buffer_.get(), delay_manager_.get(), buffer_level_filter_.get(),
2142 tick_timer_.get())); 2130 tick_timer_.get()));
2143 } 2131 }
2144 } // namespace webrtc 2132 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698