Home | History | Annotate | Download | only in cast
      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 is the main interface for the cast sender.
      6 //
      7 // The AudioFrameInput, VideoFrameInput and PacketReciever interfaces should
      8 // be accessed from the main thread.
      9 
     10 #ifndef MEDIA_CAST_CAST_SENDER_H_
     11 #define MEDIA_CAST_CAST_SENDER_H_
     12 
     13 #include "base/basictypes.h"
     14 #include "base/callback.h"
     15 #include "base/memory/ref_counted.h"
     16 #include "base/memory/scoped_ptr.h"
     17 #include "base/time/tick_clock.h"
     18 #include "base/time/time.h"
     19 #include "media/base/audio_bus.h"
     20 #include "media/cast/cast_config.h"
     21 #include "media/cast/cast_environment.h"
     22 #include "media/cast/net/cast_transport_sender.h"
     23 
     24 namespace media {
     25 class VideoFrame;
     26 
     27 namespace cast {
     28 class AudioSender;
     29 class VideoSender;
     30 
     31 class VideoFrameInput : public base::RefCountedThreadSafe<VideoFrameInput> {
     32  public:
     33   // Insert video frames into Cast sender. Frames will be encoded, packetized
     34   // and sent to the network.
     35   virtual void InsertRawVideoFrame(
     36       const scoped_refptr<media::VideoFrame>& video_frame,
     37       const base::TimeTicks& capture_time) = 0;
     38 
     39  protected:
     40   virtual ~VideoFrameInput() {}
     41 
     42  private:
     43   friend class base::RefCountedThreadSafe<VideoFrameInput>;
     44 };
     45 
     46 class AudioFrameInput : public base::RefCountedThreadSafe<AudioFrameInput> {
     47  public:
     48   // Insert audio frames into Cast sender. Frames will be encoded, packetized
     49   // and sent to the network.
     50   virtual void InsertAudio(scoped_ptr<AudioBus> audio_bus,
     51                            const base::TimeTicks& recorded_time) = 0;
     52 
     53  protected:
     54   virtual ~AudioFrameInput() {}
     55 
     56  private:
     57   friend class base::RefCountedThreadSafe<AudioFrameInput>;
     58 };
     59 
     60 // All methods of CastSender must be called on the main thread.
     61 // Provided CastTransportSender will also be called on the main thread.
     62 class CastSender {
     63  public:
     64   static scoped_ptr<CastSender> Create(
     65       scoped_refptr<CastEnvironment> cast_environment,
     66       CastTransportSender* const transport_sender);
     67 
     68   virtual ~CastSender() {}
     69 
     70   // All video frames for the session should be inserted to this object.
     71   virtual scoped_refptr<VideoFrameInput> video_frame_input() = 0;
     72 
     73   // All audio frames for the session should be inserted to this object.
     74   virtual scoped_refptr<AudioFrameInput> audio_frame_input() = 0;
     75 
     76   // Initialize the audio stack. Must be called in order to send audio frames.
     77   // Status of the initialization will be returned on cast_initialization_cb.
     78   virtual void InitializeAudio(
     79       const AudioSenderConfig& audio_config,
     80       const CastInitializationCallback& cast_initialization_cb) = 0;
     81 
     82   // Initialize the video stack. Must be called in order to send video frames.
     83   // Status of the initialization will be returned on cast_initialization_cb.
     84   virtual void InitializeVideo(
     85       const VideoSenderConfig& video_config,
     86       const CastInitializationCallback& cast_initialization_cb,
     87       const CreateVideoEncodeAcceleratorCallback& create_vea_cb,
     88       const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb) = 0;
     89 
     90   // Change the target delay. This is only valid if the receiver
     91   // supports the "adaptive_target_delay" rtp extension.
     92   virtual void SetTargetPlayoutDelay(
     93       base::TimeDelta new_target_playout_delay) = 0;
     94 };
     95 
     96 }  // namespace cast
     97 }  // namespace media
     98 
     99 #endif  // MEDIA_CAST_CAST_SENDER_H_
    100