Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(56)

Side by Side Diff: content/common/gpu/media/rendering_helper.cc

Issue 465293002: rendering_helper - Wait for rendering before resetting the decoder. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "content/common/gpu/media/rendering_helper.h" 5 #include "content/common/gpu/media/rendering_helper.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <numeric> 8 #include <numeric>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 return gfx::GLSurface::InitializeOneOff(); 87 return gfx::GLSurface::InitializeOneOff();
88 } 88 }
89 89
90 RenderingHelper::RenderingHelper() { 90 RenderingHelper::RenderingHelper() {
91 window_ = gfx::kNullAcceleratedWidget; 91 window_ = gfx::kNullAcceleratedWidget;
92 Clear(); 92 Clear();
93 } 93 }
94 94
95 RenderingHelper::~RenderingHelper() { 95 RenderingHelper::~RenderingHelper() {
96 CHECK_EQ(clients_.size(), 0U) << "Must call UnInitialize before dtor."; 96 CHECK_EQ(clients_.size(), 0U) << "Must call UnInitialize before dtor.";
97 Clear(); 97 Clear();
Pawel Osciak 2014/08/14 05:11:07 Should we assert that pending frames are empty?
Owen Lin 2014/08/14 10:55:35 It's OK to have pending frames, Clear() will also
98 } 98 }
99 99
100 void RenderingHelper::Initialize(const RenderingHelperParams& params, 100 void RenderingHelper::Initialize(const RenderingHelperParams& params,
101 base::WaitableEvent* done) { 101 base::WaitableEvent* done) {
102 // Use clients_.size() != 0 as a proxy for the class having already been 102 // Use clients_.size() != 0 as a proxy for the class having already been
103 // Initialize()'d, and UnInitialize() before continuing. 103 // Initialize()'d, and UnInitialize() before continuing.
104 if (clients_.size()) { 104 if (clients_.size()) {
105 base::WaitableEvent done(false, false); 105 base::WaitableEvent done(false, false);
106 UnInitialize(&done); 106 UnInitialize(&done);
107 done.Wait(); 107 done.Wait();
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after
483 *rgb_ptr++ = *rgba_ptr++; 483 *rgb_ptr++ = *rgba_ptr++;
484 *rgb_ptr++ = *rgba_ptr++; 484 *rgb_ptr++ = *rgba_ptr++;
485 solid = solid && (*rgba_ptr == 0xff); 485 solid = solid && (*rgba_ptr == 0xff);
486 rgba_ptr++; 486 rgba_ptr++;
487 } 487 }
488 *alpha_solid = solid; 488 *alpha_solid = solid;
489 489
490 done->Signal(); 490 done->Signal();
491 } 491 }
492 492
493 void RenderingHelper::SetWaitRenderingCB(
494 size_t window_id,
495 const base::Closure& wait_rendering_cb) {
496 RenderingClient* client = &clients_[window_id];
497 if (client->pending_frames.empty() || client->last_frame_rendered) {
498 // The rendering has been completed.
499 wait_rendering_cb.Run();
500 return;
501 }
502 client->wait_rendering_cb = wait_rendering_cb;
503 }
504
493 void RenderingHelper::RenderContent() { 505 void RenderingHelper::RenderContent() {
494 CHECK_EQ(base::MessageLoop::current(), message_loop_); 506 CHECK_EQ(base::MessageLoop::current(), message_loop_);
495 glUniform1i(glGetUniformLocation(program_, "tex_flip"), 1); 507 glUniform1i(glGetUniformLocation(program_, "tex_flip"), 1);
496 508
497 if (render_as_thumbnails_) { 509 if (render_as_thumbnails_) {
498 // In render_as_thumbnails_ mode, we render the FBO content on the 510 // In render_as_thumbnails_ mode, we render the FBO content on the
499 // screen instead of the decoded textures. 511 // screen instead of the decoded textures.
500 GLSetViewPort(clients_[0].render_area); 512 GLSetViewPort(clients_[0].render_area);
501 RenderTexture(GL_TEXTURE_2D, thumbnails_texture_id_); 513 RenderTexture(GL_TEXTURE_2D, thumbnails_texture_id_);
502 gl_surface_->SwapBuffers(); 514 gl_surface_->SwapBuffers();
(...skipping 14 matching lines...) Expand all
517 // Releases the rendered frame after SwapBuffers() if it is not the last one. 529 // Releases the rendered frame after SwapBuffers() if it is not the last one.
518 for (size_t i = 0; i < clients_.size(); ++i) { 530 for (size_t i = 0; i < clients_.size(); ++i) {
519 RenderingClient* client = &clients_[i]; 531 RenderingClient* client = &clients_[i];
520 if (client->pending_frames.size() > 1) { 532 if (client->pending_frames.size() > 1) {
521 delete client->pending_frames.front(); 533 delete client->pending_frames.front();
522 client->pending_frames.pop_front(); 534 client->pending_frames.pop_front();
523 client->last_frame_rendered = false; 535 client->last_frame_rendered = false;
524 continue; 536 continue;
525 } 537 }
526 client->last_frame_rendered = true; 538 client->last_frame_rendered = true;
539 if (!client->wait_rendering_cb.is_null())
540 base::ResetAndReturn(&client->wait_rendering_cb).Run();
Pawel Osciak 2014/08/14 05:11:07 I think we have to pop the last frame here?
Owen Lin 2014/08/14 10:55:35 Done.
527 } 541 }
528 } 542 }
529 543
530 // Helper function for the LayoutRenderingAreas(). The |lengths| are the 544 // Helper function for the LayoutRenderingAreas(). The |lengths| are the
531 // heights(widths) of the rows(columns). It scales the elements in 545 // heights(widths) of the rows(columns). It scales the elements in
532 // |lengths| proportionally so that the sum of them equal to |total_length|. 546 // |lengths| proportionally so that the sum of them equal to |total_length|.
533 // It also outputs the coordinates of the rows(columns) to |offsets|. 547 // It also outputs the coordinates of the rows(columns) to |offsets|.
534 static void ScaleAndCalculateOffsets(std::vector<int>* lengths, 548 static void ScaleAndCalculateOffsets(std::vector<int>* lengths,
535 std::vector<int>* offsets, 549 std::vector<int>* offsets,
536 int total_length) { 550 int total_length) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
574 scale = std::min(1.0f, scale); 588 scale = std::min(1.0f, scale);
575 589
576 size_t w = scale * size.width(); 590 size_t w = scale * size.width();
577 size_t h = scale * size.height(); 591 size_t h = scale * size.height();
578 size_t x = offset_x[i % cols] + (widths[i % cols] - w) / 2; 592 size_t x = offset_x[i % cols] + (widths[i % cols] - w) / 2;
579 size_t y = offset_y[i / cols] + (heights[i / cols] - h) / 2; 593 size_t y = offset_y[i / cols] + (heights[i / cols] - h) / 2;
580 clients_[i].render_area = gfx::Rect(x, y, w, h); 594 clients_[i].render_area = gfx::Rect(x, y, w, h);
581 } 595 }
582 } 596 }
583 } // namespace content 597 } // namespace content
OLDNEW
« no previous file with comments | « content/common/gpu/media/rendering_helper.h ('k') | content/common/gpu/media/video_decode_accelerator_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698