| 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 |