rendering_helper.h revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gl/gl_context.h"
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/gl/gl_surface.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class MessageLoop;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WaitableEvent;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct RenderingHelperParams;
28a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates and draws textures used by the video decoder.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is not thread safe and thus all the methods of this class
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (except for ctor/dtor) ensure they're being run on a single thread.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderingHelper {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Interface for the content provider of the RenderingHelper.
35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  class Client {
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   public:
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Callback to tell client to render the content.
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    virtual void RenderContent(RenderingHelper* helper) = 0;
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    // Callback to get the desired window size of the client.
41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    virtual const gfx::Size& GetWindowSize() = 0;
42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)   protected:
44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    virtual ~Client() {}
45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  };
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  RenderingHelper();
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ~RenderingHelper();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static bool InitializeOneOff();
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Create the render context and windows by the specified dimensions.
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void Initialize(const RenderingHelperParams& params,
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  base::WaitableEvent* done);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Undo the effects of Initialize() and signal |*done|.
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void UnInitialize(base::WaitableEvent* done);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Return a newly-created GLES2 texture id of the specified size, and
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // signal |*done|.
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void CreateTexture(uint32 texture_target,
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     uint32* texture_id,
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                     const gfx::Size& size,
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     base::WaitableEvent* done);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Render thumbnail in the |texture_id| to the FBO buffer using target
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |texture_target|.
68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void RenderThumbnail(uint32 texture_target, uint32 texture_id);
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Render |texture_id| to the current view port of the screen using target
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |texture_target|.
72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void RenderTexture(uint32 texture_target, uint32 texture_id);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delete |texture_id|.
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void DeleteTexture(uint32 texture_id);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the platform specific handle to the OpenGL display.
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* GetGLDisplay();
79a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
80e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  // Get the platform specific handle to the OpenGL context.
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void* GetGLContext();
82e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
83a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Get rendered thumbnails as RGB.
84a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Sets alpha_solid to true if the alpha channel is entirely 0xff.
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void GetThumbnailsAsRGB(std::vector<unsigned char>* rgb,
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          bool* alpha_solid,
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                          base::WaitableEvent* done);
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private:
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void Clear();
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void RenderContent();
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void LayoutRenderingAreas();
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Timer to trigger the RenderContent() repeatly.
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<base::RepeatingTimer<RenderingHelper> > render_timer_;
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::MessageLoop* message_loop_;
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<gfx::GLContext> gl_context_;
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  scoped_refptr<gfx::GLSurface> gl_surface_;
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::AcceleratedWidget window_;
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gfx::Size screen_size_;
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The rendering area of each window on the screen.
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::vector<gfx::Rect> render_areas_;
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::vector<base::WeakPtr<Client> > clients_;
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool render_as_thumbnails_;
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int frame_count_;
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GLuint thumbnails_fbo_id_;
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GLuint thumbnails_texture_id_;
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size thumbnails_fbo_size_;
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  gfx::Size thumbnail_size_;
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  GLuint program_;
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  base::TimeDelta frame_duration_;
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(RenderingHelper);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)struct RenderingHelperParams {
125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  RenderingHelperParams();
126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ~RenderingHelperParams();
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The rendering FPS.
129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  int rendering_fps;
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The clients who provide the content for rendering.
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  std::vector<base::WeakPtr<RenderingHelper::Client> > clients;
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Whether the frames are rendered as scaled thumbnails within a
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // larger FBO that is in turn rendered to the window.
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool render_as_thumbnails;
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The size of the FBO containing all visible thumbnails.
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gfx::Size thumbnails_page_size;
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The size of each thumbnail within the FBO.
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gfx::Size thumbnail_size;
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)};
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_COMMON_GPU_MEDIA_RENDERING_HELPER_H_
145