Let NetEq use the PLC output from a decoder

This change enables NetEq to use the packet concealment audio (aka
PLC) produced by a decoder. The change also includes a new API to the
AudioDecoder interface, which lets the decoder implementation generate
and deliver concealment audio.

Bug: webrtc:9180
Change-Id: Icaacebccf645d4694b0d2d6310f6f2c7132881c4
Reviewed-on: https://webrtc-review.googlesource.com/96340
Commit-Queue: Henrik Lundin <henrik.lundin@webrtc.org>
Reviewed-by: Minyue Li <minyue@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24738}
diff --git a/modules/audio_coding/neteq/decision_logic.cc b/modules/audio_coding/neteq/decision_logic.cc
index e24ca62..6b61555 100644
--- a/modules/audio_coding/neteq/decision_logic.cc
+++ b/modules/audio_coding/neteq/decision_logic.cc
@@ -164,7 +164,8 @@
   // if the mute factor is low enough (otherwise the expansion was short enough
   // to not be noticable).
   // Note that the MuteFactor is in Q14, so a value of 16384 corresponds to 1.
-  if (postpone_decoding_after_expand_ && prev_mode == kModeExpand &&
+  if (postpone_decoding_after_expand_ &&
+      (prev_mode == kModeExpand || prev_mode == kModeCodecPlc) &&
       !packet_buffer_.ContainsDtxOrCngPacket(decoder_database_) &&
       cur_size_samples<static_cast<size_t>(delay_manager_->TargetLevel() *
                                            packet_length_samples_)>> 8 &&
@@ -302,9 +303,9 @@
   // Check if we should continue with an ongoing expand because the new packet
   // is too far into the future.
   uint32_t timestamp_leap = available_timestamp - target_timestamp;
-  if ((prev_mode == kModeExpand) && !ReinitAfterExpands(timestamp_leap) &&
-      !MaxWaitForPacket() && PacketTooEarly(timestamp_leap) &&
-      UnderTargetLevel()) {
+  if ((prev_mode == kModeExpand || prev_mode == kModeCodecPlc) &&
+      !ReinitAfterExpands(timestamp_leap) && !MaxWaitForPacket() &&
+      PacketTooEarly(timestamp_leap) && UnderTargetLevel()) {
     if (play_dtmf) {
       // Still have DTMF to play, so do not do expand.
       return kDtmf;
@@ -314,6 +315,10 @@
     }
   }
 
+  if (prev_mode == kModeCodecPlc) {
+    return kNormal;
+  }
+
   const size_t samples_left =
       sync_buffer.FutureLength() - expand.overlap_length();
   const size_t cur_size_samples =