| Index: cc/output/shader.cc
|
| diff --git a/cc/output/shader.cc b/cc/output/shader.cc
|
| index 5bc704497ca5b63c24547ac5d9ea15092783b454..eb0dede1d5b9863d7338e16c76eca40f027e80f9 100644
|
| --- a/cc/output/shader.cc
|
| +++ b/cc/output/shader.cc
|
| @@ -1741,15 +1741,20 @@ FragmentShaderYUVVideo::FragmentShaderYUVVideo()
|
| v_texture_location_(-1),
|
| alpha_location_(-1),
|
| yuv_matrix_location_(-1),
|
| - yuv_adj_location_(-1) {
|
| + yuv_adj_location_(-1),
|
| + clamp_rect_location_(-1) {
|
| }
|
|
|
| void FragmentShaderYUVVideo::Init(GLES2Interface* context,
|
| unsigned program,
|
| int* base_uniform_index) {
|
| - static const char* uniforms[] = {
|
| - "y_texture", "u_texture", "v_texture", "alpha", "yuv_matrix", "yuv_adj",
|
| - };
|
| + static const char* uniforms[] = {"y_texture",
|
| + "u_texture",
|
| + "v_texture",
|
| + "alpha",
|
| + "yuv_matrix",
|
| + "yuv_adj",
|
| + "clamp_rect"};
|
| int locations[arraysize(uniforms)];
|
|
|
| GetProgramUniformLocations(context,
|
| @@ -1764,6 +1769,7 @@ void FragmentShaderYUVVideo::Init(GLES2Interface* context,
|
| alpha_location_ = locations[3];
|
| yuv_matrix_location_ = locations[4];
|
| yuv_adj_location_ = locations[5];
|
| + clamp_rect_location_ = locations[6];
|
| }
|
|
|
| std::string FragmentShaderYUVVideo::GetShaderString(TexCoordPrecision precision,
|
| @@ -1780,10 +1786,12 @@ std::string FragmentShaderYUVVideo::GetShaderString(TexCoordPrecision precision,
|
| uniform float alpha;
|
| uniform vec3 yuv_adj;
|
| uniform mat3 yuv_matrix;
|
| + uniform vec4 clamp_rect;
|
| void main() {
|
| - float y_raw = TextureLookup(y_texture, v_texCoord).x;
|
| - float u_unsigned = TextureLookup(u_texture, v_texCoord).x;
|
| - float v_unsigned = TextureLookup(v_texture, v_texCoord).x;
|
| + vec2 clamped = max(clamp_rect.xy, min(clamp_rect.zw, v_texCoord));
|
| + float y_raw = TextureLookup(y_texture, clamped).x;
|
| + float u_unsigned = TextureLookup(u_texture, clamped).x;
|
| + float v_unsigned = TextureLookup(v_texture, clamped).x;
|
| vec3 yuv = vec3(y_raw, u_unsigned, v_unsigned) + yuv_adj;
|
| vec3 rgb = yuv_matrix * yuv;
|
| gl_FragColor = vec4(rgb, 1.0) * alpha;
|
| @@ -1814,6 +1822,7 @@ void FragmentShaderYUVAVideo::Init(GLES2Interface* context,
|
| "alpha",
|
| "cc_matrix",
|
| "yuv_adj",
|
| + "clamp_rect",
|
| };
|
| int locations[arraysize(uniforms)];
|
|
|
| @@ -1830,6 +1839,7 @@ void FragmentShaderYUVAVideo::Init(GLES2Interface* context,
|
| alpha_location_ = locations[4];
|
| yuv_matrix_location_ = locations[5];
|
| yuv_adj_location_ = locations[6];
|
| + clamp_rect_location_ = locations[7];
|
| }
|
|
|
| std::string FragmentShaderYUVAVideo::GetShaderString(
|
| @@ -1848,11 +1858,13 @@ std::string FragmentShaderYUVAVideo::GetShaderString(
|
| uniform float alpha;
|
| uniform vec3 yuv_adj;
|
| uniform mat3 yuv_matrix;
|
| + uniform vec4 clamp_rect;
|
| void main() {
|
| - float y_raw = TextureLookup(y_texture, v_texCoord).x;
|
| - float u_unsigned = TextureLookup(u_texture, v_texCoord).x;
|
| - float v_unsigned = TextureLookup(v_texture, v_texCoord).x;
|
| - float a_raw = TextureLookup(a_texture, v_texCoord).x;
|
| + vec2 clamped = max(clamp_rect.xy, min(clamp_rect.zw, v_texCoord));
|
| + float y_raw = TextureLookup(y_texture, clamped).x;
|
| + float u_unsigned = TextureLookup(u_texture, clamped).x;
|
| + float v_unsigned = TextureLookup(v_texture, clamped).x;
|
| + float a_raw = TextureLookup(a_texture, clamped).x;
|
| vec3 yuv = vec3(y_raw, u_unsigned, v_unsigned) + yuv_adj;
|
| vec3 rgb = yuv_matrix * yuv;
|
| gl_FragColor = vec4(rgb, 1.0) * (alpha * a_raw);
|
|
|