blob: d90afcd212d40cf77e96ddb2f2fd5b0b6462adcb [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_COMMON_GPU_CLIENT_GL_SURFACE_CAPTURER_HOST_H_
#define CONTENT_COMMON_GPU_CLIENT_GL_SURFACE_CAPTURER_HOST_H_
#include "base/containers/small_map.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread_checker.h"
#include "content/common/gpu/client/command_buffer_proxy_impl.h"
#include "content/common/gpu/surface_capturer.h"
#include "ipc/ipc_listener.h"
namespace gfx {
class Rect;
class Size;
} // namespace gfx
namespace media {
class VideoFrame;
} // namespace media
namespace content {
class GpuChannelHost;
// This class is the browser-side host for the SurfaceCapturer in the GPU
// process, coordinated over IPC.
class GLSurfaceCapturerHost : public IPC::Listener,
public SurfaceCapturer,
public CommandBufferProxyImpl::DeletionObserver {
public:
// |client| is expected to outlive this object. We are registered as a
// DeletionObserver with |impl|, so it will notify us when it is about to
// be destroyed.
GLSurfaceCapturerHost(int32 capturer_route_id,
SurfaceCapturer::Client* client,
CommandBufferProxyImpl* impl);
// IPC::Listener implementation.
virtual void OnChannelError() OVERRIDE;
virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
// SurfaceCapturer implementation.
virtual void Initialize(media::VideoFrame::Format format) OVERRIDE;
virtual void TryCapture() OVERRIDE;
virtual void CopyCaptureToVideoFrame(
const scoped_refptr<media::VideoFrame>& frame) OVERRIDE;
virtual void Destroy() OVERRIDE;
// CommandBufferProxyImpl::DeletionObserver implementation.
virtual void OnWillDeleteImpl() OVERRIDE;
private:
virtual ~GLSurfaceCapturerHost();
// Notify |client_| when an error has occured. Used when notifying from
// within a media::VideoEncodeAccelerator entry point, to avoid re-entrancy.
void NotifyError(Error error);
// IPC handlers, proxying SurfaceCapturer::Client for the GPU process.
void OnNotifyCaptureParameters(const gfx::Size& buffer_size,
const gfx::Rect& visible_rect);
void OnNotifyCopyCaptureDone(int32 frame_id);
void OnNotifyError(Error error);
void Send(IPC::Message* message);
const base::ThreadChecker thread_checker_;
// Route ID for corresponding GLSurfaceCapturer in the GPU process.
const int32 capturer_route_id_;
// Weak pointer for registering as a listener for |channel_|.
base::WeakPtrFactory<GLSurfaceCapturerHost> weak_this_factory_;
// SurfaceEncoder::Client callbacks received over IPC are forwarded to
// |client_|.
SurfaceCapturer::Client* client_;
// Unowned reference to the CommandBufferProxyImpl that created us.
CommandBufferProxyImpl* impl_;
// GPU process channel to send messages on.
GpuChannelHost* channel_;
// media::VideoFrames sent to the capturer.
// base::IDMap not used here, since that takes pointers, not scoped_refptr.
typedef base::SmallMap<std::map<int32, scoped_refptr<media::VideoFrame> > >
FrameMap;
FrameMap frame_map_;
// ID serial number for next frame to send to the GPU process.
int32 next_frame_id_;
DISALLOW_COPY_AND_ASSIGN(GLSurfaceCapturerHost);
};
} // namespace content
#endif // CONTENT_COMMON_GPU_CLIENT_GL_SURFACE_CAPTURER_HOST_H_