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