Adding FEC support in NetEq 4.
R=henrik.lundin@webrtc.org, turaj@webrtc.org
TEST=passes all trybots
BUG=
Review URL: https://webrtc-codereview.appspot.com/9999004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@5748 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/audio_coding/neteq4/neteq_impl.cc b/webrtc/modules/audio_coding/neteq4/neteq_impl.cc
index 2b98d05..8b7e517 100644
--- a/webrtc/modules/audio_coding/neteq4/neteq_impl.cc
+++ b/webrtc/modules/audio_coding/neteq4/neteq_impl.cc
@@ -512,6 +512,19 @@
memcpy(&main_header, &packet_list.front()->header, sizeof(main_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) {
+ LOG_FERR1(LS_WARNING, SplitFec, packet_list.size());
+ PacketBuffer::DeleteAllPackets(&packet_list);
+ switch (ret) {
+ case PayloadSplitter::kUnknownPayloadType:
+ return kUnknownRtpPayloadType;
+ default:
+ return kOtherError;
+ }
+ }
+
// Check payload types.
if (decoder_database_->CheckPayloadTypes(packet_list) ==
DecoderDatabase::kDecoderNotFound) {
@@ -561,7 +574,7 @@
// Split payloads into smaller chunks. This also verifies that all payloads
// are of a known payload type. SplitAudio() method is protected against
// sync-packets.
- int ret = payload_splitter_->SplitAudio(&packet_list, *decoder_database_);
+ ret = payload_splitter_->SplitAudio(&packet_list, *decoder_database_);
if (ret != PayloadSplitter::kOK) {
LOG_FERR1(LS_WARNING, SplitAudio, packet_list.size());
PacketBuffer::DeleteAllPackets(&packet_list);
@@ -1777,8 +1790,14 @@
AudioDecoder* decoder = decoder_database_->GetDecoder(
packet->header.payloadType);
if (decoder) {
- packet_duration = packet->sync_packet ? decoder_frame_length_ :
- decoder->PacketDuration(packet->payload, packet->payload_length);
+ if (packet->sync_packet) {
+ packet_duration = decoder_frame_length_;
+ } else {
+ packet_duration = packet->primary ?
+ decoder->PacketDuration(packet->payload, packet->payload_length) :
+ decoder->PacketDurationRedundant(packet->payload,
+ packet->payload_length);
+ }
} else {
LOG_FERR1(LS_WARNING, GetDecoder, packet->header.payloadType) <<
"Could not find a decoder for a packet about to be extracted.";