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 3 // found in the LICENSE file. 4 5 #include "media/cast/rtp_receiver/rtp_receiver.h" 6 7 #include "base/logging.h" 8 #include "media/cast/rtp_receiver/receiver_stats.h" 9 #include "media/cast/rtp_receiver/rtp_parser/rtp_parser.h" 10 #include "media/cast/rtp_receiver/rtp_receiver_defines.h" 11 #include "net/base/big_endian.h" 12 13 namespace media { 14 namespace cast { 15 16 RtpReceiver::RtpReceiver(base::TickClock* clock, 17 const AudioReceiverConfig* audio_config, 18 const VideoReceiverConfig* video_config, 19 RtpData* incoming_payload_callback) { 20 DCHECK(incoming_payload_callback) << "Invalid argument"; 21 DCHECK(audio_config || video_config) << "Invalid argument"; 22 23 // Configure parser. 24 RtpParserConfig config; 25 if (audio_config) { 26 config.ssrc = audio_config->incoming_ssrc; 27 config.payload_type = audio_config->rtp_payload_type; 28 config.audio_codec = audio_config->codec; 29 config.audio_channels = audio_config->channels; 30 } else { 31 config.ssrc = video_config->incoming_ssrc; 32 config.payload_type = video_config->rtp_payload_type; 33 config.video_codec = video_config->codec; 34 } 35 stats_.reset(new ReceiverStats(clock)); 36 parser_.reset(new RtpParser(incoming_payload_callback, config)); 37 } 38 39 RtpReceiver::~RtpReceiver() {} 40 41 // static 42 uint32 RtpReceiver::GetSsrcOfSender(const uint8* rtcp_buffer, size_t length) { 43 DCHECK_GE(length, kMinLengthOfRtp) << "Invalid RTP packet"; 44 uint32 ssrc_of_sender; 45 net::BigEndianReader big_endian_reader(rtcp_buffer, length); 46 big_endian_reader.Skip(8); // Skip header 47 big_endian_reader.ReadU32(&ssrc_of_sender); 48 return ssrc_of_sender; 49 } 50 51 bool RtpReceiver::ReceivedPacket(const uint8* packet, size_t length) { 52 RtpCastHeader rtp_header; 53 if (!parser_->ParsePacket(packet, length, &rtp_header)) return false; 54 55 stats_->UpdateStatistics(rtp_header); 56 return true; 57 } 58 59 void RtpReceiver::GetStatistics(uint8* fraction_lost, 60 uint32* cumulative_lost, 61 uint32* extended_high_sequence_number, 62 uint32* jitter) { 63 stats_->GetStatistics(fraction_lost, 64 cumulative_lost, 65 extended_high_sequence_number, 66 jitter); 67 } 68 69 } // namespace cast 70 } // namespace media 71