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 744033ae794f446891e80d95f30a4f31cc6c79fb..101f6bc277256f29ee97314cf616718c85a987eb 100644 |
--- a/chrome/renderer/media/cast_session_delegate.cc |
+++ b/chrome/renderer/media/cast_session_delegate.cc |
@@ -6,7 +6,9 @@ |
#include "base/logging.h" |
#include "base/message_loop/message_loop_proxy.h" |
+#include "content/public/renderer/p2p_socket_client.h" |
#include "content/public/renderer/render_thread.h" |
+#include "media/cast/cast_config.h" |
#include "media/cast/cast_environment.h" |
#include "media/cast/cast_sender.h" |
#include "media/cast/logging/logging_defines.h" |
@@ -29,6 +31,13 @@ CastSessionDelegate::~CastSessionDelegate() { |
DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
} |
+void CastSessionDelegate::SetSocketFactory( |
+ scoped_ptr<CastSession::P2PSocketFactory> socket_factory, |
+ const net::IPEndPoint& remote_address) { |
+ socket_factory_ = socket_factory.Pass(); |
+ remote_address_ = remote_address; |
+} |
+ |
void CastSessionDelegate::StartAudio(const AudioSenderConfig& config) { |
DCHECK(io_message_loop_proxy_->BelongsToCurrentThread()); |
@@ -51,6 +60,14 @@ void CastSessionDelegate::StartSending() { |
if (cast_environment_) |
return; |
+ if (!socket_factory_) { |
+ // TODO(hubbe): Post an error back to the user |
+ return; |
+ } |
+ |
+ socket_ = socket_factory_->Create(); |
+ socket_->SetDelegate(this); |
+ |
audio_encode_thread_.Start(); |
video_encode_thread_.Start(); |
@@ -67,15 +84,67 @@ void CastSessionDelegate::StartSending() { |
NULL, |
media::cast::GetDefaultCastLoggingConfig()); |
- // TODO(hclam): A couple things need to be done here: |
- // 1. Connect media::cast::PacketSender to net::Socket interface. |
- // 2. Implement VideoEncoderController to configure hardware encoder. |
+ // TODO(hclam): Implement VideoEncoderController to configure hardware |
+ // encoder. |
cast_sender_.reset(CastSender::CreateCastSender( |
cast_environment_, |
audio_config_, |
video_config_, |
NULL, |
- NULL)); |
+ this)); |
+} |
+ |
+ // media::cast::PacketSender Implementation |
+bool CastSessionDelegate::SendPacket( |
+ const media::cast::Packet& packet) { |
+ // TODO(hubbe): Make sure audio and video packets gets the right DSCP. |
+ socket_->SendWithDscp( |
+ remote_address_, |
+ *reinterpret_cast<const std::vector<char> *>(&packet), |
+ net::DSCP_AF41); |
+ return true; |
+} |
+ |
+bool CastSessionDelegate::SendPackets( |
+ const media::cast::PacketList& packets) { |
+ // TODO(hubbe): Add ability to send multiple packets in one IPC message. |
+ for (size_t i = 0; i < packets.size(); i++) { |
+ SendPacket(packets[i]); |
+ } |
+ return true; |
+} |
+ |
+// content::P2PSocketClient::Delegate Implementation |
+void CastSessionDelegate::OnOpen( |
+ const net::IPEndPoint& address) { |
+ // Called once Init completes. Ignored. |
+} |
+ |
+void CastSessionDelegate::OnIncomingTcpConnection( |
+ const net::IPEndPoint& address, |
+ content::P2PSocketClient* client) { |
+ // We only support UDP sockets. This function should not be called |
+ // for UDP sockets. |
+ NOTREACHED(); |
+} |
+ |
+void CastSessionDelegate::OnSendComplete() { |
+ // Ignored for now. |
+} |
+ |
+void CastSessionDelegate::OnError() { |
+ // TODO(hubbe): Report this back to the user. |
+} |
+ |
+void CastSessionDelegate::OnDataReceived(const net::IPEndPoint& address, |
+ const std::vector<char>& data) { |
+ uint8 *packet_copy = new uint8[data.size()]; |
+ memcpy(packet_copy, &data[0], data.size()); |
+ cast_sender_->packet_receiver()->ReceivedPacket( |
+ packet_copy, |
+ data.size(), |
+ base::Bind(&media::cast::PacketReceiver::DeletePacket, |
+ packet_copy)); |
} |
void CastSessionDelegate::MaybeStartSending() { |