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

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: Separate Pli message from Cast message. Created 4 years, 9 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 has_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 has_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
59 switch (header.PT) { 61 switch (header.PT) {
60 case kPacketTypeSenderReport: 62 case kPacketTypeSenderReport:
61 if (!ParseSR(&chunk, header)) 63 if (!ParseSR(&chunk, header))
62 return false; 64 return false;
63 break; 65 break;
64 66
65 case kPacketTypeReceiverReport: 67 case kPacketTypeReceiverReport:
66 if (!ParseRR(&chunk, header)) 68 if (!ParseRR(&chunk, header))
67 return false; 69 return false;
68 break; 70 break;
69 71
70 case kPacketTypeApplicationDefined: 72 case kPacketTypeApplicationDefined:
71 if (!ParseApplicationDefined(&chunk, header)) 73 if (!ParseApplicationDefined(&chunk, header))
72 return false; 74 return false;
73 break; 75 break;
74 76
75 case kPacketTypePayloadSpecific: 77 case kPacketTypePayloadSpecific: {
76 if (!ParseFeedbackCommon(&chunk, header)) 78 if (!ParseFeedbackCommon(&chunk, header))
77 return false; 79 return false;
80 if (!ParsePli(&chunk, header))
81 return false;
78 break; 82 break;
83 }
79 84
80 case kPacketTypeXr: 85 case kPacketTypeXr:
81 if (!ParseExtendedReport(&chunk, header)) 86 if (!ParseExtendedReport(&chunk, header))
82 return false; 87 return false;
83 break; 88 break;
84 } 89 }
85 } 90 }
86 return true; 91 return true;
87 } 92 }
88 93
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 182
178 if (ssrc == local_ssrc_) { 183 if (ssrc == local_ssrc_) {
179 last_report_ = last_report; 184 last_report_ = last_report;
180 delay_since_last_report_ = delay; 185 delay_since_last_report_ = delay;
181 has_last_report_ = true; 186 has_last_report_ = true;
182 } 187 }
183 188
184 return true; 189 return true;
185 } 190 }
186 191
192 bool RtcpParser::ParsePli(base::BigEndianReader* reader,
193 const RtcpCommonHeader& header) {
194 if (header.IC != 1)
195 return true;
196
197 uint32_t receiver_ssrc, sender_ssrc;
198 if (!reader->ReadU32(&receiver_ssrc))
199 return false;
200
201 // Ignore this Rtcp if the receiver ssrc does not match.
202 if (receiver_ssrc != remote_ssrc_)
203 return true;
204
205 if (!reader->ReadU32(&sender_ssrc))
206 return false;
207
208 // Ignore this Rtcp if the sender ssrc does not match.
209 if (sender_ssrc != local_ssrc_)
210 return true;
211
212 has_picture_loss_indicator_ = true;
213 return true;
214 }
215
187 bool RtcpParser::ParseApplicationDefined(base::BigEndianReader* reader, 216 bool RtcpParser::ParseApplicationDefined(base::BigEndianReader* reader,
188 const RtcpCommonHeader& header) { 217 const RtcpCommonHeader& header) {
189 uint32_t sender_ssrc; 218 uint32_t sender_ssrc;
190 uint32_t name; 219 uint32_t name;
191 if (!reader->ReadU32(&sender_ssrc) || 220 if (!reader->ReadU32(&sender_ssrc) ||
192 !reader->ReadU32(&name)) 221 !reader->ReadU32(&name))
193 return false; 222 return false;
194 223
195 if (sender_ssrc != remote_ssrc_) 224 if (sender_ssrc != remote_ssrc_)
196 return true; 225 return true;
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 uint32_t ssrc_of_sender; 507 uint32_t ssrc_of_sender;
479 base::BigEndianReader big_endian_reader( 508 base::BigEndianReader big_endian_reader(
480 reinterpret_cast<const char*>(rtcp_buffer), length); 509 reinterpret_cast<const char*>(rtcp_buffer), length);
481 big_endian_reader.Skip(4); // Skip header. 510 big_endian_reader.Skip(4); // Skip header.
482 big_endian_reader.ReadU32(&ssrc_of_sender); 511 big_endian_reader.ReadU32(&ssrc_of_sender);
483 return ssrc_of_sender; 512 return ssrc_of_sender;
484 } 513 }
485 514
486 } // namespace cast 515 } // namespace cast
487 } // namespace media 516 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698