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 // This file contains the interface to the cast RTP sender. 6 7 #ifndef MEDIA_CAST_TRANSPORT_RTP_SENDER_RTP_SENDER_H_ 8 #define MEDIA_CAST_TRANSPORT_RTP_SENDER_RTP_SENDER_H_ 9 10 #include <map> 11 #include <set> 12 13 #include "base/memory/scoped_ptr.h" 14 #include "base/time/tick_clock.h" 15 #include "base/time/time.h" 16 #include "base/memory/weak_ptr.h" 17 #include "media/cast/cast_config.h" 18 #include "media/cast/cast_environment.h" 19 #include "media/cast/transport/cast_transport_defines.h" 20 #include "media/cast/transport/cast_transport_sender.h" 21 #include "media/cast/transport/pacing/paced_sender.h" 22 #include "media/cast/transport/rtp_sender/packet_storage/packet_storage.h" 23 #include "media/cast/transport/rtp_sender/rtp_packetizer/rtp_packetizer.h" 24 25 namespace media { 26 namespace cast { 27 28 namespace transport { 29 30 // This object is only called from the main cast thread. 31 // This class handles splitting encoded audio and video frames into packets and 32 // add an RTP header to each packet. The sent packets are stored until they are 33 // acknowledged by the remote peer or timed out. 34 class RtpSender { 35 public: 36 RtpSender( 37 base::TickClock* clock, 38 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner, 39 PacedSender* const transport); 40 41 ~RtpSender(); 42 43 // Initialize audio stack. Audio must be initialized prior to sending encoded 44 // audio frames. Returns false if configuration is invalid. 45 bool InitializeAudio(const CastTransportAudioConfig& config); 46 47 // Initialize video stack. Video must be initialized prior to sending encoded 48 // video frames. Returns false if configuration is invalid. 49 bool InitializeVideo(const CastTransportVideoConfig& config); 50 51 void SendFrame(const EncodedFrame& frame); 52 53 void ResendPackets(const MissingFramesAndPacketsMap& missing_packets, 54 bool cancel_rtx_if_not_in_list, 55 base::TimeDelta dedupe_window); 56 57 size_t send_packet_count() const { 58 return packetizer_ ? packetizer_->send_packet_count() : 0; 59 } 60 size_t send_octet_count() const { 61 return packetizer_ ? packetizer_->send_octet_count() : 0; 62 } 63 uint32 ssrc() const { return config_.ssrc; } 64 65 private: 66 void UpdateSequenceNumber(Packet* packet); 67 68 base::TickClock* clock_; // Not owned by this class. 69 RtpPacketizerConfig config_; 70 scoped_ptr<RtpPacketizer> packetizer_; 71 scoped_ptr<PacketStorage> storage_; 72 PacedSender* const transport_; 73 scoped_refptr<base::SingleThreadTaskRunner> transport_task_runner_; 74 75 // NOTE: Weak pointers must be invalidated before all other member variables. 76 base::WeakPtrFactory<RtpSender> weak_factory_; 77 78 DISALLOW_COPY_AND_ASSIGN(RtpSender); 79 }; 80 81 } // namespace transport 82 } // namespace cast 83 } // namespace media 84 85 #endif // MEDIA_CAST_TRANSPORT_RTP_SENDER_RTP_SENDER_H_ 86