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

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

Issue 2425223002: NetEq now works with packets as values, rather than pointers. (Closed)
Patch Set: Compare packets better in test. One more const. 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
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 574
575 int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header, 575 int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header,
576 rtc::ArrayView<const uint8_t> payload, 576 rtc::ArrayView<const uint8_t> payload,
577 uint32_t receive_timestamp) { 577 uint32_t receive_timestamp) {
578 if (payload.empty()) { 578 if (payload.empty()) {
579 LOG_F(LS_ERROR) << "payload is empty"; 579 LOG_F(LS_ERROR) << "payload is empty";
580 return kInvalidPointer; 580 return kInvalidPointer;
581 } 581 }
582 582
583 PacketList packet_list; 583 PacketList packet_list;
584 { 584 // Insert packet in a packet list.
585 packet_list.push_back([&rtp_header, &payload] {
585 // Convert to Packet. 586 // Convert to Packet.
586 // Create |packet| within this separate scope, since it should not be used 587 Packet packet;
587 // directly once it's been inserted in the packet list. This way, |packet| 588 packet.payload_type = rtp_header.header.payloadType;
588 // is not defined outside of this block. 589 packet.sequence_number = rtp_header.header.sequenceNumber;
589 Packet* packet = new Packet; 590 packet.timestamp = rtp_header.header.timestamp;
590 packet->payload_type = rtp_header.header.payloadType; 591 packet.payload.SetData(payload.data(), payload.size());
591 packet->sequence_number = rtp_header.header.sequenceNumber;
592 packet->timestamp = rtp_header.header.timestamp;
593 packet->payload.SetData(payload.data(), payload.size());
594 // Waiting time will be set upon inserting the packet in the buffer. 592 // Waiting time will be set upon inserting the packet in the buffer.
595 RTC_DCHECK(!packet->waiting_time); 593 RTC_DCHECK(!packet.waiting_time);
596 // Insert packet in a packet list. 594 return packet;
597 packet_list.push_back(packet); 595 }());
598 }
599 596
600 bool update_sample_rate_and_channels = false; 597 bool update_sample_rate_and_channels = false;
601 // Reinitialize NetEq if it's needed (changed SSRC or first call). 598 // Reinitialize NetEq if it's needed (changed SSRC or first call).
602 if ((rtp_header.header.ssrc != ssrc_) || first_packet_) { 599 if ((rtp_header.header.ssrc != ssrc_) || first_packet_) {
603 // Note: |first_packet_| will be cleared further down in this method, once 600 // Note: |first_packet_| will be cleared further down in this method, once
604 // the packet has been successfully inserted into the packet buffer. 601 // the packet has been successfully inserted into the packet buffer.
605 602
606 rtcp_.Init(rtp_header.header.sequenceNumber); 603 rtcp_.Init(rtp_header.header.sequenceNumber);
607 604
608 // Flush the packet buffer and DTMF buffer. 605 // Flush the packet buffer and DTMF buffer.
(...skipping 25 matching lines...) Expand all
634 if (update_sample_rate_and_channels) { 631 if (update_sample_rate_and_channels) {
635 nack_->Reset(); 632 nack_->Reset();
636 } 633 }
637 nack_->UpdateLastReceivedPacket(rtp_header.header.sequenceNumber, 634 nack_->UpdateLastReceivedPacket(rtp_header.header.sequenceNumber,
638 rtp_header.header.timestamp); 635 rtp_header.header.timestamp);
639 } 636 }
640 637
641 // Check for RED payload type, and separate payloads into several packets. 638 // Check for RED payload type, and separate payloads into several packets.
642 if (decoder_database_->IsRed(rtp_header.header.payloadType)) { 639 if (decoder_database_->IsRed(rtp_header.header.payloadType)) {
643 if (!red_payload_splitter_->SplitRed(&packet_list)) { 640 if (!red_payload_splitter_->SplitRed(&packet_list)) {
644 PacketBuffer::DeleteAllPackets(&packet_list);
645 return kRedundancySplitError; 641 return kRedundancySplitError;
646 } 642 }
647 // Only accept a few RED payloads of the same type as the main data, 643 // Only accept a few RED payloads of the same type as the main data,
648 // DTMF events and CNG. 644 // DTMF events and CNG.
649 red_payload_splitter_->CheckRedPayloads(&packet_list, *decoder_database_); 645 red_payload_splitter_->CheckRedPayloads(&packet_list, *decoder_database_);
650 } 646 }
651 647
652 // Check payload types. 648 // Check payload types.
653 if (decoder_database_->CheckPayloadTypes(packet_list) == 649 if (decoder_database_->CheckPayloadTypes(packet_list) ==
654 DecoderDatabase::kDecoderNotFound) { 650 DecoderDatabase::kDecoderNotFound) {
655 PacketBuffer::DeleteAllPackets(&packet_list);
656 return kUnknownRtpPayloadType; 651 return kUnknownRtpPayloadType;
657 } 652 }
658 653
659 RTC_DCHECK(!packet_list.empty()); 654 RTC_DCHECK(!packet_list.empty());
660 // Store these for later use, since the first packet may very well disappear 655 // Store these for later use, since the first packet may very well disappear
661 // before we need these values. 656 // before we need these values.
662 const uint32_t main_timestamp = packet_list.front()->timestamp; 657 const uint32_t main_timestamp = packet_list.front().timestamp;
663 const uint8_t main_payload_type = packet_list.front()->payload_type; 658 const uint8_t main_payload_type = packet_list.front().payload_type;
664 const uint16_t main_sequence_number = packet_list.front()->sequence_number; 659 const uint16_t main_sequence_number = packet_list.front().sequence_number;
665 660
666 // Scale timestamp to internal domain (only for some codecs). 661 // Scale timestamp to internal domain (only for some codecs).
667 timestamp_scaler_->ToInternal(&packet_list); 662 timestamp_scaler_->ToInternal(&packet_list);
668 663
669 // Process DTMF payloads. Cycle through the list of packets, and pick out any 664 // Process DTMF payloads. Cycle through the list of packets, and pick out any
670 // DTMF payloads found. 665 // DTMF payloads found.
671 PacketList::iterator it = packet_list.begin(); 666 PacketList::iterator it = packet_list.begin();
672 while (it != packet_list.end()) { 667 while (it != packet_list.end()) {
673 Packet* current_packet = (*it); 668 const Packet& current_packet = (*it);
674 assert(current_packet); 669 RTC_DCHECK(!current_packet.payload.empty());
675 assert(!current_packet->payload.empty()); 670 if (decoder_database_->IsDtmf(current_packet.payload_type)) {
676 if (decoder_database_->IsDtmf(current_packet->payload_type)) {
677 DtmfEvent event; 671 DtmfEvent event;
678 int ret = DtmfBuffer::ParseEvent(current_packet->timestamp, 672 int ret = DtmfBuffer::ParseEvent(current_packet.timestamp,
679 current_packet->payload.data(), 673 current_packet.payload.data(),
680 current_packet->payload.size(), &event); 674 current_packet.payload.size(), &event);
681 if (ret != DtmfBuffer::kOK) { 675 if (ret != DtmfBuffer::kOK) {
682 PacketBuffer::DeleteAllPackets(&packet_list);
683 return kDtmfParsingError; 676 return kDtmfParsingError;
684 } 677 }
685 if (dtmf_buffer_->InsertEvent(event) != DtmfBuffer::kOK) { 678 if (dtmf_buffer_->InsertEvent(event) != DtmfBuffer::kOK) {
686 PacketBuffer::DeleteAllPackets(&packet_list);
687 return kDtmfInsertError; 679 return kDtmfInsertError;
688 } 680 }
689 delete current_packet;
690 it = packet_list.erase(it); 681 it = packet_list.erase(it);
691 } else { 682 } else {
692 ++it; 683 ++it;
693 } 684 }
694 } 685 }
695 686
696 // Update bandwidth estimate, if the packet is not comfort noise. 687 // Update bandwidth estimate, if the packet is not comfort noise.
697 if (!packet_list.empty() && 688 if (!packet_list.empty() &&
698 !decoder_database_->IsComfortNoise(main_payload_type)) { 689 !decoder_database_->IsComfortNoise(main_payload_type)) {
699 // The list can be empty here if we got nothing but DTMF payloads. 690 // The list can be empty here if we got nothing but DTMF payloads.
700 AudioDecoder* decoder = decoder_database_->GetDecoder(main_payload_type); 691 AudioDecoder* decoder = decoder_database_->GetDecoder(main_payload_type);
701 RTC_DCHECK(decoder); // Should always get a valid object, since we have 692 RTC_DCHECK(decoder); // Should always get a valid object, since we have
702 // already checked that the payload types are known. 693 // already checked that the payload types are known.
703 decoder->IncomingPacket(packet_list.front()->payload.data(), 694 decoder->IncomingPacket(packet_list.front().payload.data(),
704 packet_list.front()->payload.size(), 695 packet_list.front().payload.size(),
705 packet_list.front()->sequence_number, 696 packet_list.front().sequence_number,
706 packet_list.front()->timestamp, 697 packet_list.front().timestamp,
707 receive_timestamp); 698 receive_timestamp);
708 } 699 }
709 700
710 PacketList parsed_packet_list; 701 PacketList parsed_packet_list;
711 while (!packet_list.empty()) { 702 while (!packet_list.empty()) {
712 std::unique_ptr<Packet> packet(packet_list.front()); 703 Packet& packet = packet_list.front();
713 packet_list.pop_front();
714 const DecoderDatabase::DecoderInfo* info = 704 const DecoderDatabase::DecoderInfo* info =
715 decoder_database_->GetDecoderInfo(packet->payload_type); 705 decoder_database_->GetDecoderInfo(packet.payload_type);
716 if (!info) { 706 if (!info) {
717 LOG(LS_WARNING) << "SplitAudio unknown payload type"; 707 LOG(LS_WARNING) << "SplitAudio unknown payload type";
718 return kUnknownRtpPayloadType; 708 return kUnknownRtpPayloadType;
719 } 709 }
720 710
721 if (info->IsComfortNoise()) { 711 if (info->IsComfortNoise()) {
722 // Carry comfort noise packets along. 712 // Carry comfort noise packets along.
723 parsed_packet_list.push_back(packet.release()); 713 parsed_packet_list.splice(parsed_packet_list.end(), packet_list,
714 packet_list.begin());
724 } else { 715 } else {
716 const auto sequence_number = packet.sequence_number;
717 const auto payload_type = packet.payload_type;
718 const Packet::Priority original_priority = packet.priority;
719 auto packet_from_result = [&] (AudioDecoder::ParseResult& result) {
720 Packet new_packet;
721 new_packet.sequence_number = sequence_number;
722 new_packet.payload_type = payload_type;
723 new_packet.timestamp = result.timestamp;
724 new_packet.priority.codec_level = result.priority;
725 new_packet.priority.red_level = original_priority.red_level;
726 new_packet.frame = std::move(result.frame);
727 return new_packet;
728 };
729
725 std::vector<AudioDecoder::ParseResult> results = 730 std::vector<AudioDecoder::ParseResult> results =
726 info->GetDecoder()->ParsePayload(std::move(packet->payload), 731 info->GetDecoder()->ParsePayload(std::move(packet.payload),
727 packet->timestamp); 732 packet.timestamp);
728 const auto sequence_number = packet->sequence_number; 733 if (results.empty()) {
729 const auto payload_type = packet->payload_type; 734 packet_list.pop_front();
730 const Packet::Priority original_priority = packet->priority; 735 } else {
731 for (auto& result : results) { 736 bool first = true;
732 RTC_DCHECK(result.frame); 737 for (auto& result : results) {
733 // Reuse the packet if possible. 738 RTC_DCHECK(result.frame);
734 if (!packet) { 739 RTC_DCHECK_GE(result.priority, 0);
735 packet.reset(new Packet); 740 if (first) {
736 packet->sequence_number = sequence_number; 741 // Re-use the node and move it to parsed_packet_list.
737 packet->payload_type = payload_type; 742 packet_list.front() = packet_from_result(result);
743 parsed_packet_list.splice(parsed_packet_list.end(), packet_list,
744 packet_list.begin());
745 first = false;
746 } else {
747 parsed_packet_list.push_back(packet_from_result(result));
748 }
738 } 749 }
739 packet->timestamp = result.timestamp;
740 RTC_DCHECK_GE(result.priority, 0);
741 packet->priority.codec_level = result.priority;
742 packet->priority.red_level = original_priority.red_level;
743 packet->frame = std::move(result.frame);
744 parsed_packet_list.push_back(packet.release());
745 } 750 }
746 } 751 }
747 } 752 }
748 753
749 // Insert packets in buffer. 754 // Insert packets in buffer.
750 const size_t buffer_length_before_insert = 755 const size_t buffer_length_before_insert =
751 packet_buffer_->NumPacketsInBuffer(); 756 packet_buffer_->NumPacketsInBuffer();
752 const int ret = packet_buffer_->InsertPacketList( 757 const int ret = packet_buffer_->InsertPacketList(
753 &parsed_packet_list, *decoder_database_, &current_rtp_payload_type_, 758 &parsed_packet_list, *decoder_database_, &current_rtp_payload_type_,
754 &current_cng_rtp_payload_type_); 759 &current_cng_rtp_payload_type_);
755 if (ret == PacketBuffer::kFlushed) { 760 if (ret == PacketBuffer::kFlushed) {
756 // Reset DSP timestamp etc. if packet buffer flushed. 761 // Reset DSP timestamp etc. if packet buffer flushed.
757 new_codec_ = true; 762 new_codec_ = true;
758 update_sample_rate_and_channels = true; 763 update_sample_rate_and_channels = true;
759 } else if (ret != PacketBuffer::kOK) { 764 } else if (ret != PacketBuffer::kOK) {
760 PacketBuffer::DeleteAllPackets(&parsed_packet_list);
761 return kOtherError; 765 return kOtherError;
762 } 766 }
763 767
764 if (first_packet_) { 768 if (first_packet_) {
765 first_packet_ = false; 769 first_packet_ = false;
766 // Update the codec on the next GetAudio call. 770 // Update the codec on the next GetAudio call.
767 new_codec_ = true; 771 new_codec_ = true;
768 } 772 }
769 773
770 if (current_rtp_payload_type_) { 774 if (current_rtp_payload_type_) {
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after
1337 int NetEqImpl::Decode(PacketList* packet_list, Operations* operation, 1341 int NetEqImpl::Decode(PacketList* packet_list, Operations* operation,
1338 int* decoded_length, 1342 int* decoded_length,
1339 AudioDecoder::SpeechType* speech_type) { 1343 AudioDecoder::SpeechType* speech_type) {
1340 *speech_type = AudioDecoder::kSpeech; 1344 *speech_type = AudioDecoder::kSpeech;
1341 1345
1342 // When packet_list is empty, we may be in kCodecInternalCng mode, and for 1346 // When packet_list is empty, we may be in kCodecInternalCng mode, and for
1343 // that we use current active decoder. 1347 // that we use current active decoder.
1344 AudioDecoder* decoder = decoder_database_->GetActiveDecoder(); 1348 AudioDecoder* decoder = decoder_database_->GetActiveDecoder();
1345 1349
1346 if (!packet_list->empty()) { 1350 if (!packet_list->empty()) {
1347 const Packet* packet = packet_list->front(); 1351 const Packet& packet = packet_list->front();
1348 uint8_t payload_type = packet->payload_type; 1352 uint8_t payload_type = packet.payload_type;
1349 if (!decoder_database_->IsComfortNoise(payload_type)) { 1353 if (!decoder_database_->IsComfortNoise(payload_type)) {
1350 decoder = decoder_database_->GetDecoder(payload_type); 1354 decoder = decoder_database_->GetDecoder(payload_type);
1351 assert(decoder); 1355 assert(decoder);
1352 if (!decoder) { 1356 if (!decoder) {
1353 LOG(LS_WARNING) << "Unknown payload type " 1357 LOG(LS_WARNING) << "Unknown payload type "
1354 << static_cast<int>(payload_type); 1358 << static_cast<int>(payload_type);
1355 PacketBuffer::DeleteAllPackets(packet_list); 1359 packet_list->clear();
1356 return kDecoderNotFound; 1360 return kDecoderNotFound;
1357 } 1361 }
1358 bool decoder_changed; 1362 bool decoder_changed;
1359 decoder_database_->SetActiveDecoder(payload_type, &decoder_changed); 1363 decoder_database_->SetActiveDecoder(payload_type, &decoder_changed);
1360 if (decoder_changed) { 1364 if (decoder_changed) {
1361 // We have a new decoder. Re-init some values. 1365 // We have a new decoder. Re-init some values.
1362 const DecoderDatabase::DecoderInfo* decoder_info = decoder_database_ 1366 const DecoderDatabase::DecoderInfo* decoder_info = decoder_database_
1363 ->GetDecoderInfo(payload_type); 1367 ->GetDecoderInfo(payload_type);
1364 assert(decoder_info); 1368 assert(decoder_info);
1365 if (!decoder_info) { 1369 if (!decoder_info) {
1366 LOG(LS_WARNING) << "Unknown payload type " 1370 LOG(LS_WARNING) << "Unknown payload type "
1367 << static_cast<int>(payload_type); 1371 << static_cast<int>(payload_type);
1368 PacketBuffer::DeleteAllPackets(packet_list); 1372 packet_list->clear();
1369 return kDecoderNotFound; 1373 return kDecoderNotFound;
1370 } 1374 }
1371 // If sampling rate or number of channels has changed, we need to make 1375 // If sampling rate or number of channels has changed, we need to make
1372 // a reset. 1376 // a reset.
1373 if (decoder_info->SampleRateHz() != fs_hz_ || 1377 if (decoder_info->SampleRateHz() != fs_hz_ ||
1374 decoder->Channels() != algorithm_buffer_->Channels()) { 1378 decoder->Channels() != algorithm_buffer_->Channels()) {
1375 // TODO(tlegrand): Add unittest to cover this event. 1379 // TODO(tlegrand): Add unittest to cover this event.
1376 SetSampleRateAndChannels(decoder_info->SampleRateHz(), 1380 SetSampleRateAndChannels(decoder_info->SampleRateHz(),
1377 decoder->Channels()); 1381 decoder->Channels());
1378 } 1382 }
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1468 LOG(LS_WARNING) << "Decoded too much CNG."; 1472 LOG(LS_WARNING) << "Decoded too much CNG.";
1469 return kDecodedTooMuch; 1473 return kDecodedTooMuch;
1470 } 1474 }
1471 } 1475 }
1472 return 0; 1476 return 0;
1473 } 1477 }
1474 1478
1475 int NetEqImpl::DecodeLoop(PacketList* packet_list, const Operations& operation, 1479 int NetEqImpl::DecodeLoop(PacketList* packet_list, const Operations& operation,
1476 AudioDecoder* decoder, int* decoded_length, 1480 AudioDecoder* decoder, int* decoded_length,
1477 AudioDecoder::SpeechType* speech_type) { 1481 AudioDecoder::SpeechType* speech_type) {
1478 Packet* packet = NULL;
1479 if (!packet_list->empty()) {
1480 packet = packet_list->front();
1481 }
1482
1483 // Do decoding. 1482 // Do decoding.
1484 while (packet && !decoder_database_->IsComfortNoise(packet->payload_type)) { 1483 while (
1484 !packet_list->empty() &&
1485 !decoder_database_->IsComfortNoise(packet_list->front().payload_type)) {
1485 assert(decoder); // At this point, we must have a decoder object. 1486 assert(decoder); // At this point, we must have a decoder object.
1486 // The number of channels in the |sync_buffer_| should be the same as the 1487 // The number of channels in the |sync_buffer_| should be the same as the
1487 // number decoder channels. 1488 // number decoder channels.
1488 assert(sync_buffer_->Channels() == decoder->Channels()); 1489 assert(sync_buffer_->Channels() == decoder->Channels());
1489 assert(decoded_buffer_length_ >= kMaxFrameSize * decoder->Channels()); 1490 assert(decoded_buffer_length_ >= kMaxFrameSize * decoder->Channels());
1490 assert(operation == kNormal || operation == kAccelerate || 1491 assert(operation == kNormal || operation == kAccelerate ||
1491 operation == kFastAccelerate || operation == kMerge || 1492 operation == kFastAccelerate || operation == kMerge ||
1492 operation == kPreemptiveExpand); 1493 operation == kPreemptiveExpand);
1493 packet_list->pop_front(); 1494
1494 auto opt_result = packet->frame->Decode( 1495 auto opt_result = packet_list->front().frame->Decode(
1495 rtc::ArrayView<int16_t>(&decoded_buffer_[*decoded_length], 1496 rtc::ArrayView<int16_t>(&decoded_buffer_[*decoded_length],
1496 decoded_buffer_length_ - *decoded_length)); 1497 decoded_buffer_length_ - *decoded_length));
1497 delete packet; 1498 packet_list->pop_front();
1498 packet = NULL;
1499 if (opt_result) { 1499 if (opt_result) {
1500 const auto& result = *opt_result; 1500 const auto& result = *opt_result;
1501 *speech_type = result.speech_type; 1501 *speech_type = result.speech_type;
1502 if (result.num_decoded_samples > 0) { 1502 if (result.num_decoded_samples > 0) {
1503 *decoded_length += rtc::checked_cast<int>(result.num_decoded_samples); 1503 *decoded_length += rtc::checked_cast<int>(result.num_decoded_samples);
1504 // Update |decoder_frame_length_| with number of samples per channel. 1504 // Update |decoder_frame_length_| with number of samples per channel.
1505 decoder_frame_length_ = 1505 decoder_frame_length_ =
1506 result.num_decoded_samples / decoder->Channels(); 1506 result.num_decoded_samples / decoder->Channels();
1507 } 1507 }
1508 } else { 1508 } else {
1509 // Error. 1509 // Error.
1510 // TODO(ossu): What to put here? 1510 // TODO(ossu): What to put here?
1511 LOG(LS_WARNING) << "Decode error"; 1511 LOG(LS_WARNING) << "Decode error";
1512 *decoded_length = -1; 1512 *decoded_length = -1;
1513 PacketBuffer::DeleteAllPackets(packet_list); 1513 packet_list->clear();
1514 break; 1514 break;
1515 } 1515 }
1516 if (*decoded_length > rtc::checked_cast<int>(decoded_buffer_length_)) { 1516 if (*decoded_length > rtc::checked_cast<int>(decoded_buffer_length_)) {
1517 // Guard against overflow. 1517 // Guard against overflow.
1518 LOG(LS_WARNING) << "Decoded too much."; 1518 LOG(LS_WARNING) << "Decoded too much.";
1519 PacketBuffer::DeleteAllPackets(packet_list); 1519 packet_list->clear();
1520 return kDecodedTooMuch; 1520 return kDecodedTooMuch;
1521 } 1521 }
1522 if (!packet_list->empty()) {
1523 packet = packet_list->front();
1524 } else {
1525 packet = NULL;
1526 }
1527 } // End of decode loop. 1522 } // End of decode loop.
1528 1523
1529 // If the list is not empty at this point, either a decoding error terminated 1524 // If the list is not empty at this point, either a decoding error terminated
1530 // the while-loop, or list must hold exactly one CNG packet. 1525 // the while-loop, or list must hold exactly one CNG packet.
1531 assert(packet_list->empty() || *decoded_length < 0 || 1526 assert(
1532 (packet_list->size() == 1 && packet && 1527 packet_list->empty() || *decoded_length < 0 ||
1533 decoder_database_->IsComfortNoise(packet->payload_type))); 1528 (packet_list->size() == 1 &&
1529 decoder_database_->IsComfortNoise(packet_list->front().payload_type)));
1534 return 0; 1530 return 0;
1535 } 1531 }
1536 1532
1537 void NetEqImpl::DoNormal(const int16_t* decoded_buffer, size_t decoded_length, 1533 void NetEqImpl::DoNormal(const int16_t* decoded_buffer, size_t decoded_length,
1538 AudioDecoder::SpeechType speech_type, bool play_dtmf) { 1534 AudioDecoder::SpeechType speech_type, bool play_dtmf) {
1539 assert(normal_.get()); 1535 assert(normal_.get());
1540 assert(mute_factor_array_.get()); 1536 assert(mute_factor_array_.get());
1541 normal_->Process(decoded_buffer, decoded_length, last_mode_, 1537 normal_->Process(decoded_buffer, decoded_length, last_mode_,
1542 mute_factor_array_.get(), algorithm_buffer_.get()); 1538 mute_factor_array_.get(), algorithm_buffer_.get());
1543 if (decoded_length != 0) { 1539 if (decoded_length != 0) {
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1763 dtmf_tone_generator_->Reset(); 1759 dtmf_tone_generator_->Reset();
1764 } 1760 }
1765 expand_->Reset(); 1761 expand_->Reset();
1766 return 0; 1762 return 0;
1767 } 1763 }
1768 1764
1769 int NetEqImpl::DoRfc3389Cng(PacketList* packet_list, bool play_dtmf) { 1765 int NetEqImpl::DoRfc3389Cng(PacketList* packet_list, bool play_dtmf) {
1770 if (!packet_list->empty()) { 1766 if (!packet_list->empty()) {
1771 // Must have exactly one SID frame at this point. 1767 // Must have exactly one SID frame at this point.
1772 assert(packet_list->size() == 1); 1768 assert(packet_list->size() == 1);
1773 Packet* packet = packet_list->front(); 1769 const Packet& packet = packet_list->front();
1774 packet_list->pop_front(); 1770 if (!decoder_database_->IsComfortNoise(packet.payload_type)) {
1775 if (!decoder_database_->IsComfortNoise(packet->payload_type)) {
1776 LOG(LS_ERROR) << "Trying to decode non-CNG payload as CNG."; 1771 LOG(LS_ERROR) << "Trying to decode non-CNG payload as CNG.";
1777 return kOtherError; 1772 return kOtherError;
1778 } 1773 }
1779 // UpdateParameters() deletes |packet|.
1780 if (comfort_noise_->UpdateParameters(packet) == 1774 if (comfort_noise_->UpdateParameters(packet) ==
1781 ComfortNoise::kInternalError) { 1775 ComfortNoise::kInternalError) {
1782 algorithm_buffer_->Zeros(output_size_samples_); 1776 algorithm_buffer_->Zeros(output_size_samples_);
1783 return -comfort_noise_->internal_error_code(); 1777 return -comfort_noise_->internal_error_code();
1784 } 1778 }
1785 } 1779 }
1786 int cn_return = comfort_noise_->Generate(output_size_samples_, 1780 int cn_return = comfort_noise_->Generate(output_size_samples_,
1787 algorithm_buffer_.get()); 1781 algorithm_buffer_.get());
1788 expand_->Reset(); 1782 expand_->Reset();
1789 last_mode_ = kModeRfc3389Cng; 1783 last_mode_ = kModeRfc3389Cng;
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
1953 if (!next_packet) { 1947 if (!next_packet) {
1954 LOG(LS_ERROR) << "Packet buffer unexpectedly empty."; 1948 LOG(LS_ERROR) << "Packet buffer unexpectedly empty.";
1955 return -1; 1949 return -1;
1956 } 1950 }
1957 uint32_t first_timestamp = next_packet->timestamp; 1951 uint32_t first_timestamp = next_packet->timestamp;
1958 size_t extracted_samples = 0; 1952 size_t extracted_samples = 0;
1959 1953
1960 // Packet extraction loop. 1954 // Packet extraction loop.
1961 do { 1955 do {
1962 timestamp_ = next_packet->timestamp; 1956 timestamp_ = next_packet->timestamp;
1963 size_t discard_count = 0; 1957 rtc::Optional<Packet> packet = packet_buffer_->GetNextPacket();
1964 Packet* packet = packet_buffer_->GetNextPacket(&discard_count);
1965 // |next_packet| may be invalid after the |packet_buffer_| operation. 1958 // |next_packet| may be invalid after the |packet_buffer_| operation.
1966 next_packet = NULL; 1959 next_packet = nullptr;
1967 if (!packet) { 1960 if (!packet) {
1968 LOG(LS_ERROR) << "Should always be able to extract a packet here"; 1961 LOG(LS_ERROR) << "Should always be able to extract a packet here";
1969 assert(false); // Should always be able to extract a packet here. 1962 assert(false); // Should always be able to extract a packet here.
1970 return -1; 1963 return -1;
1971 } 1964 }
1972 stats_.PacketsDiscarded(discard_count);
1973 stats_.StoreWaitingTime(packet->waiting_time->ElapsedMs()); 1965 stats_.StoreWaitingTime(packet->waiting_time->ElapsedMs());
1974 RTC_DCHECK(!packet->empty()); 1966 RTC_DCHECK(!packet->empty());
1975 packet_list->push_back(packet); // Store packet in list.
1976 1967
1977 if (first_packet) { 1968 if (first_packet) {
1978 first_packet = false; 1969 first_packet = false;
1979 if (nack_enabled_) { 1970 if (nack_enabled_) {
1980 RTC_DCHECK(nack_); 1971 RTC_DCHECK(nack_);
1981 // TODO(henrik.lundin): Should we update this for all decoded packets? 1972 // TODO(henrik.lundin): Should we update this for all decoded packets?
1982 nack_->UpdateLastDecodedPacket(packet->sequence_number, 1973 nack_->UpdateLastDecodedPacket(packet->sequence_number,
1983 packet->timestamp); 1974 packet->timestamp);
1984 } 1975 }
1985 prev_sequence_number = packet->sequence_number; 1976 prev_sequence_number = packet->sequence_number;
(...skipping 15 matching lines...) Expand all
2001 RTC_NOTREACHED(); 1992 RTC_NOTREACHED();
2002 } 1993 }
2003 1994
2004 if (packet_duration == 0) { 1995 if (packet_duration == 0) {
2005 // Decoder did not return a packet duration. Assume that the packet 1996 // Decoder did not return a packet duration. Assume that the packet
2006 // contains the same number of samples as the previous one. 1997 // contains the same number of samples as the previous one.
2007 packet_duration = decoder_frame_length_; 1998 packet_duration = decoder_frame_length_;
2008 } 1999 }
2009 extracted_samples = packet->timestamp - first_timestamp + packet_duration; 2000 extracted_samples = packet->timestamp - first_timestamp + packet_duration;
2010 2001
2002 packet_list->push_back(std::move(*packet)); // Store packet in list.
2003 packet = rtc::Optional<Packet>(); // Ensure it's never used after the move.
2004
2011 // Check what packet is available next. 2005 // Check what packet is available next.
2012 next_packet = packet_buffer_->PeekNextPacket(); 2006 next_packet = packet_buffer_->PeekNextPacket();
2013 next_packet_available = false; 2007 next_packet_available = false;
2014 if (next_packet && prev_payload_type == next_packet->payload_type) { 2008 if (next_packet && prev_payload_type == next_packet->payload_type) {
2015 int16_t seq_no_diff = next_packet->sequence_number - prev_sequence_number; 2009 int16_t seq_no_diff = next_packet->sequence_number - prev_sequence_number;
2016 size_t ts_diff = next_packet->timestamp - prev_timestamp; 2010 size_t ts_diff = next_packet->timestamp - prev_timestamp;
2017 if (seq_no_diff == 1 || 2011 if (seq_no_diff == 1 ||
2018 (seq_no_diff == 0 && ts_diff == decoder_frame_length_)) { 2012 (seq_no_diff == 0 && ts_diff == decoder_frame_length_)) {
2019 // The next sequence number is available, or the next part of a packet 2013 // The next sequence number is available, or the next part of a packet
2020 // that was split into pieces upon insertion. 2014 // that was split into pieces upon insertion.
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
2132 } 2126 }
2133 } 2127 }
2134 2128
2135 void NetEqImpl::CreateDecisionLogic() { 2129 void NetEqImpl::CreateDecisionLogic() {
2136 decision_logic_.reset(DecisionLogic::Create( 2130 decision_logic_.reset(DecisionLogic::Create(
2137 fs_hz_, output_size_samples_, playout_mode_, decoder_database_.get(), 2131 fs_hz_, output_size_samples_, playout_mode_, decoder_database_.get(),
2138 *packet_buffer_.get(), delay_manager_.get(), buffer_level_filter_.get(), 2132 *packet_buffer_.get(), delay_manager_.get(), buffer_level_filter_.get(),
2139 tick_timer_.get())); 2133 tick_timer_.get()));
2140 } 2134 }
2141 } // namespace webrtc 2135 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_coding/neteq/mock/mock_packet_buffer.h ('k') | webrtc/modules/audio_coding/neteq/neteq_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698