Index: cc/output/gl_renderer.cc |
diff --git a/cc/output/gl_renderer.cc b/cc/output/gl_renderer.cc |
index bb1ecbf6bc61f6691d5eb5fd55690d0448eee2ae..8e60f944d4f6f23cf033f15f2f7c619473fe99cf 100644 |
--- a/cc/output/gl_renderer.cc |
+++ b/cc/output/gl_renderer.cc |
@@ -1777,9 +1777,12 @@ void GLRenderer::DrawYUVVideoQuad(const DrawingFrame* frame, |
// These values are magic numbers that are used in the transformation from YUV |
// to RGB color values. They are taken from the following webpage: |
// http://www.fourcc.org/fccyvrgb.php |
- float yuv_to_rgb[9] = {1.164f, 1.164f, 1.164f, 0.0f, -.391f, |
- 2.018f, 1.596f, -.813f, 0.0f, }; |
- GLC(gl_, gl_->UniformMatrix3fv(yuv_matrix_location, 1, 0, yuv_to_rgb)); |
+ float yuv_to_rgb_rec601[9] = { |
+ 1.164f, 1.164f, 1.164f, 0.0f, -.391f, 2.018f, 1.596f, -.813f, 0.0f, |
+ }; |
+ float yuv_to_rgb_rec601_jpeg[9] = { |
+ 1.f, 1.f, 1.f, 0.0f, -.34414f, 1.772f, 1.402f, -.71414f, 0.0f, |
+ }; |
// These values map to 16, 128, and 128 respectively, and are computed |
// as a fraction over 256 (e.g. 16 / 256 = 0.0625). |
@@ -1787,7 +1790,30 @@ void GLRenderer::DrawYUVVideoQuad(const DrawingFrame* frame, |
// Y - 16 : Gives 16 values of head and footroom for overshooting |
// U - 128 : Turns unsigned U into signed U [-128,127] |
// V - 128 : Turns unsigned V into signed V [-128,127] |
- float yuv_adjust[3] = {-0.0625f, -0.5f, -0.5f, }; |
+ float yuv_adjust_rec601[3] = { |
+ -0.0625f, -0.5f, -0.5f, |
+ }; |
+ |
+ // Same as above, but without the head and footroom. |
+ float yuv_adjust_rec601_jpeg[3] = { |
+ 0.0f, -0.5f, -0.5f, |
+ }; |
+ |
+ float* yuv_to_rgb = NULL; |
+ float* yuv_adjust = NULL; |
+ |
+ switch (quad->color_space) { |
+ case YUVVideoDrawQuad::REC_601: |
+ yuv_to_rgb = yuv_to_rgb_rec601; |
+ yuv_adjust = yuv_adjust_rec601; |
+ break; |
+ case YUVVideoDrawQuad::REC_601_JPEG: |
+ yuv_to_rgb = yuv_to_rgb_rec601_jpeg; |
+ yuv_adjust = yuv_adjust_rec601_jpeg; |
+ break; |
+ } |
+ |
+ GLC(gl_, gl_->UniformMatrix3fv(yuv_matrix_location, 1, 0, yuv_to_rgb)); |
GLC(gl_, gl_->Uniform3fv(yuv_adj_location, 1, yuv_adjust)); |
SetShaderOpacity(quad->opacity(), alpha_location); |