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 066b179c6d469e84423d5043e9c834146f14a80b..e118fb262c4e9b539f51f385a0897be3dbe2a8bc 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_sender.cc |
@@ -624,60 +624,15 @@ RTCPSender::BuildResult RTCPSender::BuildRPSI(RtcpContext* ctx) { |
if (ctx->feedback_state.send_payload_type == 0xFF) |
return BuildResult::kError; |
- // sanity |
- if (ctx->position + 24 >= IP_PACKET_SIZE) |
- return BuildResult::kTruncated; |
- |
- // add Reference Picture Selection Indication |
- uint8_t FMT = 3; |
- *ctx->AllocateData(1) = 0x80 + FMT; |
- *ctx->AllocateData(1) = 206; |
- |
- // calc length |
- uint32_t bitsRequired = 7; |
- uint8_t bytesRequired = 1; |
- while ((ctx->picture_id >> bitsRequired) > 0) { |
- bitsRequired += 7; |
- bytesRequired++; |
- } |
- |
- uint8_t size = 3; |
- if (bytesRequired > 6) { |
- size = 5; |
- } else if (bytesRequired > 2) { |
- size = 4; |
- } |
- *ctx->AllocateData(1) = 0; |
- *ctx->AllocateData(1) = size; |
- |
- // Add our own SSRC |
- ByteWriter<uint32_t>::WriteBigEndian(ctx->AllocateData(4), ssrc_); |
+ rtcp::Rpsi rpsi; |
+ rpsi.From(ssrc_); |
+ rpsi.To(remote_ssrc_); |
+ rpsi.WithPayloadType(ctx->feedback_state.send_payload_type); |
+ rpsi.WithPictureId(ctx->picture_id); |
- // Add the remote SSRC |
- ByteWriter<uint32_t>::WriteBigEndian(ctx->AllocateData(4), remote_ssrc_); |
- |
- // calc padding length |
- uint8_t paddingBytes = 4 - ((2 + bytesRequired) % 4); |
- if (paddingBytes == 4) |
- paddingBytes = 0; |
- // add padding length in bits |
- *ctx->AllocateData(1) = paddingBytes * 8; // padding can be 0, 8, 16 or 24 |
- |
- // add payload type |
- *ctx->AllocateData(1) = ctx->feedback_state.send_payload_type; |
- |
- // add picture ID |
- for (int i = bytesRequired - 1; i > 0; --i) { |
- *ctx->AllocateData(1) = |
- 0x80 | static_cast<uint8_t>(ctx->picture_id >> (i * 7)); |
- } |
- // add last byte of picture ID |
- *ctx->AllocateData(1) = static_cast<uint8_t>(ctx->picture_id & 0x7f); |
- |
- // add padding |
- for (int j = 0; j < paddingBytes; j++) { |
- *ctx->AllocateData(1) = 0; |
- } |
+ PacketBuiltCallback callback(ctx); |
+ if (!callback.BuildPacket(rpsi)) |
+ return BuildResult::kTruncated; |
return BuildResult::kSuccess; |
} |