Home | History | Annotate | Download | only in protocol
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "remoting/protocol/protobuf_video_reader.h"
      6 
      7 #include "base/bind.h"
      8 #include "net/socket/stream_socket.h"
      9 #include "remoting/base/constants.h"
     10 #include "remoting/proto/video.pb.h"
     11 #include "remoting/protocol/channel_factory.h"
     12 #include "remoting/protocol/session.h"
     13 
     14 namespace remoting {
     15 namespace protocol {
     16 
     17 ProtobufVideoReader::ProtobufVideoReader(VideoPacketFormat::Encoding encoding)
     18     : encoding_(encoding),
     19       channel_factory_(NULL),
     20       video_stub_(NULL) {
     21 }
     22 
     23 ProtobufVideoReader::~ProtobufVideoReader() {
     24   if (channel_factory_)
     25     channel_factory_->CancelChannelCreation(kVideoChannelName);
     26 }
     27 
     28 void ProtobufVideoReader::Init(protocol::Session* session,
     29                                VideoStub* video_stub,
     30                                const InitializedCallback& callback) {
     31   channel_factory_ = session->GetTransportChannelFactory();
     32   initialized_callback_ = callback;
     33   video_stub_ = video_stub;
     34 
     35   channel_factory_->CreateStreamChannel(
     36       kVideoChannelName,
     37       base::Bind(&ProtobufVideoReader::OnChannelReady, base::Unretained(this)));
     38 }
     39 
     40 bool ProtobufVideoReader::is_connected() {
     41   return channel_.get() != NULL;
     42 }
     43 
     44 void ProtobufVideoReader::OnChannelReady(scoped_ptr<net::StreamSocket> socket) {
     45   if (!socket.get()) {
     46     initialized_callback_.Run(false);
     47     return;
     48   }
     49 
     50   DCHECK(!channel_.get());
     51   channel_ = socket.Pass();
     52   reader_.Init(channel_.get(), base::Bind(&ProtobufVideoReader::OnNewData,
     53                                           base::Unretained(this)));
     54   initialized_callback_.Run(true);
     55 }
     56 
     57 void ProtobufVideoReader::OnNewData(scoped_ptr<VideoPacket> packet,
     58                                     const base::Closure& done_task) {
     59   video_stub_->ProcessVideoPacket(packet.Pass(), done_task);
     60 }
     61 
     62 }  // namespace protocol
     63 }  // namespace remoting
     64