11e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 21e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 31e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// found in the LICENSE file. 41e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 51e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#ifndef CHROME_RENDERER_MEDIA_CAST_SESSION_DELEGATE_H_ 61e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#define CHROME_RENDERER_MEDIA_CAST_SESSION_DELEGATE_H_ 71e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <map> 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector> 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/basictypes.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/linked_ptr.h" 131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/memory/ref_counted.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/weak_ptr.h" 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/threading/thread.h" 161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/threading/thread_checker.h" 171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/time/default_tick_clock.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "media/cast/cast_config.h" 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "media/cast/cast_sender.h" 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/cast/logging/logging_defines.h" 211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace base { 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class BinaryValue; 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class DictionaryValue; 251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class MessageLoopProxy; 261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} // namespace base 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace media { 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class VideoFrame; 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace cast { 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CastEnvironment; 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FrameInput; 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass RawEventSubscriberBundle; 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace transport { 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CastTransportSender; 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace transport 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace cast 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace media 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// This class hosts CastSender and connects it to audio/video frame input 431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// and network socket. 441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// This class is created on the render thread and destroyed on the IO 451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// thread. All methods are accessible only on the IO thread. 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CastSessionDelegate { 471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef base::Callback<void(const scoped_refptr< 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) media::cast::AudioFrameInput>&)> AudioFrameInputAvailableCallback; 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef base::Callback<void(const scoped_refptr< 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) media::cast::VideoFrameInput>&)> VideoFrameInputAvailableCallback; 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef base::Callback<void(scoped_ptr<base::BinaryValue>)> EventLogsCallback; 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) typedef base::Callback<void(scoped_ptr<base::DictionaryValue>)> StatsCallback; 5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) typedef base::Callback<void(const std::string&)> ErrorCallback; 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CastSessionDelegate(); 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual ~CastSessionDelegate(); 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // This will start the session by configuring and creating the Cast transport 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // and the Cast sender. 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Must be called before initialization of audio or video. 6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) void StartUDP(const net::IPEndPoint& remote_endpoint); 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // After calling StartAudio() or StartVideo() encoding of that media will 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // begin as soon as data is delivered to its sink, if the second method is 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // called the first media will be restarted. It is strongly recommended not to 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // deliver any data between calling the two methods. 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // It's OK to call only one of the two methods. 69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // StartUDP must be called before these methods. 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void StartAudio(const media::cast::AudioSenderConfig& config, 7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const AudioFrameInputAvailableCallback& callback, 7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const ErrorCallback& error_callback); 7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void StartVideo(const media::cast::VideoSenderConfig& config, 7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const VideoFrameInputAvailableCallback& callback, 76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const ErrorCallback& error_callback, 77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const media::cast::CreateVideoEncodeAcceleratorCallback& 78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch create_vea_cb, 79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const media::cast::CreateVideoEncodeMemoryCallback& 80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch create_video_encode_mem_cb); 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void ToggleLogging(bool is_audio, bool enable); 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void GetEventLogsAndReset(bool is_audio, 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& extra_data, const EventLogsCallback& callback); 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void GetStatsAndReset(bool is_audio, const StatsCallback& callback); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Callback with the result of the initialization. 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If this callback is called with STATUS_INITIALIZED it will report back 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // to the sinks that it's ready to accept incoming audio / video frames. 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void InitializationResultCB( 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) media::cast::CastInitializationStatus result) const; 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private: 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void StatusNotificationCB( 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) media::cast::transport::CastTransportStatus status); 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Adds logs collected from transport on browser side. 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void LogRawEvents(const std::vector<media::cast::PacketEvent>& packet_events); 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) base::ThreadChecker thread_checker_; 1021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<media::cast::CastEnvironment> cast_environment_; 1031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<media::cast::CastSender> cast_sender_; 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<media::cast::transport::CastTransportSender> cast_transport_; 1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) AudioFrameInputAvailableCallback audio_frame_input_available_callback_; 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) VideoFrameInputAvailableCallback video_frame_input_available_callback_; 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu scoped_ptr<media::cast::RawEventSubscriberBundle> event_subscribers_; 110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Proxy to the IO message loop. 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_; 113a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WeakPtrFactory<CastSessionDelegate> weak_factory_; 1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CastSessionDelegate); 1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif // CHROME_RENDERER_MEDIA_CAST_SESSION_DELEGATE_H_ 119