OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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_3d.h" | 5 #include "remoting/client/plugin/pepper_video_renderer_3d.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <utility> | 10 #include <utility> |
(...skipping 15 matching lines...) Expand all Loading... |
26 // The implementation here requires that the decoder allocates at least 3 | 26 // The implementation here requires that the decoder allocates at least 3 |
27 // pictures. PPB_VideoDecoder didn't support this parameter prior to | 27 // pictures. PPB_VideoDecoder didn't support this parameter prior to |
28 // 1.1, so we have to pass 0 for backwards compatibility with older versions of | 28 // 1.1, so we have to pass 0 for backwards compatibility with older versions of |
29 // the browser. Currently all API implementations allocate more than 3 buffers | 29 // the browser. Currently all API implementations allocate more than 3 buffers |
30 // by default. | 30 // by default. |
31 const uint32_t kMinimumPictureCount = 3; | 31 const uint32_t kMinimumPictureCount = 3; |
32 | 32 |
33 class PepperVideoRenderer3D::FrameTracker { | 33 class PepperVideoRenderer3D::FrameTracker { |
34 public: | 34 public: |
35 FrameTracker(std::unique_ptr<VideoPacket> packet, | 35 FrameTracker(std::unique_ptr<VideoPacket> packet, |
36 protocol::PerformanceTracker* perf_tracker, | 36 protocol::FrameStatsConsumer* stats_consumer, |
37 const base::Closure& done) | 37 const base::Closure& done) |
38 : packet_(std::move(packet)), perf_tracker_(perf_tracker), done_(done) { | 38 : packet_(std::move(packet)), |
39 stats_ = protocol::FrameStats::GetForVideoPacket(*packet_); | 39 stats_consumer_(stats_consumer), |
| 40 done_(done) { |
| 41 stats_.host_stats = protocol::HostFrameStats::GetForVideoPacket(*packet_); |
| 42 stats_.client_stats.time_received = base::TimeTicks::Now(); |
40 } | 43 } |
41 | 44 |
42 ~FrameTracker() { | 45 ~FrameTracker() { |
43 if (perf_tracker_) | 46 if (stats_consumer_) |
44 perf_tracker_->RecordVideoFrameStats(stats_); | 47 stats_consumer_->OnVideoFrameStats(stats_); |
45 if (!done_.is_null()) | 48 if (!done_.is_null()) |
46 done_.Run(); | 49 done_.Run(); |
47 } | 50 } |
48 | 51 |
49 void OnDecoded() { stats_.time_decoded = base::TimeTicks::Now(); } | 52 void OnDecoded() { |
50 void OnRendered() { stats_.time_rendered = base::TimeTicks::Now(); } | 53 stats_.client_stats.time_decoded = base::TimeTicks::Now(); |
| 54 } |
| 55 void OnRendered() { |
| 56 stats_.client_stats.time_rendered = base::TimeTicks::Now(); |
| 57 } |
51 | 58 |
52 VideoPacket* packet() { return packet_.get(); } | 59 VideoPacket* packet() { return packet_.get(); } |
53 | 60 |
54 private: | 61 private: |
55 std::unique_ptr<VideoPacket> packet_; | 62 std::unique_ptr<VideoPacket> packet_; |
56 protocol::PerformanceTracker* perf_tracker_; | 63 protocol::FrameStatsConsumer* stats_consumer_; |
57 protocol::FrameStats stats_; | 64 protocol::FrameStats stats_; |
58 base::Closure done_; | 65 base::Closure done_; |
59 }; | 66 }; |
60 | 67 |
61 class PepperVideoRenderer3D::Picture { | 68 class PepperVideoRenderer3D::Picture { |
62 public: | 69 public: |
63 Picture(pp::VideoDecoder* decoder, PP_VideoPicture picture) | 70 Picture(pp::VideoDecoder* decoder, PP_VideoPicture picture) |
64 : decoder_(decoder), picture_(picture) {} | 71 : decoder_(decoder), picture_(picture) {} |
65 ~Picture() { decoder_->RecyclePicture(picture_); } | 72 ~Picture() { decoder_->RecyclePicture(picture_); } |
66 | 73 |
(...skipping 30 matching lines...) Expand all Loading... |
97 force_repaint_ = true; | 104 force_repaint_ = true; |
98 PaintIfNeeded(); | 105 PaintIfNeeded(); |
99 } | 106 } |
100 | 107 |
101 void PepperVideoRenderer3D::EnableDebugDirtyRegion(bool enable) { | 108 void PepperVideoRenderer3D::EnableDebugDirtyRegion(bool enable) { |
102 debug_dirty_region_ = enable; | 109 debug_dirty_region_ = enable; |
103 } | 110 } |
104 | 111 |
105 bool PepperVideoRenderer3D::Initialize( | 112 bool PepperVideoRenderer3D::Initialize( |
106 const ClientContext& context, | 113 const ClientContext& context, |
107 protocol::PerformanceTracker* perf_tracker) { | 114 protocol::FrameStatsConsumer* stats_consumer) { |
108 perf_tracker_ = perf_tracker; | 115 stats_consumer_ = stats_consumer; |
109 | 116 |
110 const int32_t context_attributes[] = { | 117 const int32_t context_attributes[] = { |
111 PP_GRAPHICS3DATTRIB_ALPHA_SIZE, 8, | 118 PP_GRAPHICS3DATTRIB_ALPHA_SIZE, 8, |
112 PP_GRAPHICS3DATTRIB_BLUE_SIZE, 8, | 119 PP_GRAPHICS3DATTRIB_BLUE_SIZE, 8, |
113 PP_GRAPHICS3DATTRIB_GREEN_SIZE, 8, | 120 PP_GRAPHICS3DATTRIB_GREEN_SIZE, 8, |
114 PP_GRAPHICS3DATTRIB_RED_SIZE, 8, | 121 PP_GRAPHICS3DATTRIB_RED_SIZE, 8, |
115 PP_GRAPHICS3DATTRIB_DEPTH_SIZE, 0, | 122 PP_GRAPHICS3DATTRIB_DEPTH_SIZE, 0, |
116 PP_GRAPHICS3DATTRIB_STENCIL_SIZE, 0, | 123 PP_GRAPHICS3DATTRIB_STENCIL_SIZE, 0, |
117 PP_GRAPHICS3DATTRIB_SAMPLES, 0, | 124 PP_GRAPHICS3DATTRIB_SAMPLES, 0, |
118 PP_GRAPHICS3DATTRIB_SAMPLE_BUFFERS, 0, | 125 PP_GRAPHICS3DATTRIB_SAMPLE_BUFFERS, 0, |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 return this; | 198 return this; |
192 } | 199 } |
193 | 200 |
194 protocol::FrameConsumer* PepperVideoRenderer3D::GetFrameConsumer() { | 201 protocol::FrameConsumer* PepperVideoRenderer3D::GetFrameConsumer() { |
195 // GetFrameConsumer() is used only for WebRTC-based connections which are not | 202 // GetFrameConsumer() is used only for WebRTC-based connections which are not |
196 // supported by the plugin. | 203 // supported by the plugin. |
197 NOTREACHED(); | 204 NOTREACHED(); |
198 return nullptr; | 205 return nullptr; |
199 } | 206 } |
200 | 207 |
| 208 protocol::FrameStatsConsumer* PepperVideoRenderer3D::GetFrameStatsConsumer() { |
| 209 return stats_consumer_; |
| 210 } |
| 211 |
201 void PepperVideoRenderer3D::ProcessVideoPacket( | 212 void PepperVideoRenderer3D::ProcessVideoPacket( |
202 std::unique_ptr<VideoPacket> packet, | 213 std::unique_ptr<VideoPacket> packet, |
203 const base::Closure& done) { | 214 const base::Closure& done) { |
204 VideoPacket* packet_ptr = packet.get(); | 215 VideoPacket* packet_ptr = packet.get(); |
205 std::unique_ptr<FrameTracker> frame_tracker( | 216 std::unique_ptr<FrameTracker> frame_tracker( |
206 new FrameTracker(std::move(packet), perf_tracker_, done)); | 217 new FrameTracker(std::move(packet), stats_consumer_, done)); |
207 | 218 |
208 // Don't need to do anything if the packet is empty. Host sends empty video | 219 // Don't need to do anything if the packet is empty. Host sends empty video |
209 // packets when the screen is not changing. | 220 // packets when the screen is not changing. |
210 if (!packet_ptr->data().size()) | 221 if (!packet_ptr->data().size()) |
211 return; | 222 return; |
212 | 223 |
213 if (!frame_received_) { | 224 if (!frame_received_) { |
214 event_handler_->OnVideoFirstFrameReceived(); | 225 event_handler_->OnVideoFirstFrameReceived(); |
215 frame_received_ = true; | 226 frame_received_ = true; |
216 } | 227 } |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
519 gles2_if_->AttachShader(graphics_.pp_resource(), shader_program_, shader); | 530 gles2_if_->AttachShader(graphics_.pp_resource(), shader_program_, shader); |
520 gles2_if_->DeleteShader(graphics_.pp_resource(), shader); | 531 gles2_if_->DeleteShader(graphics_.pp_resource(), shader); |
521 } | 532 } |
522 | 533 |
523 void PepperVideoRenderer3D::CheckGLError() { | 534 void PepperVideoRenderer3D::CheckGLError() { |
524 GLenum error = gles2_if_->GetError(graphics_.pp_resource()); | 535 GLenum error = gles2_if_->GetError(graphics_.pp_resource()); |
525 CHECK_EQ(error, static_cast<GLenum>(GL_NO_ERROR)) << "GL error: " << error; | 536 CHECK_EQ(error, static_cast<GLenum>(GL_NO_ERROR)) << "GL error: " << error; |
526 } | 537 } |
527 | 538 |
528 } // namespace remoting | 539 } // namespace remoting |
OLD | NEW |