| Index: chrome/renderer/media/cast_session_delegate.cc
|
| diff --git a/chrome/renderer/media/cast_session_delegate.cc b/chrome/renderer/media/cast_session_delegate.cc
|
| index 5da3443f493cb3339e0c6ce789e1a66776af4f78..d5133b61cc0259899b38a5d422f96ca694b321a3 100644
|
| --- a/chrome/renderer/media/cast_session_delegate.cc
|
| +++ b/chrome/renderer/media/cast_session_delegate.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include "base/logging.h"
|
| #include "base/message_loop/message_loop_proxy.h"
|
| +#include "chrome/renderer/media/cast_transport_sender_ipc.h"
|
| #include "content/public/renderer/p2p_socket_client.h"
|
| #include "content/public/renderer/render_thread.h"
|
| #include "media/cast/cast_config.h"
|
| @@ -20,56 +21,13 @@ using media::cast::CastEnvironment;
|
| using media::cast::CastSender;
|
| using media::cast::VideoSenderConfig;
|
|
|
| -namespace {
|
| -
|
| -// This is a dummy class that does nothing. This is needed temporarily
|
| -// to enable tests for cast.streaming extension APIs.
|
| -// The real implementation of CastTransportSender is to use IPC to send
|
| -// data to the browser process.
|
| -// See crbug.com/327482 for more details.
|
| -class DummyTransport : public media::cast::transport::CastTransportSender {
|
| - public:
|
| - DummyTransport() {}
|
| - virtual ~DummyTransport() {}
|
| -
|
| - // CastTransportSender implementations.
|
| - virtual void SetPacketReceiver(
|
| - const media::cast::transport::PacketReceiverCallback& packet_receiver)
|
| - OVERRIDE {}
|
| - virtual void InsertCodedAudioFrame(
|
| - const media::cast::transport::EncodedAudioFrame* audio_frame,
|
| - const base::TimeTicks& recorded_time) OVERRIDE {}
|
| - virtual void InsertCodedVideoFrame(
|
| - const media::cast::transport::EncodedVideoFrame* video_frame,
|
| - const base::TimeTicks& capture_time) OVERRIDE {}
|
| - virtual void SendRtcpFromRtpSender(
|
| - uint32 packet_type_flags,
|
| - const media::cast::transport::RtcpSenderInfo& sender_info,
|
| - const media::cast::transport::RtcpDlrrReportBlock& dlrr,
|
| - const media::cast::transport::RtcpSenderLogMessage& sender_log,
|
| - uint32 sending_ssrc,
|
| - const std::string& c_name) OVERRIDE {}
|
| - virtual void ResendPackets(
|
| - bool is_audio,
|
| - const media::cast::transport::MissingFramesAndPacketsMap& missing_packets)
|
| - OVERRIDE {}
|
| - virtual void SubscribeAudioRtpStatsCallback(
|
| - const media::cast::transport::CastTransportRtpStatistics& callback)
|
| - OVERRIDE {}
|
| - virtual void SubscribeVideoRtpStatsCallback(
|
| - const media::cast::transport::CastTransportRtpStatistics& callback)
|
| - OVERRIDE {}
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(DummyTransport);
|
| -};
|
| -} // namespace
|
| -
|
| CastSessionDelegate::CastSessionDelegate()
|
| : audio_encode_thread_("CastAudioEncodeThread"),
|
| video_encode_thread_("CastVideoEncodeThread"),
|
| + transport_configured_(false),
|
| io_message_loop_proxy_(
|
| content::RenderThread::Get()->GetIOMessageLoopProxy()) {
|
| + DCHECK(io_message_loop_proxy_);
|
| }
|
|
|
| CastSessionDelegate::~CastSessionDelegate() {
|
| @@ -80,7 +38,6 @@ void CastSessionDelegate::Initialize() {
|
| if (cast_environment_)
|
| return; // Already initialized.
|
|
|
| - cast_transport_.reset(new DummyTransport());
|
| audio_encode_thread_.Start();
|
| video_encode_thread_.Start();
|
|
|
| @@ -105,32 +62,71 @@ void CastSessionDelegate::StartAudio(
|
| DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
|
|
| audio_config_.reset(new AudioSenderConfig(config));
|
| - StartSendingInternal(callback, true);
|
| + video_frame_input_available_callback_ = callback;
|
| + StartSendingInternal();
|
| }
|
|
|
| void CastSessionDelegate::StartVideo(
|
| const VideoSenderConfig& config,
|
| const FrameInputAvailableCallback& callback) {
|
| DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| + audio_frame_input_available_callback_ = callback;
|
|
|
| video_config_.reset(new VideoSenderConfig(config));
|
| - StartSendingInternal(callback, false);
|
| + StartSendingInternal();
|
| +}
|
| +
|
| +void CastSessionDelegate::StartUDP(
|
| + const net::IPEndPoint& local_endpoint,
|
| + const net::IPEndPoint& remote_endpoint) {
|
| + DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| + transport_configured_ = true;
|
| + local_endpoint_ = local_endpoint;
|
| + remote_endpoint_ = remote_endpoint;
|
| + StartSendingInternal();
|
| }
|
|
|
| -void CastSessionDelegate::StartSendingInternal(
|
| - const FrameInputAvailableCallback& callback,
|
| - bool is_audio) {
|
| +void CastSessionDelegate::StatusNotificationCB(
|
| + media::cast::transport::CastTransportStatus unused_status) {
|
| DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| + // TODO(hubbe): Call javascript UDPTransport error function.
|
| +}
|
| +
|
| +void CastSessionDelegate::StartSendingInternal() {
|
| + DCHECK(io_message_loop_proxy_->BelongsToCurrentThread());
|
| +
|
| + // No transport, wait.
|
| + if (!transport_configured_)
|
| + return;
|
| +
|
| + // No audio or video, wait.
|
| + if (!audio_config_ && !video_config_)
|
| + return;
|
|
|
| Initialize();
|
|
|
| - if (is_audio) {
|
| - audio_frame_input_available_callback_.reset(
|
| - new FrameInputAvailableCallback(callback));
|
| - } else {
|
| - video_frame_input_available_callback_.reset(
|
| - new FrameInputAvailableCallback(callback));
|
| + media::cast::transport::CastTransportConfig config;
|
| +
|
| + // TODO(hubbe): set config.aes_key and config.aes_iv_mask.
|
| + config.local_endpoint = local_endpoint_;
|
| + config.receiver_endpoint = remote_endpoint_;
|
| + if (audio_config_) {
|
| + config.audio_ssrc = audio_config_->sender_ssrc;
|
| + config.audio_codec = audio_config_->codec;
|
| + config.audio_rtp_config = audio_config_->rtp_config;
|
| + config.audio_frequency = audio_config_->frequency;
|
| + config.audio_channels = audio_config_->channels;
|
| }
|
| + if (video_config_) {
|
| + config.video_ssrc = video_config_->sender_ssrc;
|
| + config.video_codec = video_config_->codec;
|
| + config.video_rtp_config = video_config_->rtp_config;
|
| + }
|
| +
|
| + cast_transport_.reset(new CastTransportSenderIPC(
|
| + config,
|
| + base::Bind(&CastSessionDelegate::StatusNotificationCB,
|
| + base::Unretained(this))));
|
|
|
| cast_sender_.reset(CastSender::CreateCastSender(
|
| cast_environment_,
|
| @@ -140,6 +136,7 @@ void CastSessionDelegate::StartSendingInternal(
|
| base::Bind(&CastSessionDelegate::InitializationResult,
|
| base::Unretained(this)),
|
| cast_transport_.get()));
|
| + cast_transport_->SetPacketReceiver(cast_sender_->packet_receiver());
|
| }
|
|
|
| void CastSessionDelegate::InitializationResult(
|
| @@ -148,11 +145,11 @@ void CastSessionDelegate::InitializationResult(
|
|
|
| // TODO(pwestin): handle the error codes.
|
| if (result == media::cast::STATUS_INITIALIZED) {
|
| - if (audio_frame_input_available_callback_) {
|
| - audio_frame_input_available_callback_->Run(cast_sender_->frame_input());
|
| + if (!audio_frame_input_available_callback_.is_null()) {
|
| + audio_frame_input_available_callback_.Run(cast_sender_->frame_input());
|
| }
|
| - if (video_frame_input_available_callback_) {
|
| - video_frame_input_available_callback_->Run(cast_sender_->frame_input());
|
| + if (!video_frame_input_available_callback_.is_null()) {
|
| + video_frame_input_available_callback_.Run(cast_sender_->frame_input());
|
| }
|
| }
|
| }
|
|
|