Parse next RTCP XR report block after an unsupported block type.

R=stefan@webrtc.org

Review URL: https://webrtc-codereview.appspot.com/2649004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@5114 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
index c33cf23..25670f5 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
@@ -162,6 +162,17 @@
     }
   }
 
+  void AddXrUnknownBlock() {
+    Add8(6);             // Block type.
+    Add8(0);             // Reserved.
+    Add16(9);            // Length.
+    Add32(0);            // Receiver SSRC.
+    Add64(0, 0);         // Remaining fields (RFC 3611) are set to zero.
+    Add64(0, 0);
+    Add64(0, 0);
+    Add64(0, 0);
+  }
+
   void AddXrVoipBlock(uint32_t remote_ssrc, uint8_t loss) {
     Add8(7);             // Block type.
     Add8(0);             // Reserved.
@@ -452,6 +463,27 @@
   EXPECT_TRUE(rtcp_packet_info_.xr_dlrr_item);
 }
 
+TEST_F(RtcpReceiverTest, InjectXrPacketWithUnknownReportBlock) {
+  const uint8_t kLossRate = 123;
+  const uint32_t kSourceSsrc = 0x123456;
+  std::set<uint32_t> ssrcs;
+  ssrcs.insert(kSourceSsrc);
+  rtcp_receiver_->SetSsrcs(kSourceSsrc, ssrcs);
+  std::vector<uint32_t> remote_ssrcs;
+  remote_ssrcs.push_back(kSourceSsrc);
+
+  PacketBuilder p;
+  p.AddXrHeader(0x2345);
+  p.AddXrVoipBlock(kSourceSsrc, kLossRate);
+  p.AddXrUnknownBlock();
+  p.AddXrReceiverReferenceTimeBlock(0x10203, 0x40506);
+
+  EXPECT_EQ(0, InjectRtcpPacket(p.packet(), p.length()));
+  EXPECT_EQ(static_cast<unsigned int>(kRtcpXrReceiverReferenceTime +
+                                      kRtcpXrVoipMetric),
+            rtcp_packet_info_.rtcpPacketTypeFlags);
+}
+
 TEST(RtcpUtilityTest, MidNtp) {
   const uint32_t kNtpSec = 0x12345678;
   const uint32_t kNtpFrac = 0x23456789;