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 |