Home | History | Annotate | Download | only in rtp_sender
      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