| Index: webrtc/modules/rtp_rtcp/source/rtcp_sender.cc | 
| diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc | 
| index e118fb262c4e9b539f51f385a0897be3dbe2a8bc..5ebd4a895d54cced9e03681930485c1eaf2e90e9 100644 | 
| --- a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc | 
| +++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc | 
| @@ -638,47 +638,15 @@ RTCPSender::BuildResult RTCPSender::BuildRPSI(RtcpContext* ctx) { | 
| } | 
|  | 
| RTCPSender::BuildResult RTCPSender::BuildREMB(RtcpContext* ctx) { | 
| -  // sanity | 
| -  if (ctx->position + 20 + 4 * remb_ssrcs_.size() >= IP_PACKET_SIZE) | 
| -    return BuildResult::kTruncated; | 
| - | 
| -  // add application layer feedback | 
| -  uint8_t FMT = 15; | 
| -  *ctx->AllocateData(1) = 0x80 + FMT; | 
| -  *ctx->AllocateData(1) = 206; | 
| +  rtcp::Remb remb; | 
| +  remb.From(ssrc_); | 
| +  for (uint32_t ssrc : remb_ssrcs_) | 
| +    remb.AppliesTo(ssrc); | 
| +  remb.WithBitrateBps(remb_bitrate_); | 
|  | 
| -  *ctx->AllocateData(1) = 0; | 
| -  *ctx->AllocateData(1) = static_cast<uint8_t>(remb_ssrcs_.size() + 4); | 
| - | 
| -  // Add our own SSRC | 
| -  ByteWriter<uint32_t>::WriteBigEndian(ctx->AllocateData(4), ssrc_); | 
| - | 
| -  // Remote SSRC must be 0 | 
| -  ByteWriter<uint32_t>::WriteBigEndian(ctx->AllocateData(4), 0); | 
| - | 
| -  *ctx->AllocateData(1) = 'R'; | 
| -  *ctx->AllocateData(1) = 'E'; | 
| -  *ctx->AllocateData(1) = 'M'; | 
| -  *ctx->AllocateData(1) = 'B'; | 
| - | 
| -  *ctx->AllocateData(1) = remb_ssrcs_.size(); | 
| -  // 6 bit Exp | 
| -  // 18 bit mantissa | 
| -  uint8_t brExp = 0; | 
| -  for (uint32_t i = 0; i < 64; i++) { | 
| -    if (remb_bitrate_ <= (0x3FFFFu << i)) { | 
| -      brExp = i; | 
| -      break; | 
| -    } | 
| -  } | 
| -  const uint32_t brMantissa = (remb_bitrate_ >> brExp); | 
| -  *ctx->AllocateData(1) = | 
| -      static_cast<uint8_t>((brExp << 2) + ((brMantissa >> 16) & 0x03)); | 
| -  *ctx->AllocateData(1) = static_cast<uint8_t>(brMantissa >> 8); | 
| -  *ctx->AllocateData(1) = static_cast<uint8_t>(brMantissa); | 
| - | 
| -  for (size_t i = 0; i < remb_ssrcs_.size(); i++) | 
| -    ByteWriter<uint32_t>::WriteBigEndian(ctx->AllocateData(4), remb_ssrcs_[i]); | 
| +  PacketBuiltCallback callback(ctx); | 
| +  if (!callback.BuildPacket(remb)) | 
| +    return BuildResult::kTruncated; | 
|  | 
| TRACE_EVENT_INSTANT0(TRACE_DISABLED_BY_DEFAULT("webrtc_rtp"), | 
| "RTCPSender::REMB"); | 
|  |