Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(660)

Unified Diff: webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.cc

Issue 2871173008: Fix packetization logic to leave space for extensions in the last packet (Closed)
Patch Set: Implemented Danilchap@ comments Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.cc
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.cc b/webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.cc
index 2d847c17a608ba5f64dae5f938b3ca4b7689693f..a1ed0e2d7f2287d9fad9e93ad6e563bb0dd64cc6 100644
--- a/webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.cc
+++ b/webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.cc
@@ -20,59 +20,75 @@ namespace webrtc {
static const size_t kGenericHeaderLength = 1;
RtpPacketizerGeneric::RtpPacketizerGeneric(FrameType frame_type,
- size_t max_payload_len)
+ size_t max_payload_len,
+ size_t last_packet_extension_len)
: payload_data_(NULL),
payload_size_(0),
max_payload_len_(max_payload_len - kGenericHeaderLength),
- frame_type_(frame_type) {
-}
+ last_packet_extension_len_(last_packet_extension_len),
+ frame_type_(frame_type),
+ num_packets_(0) {}
RtpPacketizerGeneric::~RtpPacketizerGeneric() {
}
-void RtpPacketizerGeneric::SetPayloadData(
+size_t RtpPacketizerGeneric::SetPayloadData(
const uint8_t* payload_data,
size_t payload_size,
const RTPFragmentationHeader* fragmentation) {
payload_data_ = payload_data;
payload_size_ = payload_size;
+ size_t total_data = payload_size_ + last_packet_extension_len_;
danilchap 2017/05/12 13:56:10 what this value is? doesn't look like total size o
ilnik 2017/05/12 14:46:08 It's payload + extra bytes in the last packet. We
+
// Fragment packets more evenly by splitting the payload up evenly.
- size_t num_packets =
- (payload_size_ + max_payload_len_ - 1) / max_payload_len_;
- payload_length_ = (payload_size_ + num_packets - 1) / num_packets;
- assert(payload_length_ <= max_payload_len_);
+ num_packets_ = (total_data + max_payload_len_ - 1) / max_payload_len_;
+ payload_per_packet_ = (total_data + num_packets_ - 1) / num_packets_;
+ smaller_packets_ = num_packets_ - total_data % num_packets_;
danilchap 2017/05/12 13:56:10 Can you explain why all these arithmetic steps nee
ilnik 2017/05/12 14:46:08 Done.
+ if (smaller_packets_ == num_packets_)
+ smaller_packets_ = 0;
+ assert(payload_per_packet_ <= max_payload_len_);
danilchap 2017/05/12 13:56:10 since you are touching this line, change assert in
ilnik 2017/05/12 14:46:08 Done.
generic_header_ = RtpFormatVideoGeneric::kFirstPacketBit;
+ if (frame_type_ == kVideoFrameKey) {
+ generic_header_ |= RtpFormatVideoGeneric::kKeyFrameBit;
+ }
+ return num_packets_;
}
-bool RtpPacketizerGeneric::NextPacket(RtpPacketToSend* packet,
- bool* last_packet) {
+bool RtpPacketizerGeneric::NextPacket(RtpPacketToSend* packet) {
RTC_DCHECK(packet);
- RTC_DCHECK(last_packet);
- if (payload_size_ < payload_length_) {
- payload_length_ = payload_size_;
+ // last smaller_packets_ packets are 1 byte smaller than previous packets.
danilchap 2017/05/12 13:56:10 Start comment Uppercase: Last smaller...
ilnik 2017/05/12 14:46:08 Done.
+ if (num_packets_ == smaller_packets_)
+ payload_per_packet_--;
+ // whole payload fit into this packet
danilchap 2017/05/12 13:56:10 which line this comment explain?
ilnik 2017/05/12 14:46:08 if() line below. Moved the comment.
+ size_t current_payload = payload_per_packet_;
danilchap 2017/05/12 13:56:10 doesn't look like variable contain payload may be
ilnik 2017/05/12 14:46:08 Done.
+ if (payload_size_ <= current_payload) {
+ current_payload = payload_size_;
+ // But this is the pre-last packet. Leave at least 1 payload byte for the
danilchap 2017/05/12 13:56:10 probably better to remove 'But' and put this comme
ilnik 2017/05/12 14:46:08 Done.
+ // last packet. Should happen only if extensions take at least half of
+ // available capacity.
+ if (num_packets_ == 2) {
+ RTC_DCHECK(last_packet_extension_len_ >= max_payload_len_ / 2);
danilchap 2017/05/12 13:56:10 why do you check it? Do you rely on this assumptio
ilnik 2017/05/12 14:46:08 This is sanity checking what it works as expected.
+ current_payload -= 1;
danilchap 2017/05/12 13:56:10 --maybe
ilnik 2017/05/12 14:46:08 Done.
+ }
}
-
- payload_size_ -= payload_length_;
- RTC_DCHECK_LE(payload_length_, max_payload_len_);
+ RTC_DCHECK_LE(current_payload, max_payload_len_);
uint8_t* out_ptr =
- packet->AllocatePayload(kGenericHeaderLength + payload_length_);
+ packet->AllocatePayload(kGenericHeaderLength + current_payload);
// Put generic header in packet
danilchap 2017/05/12 13:56:10 end comments with a .
ilnik 2017/05/12 14:46:07 Done.
- if (frame_type_ == kVideoFrameKey) {
- generic_header_ |= RtpFormatVideoGeneric::kKeyFrameBit;
- }
out_ptr[0] = generic_header_;
// Remove first-packet bit, following packets are intermediate
generic_header_ &= ~RtpFormatVideoGeneric::kFirstPacketBit;
// Put payload in packet
- memcpy(out_ptr + kGenericHeaderLength, payload_data_, payload_length_);
- payload_data_ += payload_length_;
+ memcpy(out_ptr + kGenericHeaderLength, payload_data_, current_payload);
+ payload_data_ += current_payload;
+ payload_size_ -= current_payload;
+ num_packets_--;
danilchap 2017/05/12 13:56:10 may be RTC_DCHECK_EQ(num_packets_ == 0, payload_si
ilnik 2017/05/12 14:46:08 Done.
- *last_packet = payload_size_ <= 0;
- packet->SetMarker(*last_packet);
+ packet->SetMarker(payload_size_ == 0);
return true;
}

Powered by Google App Engine
This is Rietveld 408576698