| Index: webrtc/modules/rtp_rtcp/source/rtp_sender.cc
|
| diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc
|
| index 0b050b76e65b9753931ba9bb9db2a3caac0f9298..4716b9c1391642c541afec43a954b52e9fc5d159 100644
|
| --- a/webrtc/modules/rtp_rtcp/source/rtp_sender.cc
|
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender.cc
|
| @@ -569,51 +569,38 @@ size_t RTPSender::TrySendRedundantPayloads(size_t bytes_to_send) {
|
| return bytes_to_send - bytes_left;
|
| }
|
|
|
| -size_t RTPSender::BuildPaddingPacket(uint8_t* packet, size_t header_length) {
|
| - size_t padding_bytes_in_packet = kMaxPaddingLength;
|
| +void RTPSender::BuildPaddingPacket(uint8_t* packet,
|
| + size_t header_length,
|
| + size_t padding_length) {
|
| packet[0] |= 0x20; // Set padding bit.
|
| int32_t *data =
|
| reinterpret_cast<int32_t *>(&(packet[header_length]));
|
|
|
| // Fill data buffer with random data.
|
| - for (size_t j = 0; j < (padding_bytes_in_packet >> 2); ++j) {
|
| + for (size_t j = 0; j < (padding_length >> 2); ++j) {
|
| data[j] = rand(); // NOLINT
|
| }
|
| // Set number of padding bytes in the last byte of the packet.
|
| - packet[header_length + padding_bytes_in_packet - 1] =
|
| - static_cast<uint8_t>(padding_bytes_in_packet);
|
| - return padding_bytes_in_packet;
|
| -}
|
| -
|
| -size_t RTPSender::TrySendPadData(size_t bytes) {
|
| - int64_t capture_time_ms;
|
| - uint32_t timestamp;
|
| - {
|
| - CriticalSectionScoped cs(send_critsect_.get());
|
| - timestamp = timestamp_;
|
| - capture_time_ms = capture_time_ms_;
|
| - if (last_timestamp_time_ms_ > 0) {
|
| - timestamp +=
|
| - (clock_->TimeInMilliseconds() - last_timestamp_time_ms_) * 90;
|
| - capture_time_ms +=
|
| - (clock_->TimeInMilliseconds() - last_timestamp_time_ms_);
|
| - }
|
| - }
|
| - return SendPadData(timestamp, capture_time_ms, bytes);
|
| -}
|
| -
|
| -size_t RTPSender::SendPadData(uint32_t timestamp,
|
| - int64_t capture_time_ms,
|
| - size_t bytes) {
|
| - size_t padding_bytes_in_packet = 0;
|
| + packet[header_length + padding_length - 1] =
|
| + static_cast<uint8_t>(padding_length);
|
| +}
|
| +
|
| +size_t RTPSender::SendPadData(size_t bytes,
|
| + bool timestamp_provided,
|
| + uint32_t timestamp,
|
| + int64_t capture_time_ms) {
|
| + // Always send full padding packets. This is accounted for by the PacedSender,
|
| + // which will make sure we don't send too much padding even if a single packet
|
| + // is larger than requested.
|
| + size_t padding_bytes_in_packet =
|
| + std::min(MaxDataPayloadLength(), kMaxPaddingLength);
|
| size_t bytes_sent = 0;
|
| bool using_transport_seq = rtp_header_extension_map_.IsRegistered(
|
| kRtpExtensionTransportSequenceNumber) &&
|
| packet_router_;
|
| for (; bytes > 0; bytes -= padding_bytes_in_packet) {
|
| - // Always send full padding packets.
|
| - if (bytes < kMaxPaddingLength)
|
| - bytes = kMaxPaddingLength;
|
| + if (bytes < padding_bytes_in_packet)
|
| + bytes = padding_bytes_in_packet;
|
|
|
| uint32_t ssrc;
|
| uint16_t sequence_number;
|
| @@ -621,8 +608,10 @@ size_t RTPSender::SendPadData(uint32_t timestamp,
|
| bool over_rtx;
|
| {
|
| CriticalSectionScoped cs(send_critsect_.get());
|
| - // Only send padding packets following the last packet of a frame,
|
| - // indicated by the marker bit.
|
| + if (!timestamp_provided) {
|
| + timestamp = timestamp_;
|
| + capture_time_ms = capture_time_ms_;
|
| + }
|
| if (rtx_ == kRtxOff) {
|
| // Without RTX we can't send padding in the middle of frames.
|
| if (!last_packet_marker_bit_)
|
| @@ -638,6 +627,15 @@ size_t RTPSender::SendPadData(uint32_t timestamp,
|
| if (!media_has_been_sent_ && !rtp_header_extension_map_.IsRegistered(
|
| kRtpExtensionAbsoluteSendTime))
|
| return 0;
|
| + // Only change change the timestamp of padding packets sent over RTX.
|
| + // Padding only packets over RTP has to be sent as part of a media
|
| + // frame (and therefore the same timestamp).
|
| + if (last_timestamp_time_ms_ > 0) {
|
| + timestamp +=
|
| + (clock_->TimeInMilliseconds() - last_timestamp_time_ms_) * 90;
|
| + capture_time_ms +=
|
| + (clock_->TimeInMilliseconds() - last_timestamp_time_ms_);
|
| + }
|
| ssrc = ssrc_rtx_;
|
| sequence_number = sequence_number_rtx_;
|
| ++sequence_number_rtx_;
|
| @@ -650,9 +648,7 @@ size_t RTPSender::SendPadData(uint32_t timestamp,
|
| size_t header_length =
|
| CreateRtpHeader(padding_packet, payload_type, ssrc, false, timestamp,
|
| sequence_number, std::vector<uint32_t>());
|
| - assert(header_length != static_cast<size_t>(-1));
|
| - padding_bytes_in_packet = BuildPaddingPacket(padding_packet, header_length);
|
| - assert(padding_bytes_in_packet <= bytes);
|
| + BuildPaddingPacket(padding_packet, header_length, padding_bytes_in_packet);
|
| size_t length = padding_bytes_in_packet + header_length;
|
| int64_t now_ms = clock_->TimeInMilliseconds();
|
|
|
| @@ -1002,7 +998,7 @@ size_t RTPSender::TimeToSendPadding(size_t bytes) {
|
| }
|
| size_t bytes_sent = TrySendRedundantPayloads(bytes);
|
| if (bytes_sent < bytes)
|
| - bytes_sent += TrySendPadData(bytes - bytes_sent);
|
| + bytes_sent += SendPadData(bytes - bytes_sent, false, 0, 0);
|
| return bytes_sent;
|
| }
|
|
|
|
|