blob: 1ea3c0ace742dc89b164d7ac3048d58a983ec4d5 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_RENDERER_MEDIA_CAST_SESSION_DELEGATE_H_
#define CHROME_RENDERER_MEDIA_CAST_SESSION_DELEGATE_H_
#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "base/threading/thread.h"
#include "base/threading/thread_checker.h"
#include "base/time/default_tick_clock.h"
#include "chrome/renderer/media/cast_session.h"
#include "content/public/renderer/p2p_socket_client.h"
#include "content/public/renderer/p2p_socket_client_delegate.h"
#include "media/cast/cast_config.h"
#include "media/cast/cast_sender.h"
namespace base {
class MessageLoopProxy;
} // namespace base
// This class hosts CastSender and connects it to audio/video frame input
// and network socket.
// This class is created on the render thread and destroyed on the IO
// thread. All methods are accessible only on the IO thread.
class CastSessionDelegate
: public media::cast::PacketSender,
public content::P2PSocketClientDelegate {
public:
CastSessionDelegate();
virtual ~CastSessionDelegate();
void SetSocketFactory(
scoped_ptr<CastSession::P2PSocketFactory> socket_factory,
const net::IPEndPoint& remote_address);
// After calling StartAudio() and StartVideo() with configuration encoding
// will begin.
void StartAudio(const media::cast::AudioSenderConfig& config);
void StartVideo(const media::cast::VideoSenderConfig& config);
private:
// Start encoding threads and configure CastSender. It is ready to accept
// audio/video frames after this call.
void StartSending();
// If both audio and video are configured properly then start CastSender.
void MaybeStartSending();
// media::cast::PacketSender Implementation
virtual bool SendPacket(const media::cast::Packet& packet) OVERRIDE;
virtual bool SendPackets(const media::cast::PacketList& packets) OVERRIDE;
// content::P2PSocketClient::Delegate Implementation
virtual void OnOpen(const net::IPEndPoint& address) OVERRIDE;
virtual void OnIncomingTcpConnection(
const net::IPEndPoint& address,
content::P2PSocketClient* client) OVERRIDE;
virtual void OnSendComplete() OVERRIDE;
virtual void OnError() OVERRIDE;
virtual void OnDataReceived(const net::IPEndPoint& address,
const std::vector<char>& data) OVERRIDE;
private:
base::ThreadChecker thread_checker_;
scoped_refptr<media::cast::CastEnvironment> cast_environment_;
scoped_ptr<media::cast::CastSender> cast_sender_;
scoped_ptr<CastSession::P2PSocketFactory> socket_factory_;
net::IPEndPoint remote_address_;
scoped_refptr<content::P2PSocketClient> socket_;
// Utilities threads owned by this class. They are used by CastSender for
// encoding.
// TODO(hclam): See crbug.com/317006 for more details.
// This class shouldn't create and own threads.
base::Thread audio_encode_thread_;
base::Thread video_encode_thread_;
// Clock used by CastSender.
base::DefaultTickClock clock_;
// Configuration for audio and video.
media::cast::AudioSenderConfig audio_config_;
media::cast::VideoSenderConfig video_config_;
bool audio_configured_;
bool video_configured_;
// Proxy to the IO message loop.
const scoped_refptr<base::MessageLoopProxy> io_message_loop_proxy_;
DISALLOW_COPY_AND_ASSIGN(CastSessionDelegate);
};
#endif // CHROME_RENDERER_MEDIA_CAST_SESSION_DELEGATE_H_