OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |