Index: remoting/protocol/rtp_video_writer.cc |
diff --git a/remoting/protocol/rtp_video_writer.cc b/remoting/protocol/rtp_video_writer.cc |
index d5d4b752236430ea21435c7536f6918910c4b501..d18199aba3f6c363ef6a7f51319b7fc910d0dc1a 100644 |
--- a/remoting/protocol/rtp_video_writer.cc |
+++ b/remoting/protocol/rtp_video_writer.cc |
@@ -4,9 +4,11 @@ |
#include "remoting/protocol/rtp_video_writer.h" |
+#include "base/bind.h" |
#include "base/task.h" |
#include "net/base/io_buffer.h" |
#include "remoting/base/compound_buffer.h" |
+#include "remoting/base/constants.h" |
#include "remoting/proto/video.pb.h" |
#include "remoting/protocol/rtp_writer.h" |
#include "remoting/protocol/session.h" |
@@ -18,18 +20,56 @@ namespace { |
const int kMtu = 1200; |
} // namespace |
-RtpVideoWriter::RtpVideoWriter() { } |
+RtpVideoWriter::RtpVideoWriter() |
+ : initialized_(false) { |
+} |
RtpVideoWriter::~RtpVideoWriter() { |
Close(); |
} |
-void RtpVideoWriter::Init(protocol::Session* session) { |
- rtp_writer_.Init(session->video_rtp_channel()); |
+void RtpVideoWriter::Init(protocol::Session* session, |
+ const InitializedCallback& callback) { |
+ initialized_callback_ = callback; |
+ session->CreateDatagramChannel( |
+ kVideoRtpChannelName, |
+ base::Bind(&RtpVideoWriter::OnChannelReady, base::Unretained(this))); |
+ session->CreateDatagramChannel( |
+ kVideoRtcpChannelName, |
+ base::Bind(&RtpVideoWriter::OnChannelReady, base::Unretained(this))); |
+} |
+ |
+void RtpVideoWriter::OnChannelReady(const std::string& name, |
+ net::Socket* socket) { |
+ if (!socket) { |
+ if (!initialized_) { |
+ initialized_callback_.Run(false); |
+ initialized_ = true; |
Wez
2011/08/04 23:49:52
Set before callback?
Sergey Ulanov
2011/08/09 19:41:10
Done.
|
+ } |
+ return; |
+ } |
+ |
+ if (name == kVideoRtpChannelName) { |
+ DCHECK(!rtp_channel_.get()); |
+ rtp_channel_.reset(socket); |
+ rtp_writer_.Init(socket); |
+ } else if (name == kVideoRtcpChannelName) { |
+ DCHECK(!rtcp_channel_.get()); |
+ rtcp_channel_.reset(socket); |
+ // TODO(sergeyu): Use RTCP channel somehow. |
+ } |
+ |
+ if (rtp_channel_.get() && rtcp_channel_.get()) { |
+ DCHECK(!initialized_); |
+ initialized_callback_.Run(true); |
+ initialized_ = true; |
Wez
2011/08/04 23:49:52
Set before callback?
Do we really need the |initi
Sergey Ulanov
2011/08/09 19:41:10
Yes, we do. It's for the case when initialization
|
+ } |
} |
void RtpVideoWriter::Close() { |
rtp_writer_.Close(); |
+ rtp_channel_.reset(); |
+ rtcp_channel_.reset(); |
} |
void RtpVideoWriter::ProcessVideoPacket(const VideoPacket* packet, Task* done) { |