| 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/software_video_renderer.h" | 5 #include "remoting/client/software_video_renderer.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| 11 #include "base/callback_helpers.h" | 11 #include "base/callback_helpers.h" |
| 12 #include "base/location.h" | 12 #include "base/location.h" |
| 13 #include "base/logging.h" | 13 #include "base/logging.h" |
| 14 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
| 15 #include "base/task_runner_util.h" | 15 #include "base/task_runner_util.h" |
| 16 #include "remoting/base/util.h" | 16 #include "remoting/base/util.h" |
| 17 #include "remoting/client/frame_consumer.h" | |
| 18 #include "remoting/codec/video_decoder.h" | 17 #include "remoting/codec/video_decoder.h" |
| 19 #include "remoting/codec/video_decoder_verbatim.h" | 18 #include "remoting/codec/video_decoder_verbatim.h" |
| 20 #include "remoting/codec/video_decoder_vpx.h" | 19 #include "remoting/codec/video_decoder_vpx.h" |
| 21 #include "remoting/proto/video.pb.h" | 20 #include "remoting/proto/video.pb.h" |
| 21 #include "remoting/protocol/frame_consumer.h" |
| 22 #include "remoting/protocol/session_config.h" | 22 #include "remoting/protocol/session_config.h" |
| 23 #include "third_party/libyuv/include/libyuv/convert_argb.h" | 23 #include "third_party/libyuv/include/libyuv/convert_argb.h" |
| 24 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" | 24 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" |
| 25 | 25 |
| 26 using remoting::protocol::ChannelConfig; | 26 using remoting::protocol::ChannelConfig; |
| 27 using remoting::protocol::SessionConfig; | 27 using remoting::protocol::SessionConfig; |
| 28 | 28 |
| 29 namespace remoting { | 29 namespace remoting { |
| 30 | 30 |
| 31 namespace { | 31 namespace { |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 scoped_ptr<webrtc::DesktopFrame> frame) { | 65 scoped_ptr<webrtc::DesktopFrame> frame) { |
| 66 if (!decoder->DecodePacket(*packet, frame.get())) | 66 if (!decoder->DecodePacket(*packet, frame.get())) |
| 67 frame.reset(); | 67 frame.reset(); |
| 68 return frame; | 68 return frame; |
| 69 } | 69 } |
| 70 | 70 |
| 71 } // namespace | 71 } // namespace |
| 72 | 72 |
| 73 SoftwareVideoRenderer::SoftwareVideoRenderer( | 73 SoftwareVideoRenderer::SoftwareVideoRenderer( |
| 74 scoped_refptr<base::SingleThreadTaskRunner> decode_task_runner, | 74 scoped_refptr<base::SingleThreadTaskRunner> decode_task_runner, |
| 75 FrameConsumer* consumer, | 75 protocol::FrameConsumer* consumer, |
| 76 protocol::PerformanceTracker* perf_tracker) | 76 protocol::PerformanceTracker* perf_tracker) |
| 77 : decode_task_runner_(decode_task_runner), | 77 : decode_task_runner_(decode_task_runner), |
| 78 consumer_(consumer), | 78 consumer_(consumer), |
| 79 perf_tracker_(perf_tracker), | 79 perf_tracker_(perf_tracker), |
| 80 weak_factory_(this) {} | 80 weak_factory_(this) {} |
| 81 | 81 |
| 82 SoftwareVideoRenderer::~SoftwareVideoRenderer() { | 82 SoftwareVideoRenderer::~SoftwareVideoRenderer() { |
| 83 if (decoder_) | 83 if (decoder_) |
| 84 decode_task_runner_->DeleteSoon(FROM_HERE, decoder_.release()); | 84 decode_task_runner_->DeleteSoon(FROM_HERE, decoder_.release()); |
| 85 } | 85 } |
| 86 | 86 |
| 87 void SoftwareVideoRenderer::OnSessionConfig( | 87 void SoftwareVideoRenderer::OnSessionConfig( |
| 88 const protocol::SessionConfig& config) { | 88 const protocol::SessionConfig& config) { |
| 89 DCHECK(thread_checker_.CalledOnValidThread()); | 89 DCHECK(thread_checker_.CalledOnValidThread()); |
| 90 | 90 |
| 91 // Initialize decoder based on the selected codec. | 91 // Initialize decoder based on the selected codec. |
| 92 ChannelConfig::Codec codec = config.video_config().codec; | 92 ChannelConfig::Codec codec = config.video_config().codec; |
| 93 if (codec == ChannelConfig::CODEC_VERBATIM) { | 93 if (codec == ChannelConfig::CODEC_VERBATIM) { |
| 94 decoder_.reset(new VideoDecoderVerbatim()); | 94 decoder_.reset(new VideoDecoderVerbatim()); |
| 95 } else if (codec == ChannelConfig::CODEC_VP8) { | 95 } else if (codec == ChannelConfig::CODEC_VP8) { |
| 96 decoder_ = VideoDecoderVpx::CreateForVP8(); | 96 decoder_ = VideoDecoderVpx::CreateForVP8(); |
| 97 } else if (codec == ChannelConfig::CODEC_VP9) { | 97 } else if (codec == ChannelConfig::CODEC_VP9) { |
| 98 decoder_ = VideoDecoderVpx::CreateForVP9(); | 98 decoder_ = VideoDecoderVpx::CreateForVP9(); |
| 99 } else { | 99 } else { |
| 100 NOTREACHED() << "Invalid Encoding found: " << codec; | 100 NOTREACHED() << "Invalid Encoding found: " << codec; |
| 101 } | 101 } |
| 102 | 102 |
| 103 if (consumer_->GetPixelFormat() == FrameConsumer::FORMAT_RGBA) { | 103 if (consumer_->GetPixelFormat() == protocol::FrameConsumer::FORMAT_RGBA) { |
| 104 decoder_ = | 104 decoder_ = |
| 105 make_scoped_ptr(new RgbToBgrVideoDecoderFilter(std::move(decoder_))); | 105 make_scoped_ptr(new RgbToBgrVideoDecoderFilter(std::move(decoder_))); |
| 106 } | 106 } |
| 107 } | 107 } |
| 108 | 108 |
| 109 protocol::VideoStub* SoftwareVideoRenderer::GetVideoStub() { | 109 protocol::VideoStub* SoftwareVideoRenderer::GetVideoStub() { |
| 110 DCHECK(thread_checker_.CalledOnValidThread()); | 110 DCHECK(thread_checker_.CalledOnValidThread()); |
| 111 return this; | 111 return this; |
| 112 } | 112 } |
| 113 | 113 |
| 114 protocol::FrameConsumer* SoftwareVideoRenderer::GetFrameConsumer() { |
| 115 return consumer_; |
| 116 } |
| 117 |
| 114 void SoftwareVideoRenderer::ProcessVideoPacket(scoped_ptr<VideoPacket> packet, | 118 void SoftwareVideoRenderer::ProcessVideoPacket(scoped_ptr<VideoPacket> packet, |
| 115 const base::Closure& done) { | 119 const base::Closure& done) { |
| 116 DCHECK(thread_checker_.CalledOnValidThread()); | 120 DCHECK(thread_checker_.CalledOnValidThread()); |
| 117 | 121 |
| 118 base::ScopedClosureRunner done_runner(done); | 122 base::ScopedClosureRunner done_runner(done); |
| 119 | 123 |
| 120 if (perf_tracker_) | 124 if (perf_tracker_) |
| 121 perf_tracker_->RecordVideoPacketStats(*packet); | 125 perf_tracker_->RecordVideoPacketStats(*packet); |
| 122 | 126 |
| 123 // If the video packet is empty then drop it. Empty packets are used to | 127 // If the video packet is empty then drop it. Empty packets are used to |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 DCHECK(thread_checker_.CalledOnValidThread()); | 187 DCHECK(thread_checker_.CalledOnValidThread()); |
| 184 | 188 |
| 185 if (perf_tracker_) | 189 if (perf_tracker_) |
| 186 perf_tracker_->OnFramePainted(frame_id); | 190 perf_tracker_->OnFramePainted(frame_id); |
| 187 | 191 |
| 188 if (!done.is_null()) | 192 if (!done.is_null()) |
| 189 done.Run(); | 193 done.Run(); |
| 190 } | 194 } |
| 191 | 195 |
| 192 } // namespace remoting | 196 } // namespace remoting |
| OLD | NEW |