OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/rtp_receiver/rtp_parser/rtp_parser.h" | 5 #include "media/cast/rtp_receiver/rtp_parser/rtp_parser.h" |
6 | 6 |
| 7 #include "base/big_endian.h" |
7 #include "base/logging.h" | 8 #include "base/logging.h" |
8 #include "media/cast/cast_defines.h" | 9 #include "media/cast/cast_defines.h" |
9 #include "media/cast/rtp_receiver/rtp_receiver.h" | 10 #include "media/cast/rtp_receiver/rtp_receiver.h" |
10 #include "net/base/big_endian.h" | |
11 | 11 |
12 namespace media { | 12 namespace media { |
13 namespace cast { | 13 namespace cast { |
14 | 14 |
15 static const size_t kRtpCommonHeaderLength = 12; | 15 static const size_t kRtpCommonHeaderLength = 12; |
16 static const size_t kRtpCastHeaderLength = 7; | 16 static const size_t kRtpCastHeaderLength = 7; |
17 static const uint8 kCastKeyFrameBitMask = 0x80; | 17 static const uint8 kCastKeyFrameBitMask = 0x80; |
18 static const uint8 kCastReferenceFrameIdBitMask = 0x40; | 18 static const uint8 kCastReferenceFrameIdBitMask = 0x40; |
19 | 19 |
20 RtpParser::RtpParser(RtpData* incoming_payload_callback, | 20 RtpParser::RtpParser(RtpData* incoming_payload_callback, |
(...skipping 28 matching lines...) Expand all Loading... |
49 return false; | 49 return false; |
50 uint8 version = packet[0] >> 6; | 50 uint8 version = packet[0] >> 6; |
51 if (version != 2) | 51 if (version != 2) |
52 return false; | 52 return false; |
53 uint8 cc = packet[0] & 0x0f; | 53 uint8 cc = packet[0] & 0x0f; |
54 bool marker = ((packet[1] & 0x80) != 0); | 54 bool marker = ((packet[1] & 0x80) != 0); |
55 int payload_type = packet[1] & 0x7f; | 55 int payload_type = packet[1] & 0x7f; |
56 | 56 |
57 uint16 sequence_number; | 57 uint16 sequence_number; |
58 uint32 rtp_timestamp, ssrc; | 58 uint32 rtp_timestamp, ssrc; |
59 net::BigEndianReader big_endian_reader(packet + 2, 10); | 59 base::BigEndianReader big_endian_reader( |
| 60 reinterpret_cast<const char*>(packet + 2), 10); |
60 big_endian_reader.ReadU16(&sequence_number); | 61 big_endian_reader.ReadU16(&sequence_number); |
61 big_endian_reader.ReadU32(&rtp_timestamp); | 62 big_endian_reader.ReadU32(&rtp_timestamp); |
62 big_endian_reader.ReadU32(&ssrc); | 63 big_endian_reader.ReadU32(&ssrc); |
63 | 64 |
64 if (ssrc != parser_config_.ssrc) | 65 if (ssrc != parser_config_.ssrc) |
65 return false; | 66 return false; |
66 | 67 |
67 rtp_header->webrtc.header.markerBit = marker; | 68 rtp_header->webrtc.header.markerBit = marker; |
68 rtp_header->webrtc.header.payloadType = payload_type; | 69 rtp_header->webrtc.header.payloadType = payload_type; |
69 rtp_header->webrtc.header.sequenceNumber = sequence_number; | 70 rtp_header->webrtc.header.sequenceNumber = sequence_number; |
(...skipping 16 matching lines...) Expand all Loading... |
86 if (length < kRtpCastHeaderLength) | 87 if (length < kRtpCastHeaderLength) |
87 return false; | 88 return false; |
88 | 89 |
89 // Extract header. | 90 // Extract header. |
90 const uint8* data_ptr = packet; | 91 const uint8* data_ptr = packet; |
91 size_t data_length = length; | 92 size_t data_length = length; |
92 rtp_header->is_key_frame = (data_ptr[0] & kCastKeyFrameBitMask); | 93 rtp_header->is_key_frame = (data_ptr[0] & kCastKeyFrameBitMask); |
93 rtp_header->is_reference = (data_ptr[0] & kCastReferenceFrameIdBitMask); | 94 rtp_header->is_reference = (data_ptr[0] & kCastReferenceFrameIdBitMask); |
94 rtp_header->frame_id = frame_id_wrap_helper_.MapTo32bitsFrameId(data_ptr[1]); | 95 rtp_header->frame_id = frame_id_wrap_helper_.MapTo32bitsFrameId(data_ptr[1]); |
95 | 96 |
96 net::BigEndianReader big_endian_reader(data_ptr + 2, 4); | 97 base::BigEndianReader big_endian_reader( |
| 98 reinterpret_cast<const char*>(data_ptr + 2), 4); |
97 big_endian_reader.ReadU16(&rtp_header->packet_id); | 99 big_endian_reader.ReadU16(&rtp_header->packet_id); |
98 big_endian_reader.ReadU16(&rtp_header->max_packet_id); | 100 big_endian_reader.ReadU16(&rtp_header->max_packet_id); |
99 | 101 |
100 if (rtp_header->is_reference) { | 102 if (rtp_header->is_reference) { |
101 rtp_header->reference_frame_id = | 103 rtp_header->reference_frame_id = |
102 reference_frame_id_wrap_helper_.MapTo32bitsFrameId(data_ptr[6]); | 104 reference_frame_id_wrap_helper_.MapTo32bitsFrameId(data_ptr[6]); |
103 data_ptr += kRtpCastHeaderLength; | 105 data_ptr += kRtpCastHeaderLength; |
104 data_length -= kRtpCastHeaderLength; | 106 data_length -= kRtpCastHeaderLength; |
105 } else { | 107 } else { |
106 data_ptr += kRtpCastHeaderLength - 1; | 108 data_ptr += kRtpCastHeaderLength - 1; |
107 data_length -= kRtpCastHeaderLength - 1; | 109 data_length -= kRtpCastHeaderLength - 1; |
108 } | 110 } |
109 | 111 |
110 if (rtp_header->max_packet_id < rtp_header->packet_id) | 112 if (rtp_header->max_packet_id < rtp_header->packet_id) |
111 return false; | 113 return false; |
112 | 114 |
113 data_callback_->OnReceivedPayloadData(data_ptr, data_length, rtp_header); | 115 data_callback_->OnReceivedPayloadData(data_ptr, data_length, rtp_header); |
114 return true; | 116 return true; |
115 } | 117 } |
116 | 118 |
117 } // namespace cast | 119 } // namespace cast |
118 } // namespace media | 120 } // namespace media |
OLD | NEW |