Index: webrtc/test/layer_filtering_transport.cc |
diff --git a/webrtc/test/layer_filtering_transport.cc b/webrtc/test/layer_filtering_transport.cc |
index 102f63eb3f55d9d2f1319e0d44d73d3c02c183be..d5c54f50ca4bd6bade5bae3457c094fba8334869 100644 |
--- a/webrtc/test/layer_filtering_transport.cc |
+++ b/webrtc/test/layer_filtering_transport.cc |
@@ -39,6 +39,7 @@ bool LayerFilteringTransport::SendRtp(const uint8_t* packet, size_t length) { |
return test::DirectTransport::SendRtp(packet, length); |
} |
+ bool discard = false; |
bool set_marker_bit = false; |
rtc::scoped_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); |
RTPHeader header; |
@@ -73,7 +74,7 @@ bool LayerFilteringTransport::SendRtp(const uint8_t* packet, size_t length) { |
temporalIdx >= tl_discard_threshold_) || |
(sl_discard_threshold_ > 0 && spatialIdx != kNoSpatialIdx && |
spatialIdx >= sl_discard_threshold_)) { |
- return true; // Discard the packet. |
+ discard = true; |
} |
} else { |
RTC_NOTREACHED() << "Parse error"; |
@@ -86,13 +87,48 @@ bool LayerFilteringTransport::SendRtp(const uint8_t* packet, size_t length) { |
// We are discarding some of the packets (specifically, whole layers), so |
// make sure the marker bit is set properly, and that sequence numbers are |
// continuous. |
- if (set_marker_bit) { |
+ if (set_marker_bit) |
temp_buffer[1] |= kRtpMarkerBitMask; |
- } |
- ByteWriter<uint16_t>::WriteBigEndian(&temp_buffer[2], current_seq_num_); |
- ++current_seq_num_; // Increase only if packet not discarded. |
+ if (discard && header.headerLength != length) { |
+ // Min and max padding according to RTP specification. |
+ const size_t kMaxPaddingBytes = 255; |
+ const size_t kMinPaddingBytes = 1; |
+ DCHECK_LT(header.headerLength, length); |
+ temp_buffer[0] |= 0x20; // Padding bit. |
+ temp_buffer[1] &= ~kRtpMarkerBitMask; |
+ size_t bytes_left = length; |
+ while (bytes_left > 0) { |
+ size_t padding_length; |
+ if (bytes_left >= |
+ kMaxPaddingBytes + kMinPaddingBytes + header.headerLength * 2) { |
+ // Room left for another padding packet even after emitting one of |
+ // maximum size. |
+ padding_length = kMaxPaddingBytes; |
+ } else if (bytes_left > kMaxPaddingBytes + header.headerLength) { |
+ // If we make this padding packet the maximum size, the remained of the |
+ // buffer won't fit a packet of minimum size. |
+ padding_length = |
+ kMaxPaddingBytes - header.headerLength - kMinPaddingBytes; |
+ } else { |
+ DCHECK_LT(header.headerLength, bytes_left); |
+ padding_length = bytes_left - header.headerLength; |
+ } |
+ DCHECK_GE(padding_length, kMinPaddingBytes); |
+ uint16_t seq_num = ++current_seq_num_; |
+ ByteWriter<uint16_t>::WriteBigEndian(&temp_buffer[2], seq_num); |
+ size_t packet_length = header.headerLength + padding_length; |
+ temp_buffer[packet_length - 1] = static_cast<uint8_t>(padding_length); |
+ bool result = test::DirectTransport::SendRtp(temp_buffer, packet_length); |
+ DCHECK(result); |
+ DCHECK_GE(bytes_left, packet_length); |
+ bytes_left -= packet_length; |
+ } |
+ return true; |
+ } |
+ uint16_t seq_num = ++current_seq_num_; |
+ ByteWriter<uint16_t>::WriteBigEndian(&temp_buffer[2], seq_num); |
return test::DirectTransport::SendRtp(temp_buffer, length); |
} |