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 #ifndef CHROME_RENDERER_MEDIA_CAST_SESSION_DELEGATE_H_ 6 #define CHROME_RENDERER_MEDIA_CAST_SESSION_DELEGATE_H_ 7 8 #include <map> 9 #include <vector> 10 11 #include "base/basictypes.h" 12 #include "base/memory/linked_ptr.h" 13 #include "base/memory/ref_counted.h" 14 #include "base/memory/weak_ptr.h" 15 #include "base/threading/thread.h" 16 #include "base/threading/thread_checker.h" 17 #include "base/time/default_tick_clock.h" 18 #include "media/cast/cast_config.h" 19 #include "media/cast/cast_sender.h" 20 #include "media/cast/logging/logging_defines.h" 21 22 namespace base { 23 class BinaryValue; 24 class DictionaryValue; 25 class MessageLoopProxy; 26 } // namespace base 27 28 namespace media { 29 class VideoFrame; 30 31 namespace cast { 32 class CastEnvironment; 33 class FrameInput; 34 class RawEventSubscriberBundle; 35 36 namespace transport { 37 class CastTransportSender; 38 } // namespace transport 39 } // namespace cast 40 } // namespace media 41 42 // This class hosts CastSender and connects it to audio/video frame input 43 // and network socket. 44 // This class is created on the render thread and destroyed on the IO 45 // thread. All methods are accessible only on the IO thread. 46 class CastSessionDelegate { 47 public: 48 typedef base::Callback<void(const scoped_refptr< 49 media::cast::AudioFrameInput>&)> AudioFrameInputAvailableCallback; 50 typedef base::Callback<void(const scoped_refptr< 51 media::cast::VideoFrameInput>&)> VideoFrameInputAvailableCallback; 52 typedef base::Callback<void(scoped_ptr<base::BinaryValue>)> EventLogsCallback; 53 typedef base::Callback<void(scoped_ptr<base::DictionaryValue>)> StatsCallback; 54 typedef base::Callback<void(const std::string&)> ErrorCallback; 55 56 CastSessionDelegate(); 57 virtual ~CastSessionDelegate(); 58 59 // This will start the session by configuring and creating the Cast transport 60 // and the Cast sender. 61 // Must be called before initialization of audio or video. 62 void StartUDP(const net::IPEndPoint& remote_endpoint); 63 64 // After calling StartAudio() or StartVideo() encoding of that media will 65 // begin as soon as data is delivered to its sink, if the second method is 66 // called the first media will be restarted. It is strongly recommended not to 67 // deliver any data between calling the two methods. 68 // It's OK to call only one of the two methods. 69 // StartUDP must be called before these methods. 70 void StartAudio(const media::cast::AudioSenderConfig& config, 71 const AudioFrameInputAvailableCallback& callback, 72 const ErrorCallback& error_callback); 73 74 void StartVideo(const media::cast::VideoSenderConfig& config, 75 const VideoFrameInputAvailableCallback& callback, 76 const ErrorCallback& error_callback, 77 const media::cast::CreateVideoEncodeAcceleratorCallback& 78 create_vea_cb, 79 const media::cast::CreateVideoEncodeMemoryCallback& 80 create_video_encode_mem_cb); 81 82 void ToggleLogging(bool is_audio, bool enable); 83 void GetEventLogsAndReset(bool is_audio, 84 const std::string& extra_data, const EventLogsCallback& callback); 85 void GetStatsAndReset(bool is_audio, const StatsCallback& callback); 86 87 protected: 88 // Callback with the result of the initialization. 89 // If this callback is called with STATUS_INITIALIZED it will report back 90 // to the sinks that it's ready to accept incoming audio / video frames. 91 void InitializationResultCB( 92 media::cast::CastInitializationStatus result) const; 93 94 private: 95 void StatusNotificationCB( 96 media::cast::transport::CastTransportStatus status); 97 98 // Adds logs collected from transport on browser side. 99 void LogRawEvents(const std::vector<media::cast::PacketEvent>& packet_events); 100 101 base::ThreadChecker thread_checker_; 102 scoped_refptr<media::cast::CastEnvironment> cast_environment_; 103 scoped_ptr<media::cast::CastSender> cast_sender_; 104 scoped_ptr<media::cast::transport::CastTransportSender> cast_transport_; 105 106 AudioFrameInputAvailableCallback audio_frame_input_available_callback_; 107 VideoFrameInputAvailableCallback video_frame_input_available_callback_; 108 109 scoped_ptr<media::cast::RawEventSubscriberBundle> event_subscribers_; 110 111 // Proxy to the IO message loop. 112 scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_; 113 base::WeakPtrFactory<CastSessionDelegate> weak_factory_; 114 115 DISALLOW_COPY_AND_ASSIGN(CastSessionDelegate); 116 }; 117 118 #endif // CHROME_RENDERER_MEDIA_CAST_SESSION_DELEGATE_H_ 119