124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Copyright 2014 The Chromium Authors. All rights reserved. 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Use of this source code is governed by a BSD-style license that can be 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// found in the LICENSE file. 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef REMOTING_PROTOCOL_MONITORED_VIDEO_STUB_H_ 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define REMOTING_PROTOCOL_MONITORED_VIDEO_STUB_H_ 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "base/callback.h" 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "base/threading/thread_checker.h" 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "base/timer/timer.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "remoting/protocol/video_stub.h" 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace base { 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass ThreadChecker; 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace base 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace remoting { 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace protocol { 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// MonitoredVideoStub is responsible for notifying the event handler if no 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// frames have been received within |connectivity_check_delay|. 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The implementation uses the decorator pattern in which the MonitoredVideoStub 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// implements the same interface as the VideoStub. It overrides the 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ProcessVideoPacket function to provide notification to the client when the 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// video channel is connected and forward the packet to the underlying 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// VideoStub. Multiple decorators can be stacked on top of each other if more 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// functionality is needed in the future. 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass MonitoredVideoStub : public VideoStub { 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner public: 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Callback to be called when channel state changes. The Callback should not 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // destroy the MonitoredVideoStub object. 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner typedef base::Callback<void(bool connected)> ChannelStateCallback; 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static const int kConnectivityCheckDelaySeconds = 2; 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner MonitoredVideoStub( 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner VideoStub* video_stub, 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base::TimeDelta connectivity_check_delay, 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ChannelStateCallback& callback); 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual ~MonitoredVideoStub(); 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // VideoStub implementation. 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner virtual void ProcessVideoPacket(scoped_ptr<VideoPacket> packet, 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const base::Closure& done) OVERRIDE; 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner private: 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void OnConnectivityCheckTimeout(); 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner void NotifyChannelState(bool connected); 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner VideoStub* video_stub_; 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ChannelStateCallback callback_; 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base::ThreadChecker thread_checker_; 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool is_connected_; 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner base::DelayTimer<MonitoredVideoStub> connectivity_check_timer_; 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DISALLOW_COPY_AND_ASSIGN(MonitoredVideoStub); 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}; 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace protocol 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace remoting 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif // REMOTING_PROTOCOL_MONITORED_VIDEO_STUB_H_ 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner