OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "remoting/protocol/rtp_reader.h" | 5 #include "remoting/protocol/rtp_reader.h" |
6 | 6 |
7 #include "net/base/completion_callback.h" | 7 #include "net/base/completion_callback.h" |
8 #include "net/base/io_buffer.h" | 8 #include "net/base/io_buffer.h" |
9 | 9 |
10 namespace remoting { | 10 namespace remoting { |
(...skipping 18 matching lines...) Expand all Loading... |
29 : max_sequence_number_(0), | 29 : max_sequence_number_(0), |
30 wrap_around_count_(0), | 30 wrap_around_count_(0), |
31 start_sequence_number_(kInitialSequenceNumber), | 31 start_sequence_number_(kInitialSequenceNumber), |
32 total_packets_received_(0) { | 32 total_packets_received_(0) { |
33 } | 33 } |
34 | 34 |
35 RtpReader::~RtpReader() { | 35 RtpReader::~RtpReader() { |
36 } | 36 } |
37 | 37 |
38 void RtpReader::Init(net::Socket* socket, | 38 void RtpReader::Init(net::Socket* socket, |
39 OnMessageCallback* on_message_callback) { | 39 const OnMessageCallback& on_message_callback) { |
40 on_message_callback_.reset(on_message_callback); | 40 DCHECK(!on_message_callback.is_null()); |
| 41 on_message_callback_ = on_message_callback; |
41 SocketReaderBase::Init(socket); | 42 SocketReaderBase::Init(socket); |
42 } | 43 } |
43 | 44 |
44 void RtpReader::OnDataReceived(net::IOBuffer* buffer, int data_size) { | 45 void RtpReader::OnDataReceived(net::IOBuffer* buffer, int data_size) { |
45 RtpPacket* packet = new RtpPacket(); | 46 RtpPacket* packet = new RtpPacket(); |
46 int header_size = UnpackRtpHeader(reinterpret_cast<uint8*>(buffer->data()), | 47 int header_size = UnpackRtpHeader(reinterpret_cast<uint8*>(buffer->data()), |
47 data_size, packet->mutable_header()); | 48 data_size, packet->mutable_header()); |
48 if (header_size < 0) { | 49 if (header_size < 0) { |
49 LOG(WARNING) << "Received invalid RTP packet."; | 50 LOG(WARNING) << "Received invalid RTP packet."; |
50 return; | 51 return; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 | 84 |
84 if (delta > 0 && delta < kMaxDropout) { | 85 if (delta > 0 && delta < kMaxDropout) { |
85 if (sequence_number < max_sequence_number_) { | 86 if (sequence_number < max_sequence_number_) { |
86 wrap_around_count_++; | 87 wrap_around_count_++; |
87 } | 88 } |
88 max_sequence_number_ = sequence_number; | 89 max_sequence_number_ = sequence_number; |
89 } | 90 } |
90 | 91 |
91 ++total_packets_received_; | 92 ++total_packets_received_; |
92 | 93 |
93 on_message_callback_->Run(packet); | 94 on_message_callback_.Run(packet); |
94 } | 95 } |
95 | 96 |
96 void RtpReader::GetReceiverReport(RtcpReceiverReport* report) { | 97 void RtpReader::GetReceiverReport(RtcpReceiverReport* report) { |
97 int expected_packets = start_sequence_number_ >= 0 ? | 98 int expected_packets = start_sequence_number_ >= 0 ? |
98 1 + max_sequence_number_ - start_sequence_number_ : 0; | 99 1 + max_sequence_number_ - start_sequence_number_ : 0; |
99 if (expected_packets > total_packets_received_) { | 100 if (expected_packets > total_packets_received_) { |
100 report->total_lost_packets = expected_packets - total_packets_received_; | 101 report->total_lost_packets = expected_packets - total_packets_received_; |
101 } else { | 102 } else { |
102 report->total_lost_packets = 0; | 103 report->total_lost_packets = 0; |
103 } | 104 } |
104 | 105 |
105 double loss_fraction = expected_packets > 0 ? | 106 double loss_fraction = expected_packets > 0 ? |
106 report->total_lost_packets / expected_packets : 0.0L; | 107 report->total_lost_packets / expected_packets : 0.0L; |
107 DCHECK_GE(loss_fraction, 0.0); | 108 DCHECK_GE(loss_fraction, 0.0); |
108 DCHECK_LE(loss_fraction, 1.0); | 109 DCHECK_LE(loss_fraction, 1.0); |
109 report->loss_fraction = static_cast<uint8>(255 * loss_fraction); | 110 report->loss_fraction = static_cast<uint8>(255 * loss_fraction); |
110 | 111 |
111 report->last_sequence_number = max_sequence_number_; | 112 report->last_sequence_number = max_sequence_number_; |
112 | 113 |
113 // TODO(sergeyu): Implement jitter calculation. | 114 // TODO(sergeyu): Implement jitter calculation. |
114 // | 115 // |
115 // TODO(sergeyu): Set last_sender_report_timestamp and | 116 // TODO(sergeyu): Set last_sender_report_timestamp and |
116 // last_sender_report_delay fields when sender reports are | 117 // last_sender_report_delay fields when sender reports are |
117 // implemented. | 118 // implemented. |
118 } | 119 } |
119 | 120 |
120 } // namespace protocol | 121 } // namespace protocol |
121 } // namespace remoting | 122 } // namespace remoting |
OLD | NEW |