rendering_helper.h revision 116680a4aac90f2aa7413d9095a592090648e557
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CONTENT_COMMON_GPU_MEDIA_RENDERING_HELPER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_COMMON_GPU_MEDIA_RENDERING_HELPER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <map>
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <vector>
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/time/time.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/timer/timer.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/gfx/geometry/rect.h"
15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/gfx/geometry/size.h"
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gl/gl_bindings.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class MessageLoop;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WaitableEvent;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if !defined(OS_WIN) && defined(ARCH_CPU_X86_FAMILY)
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define GL_VARIANT_GLX 1
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)typedef GLXContext NativeContextType;
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define GL_VARIANT_EGL 1
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)typedef EGLContext NativeContextType;
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct RenderingHelperParams;
34a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates and draws textures used by the video decoder.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is not thread safe and thus all the methods of this class
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (except for ctor/dtor) ensure they're being run on a single thread.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderingHelper {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Interface for the content provider of the RenderingHelper.
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  class Client {
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   public:
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Callback to tell client to render the content.
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    virtual void RenderContent(RenderingHelper* helper) = 0;
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Callback to get the desired window size of the client.
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    virtual const gfx::Size& GetWindowSize() = 0;
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   protected:
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    virtual ~Client() {}
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  };
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderingHelper();
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ~RenderingHelper();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create the render context and windows by the specified dimensions.
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void Initialize(const RenderingHelperParams& params,
584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  base::WaitableEvent* done);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Undo the effects of Initialize() and signal |*done|.
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void UnInitialize(base::WaitableEvent* done);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Return a newly-created GLES2 texture id of the specified size, and
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // signal |*done|.
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void CreateTexture(uint32 texture_target,
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     uint32* texture_id,
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     const gfx::Size& size,
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     base::WaitableEvent* done);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Render thumbnail in the |texture_id| to the FBO buffer using target
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |texture_target|.
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void RenderThumbnail(uint32 texture_target, uint32 texture_id);
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Render |texture_id| to the current view port of the screen using target
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |texture_target|.
76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void RenderTexture(uint32 texture_target, uint32 texture_id);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete |texture_id|.
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void DeleteTexture(uint32 texture_id);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the platform specific handle to the OpenGL display.
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* GetGLDisplay();
83a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
84e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Get the platform specific handle to the OpenGL context.
85e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  NativeContextType GetGLContext();
86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
87a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Get rendered thumbnails as RGB.
88a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Sets alpha_solid to true if the alpha channel is entirely 0xff.
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void GetThumbnailsAsRGB(std::vector<unsigned char>* rgb,
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          bool* alpha_solid,
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          base::WaitableEvent* done);
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void Clear();
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void RenderContent();
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void LayoutRenderingAreas();
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Timer to trigger the RenderContent() repeatly.
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<base::RepeatingTimer<RenderingHelper> > render_timer_;
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::MessageLoop* message_loop_;
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  NativeContextType gl_context_;
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(GL_VARIANT_EGL)
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EGLDisplay gl_display_;
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EGLSurface gl_surface_;
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  XVisualInfo* x_visual_;
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  HWND window_;
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  Display* x_display_;
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Window x_window_;
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gfx::Size screen_size_;
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The rendering area of each window on the screen.
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::vector<gfx::Rect> render_areas_;
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::vector<base::WeakPtr<Client> > clients_;
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool render_as_thumbnails_;
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int frame_count_;
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GLuint thumbnails_fbo_id_;
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GLuint thumbnails_texture_id_;
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size thumbnails_fbo_size_;
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size thumbnail_size_;
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GLuint program_;
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::TimeDelta frame_duration_;
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RenderingHelper);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct RenderingHelperParams {
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  RenderingHelperParams();
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ~RenderingHelperParams();
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The rendering FPS.
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int rendering_fps;
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The clients who provide the content for rendering.
147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::vector<base::WeakPtr<RenderingHelper::Client> > clients;
148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Whether the frames are rendered as scaled thumbnails within a
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // larger FBO that is in turn rendered to the window.
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool render_as_thumbnails;
152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The size of the FBO containing all visible thumbnails.
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gfx::Size thumbnails_page_size;
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The size of each thumbnail within the FBO.
155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gfx::Size thumbnail_size;
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_MEDIA_RENDERING_HELPER_H_
160