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

Side by Side Diff: media/cast/net/rtcp/rtcp_utility.cc

Issue 1709863002: Add Cast PLI support on sender side. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/cast/net/rtcp/rtcp_utility.h" 5 #include "media/cast/net/rtcp/rtcp_utility.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <cmath> 9 #include <cmath>
10 10
(...skipping 15 matching lines...) Expand all
26 const double kMagicFractionalUnit = 4.294967296E3; 26 const double kMagicFractionalUnit = 4.294967296E3;
27 27
28 } // namespace 28 } // namespace
29 29
30 RtcpParser::RtcpParser(uint32_t local_ssrc, uint32_t remote_ssrc) 30 RtcpParser::RtcpParser(uint32_t local_ssrc, uint32_t remote_ssrc)
31 : local_ssrc_(local_ssrc), 31 : local_ssrc_(local_ssrc),
32 remote_ssrc_(remote_ssrc), 32 remote_ssrc_(remote_ssrc),
33 has_sender_report_(false), 33 has_sender_report_(false),
34 has_last_report_(false), 34 has_last_report_(false),
35 has_cast_message_(false), 35 has_cast_message_(false),
36 has_receiver_reference_time_report_(false) {} 36 has_receiver_reference_time_report_(false),
37 received_picture_loss_indicator_(false) {}
37 38
38 RtcpParser::~RtcpParser() {} 39 RtcpParser::~RtcpParser() {}
39 40
40 bool RtcpParser::Parse(base::BigEndianReader* reader) { 41 bool RtcpParser::Parse(base::BigEndianReader* reader) {
41 // Reset. 42 // Reset.
42 has_sender_report_ = false; 43 has_sender_report_ = false;
43 sender_report_ = RtcpSenderInfo(); 44 sender_report_ = RtcpSenderInfo();
44 has_last_report_ = false; 45 has_last_report_ = false;
45 receiver_log_.clear(); 46 receiver_log_.clear();
46 has_cast_message_ = false; 47 has_cast_message_ = false;
47 has_receiver_reference_time_report_ = false; 48 has_receiver_reference_time_report_ = false;
49 received_picture_loss_indicator_ = false;
48 50
49 while (reader->remaining()) { 51 while (reader->remaining()) {
50 RtcpCommonHeader header; 52 RtcpCommonHeader header;
51 if (!ParseCommonHeader(reader, &header)) 53 if (!ParseCommonHeader(reader, &header))
52 return false; 54 return false;
53 55
54 base::StringPiece tmp; 56 base::StringPiece tmp;
55 if (!reader->ReadPiece(&tmp, header.length_in_octets - 4)) 57 if (!reader->ReadPiece(&tmp, header.length_in_octets - 4))
56 return false; 58 return false;
57 base::BigEndianReader chunk(tmp.data(), tmp.size()); 59 base::BigEndianReader chunk(tmp.data(), tmp.size());
58 60
61 // Check for receiving PLI.
miu 2016/02/26 23:36:07 Please move this to the case kPacketTypePayloadSpe
xjz 2016/02/27 05:53:32 Done.
62 if ((header.IC == 1) && (header.P == 0) &&
miu 2016/02/26 23:36:07 OOC, why do we check header.P? Doesn't seem to ma
xjz 2016/02/27 05:53:32 Removed.
63 (header.PT == kPacketTypePayloadSpecific) &&
64 (header.length_in_octets == 12)) {
65 return ParsePli(&chunk, header);
66 }
67
59 switch (header.PT) { 68 switch (header.PT) {
60 case kPacketTypeSenderReport: 69 case kPacketTypeSenderReport:
61 if (!ParseSR(&chunk, header)) 70 if (!ParseSR(&chunk, header))
62 return false; 71 return false;
63 break; 72 break;
64 73
65 case kPacketTypeReceiverReport: 74 case kPacketTypeReceiverReport:
66 if (!ParseRR(&chunk, header)) 75 if (!ParseRR(&chunk, header))
67 return false; 76 return false;
68 break; 77 break;
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 186
178 if (ssrc == local_ssrc_) { 187 if (ssrc == local_ssrc_) {
179 last_report_ = last_report; 188 last_report_ = last_report;
180 delay_since_last_report_ = delay; 189 delay_since_last_report_ = delay;
181 has_last_report_ = true; 190 has_last_report_ = true;
182 } 191 }
183 192
184 return true; 193 return true;
185 } 194 }
186 195
196 bool RtcpParser::ParsePli(base::BigEndianReader* reader,
197 const RtcpCommonHeader& header) {
198 uint32_t receiver_ssrc, sender_ssrc;
199 if (!reader->ReadU32(&receiver_ssrc))
200 return false;
201 // Ignore this Rtcp if the receiver ssrc does not match.
202 if (receiver_ssrc != remote_ssrc_)
203 return true;
204 if (!reader->ReadU32(&sender_ssrc))
205 return false;
206 // Ignore this Rtcp if the sender ssrc does not match.
miu 2016/02/26 23:36:07 nit: extra space
xjz 2016/02/27 05:53:32 Done.
207 if (sender_ssrc != local_ssrc_)
208 return true;
209
210 received_picture_loss_indicator_ = true;
211 return true;
212 }
213
187 bool RtcpParser::ParseApplicationDefined(base::BigEndianReader* reader, 214 bool RtcpParser::ParseApplicationDefined(base::BigEndianReader* reader,
188 const RtcpCommonHeader& header) { 215 const RtcpCommonHeader& header) {
189 uint32_t sender_ssrc; 216 uint32_t sender_ssrc;
190 uint32_t name; 217 uint32_t name;
191 if (!reader->ReadU32(&sender_ssrc) || 218 if (!reader->ReadU32(&sender_ssrc) ||
192 !reader->ReadU32(&name)) 219 !reader->ReadU32(&name))
193 return false; 220 return false;
194 221
195 if (sender_ssrc != remote_ssrc_) 222 if (sender_ssrc != remote_ssrc_)
196 return true; 223 return true;
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 uint32_t ssrc_of_sender; 505 uint32_t ssrc_of_sender;
479 base::BigEndianReader big_endian_reader( 506 base::BigEndianReader big_endian_reader(
480 reinterpret_cast<const char*>(rtcp_buffer), length); 507 reinterpret_cast<const char*>(rtcp_buffer), length);
481 big_endian_reader.Skip(4); // Skip header. 508 big_endian_reader.Skip(4); // Skip header.
482 big_endian_reader.ReadU32(&ssrc_of_sender); 509 big_endian_reader.ReadU32(&ssrc_of_sender);
483 return ssrc_of_sender; 510 return ssrc_of_sender;
484 } 511 }
485 512
486 } // namespace cast 513 } // namespace cast
487 } // namespace media 514 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698