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

Side by Side Diff: remoting/client/plugin/pepper_video_renderer_2d.cc

Issue 1236663002: Allow shaped-desktop hosts to send shape only when it changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Simplify FrameConsumerProxy Created 5 years, 5 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "remoting/client/plugin/pepper_video_renderer_2d.h" 5 #include "remoting/client/plugin/pepper_video_renderer_2d.h"
6 6
7 #include <functional> 7 #include <functional>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
11 #include "base/synchronization/waitable_event.h" 11 #include "base/synchronization/waitable_event.h"
12 #include "base/time/time.h" 12 #include "base/time/time.h"
13 #include "ppapi/cpp/completion_callback.h" 13 #include "ppapi/cpp/completion_callback.h"
14 #include "ppapi/cpp/image_data.h" 14 #include "ppapi/cpp/image_data.h"
15 #include "ppapi/cpp/instance.h" 15 #include "ppapi/cpp/instance.h"
16 #include "ppapi/cpp/point.h" 16 #include "ppapi/cpp/point.h"
17 #include "ppapi/cpp/rect.h" 17 #include "ppapi/cpp/rect.h"
18 #include "ppapi/cpp/size.h" 18 #include "ppapi/cpp/size.h"
19 #include "remoting/base/util.h" 19 #include "remoting/base/util.h"
20 #include "remoting/client/chromoting_stats.h" 20 #include "remoting/client/chromoting_stats.h"
21 #include "remoting/client/client_context.h" 21 #include "remoting/client/client_context.h"
22 #include "remoting/client/frame_consumer_proxy.h"
23 #include "remoting/client/frame_producer.h" 22 #include "remoting/client/frame_producer.h"
24 #include "remoting/client/software_video_renderer.h" 23 #include "remoting/client/software_video_renderer.h"
25 #include "remoting/proto/video.pb.h" 24 #include "remoting/proto/video.pb.h"
26 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" 25 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
27 26
28 namespace { 27 namespace {
29 28
30 // DesktopFrame that wraps a supplied pp::ImageData 29 // DesktopFrame that wraps a supplied pp::ImageData
31 class PepperDesktopFrame : public webrtc::DesktopFrame { 30 class PepperDesktopFrame : public webrtc::DesktopFrame {
32 public: 31 public:
(...skipping 30 matching lines...) Expand all
63 62
64 PepperVideoRenderer2D::PepperVideoRenderer2D() 63 PepperVideoRenderer2D::PepperVideoRenderer2D()
65 : instance_(nullptr), 64 : instance_(nullptr),
66 event_handler_(nullptr), 65 event_handler_(nullptr),
67 merge_buffer_(nullptr), 66 merge_buffer_(nullptr),
68 dips_to_device_scale_(1.0f), 67 dips_to_device_scale_(1.0f),
69 dips_to_view_scale_(1.0f), 68 dips_to_view_scale_(1.0f),
70 flush_pending_(false), 69 flush_pending_(false),
71 frame_received_(false), 70 frame_received_(false),
72 debug_dirty_region_(false), 71 debug_dirty_region_(false),
73 callback_factory_(this), 72 callback_factory_(this) {
74 weak_factory_(this) {
75 } 73 }
76 74
77 PepperVideoRenderer2D::~PepperVideoRenderer2D() { 75 PepperVideoRenderer2D::~PepperVideoRenderer2D() {
78 // The producer should now return any pending buffers. At this point, however, 76 // The producer should now return any pending buffers. At this point, however,
79 // ReturnBuffer() tasks scheduled by the producer will not be delivered, 77 // ReturnBuffer() tasks scheduled by the producer will not be delivered,
80 // so we free all the buffers once the producer's queue is empty. 78 // so we free all the buffers once the producer's queue is empty.
81 base::WaitableEvent done_event(true, false); 79 base::WaitableEvent done_event(true, false);
82 software_video_renderer_->RequestReturnBuffers( 80 software_video_renderer_->RequestReturnBuffers(
83 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&done_event))); 81 base::Bind(&base::WaitableEvent::Signal, base::Unretained(&done_event)));
84 done_event.Wait(); 82 done_event.Wait();
85 83
86 merge_buffer_ = nullptr; 84 merge_buffer_ = nullptr;
87 while (!buffers_.empty()) { 85 while (!buffers_.empty()) {
88 FreeBuffer(buffers_.front()); 86 FreeBuffer(buffers_.front());
89 } 87 }
90 } 88 }
91 89
92 bool PepperVideoRenderer2D::Initialize(pp::Instance* instance, 90 bool PepperVideoRenderer2D::Initialize(pp::Instance* instance,
93 const ClientContext& context, 91 const ClientContext& context,
94 EventHandler* event_handler) { 92 EventHandler* event_handler) {
95 DCHECK(CalledOnValidThread()); 93 DCHECK(CalledOnValidThread());
94 DCHECK(context.main_task_runner()->BelongsToCurrentThread());
96 DCHECK(!instance_); 95 DCHECK(!instance_);
97 DCHECK(!event_handler_); 96 DCHECK(!event_handler_);
98 DCHECK(instance); 97 DCHECK(instance);
99 DCHECK(event_handler); 98 DCHECK(event_handler);
100 99
101 instance_ = instance; 100 instance_ = instance;
102 event_handler_ = event_handler; 101 event_handler_ = event_handler;
103 frame_consumer_proxy_ = new FrameConsumerProxy(
104 context.main_task_runner(), weak_factory_.GetWeakPtr());
105 software_video_renderer_.reset(new SoftwareVideoRenderer( 102 software_video_renderer_.reset(new SoftwareVideoRenderer(
106 context.main_task_runner(), context.decode_task_runner(), 103 context.main_task_runner(), context.decode_task_runner(), this));
Sergey Ulanov 2015/07/13 21:00:32 I think we still need FrameConsumerProxy. Software
Wez 2015/07/14 02:26:44 SoftwareVideoRenderer delegates decode-thread work
Sergey Ulanov 2015/07/14 16:12:24 I see, sorry I messed. This makes sense.
Sergey Ulanov 2015/07/14 16:13:22 I meant I mIssed it.
107 frame_consumer_proxy_));
108 104
109 return true; 105 return true;
110 } 106 }
111 107
112 void PepperVideoRenderer2D::OnViewChanged(const pp::View& view) { 108 void PepperVideoRenderer2D::OnViewChanged(const pp::View& view) {
113 DCHECK(CalledOnValidThread()); 109 DCHECK(CalledOnValidThread());
114 110
115 bool view_changed = false; 111 bool view_changed = false;
116 112
117 pp::Rect pp_size = view.GetRect(); 113 pp::Rect pp_size = view.GetRect();
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
200 protocol::VideoStub* PepperVideoRenderer2D::GetVideoStub() { 196 protocol::VideoStub* PepperVideoRenderer2D::GetVideoStub() {
201 DCHECK(CalledOnValidThread()); 197 DCHECK(CalledOnValidThread());
202 198
203 return software_video_renderer_->GetVideoStub(); 199 return software_video_renderer_->GetVideoStub();
204 } 200 }
205 201
206 void PepperVideoRenderer2D::ApplyBuffer(const webrtc::DesktopSize& view_size, 202 void PepperVideoRenderer2D::ApplyBuffer(const webrtc::DesktopSize& view_size,
207 const webrtc::DesktopRect& clip_area, 203 const webrtc::DesktopRect& clip_area,
208 webrtc::DesktopFrame* buffer, 204 webrtc::DesktopFrame* buffer,
209 const webrtc::DesktopRegion& region, 205 const webrtc::DesktopRegion& region,
210 const webrtc::DesktopRegion& shape) { 206 const webrtc::DesktopRegion* shape) {
211 DCHECK(CalledOnValidThread()); 207 DCHECK(CalledOnValidThread());
212 208
213 if (!frame_received_) { 209 if (!frame_received_) {
214 event_handler_->OnVideoFirstFrameReceived(); 210 event_handler_->OnVideoFirstFrameReceived();
215 frame_received_ = true; 211 frame_received_ = true;
216 } 212 }
217 // We cannot use the data in the buffer if its dimensions don't match the 213 // We cannot use the data in the buffer if its dimensions don't match the
218 // current view size. 214 // current view size.
219 // TODO(alexeypa): We could rescale and draw it (or even draw it without
220 // rescaling) to reduce the perceived lag while we are waiting for
221 // the properly scaled data.
222 if (!view_size_.equals(view_size)) { 215 if (!view_size_.equals(view_size)) {
223 FreeBuffer(buffer); 216 FreeBuffer(buffer);
224 AllocateBuffers(); 217 AllocateBuffers();
225 } else { 218 } else {
226 FlushBuffer(clip_area, buffer, region); 219 FlushBuffer(clip_area, buffer, region);
227 event_handler_->OnVideoShape(shape); 220 if (shape) {
221 if (!source_shape_ || !source_shape_->Equals(*shape)) {
222 source_shape_ = make_scoped_ptr(new webrtc::DesktopRegion(*shape));
223 event_handler_->OnVideoShape(source_shape_.get());
224 }
225 } else if (source_shape_) {
226 source_shape_ = nullptr;
227 event_handler_->OnVideoShape(nullptr);
228 }
228 } 229 }
229 } 230 }
230 231
231 void PepperVideoRenderer2D::ReturnBuffer(webrtc::DesktopFrame* buffer) { 232 void PepperVideoRenderer2D::ReturnBuffer(webrtc::DesktopFrame* buffer) {
232 DCHECK(CalledOnValidThread()); 233 DCHECK(CalledOnValidThread());
233 234
234 // Reuse the buffer if it is large enough, otherwise drop it on the floor 235 // Reuse the buffer if it is large enough, otherwise drop it on the floor
235 // and allocate a new one. 236 // and allocate a new one.
236 if (buffer->size().width() >= clip_area_.width() && 237 if (buffer->size().width() >= clip_area_.width() &&
237 buffer->size().height() >= clip_area_.height()) { 238 buffer->size().height() >= clip_area_.height()) {
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 365
365 // If there is a buffer queued for rendering then render it now. 366 // If there is a buffer queued for rendering then render it now.
366 if (merge_buffer_) { 367 if (merge_buffer_) {
367 buffer = merge_buffer_; 368 buffer = merge_buffer_;
368 merge_buffer_ = nullptr; 369 merge_buffer_ = nullptr;
369 FlushBuffer(merge_clip_area_, buffer, merge_region_); 370 FlushBuffer(merge_clip_area_, buffer, merge_region_);
370 } 371 }
371 } 372 }
372 373
373 } // namespace remoting 374 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698