OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/gpu/rendering_helper.h" | 5 #include "media/gpu/rendering_helper.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <memory> | 10 #include <memory> |
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
385 | 385 |
386 glBindFramebufferEXT(GL_FRAMEBUFFER, thumbnails_fbo_id_); | 386 glBindFramebufferEXT(GL_FRAMEBUFFER, thumbnails_fbo_id_); |
387 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, | 387 glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, |
388 GL_TEXTURE_2D, thumbnails_texture_id_, 0); | 388 GL_TEXTURE_2D, thumbnails_texture_id_, 0); |
389 | 389 |
390 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); | 390 GLenum fb_status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER); |
391 CHECK(fb_status == GL_FRAMEBUFFER_COMPLETE) << fb_status; | 391 CHECK(fb_status == GL_FRAMEBUFFER_COMPLETE) << fb_status; |
392 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); | 392 glClearColor(0.0f, 0.0f, 0.0f, 1.0f); |
393 glClear(GL_COLOR_BUFFER_BIT); | 393 glClear(GL_COLOR_BUFFER_BIT); |
394 glBindFramebufferEXT(GL_FRAMEBUFFER, | 394 glBindFramebufferEXT(GL_FRAMEBUFFER, |
395 gl_surface_->GetBackingFrameBufferObject()); | 395 gl_surface_->GetBackingFramebufferObject()); |
396 } | 396 } |
397 | 397 |
398 // These vertices and texture coords. map (0,0) in the texture to the | 398 // These vertices and texture coords. map (0,0) in the texture to the |
399 // bottom left of the viewport. Since we get the video frames with the | 399 // bottom left of the viewport. Since we get the video frames with the |
400 // the top left at (0,0) we need to flip the texture y coordinate | 400 // the top left at (0,0) we need to flip the texture y coordinate |
401 // in the vertex shader for this to be rendered the right way up. | 401 // in the vertex shader for this to be rendered the right way up. |
402 // In the case of thumbnail rendering we use the same vertex shader | 402 // In the case of thumbnail rendering we use the same vertex shader |
403 // to render the FBO the screen, where we do not want this flipping. | 403 // to render the FBO the screen, where we do not want this flipping. |
404 static const float kVertices[] = { | 404 static const float kVertices[] = { |
405 -1.f, 1.f, -1.f, -1.f, 1.f, 1.f, 1.f, -1.f, | 405 -1.f, 1.f, -1.f, -1.f, 1.f, 1.f, 1.f, -1.f, |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 const int row = (frame_count_ / thumbnails_in_row) % thumbnails_in_column; | 603 const int row = (frame_count_ / thumbnails_in_row) % thumbnails_in_column; |
604 const int col = frame_count_ % thumbnails_in_row; | 604 const int col = frame_count_ % thumbnails_in_row; |
605 | 605 |
606 gfx::Rect area(col * width, row * height, width, height); | 606 gfx::Rect area(col * width, row * height, width, height); |
607 | 607 |
608 glUniform1i(glGetUniformLocation(program_, "tex_flip"), 0); | 608 glUniform1i(glGetUniformLocation(program_, "tex_flip"), 0); |
609 glBindFramebufferEXT(GL_FRAMEBUFFER, thumbnails_fbo_id_); | 609 glBindFramebufferEXT(GL_FRAMEBUFFER, thumbnails_fbo_id_); |
610 GLSetViewPort(area); | 610 GLSetViewPort(area); |
611 RenderTexture(texture_target, texture_id); | 611 RenderTexture(texture_target, texture_id); |
612 glBindFramebufferEXT(GL_FRAMEBUFFER, | 612 glBindFramebufferEXT(GL_FRAMEBUFFER, |
613 gl_surface_->GetBackingFrameBufferObject()); | 613 gl_surface_->GetBackingFramebufferObject()); |
614 | 614 |
615 // Need to flush the GL commands before we return the tnumbnail texture to | 615 // Need to flush the GL commands before we return the tnumbnail texture to |
616 // the decoder. | 616 // the decoder. |
617 glFlush(); | 617 glFlush(); |
618 ++frame_count_; | 618 ++frame_count_; |
619 } | 619 } |
620 | 620 |
621 void RenderingHelper::QueueVideoFrame( | 621 void RenderingHelper::QueueVideoFrame( |
622 size_t window_id, | 622 size_t window_id, |
623 scoped_refptr<VideoFrameTexture> video_frame) { | 623 scoped_refptr<VideoFrameTexture> video_frame) { |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
690 rgba.resize(num_pixels * 4); | 690 rgba.resize(num_pixels * 4); |
691 glBindFramebufferEXT(GL_FRAMEBUFFER, thumbnails_fbo_id_); | 691 glBindFramebufferEXT(GL_FRAMEBUFFER, thumbnails_fbo_id_); |
692 glPixelStorei(GL_PACK_ALIGNMENT, 1); | 692 glPixelStorei(GL_PACK_ALIGNMENT, 1); |
693 // We can only count on GL_RGBA/GL_UNSIGNED_BYTE support. | 693 // We can only count on GL_RGBA/GL_UNSIGNED_BYTE support. |
694 glReadPixels(0, 0, | 694 glReadPixels(0, 0, |
695 thumbnails_fbo_size_.width(), thumbnails_fbo_size_.height(), | 695 thumbnails_fbo_size_.width(), thumbnails_fbo_size_.height(), |
696 GL_RGBA, | 696 GL_RGBA, |
697 GL_UNSIGNED_BYTE, | 697 GL_UNSIGNED_BYTE, |
698 &rgba[0]); | 698 &rgba[0]); |
699 glBindFramebufferEXT(GL_FRAMEBUFFER, | 699 glBindFramebufferEXT(GL_FRAMEBUFFER, |
700 gl_surface_->GetBackingFrameBufferObject()); | 700 gl_surface_->GetBackingFramebufferObject()); |
701 rgb->resize(num_pixels * 3); | 701 rgb->resize(num_pixels * 3); |
702 // Drop the alpha channel, but check as we go that it is all 0xff. | 702 // Drop the alpha channel, but check as we go that it is all 0xff. |
703 bool solid = true; | 703 bool solid = true; |
704 unsigned char* rgb_ptr = &((*rgb)[0]); | 704 unsigned char* rgb_ptr = &((*rgb)[0]); |
705 unsigned char* rgba_ptr = &rgba[0]; | 705 unsigned char* rgba_ptr = &rgba[0]; |
706 for (size_t i = 0; i < num_pixels; ++i) { | 706 for (size_t i = 0; i < num_pixels; ++i) { |
707 *rgb_ptr++ = *rgba_ptr++; | 707 *rgb_ptr++ = *rgba_ptr++; |
708 *rgb_ptr++ = *rgba_ptr++; | 708 *rgb_ptr++ = *rgba_ptr++; |
709 *rgb_ptr++ = *rgba_ptr++; | 709 *rgb_ptr++ = *rgba_ptr++; |
710 solid = solid && (*rgba_ptr == 0xff); | 710 solid = solid && (*rgba_ptr == 0xff); |
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
882 // When the rendering falls behind, drops frames. | 882 // When the rendering falls behind, drops frames. |
883 while (scheduled_render_time_ < target) { | 883 while (scheduled_render_time_ < target) { |
884 scheduled_render_time_ += frame_duration_; | 884 scheduled_render_time_ += frame_duration_; |
885 DropOneFrameForAllVideos(); | 885 DropOneFrameForAllVideos(); |
886 } | 886 } |
887 | 887 |
888 message_loop_->PostDelayedTask(FROM_HERE, render_task_.callback(), | 888 message_loop_->PostDelayedTask(FROM_HERE, render_task_.callback(), |
889 target - now); | 889 target - now); |
890 } | 890 } |
891 } // namespace media | 891 } // namespace media |
OLD | NEW |