| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MEDIA_GPU_TEST_VIDEO_PLAYER_FRAME_RENDERER_THUMBNAIL_H_ |
| #define MEDIA_GPU_TEST_VIDEO_PLAYER_FRAME_RENDERER_THUMBNAIL_H_ |
| |
| #include <map> |
| #include <memory> |
| #include <string> |
| #include <vector> |
| |
| #include "base/files/file_path.h" |
| #include "base/sequence_checker.h" |
| #include "base/synchronization/waitable_event.h" |
| #include "base/thread_annotations.h" |
| #include "base/threading/thread.h" |
| #include "gpu/command_buffer/common/gl2_types.h" |
| #include "media/gpu/test/video_player/frame_renderer.h" |
| |
| namespace gl { |
| |
| class GLContext; |
| class GLSurface; |
| |
| } // namespace gl |
| |
| namespace media { |
| namespace test { |
| |
| // The thumbnail frame renderer draws a thumbnail of each frame into a large |
| // image containing 10x10 thumbnails. The checksum of this image can then be |
| // compared to a golden value. |
| // Rendering introduces small platform-dependant differences, so multiple golden |
| // values need to be maintained. The thumbnail frame renderer should only be |
| // used on older platforms that are not supported by the FrameValidator, and |
| // will be deprecated soon. |
| class FrameRendererThumbnail : public FrameRenderer { |
| public: |
| FrameRendererThumbnail(const FrameRendererThumbnail&) = delete; |
| FrameRendererThumbnail& operator=(const FrameRendererThumbnail&) = delete; |
| |
| ~FrameRendererThumbnail() override; |
| |
| // Create an instance of the thumbnail frame renderer. |
| static std::unique_ptr<FrameRendererThumbnail> Create( |
| const std::vector<std::string> thumbnail_checksums, |
| const base::FilePath& output_folder); |
| |
| // FrameRenderer implementation |
| // Acquire the GL context on the |renderer_task_runner_|. This needs to be |
| // called before executing any GL-related functions. The context will remain |
| // current on the |renderer_task_runner_| until the renderer is destroyed. |
| bool AcquireGLContext() override; |
| // Get the active GL context on the |renderer_task_runner_|. |
| gl::GLContext* GetGLContext() override; |
| void RenderFrame(scoped_refptr<VideoFrame> video_frame) override; |
| void WaitUntilRenderingDone() override; |
| scoped_refptr<VideoFrame> CreateVideoFrame(VideoPixelFormat pixel_format, |
| const gfx::Size& texture_size, |
| uint32_t texture_target, |
| uint32_t* texture_id) override; |
| |
| // Validate the thumbnail image by comparing it against known golden values. |
| bool ValidateThumbnail(); |
| |
| private: |
| explicit FrameRendererThumbnail( |
| const std::vector<std::string>& thumbnail_checksums, |
| const base::FilePath& output_folder); |
| |
| // Initialize the frame renderer, performs all rendering-related setup. |
| void Initialize(); |
| // Perform cleanup on the |renderer_task_runner_|, releases the GL context. |
| void DestroyTask(base::WaitableEvent* done); |
| |
| // Initialize the thumbnail image the frame thumbnails will be rendered to on |
| // the |renderer_task_runner_|. |
| void InitializeThumbnailImageTask(); |
| // Destroy the thumbnail image on the |renderer_task_runner_|. |
| void DestroyThumbnailImageTask(); |
| // Render the texture with specified |texture_id| to the thumbnail image on |
| // the |renderer_task_runner_|. |
| void RenderThumbnailTask(uint32_t texture_target, uint32_t texture_id); |
| // Convert the thumbnail image to RGBA on the |renderer_task_runner_|. |
| const std::vector<uint8_t> ConvertThumbnailToRGBATask(); |
| // Validate the thumbnail image on the |renderer_task_runner_|. The validated |
| // thumbnail will be saved to disk on failure. |
| void ValidateThumbnailTask(bool* success, base::WaitableEvent* done); |
| // Save the thumbnail image to disk on the |renderer_task_runner_|. |
| void SaveThumbnailTask(); |
| |
| // Destroy the texture associated with the |mailbox| on the |
| // |renderer_task_runner_|. |
| void DeleteTextureTask(const gpu::Mailbox& mailbox, const gpu::SyncToken&); |
| |
| // The number of frames rendered so far. |
| size_t frame_count_ = 0u; |
| |
| // The list of thumbnail checksums for all platforms. |
| const std::vector<std::string> thumbnail_checksums_; |
| // Map between mailboxes and texture id's. |
| std::map<gpu::Mailbox, uint32_t> mailbox_texture_map_; |
| |
| // Id of the frame buffer used to render the thumbnails image. |
| GLuint thumbnails_fbo_id_ = 0u; |
| // Size of the frame buffer used to render the thumbnails image. |
| gfx::Size thumbnails_fbo_size_; |
| // Texture id of the thumbnails image. |
| GLuint thumbnails_texture_id_ = 0u; |
| // Size of the individual thumbnails rendered to the thumbnails image. |
| gfx::Size thumbnail_size_; |
| // Vertex buffer used to render thumbnails to the thumbnails image. |
| GLuint vertex_buffer_ = 0u; |
| // Shader program used to render thumbnails to the thumbnails image. |
| GLuint program_ = 0u; |
| |
| // GL context used for rendering. |
| scoped_refptr<gl::GLContext> gl_context_; |
| // GL surface used for rendering. |
| scoped_refptr<gl::GLSurface> gl_surface_; |
| |
| // Whether GL was initialized, as it should only happen once. |
| static bool gl_initialized_; |
| |
| // Output folder the thumbnails image will be written to by SaveThumbnail(). |
| const base::FilePath output_folder_; |
| |
| // Renderer thread task runner. |
| scoped_refptr<base::SequencedTaskRunner> renderer_task_runner_; |
| |
| SEQUENCE_CHECKER(client_sequence_checker_); |
| SEQUENCE_CHECKER(renderer_sequence_checker_); |
| }; |
| |
| } // namespace test |
| } // namespace media |
| |
| #endif // MEDIA_GPU_TEST_VIDEO_PLAYER_FRAME_RENDERER_THUMBNAIL_H_ |