Index: media/renderers/skcanvas_video_renderer.h |
diff --git a/media/renderers/skcanvas_video_renderer.h b/media/renderers/skcanvas_video_renderer.h |
index 9323a82fed4d55c8160707d809c5fb6030186d33..2b25edbc0a3e24a6301c7cd641f75c1dafeb49db 100644 |
--- a/media/renderers/skcanvas_video_renderer.h |
+++ b/media/renderers/skcanvas_video_renderer.h |
@@ -23,7 +23,6 @@ |
#include "third_party/skia/include/core/SkXfermode.h" |
class SkCanvas; |
-class SkImage; |
namespace gfx { |
class RectF; |
@@ -93,6 +92,29 @@ class MEDIA_EXPORT SkCanvasVideoRenderer { |
bool premultiply_alpha, |
bool flip_y); |
+ // Method handles reinterpreting two components RG8 as 16 bit value for Y16 |
+ // format and optimizing upload-to-texture for some video frame and texture |
+ // formats. If needed, there is a conversion followed by a tex(Sub)Image2D or |
+ // tex(Sub)Image3D call. |
+ // |format|, |internal_format|, |type| specify target texture |texture|. |
+ // |xoffset|, |yoffset|, |zoffset| are used when functionID defines sub image |
+ // calls. |
+ // Returns false if there is no implementation for given parameters or if the |
+ // call fails. |
+ static bool TexImageImpl(const char* functionID, |
+ unsigned target, |
+ gpu::gles2::GLES2Interface* gl, |
+ VideoFrame* video_frame, |
+ int level, |
+ int internalformat, |
+ unsigned format, |
+ unsigned type, |
+ int xoffset, |
+ int yoffset, |
+ int zoffset, |
+ bool flipY, |
+ bool premultiplyAlpha); |
+ |
// In general, We hold the most recently painted frame to increase the |
// performance for the case that the same frame needs to be painted |
// repeatedly. Call this function if you are sure the most recent frame will |
@@ -110,6 +132,32 @@ class MEDIA_EXPORT SkCanvasVideoRenderer { |
bool UpdateLastImage(const scoped_refptr<VideoFrame>& video_frame, |
const Context3D& context_3d); |
+ // Reinterpret the content of RG8 texture as R16 (normalized value) to float |
+ // intermediate texture and then copy to texture. All the available RGB color |
+ // components in the texture get the same value. |
+ // Reinterpretting texture happens on canvas gl (context_3d) to enable caching |
+ // resources for following calls. Target |texture| should live on |target_gl| |
+ // after the call. |
+ void CopyRG8ToTexture(const Context3D& context_3d, |
+ gpu::gles2::GLES2Interface* target_gl, |
+ VideoFrame* video_frame, |
+ unsigned texture, |
+ unsigned internal_format, |
+ unsigned type, |
+ bool flip_y); |
+ |
+ // Helper method used by CopyRG8ToTexture. Target used for both |
+ // |source_texture| and |target_texture| is GL_TEXTURE_2D. |
+ void DoCopyRG8ToTexture(const Context3D& context_3d, |
+ unsigned source_texture, |
+ unsigned target_texture, |
+ unsigned format, |
+ unsigned internal_format, |
+ unsigned type, |
+ unsigned width, |
+ unsigned height, |
+ bool flip_y); |
+ |
// Last image used to draw to the canvas. |
sk_sp<SkImage> last_image_; |
// Timestamp of the videoframe used to generate |last_image_|. |
@@ -119,6 +167,13 @@ class MEDIA_EXPORT SkCanvasVideoRenderer { |
// Used for DCHECKs to ensure method calls executed in the correct thread. |
base::ThreadChecker thread_checker_; |
+ // Resources rg8_to_texture_* are used for RG8 to float texture GPU |
+ // conversion. |
+ unsigned rg8_to_texture_program_ = 0; |
+ unsigned rg8_to_texture_vertices_buffer_ = 0; |
+ // Used for cached GL resources (e.g. rg8_to_texture_program) lifecycle |
+ // management. |
+ unsigned cached_gl_resources_gr_context_id_ = 0; |
// Used for unit test. |
SkISize last_image_dimensions_for_testing_; |