1// Copyright 2013 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#ifndef CONTENT_RENDERER_MEDIA_RENDERER_GPU_VIDEO_ACCELERATOR_FACTORIES_H_
6#define CONTENT_RENDERER_MEDIA_RENDERER_GPU_VIDEO_ACCELERATOR_FACTORIES_H_
7
8#include <vector>
9
10#include "base/basictypes.h"
11#include "base/memory/ref_counted.h"
12#include "base/memory/weak_ptr.h"
13#include "base/synchronization/waitable_event.h"
14#include "content/child/thread_safe_sender.h"
15#include "content/common/content_export.h"
16#include "media/filters/gpu_video_accelerator_factories.h"
17#include "ui/gfx/size.h"
18
19namespace base {
20class WaitableEvent;
21}
22
23namespace content {
24class ContextProviderCommandBuffer;
25class GLHelper;
26class GpuChannelHost;
27class WebGraphicsContext3DCommandBufferImpl;
28
29// Glue code to expose functionality needed by media::GpuVideoAccelerator to
30// RenderViewImpl.  This class is entirely an implementation detail of
31// RenderViewImpl and only has its own header to allow extraction of its
32// implementation from render_view_impl.cc which is already far too large.
33//
34// The RendererGpuVideoAcceleratorFactories can be constructed on any thread,
35// but subsequent calls to all public methods of the class must be called from
36// the |task_runner_|, as provided during construction.
37class CONTENT_EXPORT RendererGpuVideoAcceleratorFactories
38    : public media::GpuVideoAcceleratorFactories {
39 public:
40  // Takes a ref on |gpu_channel_host| and tests |context| for loss before each
41  // use.  Safe to call from any thread.
42  static scoped_refptr<RendererGpuVideoAcceleratorFactories> Create(
43      GpuChannelHost* gpu_channel_host,
44      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
45      const scoped_refptr<ContextProviderCommandBuffer>& context_provider);
46
47  // media::GpuVideoAcceleratorFactories implementation.
48  virtual scoped_ptr<media::VideoDecodeAccelerator>
49      CreateVideoDecodeAccelerator() OVERRIDE;
50  virtual scoped_ptr<media::VideoEncodeAccelerator>
51      CreateVideoEncodeAccelerator() OVERRIDE;
52  // Creates textures and produces them into mailboxes. Returns true on success
53  // or false on failure.
54  virtual bool CreateTextures(int32 count,
55                              const gfx::Size& size,
56                              std::vector<uint32>* texture_ids,
57                              std::vector<gpu::Mailbox>* texture_mailboxes,
58                              uint32 texture_target) OVERRIDE;
59  virtual void DeleteTexture(uint32 texture_id) OVERRIDE;
60  virtual void WaitSyncPoint(uint32 sync_point) OVERRIDE;
61  virtual void ReadPixels(uint32 texture_id,
62                          const gfx::Rect& visible_rect,
63                          const SkBitmap& pixels) OVERRIDE;
64  virtual base::SharedMemory* CreateSharedMemory(size_t size) OVERRIDE;
65  virtual scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunner() OVERRIDE;
66  virtual std::vector<media::VideoEncodeAccelerator::SupportedProfile>
67      GetVideoEncodeAcceleratorSupportedProfiles() OVERRIDE;
68
69 private:
70  friend class base::RefCountedThreadSafe<RendererGpuVideoAcceleratorFactories>;
71  RendererGpuVideoAcceleratorFactories(
72      GpuChannelHost* gpu_channel_host,
73      const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
74      const scoped_refptr<ContextProviderCommandBuffer>& context_provider);
75  virtual ~RendererGpuVideoAcceleratorFactories();
76
77  // Helper to bind |context_provider| to the |task_runner_| thread after
78  // construction.
79  void BindContext();
80
81  // Helper to get a pointer to the WebGraphicsContext3DCommandBufferImpl,
82  // if it has not been lost yet.
83  WebGraphicsContext3DCommandBufferImpl* GetContext3d();
84  GLHelper* GetGLHelper();
85
86  scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
87  scoped_refptr<GpuChannelHost> gpu_channel_host_;
88  scoped_refptr<ContextProviderCommandBuffer> context_provider_;
89  scoped_ptr<GLHelper> gl_helper_;
90
91  // For sending requests to allocate shared memory in the Browser process.
92  scoped_refptr<ThreadSafeSender> thread_safe_sender_;
93
94  DISALLOW_COPY_AND_ASSIGN(RendererGpuVideoAcceleratorFactories);
95};
96
97}  // namespace content
98
99#endif  // CONTENT_RENDERER_MEDIA_RENDERER_GPU_VIDEO_ACCELERATOR_FACTORIES_H_
100