OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef MEDIA_FILTERS_SKCANVAS_VIDEO_RENDERER_H_ | |
6 #define MEDIA_FILTERS_SKCANVAS_VIDEO_RENDERER_H_ | |
7 | |
8 #include "base/memory/ref_counted.h" | |
9 #include "base/time/time.h" | |
10 #include "base/timer/timer.h" | |
11 #include "media/base/media_export.h" | |
12 #include "media/base/video_rotation.h" | |
13 #include "media/filters/context_3d.h" | |
14 #include "third_party/skia/include/core/SkBitmap.h" | |
15 #include "third_party/skia/include/core/SkXfermode.h" | |
16 #include "ui/gfx/geometry/rect.h" | |
17 | |
18 class SkCanvas; | |
19 | |
20 namespace media { | |
21 | |
22 class VideoFrame; | |
23 class VideoImageGenerator; | |
24 | |
25 // Handles rendering of VideoFrames to SkCanvases, doing any necessary YUV | |
26 // conversion and caching of resulting RGB bitmaps. | |
27 class MEDIA_EXPORT SkCanvasVideoRenderer { | |
28 public: | |
29 SkCanvasVideoRenderer(); | |
30 ~SkCanvasVideoRenderer(); | |
31 | |
32 // Paints |video_frame| on |canvas|, scaling and rotating the result to fit | |
33 // dimensions specified by |dest_rect|. | |
34 // If the format of |video_frame| is VideoFrame::NATIVE_TEXTURE, |context_3d| | |
35 // must be provided. | |
36 // | |
37 // Black will be painted on |canvas| if |video_frame| is null. | |
38 void Paint(const scoped_refptr<VideoFrame>& video_frame, | |
39 SkCanvas* canvas, | |
40 const gfx::RectF& dest_rect, | |
41 uint8 alpha, | |
42 SkXfermode::Mode mode, | |
43 VideoRotation video_rotation, | |
44 const Context3D& context_3d); | |
45 | |
46 // Copy |video_frame| on |canvas|. | |
47 // If the format of |video_frame| is VideoFrame::NATIVE_TEXTURE, |context_3d| | |
48 // must be provided. | |
49 void Copy(const scoped_refptr<VideoFrame>& video_frame, | |
50 SkCanvas* canvas, | |
51 const Context3D& context_3d); | |
52 | |
53 // Convert the contents of |video_frame| to raw RGB pixels. |rgb_pixels| | |
54 // should point into a buffer large enough to hold as many 32 bit RGBA pixels | |
55 // as are in the visible_rect() area of the frame. | |
56 static void ConvertVideoFrameToRGBPixels( | |
57 const scoped_refptr<media::VideoFrame>& video_frame, | |
58 void* rgb_pixels, | |
59 size_t row_bytes); | |
60 | |
61 // Copy the contents of texture of |video_frame| to texture |texture|. | |
62 // |level|, |internal_format|, |type| specify target texture |texture|. | |
63 // The format of |video_frame| must be VideoFrame::NATIVE_TEXTURE. | |
64 static void CopyVideoFrameTextureToGLTexture(gpu::gles2::GLES2Interface* gl, | |
65 VideoFrame* video_frame, | |
66 unsigned int texture, | |
67 unsigned int level, | |
68 unsigned int internal_format, | |
69 unsigned int type, | |
70 bool premultiply_alpha, | |
71 bool flip_y); | |
72 | |
73 private: | |
74 void ResetLastFrame(); | |
75 void ResetAcceleratedLastFrame(); | |
76 | |
77 // An RGB bitmap and corresponding timestamp of the previously converted | |
78 // video frame data by software color space conversion. | |
79 SkBitmap last_frame_; | |
80 base::TimeDelta last_frame_timestamp_; | |
81 // If |last_frame_| is not used for a while, it's deleted to save memory. | |
82 base::DelayTimer<SkCanvasVideoRenderer> frame_deleting_timer_; | |
83 | |
84 // This is a hardware accelerated copy of the frame generated by | |
85 // |accelerated_generator_|. | |
86 // It's used when |canvas| parameter in Paint() is Ganesh canvas. | |
87 // Note: all GrContext in SkCanvas instances are same. | |
88 SkBitmap accelerated_last_frame_; | |
89 VideoImageGenerator* accelerated_generator_; | |
90 base::TimeDelta accelerated_last_frame_timestamp_; | |
91 base::DelayTimer<SkCanvasVideoRenderer> accelerated_frame_deleting_timer_; | |
92 | |
93 DISALLOW_COPY_AND_ASSIGN(SkCanvasVideoRenderer); | |
94 }; | |
95 | |
96 } // namespace media | |
97 | |
98 #endif // MEDIA_FILTERS_SKCANVAS_VIDEO_RENDERER_H_ | |
OLD | NEW |