| Index: cc/output/shader.cc | 
| diff --git a/cc/output/shader.cc b/cc/output/shader.cc | 
| index d70352f58c38e937285cb32e0e2aaa20eeeba561..474e539b79d979dc7daa3e1bea28014b8ddf5a17 100644 | 
| --- a/cc/output/shader.cc | 
| +++ b/cc/output/shader.cc | 
| @@ -913,6 +913,83 @@ std::string FragmentShaderYUVVideo::GetShaderString() const { | 
| ); | 
| } | 
|  | 
| +FragmentShaderYUVAVideo::FragmentShaderYUVAVideo() | 
| +    : y_texture_location_(-1) | 
| +    , u_texture_location_(-1) | 
| +    , v_texture_location_(-1) | 
| +    , a_texture_location_(-1) | 
| +    , alpha_location_(-1) | 
| +    , yuv_matrix_location_(-1) | 
| +    , yuv_adj_location_(-1) | 
| +{ | 
| +} | 
| + | 
| +void FragmentShaderYUVAVideo::Init(WebGraphicsContext3D* context, | 
| +                                   unsigned program, | 
| +                                   bool using_bind_uniform, | 
| +                                   int* base_uniform_index) | 
| +{ | 
| +    static const char* shader_uniforms[] = { | 
| +        "y_texture", | 
| +        "u_texture", | 
| +        "v_texture", | 
| +        "a_texture", | 
| +        "alpha", | 
| +        "cc_matrix", | 
| +        "yuv_adj", | 
| +    }; | 
| +    int locations[7]; | 
| + | 
| +    GetProgramUniformLocations(context, | 
| +                               program, | 
| +                               shader_uniforms, | 
| +                               arraysize(shader_uniforms), | 
| +                               arraysize(locations), | 
| +                               locations, | 
| +                               using_bind_uniform, | 
| +                               base_uniform_index); | 
| + | 
| +    y_texture_location_ = locations[0]; | 
| +    u_texture_location_ = locations[1]; | 
| +    v_texture_location_ = locations[2]; | 
| +    a_texture_location_ = locations[3]; | 
| +    alpha_location_ = locations[4]; | 
| +    yuv_matrix_location_ = locations[5]; | 
| +    yuv_adj_location_ = locations[6]; | 
| + | 
| +    DCHECK(y_texture_location_ != -1 && u_texture_location_ != -1 && | 
| +           v_texture_location_ != -1 && a_texture_location_ != -1 && | 
| +           alpha_location_ != -1 && yuv_matrix_location_ != -1 && | 
| +           yuv_adj_location_ != -1); | 
| +} | 
| + | 
| +std::string FragmentShaderYUVAVideo::GetShaderString() const | 
| +{ | 
| +    return SHADER( | 
| +        precision mediump float; | 
| +        precision mediump int; | 
| +        varying vec2 y_texCoord; | 
| +        varying vec2 uv_texCoord; | 
| +        uniform sampler2D y_texture; | 
| +        uniform sampler2D u_texture; | 
| +        uniform sampler2D v_texture; | 
| +        uniform sampler2D a_texture; | 
| +        uniform float alpha; | 
| +        uniform vec3 yuv_adj; | 
| +        uniform mat3 cc_matrix; | 
| +        void main() | 
| +        { | 
| +            float y_raw = texture2D(y_texture, y_texCoord).x; | 
| +            float u_unsigned = texture2D(u_texture, uv_texCoord).x; | 
| +            float v_unsigned = texture2D(v_texture, uv_texCoord).x; | 
| +            float a_raw = texture2D(a_texture, y_texCoord).x; | 
| +            vec3 yuv = vec3(y_raw, u_unsigned, v_unsigned) + yuv_adj; | 
| +            vec3 rgb = cc_matrix * yuv; | 
| +            gl_FragColor = vec4(rgb, float(1)) * (a_raw * alpha); | 
| +        } | 
| +    ); | 
| +} | 
| + | 
| FragmentShaderColor::FragmentShaderColor() | 
| : color_location_(-1) {} | 
|  | 
|  |