Reland of Add path for recovered packets from internal::Call to RtpStreamReceiver. (patchset #1 id:1 of https://codereview.webrtc.org/2427733002/ )

Reason for revert:
Flaky test has been fixed.

Original issue's description:
> Revert of Add path for recovered packets from internal::Call to RtpStreamReceiver. (patchset #2 id:60001 of https://codereview.webrtc.org/2390823009/ )
>
> Reason for revert:
> Speculative revert as it may be the cause of the DrMemory test failure:
> https://build.chromium.org/p/client.webrtc/builders/Win%20DrMemory%20Full/builds/5115
>
> Original issue's description:
> > Add path for recovered packets from internal::Call to RtpStreamReceiver.
> >
> > When the FlexfecReceiver recovers media packets, it inserts these into
> > internal::Call, which then distributes them to the appropriate
> > VideoReceiveStream/RtpStreamReceiver.
> >
> > BUG=webrtc:5654
> >
> > Committed: https://crrev.com/9c4b4b47f4325b48e1856566a30983f9e4e30dd0
> > Cr-Commit-Position: refs/heads/master@{#14642}
>
> TBR=stefan@webrtc.org,brandtr@webrtc.org
> # Skipping CQ checks because original CL landed less than 1 days ago.
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> BUG=webrtc:5654
>
> Committed: https://crrev.com/862d74d0176fa762b3c96cf20bd36f27e7001a47
> Cr-Commit-Position: refs/heads/master@{#14652}

TBR=stefan@webrtc.org,honghaiz@webrtc.org
# Not skipping CQ checks because original CL landed more than 1 days ago.
BUG=webrtc:5654

Review-Url: https://codereview.webrtc.org/2428303004
Cr-Commit-Position: refs/heads/master@{#14677}
diff --git a/webrtc/call/call.cc b/webrtc/call/call.cc
index 9515ac1..489983e 100644
--- a/webrtc/call/call.cc
+++ b/webrtc/call/call.cc
@@ -18,6 +18,7 @@
 #include "webrtc/audio/audio_send_stream.h"
 #include "webrtc/audio/audio_state.h"
 #include "webrtc/audio/scoped_voe_interface.h"
+#include "webrtc/base/basictypes.h"
 #include "webrtc/base/checks.h"
 #include "webrtc/base/constructormagic.h"
 #include "webrtc/base/logging.h"
@@ -32,6 +33,7 @@
 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h"
 #include "webrtc/modules/congestion_controller/include/congestion_controller.h"
 #include "webrtc/modules/pacing/paced_sender.h"
+#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h"
 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
 #include "webrtc/modules/rtp_rtcp/source/byte_io.h"
 #include "webrtc/modules/utility/include/process_thread.h"
@@ -57,6 +59,7 @@
 
 class Call : public webrtc::Call,
              public PacketReceiver,
+             public RecoveredPacketReceiver,
              public CongestionController::Observer,
              public BitrateAllocator::LimitObserver {
  public:
@@ -91,6 +94,9 @@
                                size_t length,
                                const PacketTime& packet_time) override;
 
+  // Implements RecoveredPacketReceiver.
+  bool OnRecoveredPacket(const uint8_t* packet, size_t length) override;
+
   void SetBitrateConfig(
       const webrtc::Call::Config::BitrateConfig& bitrate_config) override;
 
@@ -940,5 +946,16 @@
   return DeliverRtp(media_type, packet, length, packet_time);
 }
 
+// TODO(brandtr): Update this member function when we support protecting
+// audio packets with FlexFEC.
+bool Call::OnRecoveredPacket(const uint8_t* packet, size_t length) {
+  uint32_t ssrc = ByteReader<uint32_t>::ReadBigEndian(&packet[8]);
+  ReadLockScoped read_lock(*receive_crit_);
+  auto it = video_receive_ssrcs_.find(ssrc);
+  if (it == video_receive_ssrcs_.end())
+    return false;
+  return it->second->OnRecoveredPacket(packet, length);
+}
+
 }  // namespace internal
 }  // namespace webrtc
diff --git a/webrtc/modules/rtp_rtcp/include/flexfec_receiver.h b/webrtc/modules/rtp_rtcp/include/flexfec_receiver.h
index f3894f5..8f672fc 100644
--- a/webrtc/modules/rtp_rtcp/include/flexfec_receiver.h
+++ b/webrtc/modules/rtp_rtcp/include/flexfec_receiver.h
@@ -18,7 +18,8 @@
 
 namespace webrtc {
 
-// Callback interface for packets recovered by FlexFEC.
+// Callback interface for packets recovered by FlexFEC. The implementation
+// should be able to demultiplex the recovered RTP packets based on SSRC.
 class RecoveredPacketReceiver {
  public:
   virtual bool OnRecoveredPacket(const uint8_t* packet, size_t length) = 0;
diff --git a/webrtc/video/video_receive_stream.cc b/webrtc/video/video_receive_stream.cc
index f260b5e..e25546a 100644
--- a/webrtc/video/video_receive_stream.cc
+++ b/webrtc/video/video_receive_stream.cc
@@ -259,6 +259,11 @@
   return rtp_stream_receiver_.DeliverRtp(packet, length, packet_time);
 }
 
+bool VideoReceiveStream::OnRecoveredPacket(const uint8_t* packet,
+                                           size_t length) {
+  return rtp_stream_receiver_.OnRecoveredPacket(packet, length);
+}
+
 void VideoReceiveStream::Start() {
   if (decode_thread_.IsRunning())
     return;
diff --git a/webrtc/video/video_receive_stream.h b/webrtc/video/video_receive_stream.h
index 3bb8aea..c6d21d2 100644
--- a/webrtc/video/video_receive_stream.h
+++ b/webrtc/video/video_receive_stream.h
@@ -18,6 +18,7 @@
 #include "webrtc/call/transport_adapter.h"
 #include "webrtc/common_video/include/incoming_video_stream.h"
 #include "webrtc/common_video/libyuv/include/webrtc_libyuv.h"
+#include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h"
 #include "webrtc/modules/video_coding/video_coding_impl.h"
 #include "webrtc/system_wrappers/include/clock.h"
 #include "webrtc/video/receive_statistics_proxy.h"
@@ -59,6 +60,8 @@
                   size_t length,
                   const PacketTime& packet_time);
 
+  bool OnRecoveredPacket(const uint8_t* packet, size_t length);
+
   // webrtc::VideoReceiveStream implementation.
   void Start() override;
   void Stop() override;