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

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

Issue 2342443005: Moved Opus-specific payload splitting into AudioDecoderOpus. (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 510 matching lines...) Expand 10 before | Expand all | Expand 10 after
521 // directly once it's been inserted in the packet list. This way, |packet| 521 // directly once it's been inserted in the packet list. This way, |packet|
522 // is not defined outside of this block. 522 // is not defined outside of this block.
523 Packet* packet = new Packet; 523 Packet* packet = new Packet;
524 packet->header.markerBit = false; 524 packet->header.markerBit = false;
525 packet->header.payloadType = rtp_header.header.payloadType; 525 packet->header.payloadType = rtp_header.header.payloadType;
526 packet->header.sequenceNumber = rtp_header.header.sequenceNumber; 526 packet->header.sequenceNumber = rtp_header.header.sequenceNumber;
527 packet->header.timestamp = rtp_header.header.timestamp; 527 packet->header.timestamp = rtp_header.header.timestamp;
528 packet->header.ssrc = rtp_header.header.ssrc; 528 packet->header.ssrc = rtp_header.header.ssrc;
529 packet->header.numCSRCs = 0; 529 packet->header.numCSRCs = 0;
530 packet->payload.SetData(payload.data(), payload.size()); 530 packet->payload.SetData(payload.data(), payload.size());
531 packet->primary = true;
532 // Waiting time will be set upon inserting the packet in the buffer. 531 // Waiting time will be set upon inserting the packet in the buffer.
533 RTC_DCHECK(!packet->waiting_time); 532 RTC_DCHECK(!packet->waiting_time);
534 // Insert packet in a packet list. 533 // Insert packet in a packet list.
535 packet_list.push_back(packet); 534 packet_list.push_back(packet);
536 // Save main payloads header for later. 535 // Save main payloads header for later.
537 memcpy(&main_header, &packet->header, sizeof(main_header)); 536 memcpy(&main_header, &packet->header, sizeof(main_header));
538 } 537 }
539 538
540 bool update_sample_rate_and_channels = false; 539 bool update_sample_rate_and_channels = false;
541 // Reinitialize NetEq if it's needed (changed SSRC or first call). 540 // Reinitialize NetEq if it's needed (changed SSRC or first call).
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 PacketBuffer::DeleteAllPackets(&packet_list); 611 PacketBuffer::DeleteAllPackets(&packet_list);
613 return kDtmfInsertError; 612 return kDtmfInsertError;
614 } 613 }
615 delete current_packet; 614 delete current_packet;
616 it = packet_list.erase(it); 615 it = packet_list.erase(it);
617 } else { 616 } else {
618 ++it; 617 ++it;
619 } 618 }
620 } 619 }
621 620
622 // Check for FEC in packets, and separate payloads into several packets.
623 int ret = payload_splitter_->SplitFec(&packet_list, decoder_database_.get());
624 if (ret != PayloadSplitter::kOK) {
625 PacketBuffer::DeleteAllPackets(&packet_list);
626 switch (ret) {
627 case PayloadSplitter::kUnknownPayloadType:
628 return kUnknownRtpPayloadType;
629 default:
630 return kOtherError;
631 }
632 }
633
634 // Update bandwidth estimate, if the packet is not comfort noise. 621 // Update bandwidth estimate, if the packet is not comfort noise.
635 if (!packet_list.empty() && 622 if (!packet_list.empty() &&
636 !decoder_database_->IsComfortNoise(main_header.payloadType)) { 623 !decoder_database_->IsComfortNoise(main_header.payloadType)) {
637 // The list can be empty here if we got nothing but DTMF payloads. 624 // The list can be empty here if we got nothing but DTMF payloads.
638 AudioDecoder* decoder = 625 AudioDecoder* decoder =
639 decoder_database_->GetDecoder(main_header.payloadType); 626 decoder_database_->GetDecoder(main_header.payloadType);
640 assert(decoder); // Should always get a valid object, since we have 627 assert(decoder); // Should always get a valid object, since we have
641 // already checked that the payload types are known. 628 // already checked that the payload types are known.
642 decoder->IncomingPacket(packet_list.front()->payload.data(), 629 decoder->IncomingPacket(packet_list.front()->payload.data(),
643 packet_list.front()->payload.size(), 630 packet_list.front()->payload.size(),
(...skipping 11 matching lines...) Expand all
655 if (!info) { 642 if (!info) {
656 LOG(LS_WARNING) << "SplitAudio unknown payload type"; 643 LOG(LS_WARNING) << "SplitAudio unknown payload type";
657 return kUnknownRtpPayloadType; 644 return kUnknownRtpPayloadType;
658 } 645 }
659 646
660 if (info->IsComfortNoise()) { 647 if (info->IsComfortNoise()) {
661 // Carry comfort noise packets along. 648 // Carry comfort noise packets along.
662 parsed_packet_list.push_back(packet.release()); 649 parsed_packet_list.push_back(packet.release());
663 } else { 650 } else {
664 std::vector<AudioDecoder::ParseResult> results = 651 std::vector<AudioDecoder::ParseResult> results =
665 info->GetDecoder()->ParsePayload( 652 info->GetDecoder()->ParsePayload(&packet->payload,
666 &packet->payload, packet->header.timestamp, packet->primary); 653 packet->header.timestamp);
667 654
668 // Reuse the packet if possible 655 // Reuse the packet if possible
669 if (results.size() == 1) { 656 if (results.size() == 1) {
670 auto& result = results[0]; 657 auto& result = results[0];
671 RTC_DCHECK(result.frame); 658 RTC_DCHECK(result.frame);
672 packet->header.timestamp = result.timestamp; 659 packet->header.timestamp = result.timestamp;
673 packet->primary = result.primary; 660 packet->priority.codec_level = result.priority;
674 packet->frame = std::move(result.frame); 661 packet->frame = std::move(result.frame);
675 parsed_packet_list.push_back(packet.release()); 662 parsed_packet_list.push_back(packet.release());
676 } else { 663 } else {
677 for (auto& result : results) { 664 for (auto& result : results) {
678 // If you can't parse, return an empty list instead! 665 // If you can't parse, return an empty list instead!
679 RTC_DCHECK(result.frame); 666 RTC_DCHECK(result.frame);
680 std::unique_ptr<Packet> parsed_packet(new Packet); 667 std::unique_ptr<Packet> parsed_packet(new Packet);
681 parsed_packet->header = packet->header; 668 parsed_packet->header = packet->header;
682 parsed_packet->header.timestamp = result.timestamp; 669 parsed_packet->header.timestamp = result.timestamp;
683 // TODO(ossu): Move from primary to some sort of priority level. 670 parsed_packet->priority.codec_level = result.priority;
684 parsed_packet->primary = result.primary; 671 parsed_packet->priority.red_level = packet->priority.red_level;
685 parsed_packet->frame = std::move(result.frame); 672 parsed_packet->frame = std::move(result.frame);
686 parsed_packet_list.push_back(parsed_packet.release()); 673 parsed_packet_list.push_back(parsed_packet.release());
687 } 674 }
688 } 675 }
689 } 676 }
690 } 677 }
691 678
692 if (nack_enabled_) { 679 if (nack_enabled_) {
693 RTC_DCHECK(nack_); 680 RTC_DCHECK(nack_);
694 if (update_sample_rate_and_channels) { 681 if (update_sample_rate_and_channels) {
695 nack_->Reset(); 682 nack_->Reset();
696 } 683 }
697 nack_->UpdateLastReceivedPacket( 684 nack_->UpdateLastReceivedPacket(
698 parsed_packet_list.front()->header.sequenceNumber, 685 parsed_packet_list.front()->header.sequenceNumber,
699 parsed_packet_list.front()->header.timestamp); 686 parsed_packet_list.front()->header.timestamp);
700 } 687 }
701 688
702 // Insert packets in buffer. 689 // Insert packets in buffer.
703 const size_t buffer_length_before_insert = 690 const size_t buffer_length_before_insert =
704 packet_buffer_->NumPacketsInBuffer(); 691 packet_buffer_->NumPacketsInBuffer();
705 ret = packet_buffer_->InsertPacketList( 692 int ret = packet_buffer_->InsertPacketList(
kwiberg-webrtc 2016/09/19 11:07:49 const?
ossu 2016/09/19 11:41:01 Acknowledged.
706 &parsed_packet_list, *decoder_database_, &current_rtp_payload_type_, 693 &parsed_packet_list, *decoder_database_, &current_rtp_payload_type_,
707 &current_cng_rtp_payload_type_); 694 &current_cng_rtp_payload_type_);
708 if (ret == PacketBuffer::kFlushed) { 695 if (ret == PacketBuffer::kFlushed) {
709 // Reset DSP timestamp etc. if packet buffer flushed. 696 // Reset DSP timestamp etc. if packet buffer flushed.
710 new_codec_ = true; 697 new_codec_ = true;
711 update_sample_rate_and_channels = true; 698 update_sample_rate_and_channels = true;
712 } else if (ret != PacketBuffer::kOK) { 699 } else if (ret != PacketBuffer::kOK) {
713 PacketBuffer::DeleteAllPackets(&parsed_packet_list); 700 PacketBuffer::DeleteAllPackets(&parsed_packet_list);
714 return kOtherError; 701 return kOtherError;
715 } 702 }
(...skipping 1226 matching lines...) Expand 10 before | Expand all | Expand 10 after
1942 prev_timestamp = packet->header.timestamp; 1929 prev_timestamp = packet->header.timestamp;
1943 prev_payload_type = packet->header.payloadType; 1930 prev_payload_type = packet->header.payloadType;
1944 } 1931 }
1945 1932
1946 // Store number of extracted samples. 1933 // Store number of extracted samples.
1947 size_t packet_duration = 0; 1934 size_t packet_duration = 0;
1948 if (packet->frame) { 1935 if (packet->frame) {
1949 packet_duration = packet->frame->Duration(); 1936 packet_duration = packet->frame->Duration();
1950 // TODO(ossu): Is this the correct way to track samples decoded from a 1937 // TODO(ossu): Is this the correct way to track samples decoded from a
1951 // redundant packet? 1938 // redundant packet?
1952 if (packet_duration > 0 && !packet->primary) { 1939 if (packet->priority != Packet::kHighestPriority) {
1953 stats_.SecondaryDecodedSamples(packet_duration); 1940 stats_.SecondaryDecodedSamples(packet_duration);
1954 } 1941 }
1955 } else if (!decoder_database_->IsComfortNoise(packet->header.payloadType)) { 1942 } else if (!decoder_database_->IsComfortNoise(packet->header.payloadType)) {
1956 LOG(LS_WARNING) << "Unknown payload type " 1943 LOG(LS_WARNING) << "Unknown payload type "
1957 << static_cast<int>(packet->header.payloadType); 1944 << static_cast<int>(packet->header.payloadType);
1958 RTC_NOTREACHED(); 1945 RTC_NOTREACHED();
1959 } 1946 }
1960 1947
1961 if (packet_duration == 0) { 1948 if (packet_duration == 0) {
1962 // Decoder did not return a packet duration. Assume that the packet 1949 // Decoder did not return a packet duration. Assume that the packet
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
2091 } 2078 }
2092 } 2079 }
2093 2080
2094 void NetEqImpl::CreateDecisionLogic() { 2081 void NetEqImpl::CreateDecisionLogic() {
2095 decision_logic_.reset(DecisionLogic::Create( 2082 decision_logic_.reset(DecisionLogic::Create(
2096 fs_hz_, output_size_samples_, playout_mode_, decoder_database_.get(), 2083 fs_hz_, output_size_samples_, playout_mode_, decoder_database_.get(),
2097 *packet_buffer_.get(), delay_manager_.get(), buffer_level_filter_.get(), 2084 *packet_buffer_.get(), delay_manager_.get(), buffer_level_filter_.get(),
2098 tick_timer_.get())); 2085 tick_timer_.get()));
2099 } 2086 }
2100 } // namespace webrtc 2087 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698