[rtp_rtcp] rtcp::Sli packet moved into own file and got Parse function

BUG=webrtc:5260
R=åsapersson

Review URL: https://codereview.webrtc.org/1551893002

Cr-Commit-Position: refs/heads/master@{#11228}
diff --git a/webrtc/modules/modules.gyp b/webrtc/modules/modules.gyp
index f8febd8..4fd3408 100644
--- a/webrtc/modules/modules.gyp
+++ b/webrtc/modules/modules.gyp
@@ -314,6 +314,7 @@
                 'rtp_rtcp/source/rtcp_packet/receiver_report_unittest.cc',
                 'rtp_rtcp/source/rtcp_packet/report_block_unittest.cc',
                 'rtp_rtcp/source/rtcp_packet/rrtr_unittest.cc',
+                'rtp_rtcp/source/rtcp_packet/sli_unittest.cc',
                 'rtp_rtcp/source/rtcp_packet/tmmbn_unittest.cc',
                 'rtp_rtcp/source/rtcp_packet/tmmbr_unittest.cc',
                 'rtp_rtcp/source/rtcp_packet/transport_feedback_unittest.cc',
diff --git a/webrtc/modules/rtp_rtcp/BUILD.gn b/webrtc/modules/rtp_rtcp/BUILD.gn
index 064c12d..77f6f65 100644
--- a/webrtc/modules/rtp_rtcp/BUILD.gn
+++ b/webrtc/modules/rtp_rtcp/BUILD.gn
@@ -68,6 +68,8 @@
     "source/rtcp_packet/rrtr.h",
     "source/rtcp_packet/rtpfb.cc",
     "source/rtcp_packet/rtpfb.h",
+    "source/rtcp_packet/sli.cc",
+    "source/rtcp_packet/sli.h",
     "source/rtcp_packet/tmmbn.cc",
     "source/rtcp_packet/tmmbn.h",
     "source/rtcp_packet/tmmbr.cc",
diff --git a/webrtc/modules/rtp_rtcp/rtp_rtcp.gypi b/webrtc/modules/rtp_rtcp/rtp_rtcp.gypi
index 7a19efc..81c5edb 100644
--- a/webrtc/modules/rtp_rtcp/rtp_rtcp.gypi
+++ b/webrtc/modules/rtp_rtcp/rtp_rtcp.gypi
@@ -63,6 +63,8 @@
         'source/rtcp_packet/rrtr.h',
         'source/rtcp_packet/rtpfb.cc',
         'source/rtcp_packet/rtpfb.h',
+        'source/rtcp_packet/sli.cc',
+        'source/rtcp_packet/sli.h',
         'source/rtcp_packet/tmmbn.cc',
         'source/rtcp_packet/tmmbn.h',
         'source/rtcp_packet/tmmbr.cc',
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc
index 64a69f1..62371a8 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet.cc
@@ -34,8 +34,6 @@
 using webrtc::RTCPUtility::RTCPPacketPSFBFIRItem;
 using webrtc::RTCPUtility::RTCPPacketPSFBREMBItem;
 using webrtc::RTCPUtility::RTCPPacketPSFBRPSI;
-using webrtc::RTCPUtility::RTCPPacketPSFBSLI;
-using webrtc::RTCPUtility::RTCPPacketPSFBSLIItem;
 using webrtc::RTCPUtility::RTCPPacketReportBlockItem;
 using webrtc::RTCPUtility::RTCPPacketRTPFBNACK;
 using webrtc::RTCPUtility::RTCPPacketRTPFBNACKItem;
@@ -181,30 +179,6 @@
   }
 }
 
-// Slice loss indication (SLI) (RFC 4585).
-//
-// FCI:
-//
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |            First        |        Number           | PictureID |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-void CreateSli(const RTCPPacketPSFBSLI& sli,
-               const RTCPPacketPSFBSLIItem& sli_item,
-               uint8_t* buffer,
-               size_t* pos) {
-  AssignUWord32(buffer, pos, sli.SenderSSRC);
-  AssignUWord32(buffer, pos, sli.MediaSSRC);
-
-  AssignUWord8(buffer, pos, sli_item.FirstMB >> 5);
-  AssignUWord8(buffer, pos, (sli_item.FirstMB << 3) +
-                            ((sli_item.NumberOfMB >> 10) & 0x07));
-  AssignUWord8(buffer, pos, sli_item.NumberOfMB >> 2);
-  AssignUWord8(buffer, pos, (sli_item.NumberOfMB << 6) + sli_item.PictureId);
-}
-
 // Reference picture selection indication (RPSI) (RFC 4585).
 //
 // FCI:
@@ -494,20 +468,6 @@
   return length;
 }
 
-bool Sli::Create(uint8_t* packet,
-                 size_t* index,
-                 size_t max_length,
-                 RtcpPacket::PacketReadyCallback* callback) const {
-  while (*index + BlockLength() > max_length) {
-    if (!OnBufferFull(packet, index, callback))
-      return false;
-  }
-  const uint8_t kFmt = 2;
-  CreateHeader(kFmt, PT_PSFB, HeaderLength(), packet, index);
-  CreateSli(sli_, sli_item_, packet, index);
-  return true;
-}
-
 bool Rpsi::Create(uint8_t* packet,
                   size_t* index,
                   size_t max_length,
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet.h b/webrtc/modules/rtp_rtcp/source/rtcp_packet.h
index cec50ec..c2671f0 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_packet.h
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet.h
@@ -272,61 +272,6 @@
   RTC_DISALLOW_COPY_AND_ASSIGN(Sdes);
 };
 
-// Slice loss indication (SLI) (RFC 4585).
-//
-// FCI:
-//    0                   1                   2                   3
-//    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-//   |            First        |        Number           | PictureID |
-//   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-
-class Sli : public RtcpPacket {
- public:
-  Sli() : RtcpPacket() {
-    memset(&sli_, 0, sizeof(sli_));
-    memset(&sli_item_, 0, sizeof(sli_item_));
-  }
-
-  virtual ~Sli() {}
-
-  void From(uint32_t ssrc) {
-    sli_.SenderSSRC = ssrc;
-  }
-  void To(uint32_t ssrc) {
-    sli_.MediaSSRC = ssrc;
-  }
-  void WithFirstMb(uint16_t first_mb) {
-    assert(first_mb <= 0x1fff);
-    sli_item_.FirstMB = first_mb;
-  }
-  void WithNumberOfMb(uint16_t number_mb) {
-    assert(number_mb <= 0x1fff);
-    sli_item_.NumberOfMB = number_mb;
-  }
-  void WithPictureId(uint8_t picture_id) {
-    assert(picture_id <= 0x3f);
-    sli_item_.PictureId = picture_id;
-  }
-
- protected:
-  bool Create(uint8_t* packet,
-              size_t* index,
-              size_t max_length,
-              RtcpPacket::PacketReadyCallback* callback) const override;
-
- private:
-  size_t BlockLength() const {
-    const size_t kFciLength = 4;
-    return kCommonFbFmtLength + kFciLength;
-  }
-
-  RTCPUtility::RTCPPacketPSFBSLI sli_;
-  RTCPUtility::RTCPPacketPSFBSLIItem sli_item_;
-
-  RTC_DISALLOW_COPY_AND_ASSIGN(Sli);
-};
-
 // Reference picture selection indication (RPSI) (RFC 4585).
 //
 // FCI:
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.cc
new file mode 100644
index 0000000..829f3a9
--- /dev/null
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.cc
@@ -0,0 +1,108 @@
+/*
+ *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h"
+
+#include "webrtc/base/checks.h"
+#include "webrtc/base/logging.h"
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h"
+
+using webrtc::RTCPUtility::RtcpCommonHeader;
+
+namespace webrtc {
+namespace rtcp {
+// RFC 4585: Feedback format.
+//
+// Common packet format:
+//
+//   0                   1                   2                   3
+//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//  |V=2|P|   FMT   |       PT      |          length               |
+//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//  |                  SSRC of packet sender                        |
+//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//  |                  SSRC of media source                         |
+//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//  :            Feedback Control Information (FCI)                 :
+//  :                                                               :
+//
+// Slice loss indication (SLI) (RFC 4585).
+// FCI:
+//   0                   1                   2                   3
+//   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+//  |            First        |        Number           | PictureID |
+//  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+Sli::Macroblocks::Macroblocks(uint8_t picture_id,
+                              uint16_t first,
+                              uint16_t number) {
+  RTC_DCHECK_LE(first, 0x1fff);
+  RTC_DCHECK_LE(number, 0x1fff);
+  RTC_DCHECK_LE(picture_id, 0x3f);
+  item_ = (first << 19) | (number << 6) | picture_id;
+}
+
+void Sli::Macroblocks::Parse(const uint8_t* buffer) {
+  item_ = ByteReader<uint32_t>::ReadBigEndian(buffer);
+}
+
+void Sli::Macroblocks::Create(uint8_t* buffer) const {
+  ByteWriter<uint32_t>::WriteBigEndian(buffer, item_);
+}
+
+bool Sli::Parse(const RtcpCommonHeader& header, const uint8_t* payload) {
+  RTC_DCHECK(header.packet_type == kPacketType);
+  RTC_DCHECK(header.count_or_format == kFeedbackMessageType);
+
+  if (header.payload_size_bytes <
+      kCommonFeedbackLength + Macroblocks::kLength) {
+    LOG(LS_WARNING) << "Packet is too small to be a valid SLI packet";
+    return false;
+  }
+
+  size_t number_of_items =
+      (header.payload_size_bytes - kCommonFeedbackLength) /
+      Macroblocks::kLength;
+
+  ParseCommonFeedback(payload);
+  items_.resize(number_of_items);
+
+  const uint8_t* next_item = payload + kCommonFeedbackLength;
+  for (Macroblocks& item : items_) {
+    item.Parse(next_item);
+    next_item += Macroblocks::kLength;
+  }
+
+  return true;
+}
+
+bool Sli::Create(uint8_t* packet,
+                 size_t* index,
+                 size_t max_length,
+                 RtcpPacket::PacketReadyCallback* callback) const {
+  RTC_DCHECK(!items_.empty());
+  while (*index + BlockLength() > max_length) {
+    if (!OnBufferFull(packet, index, callback))
+      return false;
+  }
+  CreateHeader(kFeedbackMessageType, kPacketType, HeaderLength(), packet,
+               index);
+  CreateCommonFeedback(packet + *index);
+  *index += kCommonFeedbackLength;
+  for (const Macroblocks& item : items_) {
+    item.Create(packet + *index);
+    *index += Macroblocks::kLength;
+  }
+  return true;
+}
+
+}  // namespace rtcp
+}  // namespace webrtc
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h b/webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h
new file mode 100644
index 0000000..5d9e6c9
--- /dev/null
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h
@@ -0,0 +1,81 @@
+/*
+ *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ *
+ */
+
+#ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_SLI_H_
+#define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_SLI_H_
+
+#include <vector>
+
+#include "webrtc/base/basictypes.h"
+#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/psfb.h"
+#include "webrtc/modules/rtp_rtcp/source/rtcp_utility.h"
+
+namespace webrtc {
+namespace rtcp {
+
+// Slice loss indication (SLI) (RFC 4585).
+class Sli : public Psfb {
+ public:
+  static const uint8_t kFeedbackMessageType = 2;
+  class Macroblocks {
+   public:
+    static const size_t kLength = 4;
+    Macroblocks() : item_(0) {}
+    Macroblocks(uint8_t picture_id, uint16_t first, uint16_t number);
+    ~Macroblocks() {}
+
+    void Parse(const uint8_t* buffer);
+    void Create(uint8_t* buffer) const;
+
+    uint16_t first() const { return item_ >> 19; }
+    uint16_t number() const { return (item_ >> 6) & 0x1fff; }
+    uint8_t picture_id() const { return (item_ & 0x3f); }
+
+   private:
+    uint32_t item_;
+  };
+
+  Sli() {}
+  virtual ~Sli() {}
+
+  // Parse assumes header is already parsed and validated.
+  bool Parse(const RTCPUtility::RtcpCommonHeader& header,
+             const uint8_t* payload);  // Size of the payload is in the header.
+
+  void WithPictureId(uint8_t picture_id,
+                     uint16_t first_macroblock = 0,
+                     uint16_t number_macroblocks = 0x1fff) {
+    items_.push_back(
+        Macroblocks(picture_id, first_macroblock, number_macroblocks));
+  }
+
+  const std::vector<Macroblocks>& macroblocks() const { return items_; }
+
+ protected:
+  bool Create(uint8_t* packet,
+              size_t* index,
+              size_t max_length,
+              RtcpPacket::PacketReadyCallback* callback) const override;
+
+ private:
+  size_t BlockLength() const override {
+    return RtcpPacket::kHeaderLength + Psfb::kCommonFeedbackLength +
+           items_.size() * Macroblocks::kLength;
+  }
+
+  std::vector<Macroblocks> items_;
+
+  RTC_DISALLOW_COPY_AND_ASSIGN(Sli);
+};
+
+}  // namespace rtcp
+}  // namespace webrtc
+#endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTCP_PACKET_SLI_H_
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/sli_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet/sli_unittest.cc
new file mode 100644
index 0000000..c2be168
--- /dev/null
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/sli_unittest.cc
@@ -0,0 +1,91 @@
+/*
+ *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h"
+
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using testing::ElementsAreArray;
+using testing::make_tuple;
+using webrtc::rtcp::RawPacket;
+using webrtc::rtcp::Sli;
+using webrtc::RTCPUtility::RtcpCommonHeader;
+using webrtc::RTCPUtility::RtcpParseCommonHeader;
+
+namespace webrtc {
+namespace {
+
+const uint32_t kSenderSsrc = 0x12345678;
+const uint32_t kRemoteSsrc = 0x23456789;
+
+const uint8_t kPictureId = 0x3f;
+const uint16_t kFirstMb = 0x1e61;
+const uint16_t kNumberOfMb = 0x1a0a;
+const uint32_t kSliItem = (static_cast<uint32_t>(kFirstMb) << 19) |
+                          (static_cast<uint32_t>(kNumberOfMb) << 6) |
+                           static_cast<uint32_t>(kPictureId);
+
+// Manually created Sli packet matching constants above.
+const uint8_t kPacket[] = {0x82,  206, 0x00, 0x03,
+                           0x12, 0x34, 0x56, 0x78,
+                           0x23, 0x45, 0x67, 0x89,
+                           (kSliItem >> 24) & 0xff,
+                           (kSliItem >> 16) & 0xff,
+                           (kSliItem >> 8) & 0xff,
+                           kSliItem & 0xff};
+const size_t kPacketLength = sizeof(kPacket);
+
+bool ParseSli(const uint8_t* buffer, size_t length, Sli* sli) {
+  RtcpCommonHeader header;
+  EXPECT_TRUE(RtcpParseCommonHeader(buffer, length, &header));
+  EXPECT_EQ(length, header.BlockSize());
+  return sli->Parse(header, buffer + RtcpCommonHeader::kHeaderSizeBytes);
+}
+
+TEST(RtcpPacketSliTest, Create) {
+  Sli sli;
+  sli.From(kSenderSsrc);
+  sli.To(kRemoteSsrc);
+  sli.WithPictureId(kPictureId, kFirstMb, kNumberOfMb);
+
+  rtc::scoped_ptr<RawPacket> packet(sli.Build());
+
+  EXPECT_THAT(make_tuple(packet->Buffer(), packet->Length()),
+              ElementsAreArray(kPacket));
+}
+
+TEST(RtcpPacketSliTest, Parse) {
+  Sli mutable_parsed;
+  EXPECT_TRUE(ParseSli(kPacket, kPacketLength, &mutable_parsed));
+  const Sli& parsed = mutable_parsed;  // Read values from constant object.
+
+  EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc());
+  EXPECT_EQ(kRemoteSsrc, parsed.media_ssrc());
+  EXPECT_EQ(1u, parsed.macroblocks().size());
+  EXPECT_EQ(kFirstMb, parsed.macroblocks()[0].first());
+  EXPECT_EQ(kNumberOfMb, parsed.macroblocks()[0].number());
+  EXPECT_EQ(kPictureId, parsed.macroblocks()[0].picture_id());
+}
+
+TEST(RtcpPacketSliTest, ParseFailsOnTooSmallPacket) {
+  Sli sli;
+  sli.From(kSenderSsrc);
+  sli.To(kRemoteSsrc);
+  sli.WithPictureId(kPictureId, kFirstMb, kNumberOfMb);
+
+  rtc::scoped_ptr<RawPacket> packet(sli.Build());
+  packet->MutableBuffer()[3]--;  // Decrease size by 1 word (4 bytes).
+
+  EXPECT_FALSE(ParseSli(packet->Buffer(), packet->Length() - 4, &sli));
+}
+
+}  // namespace
+}  // namespace webrtc
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet_unittest.cc
index 886eb4b..c57fe19e 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_packet_unittest.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet_unittest.cc
@@ -34,7 +34,6 @@
 using webrtc::rtcp::Rrtr;
 using webrtc::rtcp::Sdes;
 using webrtc::rtcp::SenderReport;
-using webrtc::rtcp::Sli;
 using webrtc::rtcp::VoipMetric;
 using webrtc::rtcp::Xr;
 using webrtc::test::RtcpPacketParser;
@@ -217,29 +216,6 @@
   EXPECT_EQ("", parser.sdes_chunk()->Cname());
 }
 
-TEST(RtcpPacketTest, Sli) {
-  const uint16_t kFirstMb = 7777;
-  const uint16_t kNumberOfMb = 6666;
-  const uint8_t kPictureId = 60;
-  Sli sli;
-  sli.From(kSenderSsrc);
-  sli.To(kRemoteSsrc);
-  sli.WithFirstMb(kFirstMb);
-  sli.WithNumberOfMb(kNumberOfMb);
-  sli.WithPictureId(kPictureId);
-
-  rtc::scoped_ptr<RawPacket> packet(sli.Build());
-  RtcpPacketParser parser;
-  parser.Parse(packet->Buffer(), packet->Length());
-  EXPECT_EQ(1, parser.sli()->num_packets());
-  EXPECT_EQ(kSenderSsrc, parser.sli()->Ssrc());
-  EXPECT_EQ(kRemoteSsrc, parser.sli()->MediaSsrc());
-  EXPECT_EQ(1, parser.sli_item()->num_packets());
-  EXPECT_EQ(kFirstMb, parser.sli_item()->FirstMb());
-  EXPECT_EQ(kNumberOfMb, parser.sli_item()->NumberOfMb());
-  EXPECT_EQ(kPictureId, parser.sli_item()->PictureId());
-}
-
 TEST(RtcpPacketTest, Rpsi) {
   Rpsi rpsi;
   // 1000001 (7 bits = 1 byte in native string).
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
index 8be758a..5d2fda3 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
@@ -25,6 +25,7 @@
 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h"
 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h"
 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
+#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h"
 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h"
 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
 #include "webrtc/modules/rtp_rtcp/source/rtcp_receiver.h"
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
index 81a2528..7b47ab7 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
@@ -27,6 +27,7 @@
 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/nack.h"
 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/pli.h"
 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
+#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/sli.h"
 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbn.h"
 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/tmmbr.h"
 #include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h"
@@ -559,8 +560,6 @@
   sli->To(remote_ssrc_);
   // Crop picture id to 6 least significant bits.
   sli->WithPictureId(ctx.picture_id_ & 0x3F);
-  sli->WithFirstMb(0);
-  sli->WithNumberOfMb(0x1FFF);  // 13 bits, only ones for now.
 
   return rtc::scoped_ptr<rtcp::Sli>(sli);
 }