Index: webrtc/modules/audio_coding/neteq/neteq_impl.cc |
diff --git a/webrtc/modules/audio_coding/neteq/neteq_impl.cc b/webrtc/modules/audio_coding/neteq/neteq_impl.cc |
index 014bd044ddeb9f5fc051664261ca5c767cf7f27c..99454dba3274b3305d1638a7141e971fd3212733 100644 |
--- a/webrtc/modules/audio_coding/neteq/neteq_impl.cc |
+++ b/webrtc/modules/audio_coding/neteq/neteq_impl.cc |
@@ -41,7 +41,7 @@ |
#include "webrtc/modules/audio_coding/neteq/normal.h" |
#include "webrtc/modules/audio_coding/neteq/packet_buffer.h" |
#include "webrtc/modules/audio_coding/neteq/packet.h" |
-#include "webrtc/modules/audio_coding/neteq/payload_splitter.h" |
+#include "webrtc/modules/audio_coding/neteq/red_payload_splitter.h" |
#include "webrtc/modules/audio_coding/neteq/post_decode_vad.h" |
#include "webrtc/modules/audio_coding/neteq/preemptive_expand.h" |
#include "webrtc/modules/audio_coding/neteq/sync_buffer.h" |
@@ -65,7 +65,7 @@ NetEqImpl::Dependencies::Dependencies( |
dtmf_tone_generator(new DtmfToneGenerator), |
packet_buffer( |
new PacketBuffer(config.max_packets_in_buffer, tick_timer.get())), |
- payload_splitter(new PayloadSplitter), |
+ red_payload_splitter(new RedPayloadSplitter), |
timestamp_scaler(new TimestampScaler(*decoder_database)), |
accelerate_factory(new AccelerateFactory), |
expand_factory(new ExpandFactory), |
@@ -84,7 +84,7 @@ NetEqImpl::NetEqImpl(const NetEq::Config& config, |
dtmf_buffer_(std::move(deps.dtmf_buffer)), |
dtmf_tone_generator_(std::move(deps.dtmf_tone_generator)), |
packet_buffer_(std::move(deps.packet_buffer)), |
- payload_splitter_(std::move(deps.payload_splitter)), |
+ red_payload_splitter_(std::move(deps.red_payload_splitter)), |
timestamp_scaler_(std::move(deps.timestamp_scaler)), |
vad_(new PostDecodeVad()), |
expand_factory_(std::move(deps.expand_factory)), |
@@ -529,7 +529,6 @@ int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header, |
packet->header.ssrc = rtp_header.header.ssrc; |
packet->header.numCSRCs = 0; |
packet->payload.SetData(payload.data(), payload.size()); |
- packet->primary = true; |
// Waiting time will be set upon inserting the packet in the buffer. |
RTC_DCHECK(!packet->waiting_time); |
// Insert packet in a packet list. |
@@ -571,13 +570,13 @@ int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header, |
// Check for RED payload type, and separate payloads into several packets. |
if (decoder_database_->IsRed(main_header.payloadType)) { |
- if (payload_splitter_->SplitRed(&packet_list) != PayloadSplitter::kOK) { |
+ if (!red_payload_splitter_->SplitRed(&packet_list)) { |
PacketBuffer::DeleteAllPackets(&packet_list); |
return kRedundancySplitError; |
} |
// Only accept a few RED payloads of the same type as the main data, |
// DTMF events and CNG. |
- payload_splitter_->CheckRedPayloads(&packet_list, *decoder_database_); |
+ red_payload_splitter_->CheckRedPayloads(&packet_list, *decoder_database_); |
// Update the stored main payload header since the main payload has now |
// changed. |
memcpy(&main_header, &packet_list.front()->header, sizeof(main_header)); |
@@ -620,18 +619,6 @@ int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header, |
} |
} |
- // Check for FEC in packets, and separate payloads into several packets. |
- int ret = payload_splitter_->SplitFec(&packet_list, decoder_database_.get()); |
- if (ret != PayloadSplitter::kOK) { |
- PacketBuffer::DeleteAllPackets(&packet_list); |
- switch (ret) { |
- case PayloadSplitter::kUnknownPayloadType: |
- return kUnknownRtpPayloadType; |
- default: |
- return kOtherError; |
- } |
- } |
- |
// Update bandwidth estimate, if the packet is not comfort noise. |
if (!packet_list.empty() && |
!decoder_database_->IsComfortNoise(main_header.payloadType)) { |
@@ -664,9 +651,9 @@ int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header, |
} else { |
std::vector<AudioDecoder::ParseResult> results = |
info->GetDecoder()->ParsePayload(std::move(packet->payload), |
- packet->header.timestamp, |
- packet->primary); |
+ packet->header.timestamp); |
const RTPHeader& original_header = packet->header; |
+ const Packet::Priority original_priority = packet->priority; |
for (auto& result : results) { |
RTC_DCHECK(result.frame); |
// Reuse the packet if possible. |
@@ -675,8 +662,9 @@ int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header, |
packet->header = original_header; |
} |
packet->header.timestamp = result.timestamp; |
- // TODO(ossu): Move from primary to some sort of priority level. |
- packet->primary = result.primary; |
+ RTC_DCHECK_GE(result.priority, 0); |
+ packet->priority.codec_level = result.priority; |
+ packet->priority.red_level = original_priority.red_level; |
packet->frame = std::move(result.frame); |
parsed_packet_list.push_back(packet.release()); |
} |
@@ -696,7 +684,7 @@ int NetEqImpl::InsertPacketInternal(const WebRtcRTPHeader& rtp_header, |
// Insert packets in buffer. |
const size_t buffer_length_before_insert = |
packet_buffer_->NumPacketsInBuffer(); |
- ret = packet_buffer_->InsertPacketList( |
+ const int ret = packet_buffer_->InsertPacketList( |
&parsed_packet_list, *decoder_database_, ¤t_rtp_payload_type_, |
¤t_cng_rtp_payload_type_); |
if (ret == PacketBuffer::kFlushed) { |
@@ -1941,9 +1929,8 @@ int NetEqImpl::ExtractPackets(size_t required_samples, |
size_t packet_duration = 0; |
if (packet->frame) { |
packet_duration = packet->frame->Duration(); |
- // TODO(ossu): Is this the correct way to track samples decoded from a |
- // redundant packet? |
- if (packet_duration > 0 && !packet->primary) { |
+ // TODO(ossu): Is this the correct way to track Opus FEC packets? |
+ if (packet->priority.codec_level > 0) { |
stats_.SecondaryDecodedSamples(rtc::checked_cast<int>(packet_duration)); |
} |
} else if (!decoder_database_->IsComfortNoise(packet->header.payloadType)) { |