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 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 RTPHeader main_header; | |
| 585 { | 584 { | 
| 586 // Convert to Packet. | 585 // Convert to Packet. | 
| 587 // Create |packet| within this separate scope, since it should not be used | 586 // Create |packet| within this separate scope, since it should not be used | 
| 588 // directly once it's been inserted in the packet list. This way, |packet| | 587 // directly once it's been inserted in the packet list. This way, |packet| | 
| 589 // is not defined outside of this block. | 588 // is not defined outside of this block. | 
| 590 Packet* packet = new Packet; | 589 Packet* packet = new Packet; | 
| 591 packet->header.markerBit = false; | 590 packet->payloadType = rtp_header.header.payloadType; | 
| 592 packet->header.payloadType = rtp_header.header.payloadType; | 591 packet->sequenceNumber = rtp_header.header.sequenceNumber; | 
| 593 packet->header.sequenceNumber = rtp_header.header.sequenceNumber; | 592 packet->timestamp = rtp_header.header.timestamp; | 
| 594 packet->header.timestamp = rtp_header.header.timestamp; | |
| 595 packet->header.ssrc = rtp_header.header.ssrc; | |
| 596 packet->header.numCSRCs = 0; | |
| 597 packet->payload.SetData(payload.data(), payload.size()); | 593 packet->payload.SetData(payload.data(), payload.size()); | 
| 598 // Waiting time will be set upon inserting the packet in the buffer. | 594 // Waiting time will be set upon inserting the packet in the buffer. | 
| 599 RTC_DCHECK(!packet->waiting_time); | 595 RTC_DCHECK(!packet->waiting_time); | 
| 600 // Insert packet in a packet list. | 596 // Insert packet in a packet list. | 
| 601 packet_list.push_back(packet); | 597 packet_list.push_back(packet); | 
| 602 // Save main payloads header for later. | |
| 603 memcpy(&main_header, &packet->header, sizeof(main_header)); | |
| 604 } | 598 } | 
| 605 | 599 | 
| 606 bool update_sample_rate_and_channels = false; | 600 bool update_sample_rate_and_channels = false; | 
| 607 // Reinitialize NetEq if it's needed (changed SSRC or first call). | 601 // Reinitialize NetEq if it's needed (changed SSRC or first call). | 
| 608 if ((main_header.ssrc != ssrc_) || first_packet_) { | 602 if ((rtp_header.header.ssrc != ssrc_) || first_packet_) { | 
| 609 // Note: |first_packet_| will be cleared further down in this method, once | 603 // Note: |first_packet_| will be cleared further down in this method, once | 
| 610 // the packet has been successfully inserted into the packet buffer. | 604 // the packet has been successfully inserted into the packet buffer. | 
| 611 | 605 | 
| 612 rtcp_.Init(main_header.sequenceNumber); | 606 rtcp_.Init(rtp_header.header.sequenceNumber); | 
| 613 | 607 | 
| 614 // Flush the packet buffer and DTMF buffer. | 608 // Flush the packet buffer and DTMF buffer. | 
| 615 packet_buffer_->Flush(); | 609 packet_buffer_->Flush(); | 
| 616 dtmf_buffer_->Flush(); | 610 dtmf_buffer_->Flush(); | 
| 617 | 611 | 
| 618 // Store new SSRC. | 612 // Store new SSRC. | 
| 619 ssrc_ = main_header.ssrc; | 613 ssrc_ = rtp_header.header.ssrc; | 
| 620 | 614 | 
| 621 // Update audio buffer timestamp. | 615 // Update audio buffer timestamp. | 
| 622 sync_buffer_->IncreaseEndTimestamp(main_header.timestamp - timestamp_); | 616 sync_buffer_->IncreaseEndTimestamp(rtp_header.header.timestamp - | 
| 617 timestamp_); | |
| 623 | 618 | 
| 624 // Update codecs. | 619 // Update codecs. | 
| 625 timestamp_ = main_header.timestamp; | 620 timestamp_ = rtp_header.header.timestamp; | 
| 626 | 621 | 
| 627 // Reset timestamp scaling. | 622 // Reset timestamp scaling. | 
| 628 timestamp_scaler_->Reset(); | 623 timestamp_scaler_->Reset(); | 
| 629 | 624 | 
| 630 // Trigger an update of sampling rate and the number of channels. | 625 // Trigger an update of sampling rate and the number of channels. | 
| 631 update_sample_rate_and_channels = true; | 626 update_sample_rate_and_channels = true; | 
| 632 } | 627 } | 
| 633 | 628 | 
| 634 // Update RTCP statistics, only for regular packets. | 629 // Update RTCP statistics, only for regular packets. | 
| 635 rtcp_.Update(main_header, receive_timestamp); | 630 rtcp_.Update(rtp_header.header, receive_timestamp); | 
| 631 | |
| 632 if (nack_enabled_) { | |
| 633 RTC_DCHECK(nack_); | |
| 634 if (update_sample_rate_and_channels) { | |
| 635 nack_->Reset(); | |
| 636 } | |
| 637 nack_->UpdateLastReceivedPacket(rtp_header.header.sequenceNumber, | |
| 638 rtp_header.header.timestamp); | |
| 639 } | |
| 636 | 640 | 
| 637 // Check for RED payload type, and separate payloads into several packets. | 641 // Check for RED payload type, and separate payloads into several packets. | 
| 638 if (decoder_database_->IsRed(main_header.payloadType)) { | 642 if (decoder_database_->IsRed(rtp_header.header.payloadType)) { | 
| 639 if (!red_payload_splitter_->SplitRed(&packet_list)) { | 643 if (!red_payload_splitter_->SplitRed(&packet_list)) { | 
| 640 PacketBuffer::DeleteAllPackets(&packet_list); | 644 PacketBuffer::DeleteAllPackets(&packet_list); | 
| 641 return kRedundancySplitError; | 645 return kRedundancySplitError; | 
| 642 } | 646 } | 
| 643 // Only accept a few RED payloads of the same type as the main data, | 647 // Only accept a few RED payloads of the same type as the main data, | 
| 644 // DTMF events and CNG. | 648 // DTMF events and CNG. | 
| 645 red_payload_splitter_->CheckRedPayloads(&packet_list, *decoder_database_); | 649 red_payload_splitter_->CheckRedPayloads(&packet_list, *decoder_database_); | 
| 646 // Update the stored main payload header since the main payload has now | 650 // Update the main packet pointer since the main payload has now changed. | 
| 
 
hlundin-webrtc
2016/10/12 20:39:57
You are not updating the main packet pointer here.
 
ossu
2016/10/12 21:46:02
Heh, that's true!
 
 | |
| 647 // changed. | |
| 648 memcpy(&main_header, &packet_list.front()->header, sizeof(main_header)); | |
| 649 } | 651 } | 
| 650 | 652 | 
| 651 // Check payload types. | 653 // Check payload types. | 
| 652 if (decoder_database_->CheckPayloadTypes(packet_list) == | 654 if (decoder_database_->CheckPayloadTypes(packet_list) == | 
| 653 DecoderDatabase::kDecoderNotFound) { | 655 DecoderDatabase::kDecoderNotFound) { | 
| 654 PacketBuffer::DeleteAllPackets(&packet_list); | 656 PacketBuffer::DeleteAllPackets(&packet_list); | 
| 655 return kUnknownRtpPayloadType; | 657 return kUnknownRtpPayloadType; | 
| 656 } | 658 } | 
| 657 | 659 | 
| 660 RTC_DCHECK(!packet_list.empty()); | |
| 661 const uint32_t main_timestamp = packet_list.front()->timestamp; | |
| 662 const uint8_t main_payload_type = packet_list.front()->payloadType; | |
| 663 const uint16_t main_sequence_number = packet_list.front()->sequenceNumber; | |
| 664 | |
| 658 // Scale timestamp to internal domain (only for some codecs). | 665 // Scale timestamp to internal domain (only for some codecs). | 
| 659 timestamp_scaler_->ToInternal(&packet_list); | 666 timestamp_scaler_->ToInternal(&packet_list); | 
| 660 | 667 | 
| 661 // Process DTMF payloads. Cycle through the list of packets, and pick out any | 668 // Process DTMF payloads. Cycle through the list of packets, and pick out any | 
| 662 // DTMF payloads found. | 669 // DTMF payloads found. | 
| 663 PacketList::iterator it = packet_list.begin(); | 670 PacketList::iterator it = packet_list.begin(); | 
| 664 while (it != packet_list.end()) { | 671 while (it != packet_list.end()) { | 
| 665 Packet* current_packet = (*it); | 672 Packet* current_packet = (*it); | 
| 666 assert(current_packet); | 673 assert(current_packet); | 
| 667 assert(!current_packet->payload.empty()); | 674 assert(!current_packet->payload.empty()); | 
| 668 if (decoder_database_->IsDtmf(current_packet->header.payloadType)) { | 675 if (decoder_database_->IsDtmf(current_packet->payloadType)) { | 
| 669 DtmfEvent event; | 676 DtmfEvent event; | 
| 670 int ret = DtmfBuffer::ParseEvent(current_packet->header.timestamp, | 677 int ret = DtmfBuffer::ParseEvent(current_packet->timestamp, | 
| 671 current_packet->payload.data(), | 678 current_packet->payload.data(), | 
| 672 current_packet->payload.size(), &event); | 679 current_packet->payload.size(), &event); | 
| 673 if (ret != DtmfBuffer::kOK) { | 680 if (ret != DtmfBuffer::kOK) { | 
| 674 PacketBuffer::DeleteAllPackets(&packet_list); | 681 PacketBuffer::DeleteAllPackets(&packet_list); | 
| 675 return kDtmfParsingError; | 682 return kDtmfParsingError; | 
| 676 } | 683 } | 
| 677 if (dtmf_buffer_->InsertEvent(event) != DtmfBuffer::kOK) { | 684 if (dtmf_buffer_->InsertEvent(event) != DtmfBuffer::kOK) { | 
| 678 PacketBuffer::DeleteAllPackets(&packet_list); | 685 PacketBuffer::DeleteAllPackets(&packet_list); | 
| 679 return kDtmfInsertError; | 686 return kDtmfInsertError; | 
| 680 } | 687 } | 
| 681 delete current_packet; | 688 delete current_packet; | 
| 682 it = packet_list.erase(it); | 689 it = packet_list.erase(it); | 
| 683 } else { | 690 } else { | 
| 684 ++it; | 691 ++it; | 
| 685 } | 692 } | 
| 686 } | 693 } | 
| 687 | 694 | 
| 688 // Update bandwidth estimate, if the packet is not comfort noise. | 695 // Update bandwidth estimate, if the packet is not comfort noise. | 
| 689 if (!packet_list.empty() && | 696 if (!packet_list.empty() && | 
| 690 !decoder_database_->IsComfortNoise(main_header.payloadType)) { | 697 !decoder_database_->IsComfortNoise(main_payload_type)) { | 
| 691 // The list can be empty here if we got nothing but DTMF payloads. | 698 // The list can be empty here if we got nothing but DTMF payloads. | 
| 692 AudioDecoder* decoder = | 699 AudioDecoder* decoder = decoder_database_->GetDecoder(main_payload_type); | 
| 693 decoder_database_->GetDecoder(main_header.payloadType); | 700 RTC_DCHECK(decoder); // Should always get a valid object, since we have | 
| 694 assert(decoder); // Should always get a valid object, since we have | 701 // already checked that the payload types are known. | 
| 695 // already checked that the payload types are known. | |
| 696 decoder->IncomingPacket(packet_list.front()->payload.data(), | 702 decoder->IncomingPacket(packet_list.front()->payload.data(), | 
| 697 packet_list.front()->payload.size(), | 703 packet_list.front()->payload.size(), | 
| 698 packet_list.front()->header.sequenceNumber, | 704 packet_list.front()->sequenceNumber, | 
| 699 packet_list.front()->header.timestamp, | 705 packet_list.front()->timestamp, | 
| 700 receive_timestamp); | 706 receive_timestamp); | 
| 701 } | 707 } | 
| 702 | 708 | 
| 703 PacketList parsed_packet_list; | 709 PacketList parsed_packet_list; | 
| 704 while (!packet_list.empty()) { | 710 while (!packet_list.empty()) { | 
| 705 std::unique_ptr<Packet> packet(packet_list.front()); | 711 std::unique_ptr<Packet> packet(packet_list.front()); | 
| 706 packet_list.pop_front(); | 712 packet_list.pop_front(); | 
| 707 const DecoderDatabase::DecoderInfo* info = | 713 const DecoderDatabase::DecoderInfo* info = | 
| 708 decoder_database_->GetDecoderInfo(packet->header.payloadType); | 714 decoder_database_->GetDecoderInfo(packet->payloadType); | 
| 709 if (!info) { | 715 if (!info) { | 
| 710 LOG(LS_WARNING) << "SplitAudio unknown payload type"; | 716 LOG(LS_WARNING) << "SplitAudio unknown payload type"; | 
| 711 return kUnknownRtpPayloadType; | 717 return kUnknownRtpPayloadType; | 
| 712 } | 718 } | 
| 713 | 719 | 
| 714 if (info->IsComfortNoise()) { | 720 if (info->IsComfortNoise()) { | 
| 715 // Carry comfort noise packets along. | 721 // Carry comfort noise packets along. | 
| 716 parsed_packet_list.push_back(packet.release()); | 722 parsed_packet_list.push_back(packet.release()); | 
| 717 } else { | 723 } else { | 
| 718 std::vector<AudioDecoder::ParseResult> results = | 724 std::vector<AudioDecoder::ParseResult> results = | 
| 719 info->GetDecoder()->ParsePayload(std::move(packet->payload), | 725 info->GetDecoder()->ParsePayload(std::move(packet->payload), | 
| 720 packet->header.timestamp); | 726 packet->timestamp); | 
| 721 const RTPHeader& original_header = packet->header; | 727 const auto sequenceNumber = packet->sequenceNumber; | 
| 728 const auto payloadType = packet->payloadType; | |
| 722 const Packet::Priority original_priority = packet->priority; | 729 const Packet::Priority original_priority = packet->priority; | 
| 723 for (auto& result : results) { | 730 for (auto& result : results) { | 
| 724 RTC_DCHECK(result.frame); | 731 RTC_DCHECK(result.frame); | 
| 725 // Reuse the packet if possible. | 732 // Reuse the packet if possible. | 
| 726 if (!packet) { | 733 if (!packet) { | 
| 727 packet.reset(new Packet); | 734 packet.reset(new Packet); | 
| 728 packet->header = original_header; | 735 packet->sequenceNumber = sequenceNumber; | 
| 736 packet->payloadType = payloadType; | |
| 729 } | 737 } | 
| 730 packet->header.timestamp = result.timestamp; | 738 packet->timestamp = result.timestamp; | 
| 731 RTC_DCHECK_GE(result.priority, 0); | 739 RTC_DCHECK_GE(result.priority, 0); | 
| 732 packet->priority.codec_level = result.priority; | 740 packet->priority.codec_level = result.priority; | 
| 733 packet->priority.red_level = original_priority.red_level; | 741 packet->priority.red_level = original_priority.red_level; | 
| 734 packet->frame = std::move(result.frame); | 742 packet->frame = std::move(result.frame); | 
| 735 parsed_packet_list.push_back(packet.release()); | 743 parsed_packet_list.push_back(packet.release()); | 
| 736 } | 744 } | 
| 737 } | 745 } | 
| 738 } | 746 } | 
| 739 | 747 | 
| 740 if (nack_enabled_) { | |
| 741 RTC_DCHECK(nack_); | |
| 742 if (update_sample_rate_and_channels) { | |
| 743 nack_->Reset(); | |
| 744 } | |
| 745 nack_->UpdateLastReceivedPacket( | |
| 746 parsed_packet_list.front()->header.sequenceNumber, | |
| 747 parsed_packet_list.front()->header.timestamp); | |
| 748 } | |
| 749 | |
| 750 // Insert packets in buffer. | 748 // Insert packets in buffer. | 
| 751 const size_t buffer_length_before_insert = | 749 const size_t buffer_length_before_insert = | 
| 752 packet_buffer_->NumPacketsInBuffer(); | 750 packet_buffer_->NumPacketsInBuffer(); | 
| 753 const int ret = packet_buffer_->InsertPacketList( | 751 const int ret = packet_buffer_->InsertPacketList( | 
| 754 &parsed_packet_list, *decoder_database_, ¤t_rtp_payload_type_, | 752 &parsed_packet_list, *decoder_database_, ¤t_rtp_payload_type_, | 
| 755 ¤t_cng_rtp_payload_type_); | 753 ¤t_cng_rtp_payload_type_); | 
| 756 if (ret == PacketBuffer::kFlushed) { | 754 if (ret == PacketBuffer::kFlushed) { | 
| 757 // Reset DSP timestamp etc. if packet buffer flushed. | 755 // Reset DSP timestamp etc. if packet buffer flushed. | 
| 758 new_codec_ = true; | 756 new_codec_ = true; | 
| 759 update_sample_rate_and_channels = true; | 757 update_sample_rate_and_channels = true; | 
| (...skipping 14 matching lines...) Expand all Loading... | |
| 774 << " is unknown where it shouldn't be"; | 772 << " is unknown where it shouldn't be"; | 
| 775 } | 773 } | 
| 776 | 774 | 
| 777 if (update_sample_rate_and_channels && !packet_buffer_->Empty()) { | 775 if (update_sample_rate_and_channels && !packet_buffer_->Empty()) { | 
| 778 // We do not use |current_rtp_payload_type_| to |set payload_type|, but | 776 // We do not use |current_rtp_payload_type_| to |set payload_type|, but | 
| 779 // get the next RTP header from |packet_buffer_| to obtain the payload type. | 777 // get the next RTP header from |packet_buffer_| to obtain the payload type. | 
| 780 // The reason for it is the following corner case. If NetEq receives a | 778 // The reason for it is the following corner case. If NetEq receives a | 
| 781 // CNG packet with a sample rate different than the current CNG then it | 779 // CNG packet with a sample rate different than the current CNG then it | 
| 782 // flushes its buffer, assuming send codec must have been changed. However, | 780 // flushes its buffer, assuming send codec must have been changed. However, | 
| 783 // payload type of the hypothetically new send codec is not known. | 781 // payload type of the hypothetically new send codec is not known. | 
| 784 const RTPHeader* rtp_header = packet_buffer_->NextRtpHeader(); | 782 const Packet* next_packet = packet_buffer_->PeekNextPacket(); | 
| 785 assert(rtp_header); | 783 RTC_DCHECK(next_packet); | 
| 786 int payload_type = rtp_header->payloadType; | 784 const int payload_type = next_packet->payloadType; | 
| 787 size_t channels = 1; | 785 size_t channels = 1; | 
| 788 if (!decoder_database_->IsComfortNoise(payload_type)) { | 786 if (!decoder_database_->IsComfortNoise(payload_type)) { | 
| 789 AudioDecoder* decoder = decoder_database_->GetDecoder(payload_type); | 787 AudioDecoder* decoder = decoder_database_->GetDecoder(payload_type); | 
| 790 assert(decoder); // Payloads are already checked to be valid. | 788 assert(decoder); // Payloads are already checked to be valid. | 
| 791 channels = decoder->Channels(); | 789 channels = decoder->Channels(); | 
| 792 } | 790 } | 
| 793 const DecoderDatabase::DecoderInfo* decoder_info = | 791 const DecoderDatabase::DecoderInfo* decoder_info = | 
| 794 decoder_database_->GetDecoderInfo(payload_type); | 792 decoder_database_->GetDecoderInfo(payload_type); | 
| 795 assert(decoder_info); | 793 assert(decoder_info); | 
| 796 if (decoder_info->SampleRateHz() != fs_hz_ || | 794 if (decoder_info->SampleRateHz() != fs_hz_ || | 
| 797 channels != algorithm_buffer_->Channels()) { | 795 channels != algorithm_buffer_->Channels()) { | 
| 798 SetSampleRateAndChannels(decoder_info->SampleRateHz(), | 796 SetSampleRateAndChannels(decoder_info->SampleRateHz(), | 
| 799 channels); | 797 channels); | 
| 800 } | 798 } | 
| 801 if (nack_enabled_) { | 799 if (nack_enabled_) { | 
| 802 RTC_DCHECK(nack_); | 800 RTC_DCHECK(nack_); | 
| 803 // Update the sample rate even if the rate is not new, because of Reset(). | 801 // Update the sample rate even if the rate is not new, because of Reset(). | 
| 804 nack_->UpdateSampleRate(fs_hz_); | 802 nack_->UpdateSampleRate(fs_hz_); | 
| 805 } | 803 } | 
| 806 } | 804 } | 
| 807 | 805 | 
| 808 // TODO(hlundin): Move this code to DelayManager class. | 806 // TODO(hlundin): Move this code to DelayManager class. | 
| 809 const DecoderDatabase::DecoderInfo* dec_info = | 807 const DecoderDatabase::DecoderInfo* dec_info = | 
| 810 decoder_database_->GetDecoderInfo(main_header.payloadType); | 808 decoder_database_->GetDecoderInfo(main_payload_type); | 
| 811 assert(dec_info); // Already checked that the payload type is known. | 809 assert(dec_info); // Already checked that the payload type is known. | 
| 812 delay_manager_->LastDecodedWasCngOrDtmf(dec_info->IsComfortNoise() || | 810 delay_manager_->LastDecodedWasCngOrDtmf(dec_info->IsComfortNoise() || | 
| 813 dec_info->IsDtmf()); | 811 dec_info->IsDtmf()); | 
| 814 if (delay_manager_->last_pack_cng_or_dtmf() == 0) { | 812 if (delay_manager_->last_pack_cng_or_dtmf() == 0) { | 
| 815 // Calculate the total speech length carried in each packet. | 813 // Calculate the total speech length carried in each packet. | 
| 816 const size_t buffer_length_after_insert = | 814 const size_t buffer_length_after_insert = | 
| 817 packet_buffer_->NumPacketsInBuffer(); | 815 packet_buffer_->NumPacketsInBuffer(); | 
| 818 | 816 | 
| 819 if (buffer_length_after_insert > buffer_length_before_insert) { | 817 if (buffer_length_after_insert > buffer_length_before_insert) { | 
| 820 const size_t packet_length_samples = | 818 const size_t packet_length_samples = | 
| 821 (buffer_length_after_insert - buffer_length_before_insert) * | 819 (buffer_length_after_insert - buffer_length_before_insert) * | 
| 822 decoder_frame_length_; | 820 decoder_frame_length_; | 
| 823 if (packet_length_samples != decision_logic_->packet_length_samples()) { | 821 if (packet_length_samples != decision_logic_->packet_length_samples()) { | 
| 824 decision_logic_->set_packet_length_samples(packet_length_samples); | 822 decision_logic_->set_packet_length_samples(packet_length_samples); | 
| 825 delay_manager_->SetPacketAudioLength( | 823 delay_manager_->SetPacketAudioLength( | 
| 826 rtc::checked_cast<int>((1000 * packet_length_samples) / fs_hz_)); | 824 rtc::checked_cast<int>((1000 * packet_length_samples) / fs_hz_)); | 
| 827 } | 825 } | 
| 828 } | 826 } | 
| 829 | 827 | 
| 830 // Update statistics. | 828 // Update statistics. | 
| 831 if ((int32_t) (main_header.timestamp - timestamp_) >= 0 && | 829 if ((int32_t)(main_timestamp - timestamp_) >= 0 && !new_codec_) { | 
| 832 !new_codec_) { | |
| 833 // Only update statistics if incoming packet is not older than last played | 830 // Only update statistics if incoming packet is not older than last played | 
| 834 // out packet, and if new codec flag is not set. | 831 // out packet, and if new codec flag is not set. | 
| 835 delay_manager_->Update(main_header.sequenceNumber, main_header.timestamp, | 832 delay_manager_->Update(main_sequence_number, main_timestamp, fs_hz_); | 
| 836 fs_hz_); | |
| 837 } | 833 } | 
| 838 } else if (delay_manager_->last_pack_cng_or_dtmf() == -1) { | 834 } else if (delay_manager_->last_pack_cng_or_dtmf() == -1) { | 
| 839 // This is first "normal" packet after CNG or DTMF. | 835 // This is first "normal" packet after CNG or DTMF. | 
| 840 // Reset packet time counter and measure time until next packet, | 836 // Reset packet time counter and measure time until next packet, | 
| 841 // but don't update statistics. | 837 // but don't update statistics. | 
| 842 delay_manager_->set_last_pack_cng_or_dtmf(0); | 838 delay_manager_->set_last_pack_cng_or_dtmf(0); | 
| 843 delay_manager_->ResetPacketIatCount(); | 839 delay_manager_->ResetPacketIatCount(); | 
| 844 } | 840 } | 
| 845 return 0; | 841 return 0; | 
| 846 } | 842 } | 
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1084 // Initialize output variables. | 1080 // Initialize output variables. | 
| 1085 *play_dtmf = false; | 1081 *play_dtmf = false; | 
| 1086 *operation = kUndefined; | 1082 *operation = kUndefined; | 
| 1087 | 1083 | 
| 1088 assert(sync_buffer_.get()); | 1084 assert(sync_buffer_.get()); | 
| 1089 uint32_t end_timestamp = sync_buffer_->end_timestamp(); | 1085 uint32_t end_timestamp = sync_buffer_->end_timestamp(); | 
| 1090 if (!new_codec_) { | 1086 if (!new_codec_) { | 
| 1091 const uint32_t five_seconds_samples = 5 * fs_hz_; | 1087 const uint32_t five_seconds_samples = 5 * fs_hz_; | 
| 1092 packet_buffer_->DiscardOldPackets(end_timestamp, five_seconds_samples); | 1088 packet_buffer_->DiscardOldPackets(end_timestamp, five_seconds_samples); | 
| 1093 } | 1089 } | 
| 1094 const RTPHeader* header = packet_buffer_->NextRtpHeader(); | 1090 const Packet* packet = packet_buffer_->PeekNextPacket(); | 
| 1095 | 1091 | 
| 1096 RTC_DCHECK(!generated_noise_stopwatch_ || | 1092 RTC_DCHECK(!generated_noise_stopwatch_ || | 
| 1097 generated_noise_stopwatch_->ElapsedTicks() >= 1); | 1093 generated_noise_stopwatch_->ElapsedTicks() >= 1); | 
| 1098 uint64_t generated_noise_samples = | 1094 uint64_t generated_noise_samples = | 
| 1099 generated_noise_stopwatch_ | 1095 generated_noise_stopwatch_ | 
| 1100 ? (generated_noise_stopwatch_->ElapsedTicks() - 1) * | 1096 ? (generated_noise_stopwatch_->ElapsedTicks() - 1) * | 
| 1101 output_size_samples_ + | 1097 output_size_samples_ + | 
| 1102 decision_logic_->noise_fast_forward() | 1098 decision_logic_->noise_fast_forward() | 
| 1103 : 0; | 1099 : 0; | 
| 1104 | 1100 | 
| 1105 if (decision_logic_->CngRfc3389On() || last_mode_ == kModeRfc3389Cng) { | 1101 if (decision_logic_->CngRfc3389On() || last_mode_ == kModeRfc3389Cng) { | 
| 1106 // Because of timestamp peculiarities, we have to "manually" disallow using | 1102 // Because of timestamp peculiarities, we have to "manually" disallow using | 
| 1107 // a CNG packet with the same timestamp as the one that was last played. | 1103 // a CNG packet with the same timestamp as the one that was last played. | 
| 1108 // This can happen when using redundancy and will cause the timing to shift. | 1104 // This can happen when using redundancy and will cause the timing to shift. | 
| 1109 while (header && decoder_database_->IsComfortNoise(header->payloadType) && | 1105 while (packet && decoder_database_->IsComfortNoise(packet->payloadType) && | 
| 1110 (end_timestamp >= header->timestamp || | 1106 (end_timestamp >= packet->timestamp || | 
| 1111 end_timestamp + generated_noise_samples > header->timestamp)) { | 1107 end_timestamp + generated_noise_samples > packet->timestamp)) { | 
| 1112 // Don't use this packet, discard it. | 1108 // Don't use this packet, discard it. | 
| 1113 if (packet_buffer_->DiscardNextPacket() != PacketBuffer::kOK) { | 1109 if (packet_buffer_->DiscardNextPacket() != PacketBuffer::kOK) { | 
| 1114 assert(false); // Must be ok by design. | 1110 assert(false); // Must be ok by design. | 
| 1115 } | 1111 } | 
| 1116 // Check buffer again. | 1112 // Check buffer again. | 
| 1117 if (!new_codec_) { | 1113 if (!new_codec_) { | 
| 1118 packet_buffer_->DiscardOldPackets(end_timestamp, 5 * fs_hz_); | 1114 packet_buffer_->DiscardOldPackets(end_timestamp, 5 * fs_hz_); | 
| 1119 } | 1115 } | 
| 1120 header = packet_buffer_->NextRtpHeader(); | 1116 packet = packet_buffer_->PeekNextPacket(); | 
| 1121 } | 1117 } | 
| 1122 } | 1118 } | 
| 1123 | 1119 | 
| 1124 assert(expand_.get()); | 1120 assert(expand_.get()); | 
| 1125 const int samples_left = static_cast<int>(sync_buffer_->FutureLength() - | 1121 const int samples_left = static_cast<int>(sync_buffer_->FutureLength() - | 
| 1126 expand_->overlap_length()); | 1122 expand_->overlap_length()); | 
| 1127 if (last_mode_ == kModeAccelerateSuccess || | 1123 if (last_mode_ == kModeAccelerateSuccess || | 
| 1128 last_mode_ == kModeAccelerateLowEnergy || | 1124 last_mode_ == kModeAccelerateLowEnergy || | 
| 1129 last_mode_ == kModePreemptiveExpandSuccess || | 1125 last_mode_ == kModePreemptiveExpandSuccess || | 
| 1130 last_mode_ == kModePreemptiveExpandLowEnergy) { | 1126 last_mode_ == kModePreemptiveExpandLowEnergy) { | 
| (...skipping 12 matching lines...) Expand all Loading... | |
| 1143 | 1139 | 
| 1144 // Get instruction. | 1140 // Get instruction. | 
| 1145 assert(sync_buffer_.get()); | 1141 assert(sync_buffer_.get()); | 
| 1146 assert(expand_.get()); | 1142 assert(expand_.get()); | 
| 1147 generated_noise_samples = | 1143 generated_noise_samples = | 
| 1148 generated_noise_stopwatch_ | 1144 generated_noise_stopwatch_ | 
| 1149 ? generated_noise_stopwatch_->ElapsedTicks() * output_size_samples_ + | 1145 ? generated_noise_stopwatch_->ElapsedTicks() * output_size_samples_ + | 
| 1150 decision_logic_->noise_fast_forward() | 1146 decision_logic_->noise_fast_forward() | 
| 1151 : 0; | 1147 : 0; | 
| 1152 *operation = decision_logic_->GetDecision( | 1148 *operation = decision_logic_->GetDecision( | 
| 1153 *sync_buffer_, *expand_, decoder_frame_length_, header, last_mode_, | 1149 *sync_buffer_, *expand_, decoder_frame_length_, packet, last_mode_, | 
| 1154 *play_dtmf, generated_noise_samples, &reset_decoder_); | 1150 *play_dtmf, generated_noise_samples, &reset_decoder_); | 
| 1155 | 1151 | 
| 1156 // Check if we already have enough samples in the |sync_buffer_|. If so, | 1152 // Check if we already have enough samples in the |sync_buffer_|. If so, | 
| 1157 // change decision to normal, unless the decision was merge, accelerate, or | 1153 // change decision to normal, unless the decision was merge, accelerate, or | 
| 1158 // preemptive expand. | 1154 // preemptive expand. | 
| 1159 if (samples_left >= rtc::checked_cast<int>(output_size_samples_) && | 1155 if (samples_left >= rtc::checked_cast<int>(output_size_samples_) && | 
| 1160 *operation != kMerge && | 1156 *operation != kMerge && | 
| 1161 *operation != kAccelerate && | 1157 *operation != kAccelerate && | 
| 1162 *operation != kFastAccelerate && | 1158 *operation != kFastAccelerate && | 
| 1163 *operation != kPreemptiveExpand) { | 1159 *operation != kPreemptiveExpand) { | 
| 1164 *operation = kNormal; | 1160 *operation = kNormal; | 
| 1165 return 0; | 1161 return 0; | 
| 1166 } | 1162 } | 
| 1167 | 1163 | 
| 1168 decision_logic_->ExpandDecision(*operation); | 1164 decision_logic_->ExpandDecision(*operation); | 
| 1169 | 1165 | 
| 1170 // Check conditions for reset. | 1166 // Check conditions for reset. | 
| 1171 if (new_codec_ || *operation == kUndefined) { | 1167 if (new_codec_ || *operation == kUndefined) { | 
| 1172 // The only valid reason to get kUndefined is that new_codec_ is set. | 1168 // The only valid reason to get kUndefined is that new_codec_ is set. | 
| 1173 assert(new_codec_); | 1169 assert(new_codec_); | 
| 1174 if (*play_dtmf && !header) { | 1170 if (*play_dtmf && !packet) { | 
| 1175 timestamp_ = dtmf_event->timestamp; | 1171 timestamp_ = dtmf_event->timestamp; | 
| 1176 } else { | 1172 } else { | 
| 1177 if (!header) { | 1173 if (!packet) { | 
| 1178 LOG(LS_ERROR) << "Packet missing where it shouldn't."; | 1174 LOG(LS_ERROR) << "Packet missing where it shouldn't."; | 
| 1179 return -1; | 1175 return -1; | 
| 1180 } | 1176 } | 
| 1181 timestamp_ = header->timestamp; | 1177 timestamp_ = packet->timestamp; | 
| 1182 if (*operation == kRfc3389CngNoPacket && | 1178 if (*operation == kRfc3389CngNoPacket && | 
| 1183 decoder_database_->IsComfortNoise(header->payloadType)) { | 1179 decoder_database_->IsComfortNoise(packet->payloadType)) { | 
| 1184 // Change decision to CNG packet, since we do have a CNG packet, but it | 1180 // Change decision to CNG packet, since we do have a CNG packet, but it | 
| 1185 // was considered too early to use. Now, use it anyway. | 1181 // was considered too early to use. Now, use it anyway. | 
| 1186 *operation = kRfc3389Cng; | 1182 *operation = kRfc3389Cng; | 
| 1187 } else if (*operation != kRfc3389Cng) { | 1183 } else if (*operation != kRfc3389Cng) { | 
| 1188 *operation = kNormal; | 1184 *operation = kNormal; | 
| 1189 } | 1185 } | 
| 1190 } | 1186 } | 
| 1191 // Adjust |sync_buffer_| timestamp before setting |end_timestamp| to the | 1187 // Adjust |sync_buffer_| timestamp before setting |end_timestamp| to the | 
| 1192 // new value. | 1188 // new value. | 
| 1193 sync_buffer_->IncreaseEndTimestamp(timestamp_ - end_timestamp); | 1189 sync_buffer_->IncreaseEndTimestamp(timestamp_ - end_timestamp); | 
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1287 std::max(merge_->RequiredFutureSamples(), required_samples); | 1283 std::max(merge_->RequiredFutureSamples(), required_samples); | 
| 1288 break; | 1284 break; | 
| 1289 } | 1285 } | 
| 1290 default: { | 1286 default: { | 
| 1291 // Do nothing. | 1287 // Do nothing. | 
| 1292 } | 1288 } | 
| 1293 } | 1289 } | 
| 1294 | 1290 | 
| 1295 // Get packets from buffer. | 1291 // Get packets from buffer. | 
| 1296 int extracted_samples = 0; | 1292 int extracted_samples = 0; | 
| 1297 if (header && | 1293 if (packet && *operation != kAlternativePlc && | 
| 1298 *operation != kAlternativePlc && | |
| 1299 *operation != kAlternativePlcIncreaseTimestamp && | 1294 *operation != kAlternativePlcIncreaseTimestamp && | 
| 1300 *operation != kAudioRepetition && | 1295 *operation != kAudioRepetition && | 
| 1301 *operation != kAudioRepetitionIncreaseTimestamp) { | 1296 *operation != kAudioRepetitionIncreaseTimestamp) { | 
| 1302 sync_buffer_->IncreaseEndTimestamp(header->timestamp - end_timestamp); | 1297 sync_buffer_->IncreaseEndTimestamp(packet->timestamp - end_timestamp); | 
| 1303 if (decision_logic_->CngOff()) { | 1298 if (decision_logic_->CngOff()) { | 
| 1304 // Adjustment of timestamp only corresponds to an actual packet loss | 1299 // Adjustment of timestamp only corresponds to an actual packet loss | 
| 1305 // if comfort noise is not played. If comfort noise was just played, | 1300 // if comfort noise is not played. If comfort noise was just played, | 
| 1306 // this adjustment of timestamp is only done to get back in sync with the | 1301 // this adjustment of timestamp is only done to get back in sync with the | 
| 1307 // stream timestamp; no loss to report. | 1302 // stream timestamp; no loss to report. | 
| 1308 stats_.LostSamples(header->timestamp - end_timestamp); | 1303 stats_.LostSamples(packet->timestamp - end_timestamp); | 
| 1309 } | 1304 } | 
| 1310 | 1305 | 
| 1311 if (*operation != kRfc3389Cng) { | 1306 if (*operation != kRfc3389Cng) { | 
| 1312 // We are about to decode and use a non-CNG packet. | 1307 // We are about to decode and use a non-CNG packet. | 
| 1313 decision_logic_->SetCngOff(); | 1308 decision_logic_->SetCngOff(); | 
| 1314 } | 1309 } | 
| 1315 | 1310 | 
| 1316 extracted_samples = ExtractPackets(required_samples, packet_list); | 1311 extracted_samples = ExtractPackets(required_samples, packet_list); | 
| 1317 if (extracted_samples < 0) { | 1312 if (extracted_samples < 0) { | 
| 1318 return kPacketBufferCorruption; | 1313 return kPacketBufferCorruption; | 
| (...skipping 23 matching lines...) Expand all Loading... | |
| 1342 int* decoded_length, | 1337 int* decoded_length, | 
| 1343 AudioDecoder::SpeechType* speech_type) { | 1338 AudioDecoder::SpeechType* speech_type) { | 
| 1344 *speech_type = AudioDecoder::kSpeech; | 1339 *speech_type = AudioDecoder::kSpeech; | 
| 1345 | 1340 | 
| 1346 // When packet_list is empty, we may be in kCodecInternalCng mode, and for | 1341 // When packet_list is empty, we may be in kCodecInternalCng mode, and for | 
| 1347 // that we use current active decoder. | 1342 // that we use current active decoder. | 
| 1348 AudioDecoder* decoder = decoder_database_->GetActiveDecoder(); | 1343 AudioDecoder* decoder = decoder_database_->GetActiveDecoder(); | 
| 1349 | 1344 | 
| 1350 if (!packet_list->empty()) { | 1345 if (!packet_list->empty()) { | 
| 1351 const Packet* packet = packet_list->front(); | 1346 const Packet* packet = packet_list->front(); | 
| 1352 uint8_t payload_type = packet->header.payloadType; | 1347 uint8_t payload_type = packet->payloadType; | 
| 1353 if (!decoder_database_->IsComfortNoise(payload_type)) { | 1348 if (!decoder_database_->IsComfortNoise(payload_type)) { | 
| 1354 decoder = decoder_database_->GetDecoder(payload_type); | 1349 decoder = decoder_database_->GetDecoder(payload_type); | 
| 1355 assert(decoder); | 1350 assert(decoder); | 
| 1356 if (!decoder) { | 1351 if (!decoder) { | 
| 1357 LOG(LS_WARNING) << "Unknown payload type " | 1352 LOG(LS_WARNING) << "Unknown payload type " | 
| 1358 << static_cast<int>(payload_type); | 1353 << static_cast<int>(payload_type); | 
| 1359 PacketBuffer::DeleteAllPackets(packet_list); | 1354 PacketBuffer::DeleteAllPackets(packet_list); | 
| 1360 return kDecoderNotFound; | 1355 return kDecoderNotFound; | 
| 1361 } | 1356 } | 
| 1362 bool decoder_changed; | 1357 bool decoder_changed; | 
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1478 | 1473 | 
| 1479 int NetEqImpl::DecodeLoop(PacketList* packet_list, const Operations& operation, | 1474 int NetEqImpl::DecodeLoop(PacketList* packet_list, const Operations& operation, | 
| 1480 AudioDecoder* decoder, int* decoded_length, | 1475 AudioDecoder* decoder, int* decoded_length, | 
| 1481 AudioDecoder::SpeechType* speech_type) { | 1476 AudioDecoder::SpeechType* speech_type) { | 
| 1482 Packet* packet = NULL; | 1477 Packet* packet = NULL; | 
| 1483 if (!packet_list->empty()) { | 1478 if (!packet_list->empty()) { | 
| 1484 packet = packet_list->front(); | 1479 packet = packet_list->front(); | 
| 1485 } | 1480 } | 
| 1486 | 1481 | 
| 1487 // Do decoding. | 1482 // Do decoding. | 
| 1488 while (packet && | 1483 while (packet && !decoder_database_->IsComfortNoise(packet->payloadType)) { | 
| 1489 !decoder_database_->IsComfortNoise(packet->header.payloadType)) { | |
| 1490 assert(decoder); // At this point, we must have a decoder object. | 1484 assert(decoder); // At this point, we must have a decoder object. | 
| 1491 // The number of channels in the |sync_buffer_| should be the same as the | 1485 // The number of channels in the |sync_buffer_| should be the same as the | 
| 1492 // number decoder channels. | 1486 // number decoder channels. | 
| 1493 assert(sync_buffer_->Channels() == decoder->Channels()); | 1487 assert(sync_buffer_->Channels() == decoder->Channels()); | 
| 1494 assert(decoded_buffer_length_ >= kMaxFrameSize * decoder->Channels()); | 1488 assert(decoded_buffer_length_ >= kMaxFrameSize * decoder->Channels()); | 
| 1495 assert(operation == kNormal || operation == kAccelerate || | 1489 assert(operation == kNormal || operation == kAccelerate || | 
| 1496 operation == kFastAccelerate || operation == kMerge || | 1490 operation == kFastAccelerate || operation == kMerge || | 
| 1497 operation == kPreemptiveExpand); | 1491 operation == kPreemptiveExpand); | 
| 1498 packet_list->pop_front(); | 1492 packet_list->pop_front(); | 
| 1499 auto opt_result = packet->frame->Decode( | 1493 auto opt_result = packet->frame->Decode( | 
| (...skipping 28 matching lines...) Expand all Loading... | |
| 1528 packet = packet_list->front(); | 1522 packet = packet_list->front(); | 
| 1529 } else { | 1523 } else { | 
| 1530 packet = NULL; | 1524 packet = NULL; | 
| 1531 } | 1525 } | 
| 1532 } // End of decode loop. | 1526 } // End of decode loop. | 
| 1533 | 1527 | 
| 1534 // If the list is not empty at this point, either a decoding error terminated | 1528 // If the list is not empty at this point, either a decoding error terminated | 
| 1535 // the while-loop, or list must hold exactly one CNG packet. | 1529 // the while-loop, or list must hold exactly one CNG packet. | 
| 1536 assert(packet_list->empty() || *decoded_length < 0 || | 1530 assert(packet_list->empty() || *decoded_length < 0 || | 
| 1537 (packet_list->size() == 1 && packet && | 1531 (packet_list->size() == 1 && packet && | 
| 1538 decoder_database_->IsComfortNoise(packet->header.payloadType))); | 1532 decoder_database_->IsComfortNoise(packet->payloadType))); | 
| 1539 return 0; | 1533 return 0; | 
| 1540 } | 1534 } | 
| 1541 | 1535 | 
| 1542 void NetEqImpl::DoNormal(const int16_t* decoded_buffer, size_t decoded_length, | 1536 void NetEqImpl::DoNormal(const int16_t* decoded_buffer, size_t decoded_length, | 
| 1543 AudioDecoder::SpeechType speech_type, bool play_dtmf) { | 1537 AudioDecoder::SpeechType speech_type, bool play_dtmf) { | 
| 1544 assert(normal_.get()); | 1538 assert(normal_.get()); | 
| 1545 assert(mute_factor_array_.get()); | 1539 assert(mute_factor_array_.get()); | 
| 1546 normal_->Process(decoded_buffer, decoded_length, last_mode_, | 1540 normal_->Process(decoded_buffer, decoded_length, last_mode_, | 
| 1547 mute_factor_array_.get(), algorithm_buffer_.get()); | 1541 mute_factor_array_.get(), algorithm_buffer_.get()); | 
| 1548 if (decoded_length != 0) { | 1542 if (decoded_length != 0) { | 
| (...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1770 expand_->Reset(); | 1764 expand_->Reset(); | 
| 1771 return 0; | 1765 return 0; | 
| 1772 } | 1766 } | 
| 1773 | 1767 | 
| 1774 int NetEqImpl::DoRfc3389Cng(PacketList* packet_list, bool play_dtmf) { | 1768 int NetEqImpl::DoRfc3389Cng(PacketList* packet_list, bool play_dtmf) { | 
| 1775 if (!packet_list->empty()) { | 1769 if (!packet_list->empty()) { | 
| 1776 // Must have exactly one SID frame at this point. | 1770 // Must have exactly one SID frame at this point. | 
| 1777 assert(packet_list->size() == 1); | 1771 assert(packet_list->size() == 1); | 
| 1778 Packet* packet = packet_list->front(); | 1772 Packet* packet = packet_list->front(); | 
| 1779 packet_list->pop_front(); | 1773 packet_list->pop_front(); | 
| 1780 if (!decoder_database_->IsComfortNoise(packet->header.payloadType)) { | 1774 if (!decoder_database_->IsComfortNoise(packet->payloadType)) { | 
| 1781 LOG(LS_ERROR) << "Trying to decode non-CNG payload as CNG."; | 1775 LOG(LS_ERROR) << "Trying to decode non-CNG payload as CNG."; | 
| 1782 return kOtherError; | 1776 return kOtherError; | 
| 1783 } | 1777 } | 
| 1784 // UpdateParameters() deletes |packet|. | 1778 // UpdateParameters() deletes |packet|. | 
| 1785 if (comfort_noise_->UpdateParameters(packet) == | 1779 if (comfort_noise_->UpdateParameters(packet) == | 
| 1786 ComfortNoise::kInternalError) { | 1780 ComfortNoise::kInternalError) { | 
| 1787 algorithm_buffer_->Zeros(output_size_samples_); | 1781 algorithm_buffer_->Zeros(output_size_samples_); | 
| 1788 return -comfort_noise_->internal_error_code(); | 1782 return -comfort_noise_->internal_error_code(); | 
| 1789 } | 1783 } | 
| 1790 } | 1784 } | 
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1946 } | 1940 } | 
| 1947 | 1941 | 
| 1948 int NetEqImpl::ExtractPackets(size_t required_samples, | 1942 int NetEqImpl::ExtractPackets(size_t required_samples, | 
| 1949 PacketList* packet_list) { | 1943 PacketList* packet_list) { | 
| 1950 bool first_packet = true; | 1944 bool first_packet = true; | 
| 1951 uint8_t prev_payload_type = 0; | 1945 uint8_t prev_payload_type = 0; | 
| 1952 uint32_t prev_timestamp = 0; | 1946 uint32_t prev_timestamp = 0; | 
| 1953 uint16_t prev_sequence_number = 0; | 1947 uint16_t prev_sequence_number = 0; | 
| 1954 bool next_packet_available = false; | 1948 bool next_packet_available = false; | 
| 1955 | 1949 | 
| 1956 const RTPHeader* header = packet_buffer_->NextRtpHeader(); | 1950 const Packet* next_packet = packet_buffer_->PeekNextPacket(); | 
| 1957 assert(header); | 1951 RTC_DCHECK(next_packet); | 
| 1958 if (!header) { | 1952 if (!next_packet) { | 
| 1959 LOG(LS_ERROR) << "Packet buffer unexpectedly empty."; | 1953 LOG(LS_ERROR) << "Packet buffer unexpectedly empty."; | 
| 1960 return -1; | 1954 return -1; | 
| 1961 } | 1955 } | 
| 1962 uint32_t first_timestamp = header->timestamp; | 1956 uint32_t first_timestamp = next_packet->timestamp; | 
| 1963 size_t extracted_samples = 0; | 1957 size_t extracted_samples = 0; | 
| 1964 | 1958 | 
| 1965 // Packet extraction loop. | 1959 // Packet extraction loop. | 
| 1966 do { | 1960 do { | 
| 1967 timestamp_ = header->timestamp; | 1961 timestamp_ = next_packet->timestamp; | 
| 1968 size_t discard_count = 0; | 1962 size_t discard_count = 0; | 
| 1969 Packet* packet = packet_buffer_->GetNextPacket(&discard_count); | 1963 Packet* packet = packet_buffer_->GetNextPacket(&discard_count); | 
| 1970 // |header| may be invalid after the |packet_buffer_| operation. | 1964 // |next_packet| may be invalid after the |packet_buffer_| operation. | 
| 1971 header = NULL; | 1965 next_packet = NULL; | 
| 1972 if (!packet) { | 1966 if (!packet) { | 
| 1973 LOG(LS_ERROR) << "Should always be able to extract a packet here"; | 1967 LOG(LS_ERROR) << "Should always be able to extract a packet here"; | 
| 1974 assert(false); // Should always be able to extract a packet here. | 1968 assert(false); // Should always be able to extract a packet here. | 
| 1975 return -1; | 1969 return -1; | 
| 1976 } | 1970 } | 
| 1977 stats_.PacketsDiscarded(discard_count); | 1971 stats_.PacketsDiscarded(discard_count); | 
| 1978 stats_.StoreWaitingTime(packet->waiting_time->ElapsedMs()); | 1972 stats_.StoreWaitingTime(packet->waiting_time->ElapsedMs()); | 
| 1979 RTC_DCHECK(!packet->empty()); | 1973 RTC_DCHECK(!packet->empty()); | 
| 1980 packet_list->push_back(packet); // Store packet in list. | 1974 packet_list->push_back(packet); // Store packet in list. | 
| 1981 | 1975 | 
| 1982 if (first_packet) { | 1976 if (first_packet) { | 
| 1983 first_packet = false; | 1977 first_packet = false; | 
| 1984 if (nack_enabled_) { | 1978 if (nack_enabled_) { | 
| 1985 RTC_DCHECK(nack_); | 1979 RTC_DCHECK(nack_); | 
| 1986 // TODO(henrik.lundin): Should we update this for all decoded packets? | 1980 // TODO(henrik.lundin): Should we update this for all decoded packets? | 
| 1987 nack_->UpdateLastDecodedPacket(packet->header.sequenceNumber, | 1981 nack_->UpdateLastDecodedPacket(packet->sequenceNumber, | 
| 1988 packet->header.timestamp); | 1982 packet->timestamp); | 
| 1989 } | 1983 } | 
| 1990 prev_sequence_number = packet->header.sequenceNumber; | 1984 prev_sequence_number = packet->sequenceNumber; | 
| 1991 prev_timestamp = packet->header.timestamp; | 1985 prev_timestamp = packet->timestamp; | 
| 1992 prev_payload_type = packet->header.payloadType; | 1986 prev_payload_type = packet->payloadType; | 
| 1993 } | 1987 } | 
| 1994 | 1988 | 
| 1995 // Store number of extracted samples. | 1989 // Store number of extracted samples. | 
| 1996 size_t packet_duration = 0; | 1990 size_t packet_duration = 0; | 
| 1997 if (packet->frame) { | 1991 if (packet->frame) { | 
| 1998 packet_duration = packet->frame->Duration(); | 1992 packet_duration = packet->frame->Duration(); | 
| 1999 // TODO(ossu): Is this the correct way to track Opus FEC packets? | 1993 // TODO(ossu): Is this the correct way to track Opus FEC packets? | 
| 2000 if (packet->priority.codec_level > 0) { | 1994 if (packet->priority.codec_level > 0) { | 
| 2001 stats_.SecondaryDecodedSamples(rtc::checked_cast<int>(packet_duration)); | 1995 stats_.SecondaryDecodedSamples(rtc::checked_cast<int>(packet_duration)); | 
| 2002 } | 1996 } | 
| 2003 } else if (!decoder_database_->IsComfortNoise(packet->header.payloadType)) { | 1997 } else if (!decoder_database_->IsComfortNoise(packet->payloadType)) { | 
| 2004 LOG(LS_WARNING) << "Unknown payload type " | 1998 LOG(LS_WARNING) << "Unknown payload type " | 
| 2005 << static_cast<int>(packet->header.payloadType); | 1999 << static_cast<int>(packet->payloadType); | 
| 2006 RTC_NOTREACHED(); | 2000 RTC_NOTREACHED(); | 
| 2007 } | 2001 } | 
| 2008 | 2002 | 
| 2009 if (packet_duration == 0) { | 2003 if (packet_duration == 0) { | 
| 2010 // Decoder did not return a packet duration. Assume that the packet | 2004 // Decoder did not return a packet duration. Assume that the packet | 
| 2011 // contains the same number of samples as the previous one. | 2005 // contains the same number of samples as the previous one. | 
| 2012 packet_duration = decoder_frame_length_; | 2006 packet_duration = decoder_frame_length_; | 
| 2013 } | 2007 } | 
| 2014 extracted_samples = packet->header.timestamp - first_timestamp + | 2008 extracted_samples = packet->timestamp - first_timestamp + packet_duration; | 
| 2015 packet_duration; | |
| 2016 | 2009 | 
| 2017 // Check what packet is available next. | 2010 // Check what packet is available next. | 
| 2018 header = packet_buffer_->NextRtpHeader(); | 2011 next_packet = packet_buffer_->PeekNextPacket(); | 
| 2019 next_packet_available = false; | 2012 next_packet_available = false; | 
| 2020 if (header && prev_payload_type == header->payloadType) { | 2013 if (next_packet && prev_payload_type == next_packet->payloadType) { | 
| 2021 int16_t seq_no_diff = header->sequenceNumber - prev_sequence_number; | 2014 int16_t seq_no_diff = next_packet->sequenceNumber - prev_sequence_number; | 
| 2022 size_t ts_diff = header->timestamp - prev_timestamp; | 2015 size_t ts_diff = next_packet->timestamp - prev_timestamp; | 
| 2023 if (seq_no_diff == 1 || | 2016 if (seq_no_diff == 1 || | 
| 2024 (seq_no_diff == 0 && ts_diff == decoder_frame_length_)) { | 2017 (seq_no_diff == 0 && ts_diff == decoder_frame_length_)) { | 
| 2025 // The next sequence number is available, or the next part of a packet | 2018 // The next sequence number is available, or the next part of a packet | 
| 2026 // that was split into pieces upon insertion. | 2019 // that was split into pieces upon insertion. | 
| 2027 next_packet_available = true; | 2020 next_packet_available = true; | 
| 2028 } | 2021 } | 
| 2029 prev_sequence_number = header->sequenceNumber; | 2022 prev_sequence_number = next_packet->sequenceNumber; | 
| 2030 } | 2023 } | 
| 2031 } while (extracted_samples < required_samples && next_packet_available); | 2024 } while (extracted_samples < required_samples && next_packet_available); | 
| 2032 | 2025 | 
| 2033 if (extracted_samples > 0) { | 2026 if (extracted_samples > 0) { | 
| 2034 // Delete old packets only when we are going to decode something. Otherwise, | 2027 // Delete old packets only when we are going to decode something. Otherwise, | 
| 2035 // we could end up in the situation where we never decode anything, since | 2028 // we could end up in the situation where we never decode anything, since | 
| 2036 // all incoming packets are considered too old but the buffer will also | 2029 // all incoming packets are considered too old but the buffer will also | 
| 2037 // never be flooded and flushed. | 2030 // never be flooded and flushed. | 
| 2038 packet_buffer_->DiscardAllOldPackets(timestamp_); | 2031 packet_buffer_->DiscardAllOldPackets(timestamp_); | 
| 2039 } | 2032 } | 
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2138 } | 2131 } | 
| 2139 } | 2132 } | 
| 2140 | 2133 | 
| 2141 void NetEqImpl::CreateDecisionLogic() { | 2134 void NetEqImpl::CreateDecisionLogic() { | 
| 2142 decision_logic_.reset(DecisionLogic::Create( | 2135 decision_logic_.reset(DecisionLogic::Create( | 
| 2143 fs_hz_, output_size_samples_, playout_mode_, decoder_database_.get(), | 2136 fs_hz_, output_size_samples_, playout_mode_, decoder_database_.get(), | 
| 2144 *packet_buffer_.get(), delay_manager_.get(), buffer_level_filter_.get(), | 2137 *packet_buffer_.get(), delay_manager_.get(), buffer_level_filter_.get(), | 
| 2145 tick_timer_.get())); | 2138 tick_timer_.get())); | 
| 2146 } | 2139 } | 
| 2147 } // namespace webrtc | 2140 } // namespace webrtc | 
| OLD | NEW |