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