| 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 |