Use RtcpPacket to send PLI in RtcpSender

BUG=webrtc:2450
R=asapersson@webrtc.org

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

Cr-Commit-Position: refs/heads/master@{#9666}
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
index 55ca9a7..6967754 100644
--- a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc
@@ -120,6 +120,11 @@
   void OnPacketReady(uint8_t* data, size_t length) override {
     context_->position += length;
   }
+  bool BuildPacket(const rtcp::RtcpPacket& packet) {
+    return packet.BuildExternalBuffer(
+        &context_->buffer[context_->position],
+        context_->buffer_size - context_->position, this);
+  }
 
  private:
   RtcpContext* const context_;
@@ -501,11 +506,8 @@
     report.WithReportBlock(it.second);
 
   PacketBuiltCallback callback(ctx);
-  if (!report.BuildExternalBuffer(&ctx->buffer[ctx->position],
-                                  ctx->buffer_size - ctx->position,
-                                  &callback)) {
+  if (!callback.BuildPacket(report))
     return BuildResult::kTruncated;
-  }
 
   report_blocks_.clear();
   return BuildResult::kSuccess;
@@ -522,10 +524,8 @@
     sdes.WithCName(it.first, it.second);
 
   PacketBuiltCallback callback(ctx);
-  if (!sdes.BuildExternalBuffer(&ctx->buffer[ctx->position],
-                                ctx->buffer_size - ctx->position, &callback)) {
+  if (!callback.BuildPacket(sdes))
     return BuildResult::kTruncated;
-  }
 
   return BuildResult::kSuccess;
 }
@@ -537,11 +537,8 @@
     report.WithReportBlock(it.second);
 
   PacketBuiltCallback callback(ctx);
-  if (!report.BuildExternalBuffer(&ctx->buffer[ctx->position],
-                                  ctx->buffer_size - ctx->position,
-                                  &callback)) {
+  if (!callback.BuildPacket(report))
     return BuildResult::kTruncated;
-  }
 
   report_blocks_.clear();
 
@@ -549,25 +546,14 @@
 }
 
 RTCPSender::BuildResult RTCPSender::BuildPLI(RtcpContext* ctx) {
-  // sanity
-  if (ctx->position + 12 >= IP_PACKET_SIZE)
+  rtcp::Pli pli;
+  pli.From(ssrc_);
+  pli.To(remote_ssrc_);
+
+  PacketBuiltCallback callback(ctx);
+  if (!callback.BuildPacket(pli))
     return BuildResult::kTruncated;
 
-  // add picture loss indicator
-  uint8_t FMT = 1;
-  *ctx->AllocateData(1) = 0x80 + FMT;
-  *ctx->AllocateData(1) = 206;
-
-  // Used fixed length of 2
-  *ctx->AllocateData(1) = 0;
-  *ctx->AllocateData(1) = 2;
-
-  // Add our own SSRC
-  ByteWriter<uint32_t>::WriteBigEndian(ctx->AllocateData(4), ssrc_);
-
-  // Add the remote SSRC
-  ByteWriter<uint32_t>::WriteBigEndian(ctx->AllocateData(4), remote_ssrc_);
-
   TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"),
                        "RTCPSender::PLI");
   ++packet_type_counter_.pli_packets;