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