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> |
| 8 |
7 #include "base/bind.h" | 9 #include "base/bind.h" |
8 #include "base/callback.h" | 10 #include "base/callback.h" |
9 #include "base/callback_helpers.h" | 11 #include "base/callback_helpers.h" |
10 #include "base/location.h" | 12 #include "base/location.h" |
11 #include "base/logging.h" | 13 #include "base/logging.h" |
12 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
13 #include "base/task_runner_util.h" | 15 #include "base/task_runner_util.h" |
14 #include "remoting/base/util.h" | 16 #include "remoting/base/util.h" |
15 #include "remoting/client/frame_consumer.h" | 17 #include "remoting/client/frame_consumer.h" |
16 #include "remoting/codec/video_decoder.h" | 18 #include "remoting/codec/video_decoder.h" |
(...skipping 11 matching lines...) Expand all Loading... |
28 | 30 |
29 namespace { | 31 namespace { |
30 | 32 |
31 // This class wraps a VideoDecoder and byte-swaps the pixels for compatibility | 33 // This class wraps a VideoDecoder and byte-swaps the pixels for compatibility |
32 // with the android.graphics.Bitmap class. | 34 // with the android.graphics.Bitmap class. |
33 // TODO(lambroslambrou): Refactor so that the VideoDecoder produces data | 35 // TODO(lambroslambrou): Refactor so that the VideoDecoder produces data |
34 // in the right byte-order, instead of swapping it here. | 36 // in the right byte-order, instead of swapping it here. |
35 class RgbToBgrVideoDecoderFilter : public VideoDecoder { | 37 class RgbToBgrVideoDecoderFilter : public VideoDecoder { |
36 public: | 38 public: |
37 RgbToBgrVideoDecoderFilter(scoped_ptr<VideoDecoder> parent) | 39 RgbToBgrVideoDecoderFilter(scoped_ptr<VideoDecoder> parent) |
38 : parent_(parent.Pass()) { | 40 : parent_(std::move(parent)) {} |
39 } | |
40 | 41 |
41 bool DecodePacket(const VideoPacket& packet, | 42 bool DecodePacket(const VideoPacket& packet, |
42 webrtc::DesktopFrame* frame) override { | 43 webrtc::DesktopFrame* frame) override { |
43 if (!parent_->DecodePacket(packet, frame)) | 44 if (!parent_->DecodePacket(packet, frame)) |
44 return false; | 45 return false; |
45 for (webrtc::DesktopRegion::Iterator i(frame->updated_region()); | 46 for (webrtc::DesktopRegion::Iterator i(frame->updated_region()); |
46 !i.IsAtEnd(); i.Advance()) { | 47 !i.IsAtEnd(); i.Advance()) { |
47 webrtc::DesktopRect rect = i.rect(); | 48 webrtc::DesktopRect rect = i.rect(); |
48 uint8_t* pixels = frame->data() + (rect.top() * frame->stride()) + | 49 uint8_t* pixels = frame->data() + (rect.top() * frame->stride()) + |
49 (rect.left() * webrtc::DesktopFrame::kBytesPerPixel); | 50 (rect.left() * webrtc::DesktopFrame::kBytesPerPixel); |
50 libyuv::ABGRToARGB(pixels, frame->stride(), pixels, frame->stride(), | 51 libyuv::ABGRToARGB(pixels, frame->stride(), pixels, frame->stride(), |
51 rect.width(), rect.height()); | 52 rect.width(), rect.height()); |
52 } | 53 } |
53 | 54 |
54 return true; | 55 return true; |
55 } | 56 } |
56 | 57 |
57 private: | 58 private: |
58 scoped_ptr<VideoDecoder> parent_; | 59 scoped_ptr<VideoDecoder> parent_; |
59 }; | 60 }; |
60 | 61 |
61 scoped_ptr<webrtc::DesktopFrame> DoDecodeFrame( | 62 scoped_ptr<webrtc::DesktopFrame> DoDecodeFrame( |
62 VideoDecoder* decoder, | 63 VideoDecoder* decoder, |
63 scoped_ptr<VideoPacket> packet, | 64 scoped_ptr<VideoPacket> packet, |
64 scoped_ptr<webrtc::DesktopFrame> frame) { | 65 scoped_ptr<webrtc::DesktopFrame> frame) { |
65 if (!decoder->DecodePacket(*packet, frame.get())) | 66 if (!decoder->DecodePacket(*packet, frame.get())) |
66 frame.reset(); | 67 frame.reset(); |
67 return frame.Pass(); | 68 return frame; |
68 } | 69 } |
69 | 70 |
70 } // namespace | 71 } // namespace |
71 | 72 |
72 SoftwareVideoRenderer::SoftwareVideoRenderer( | 73 SoftwareVideoRenderer::SoftwareVideoRenderer( |
73 scoped_refptr<base::SingleThreadTaskRunner> decode_task_runner, | 74 scoped_refptr<base::SingleThreadTaskRunner> decode_task_runner, |
74 FrameConsumer* consumer, | 75 FrameConsumer* consumer, |
75 protocol::PerformanceTracker* perf_tracker) | 76 protocol::PerformanceTracker* perf_tracker) |
76 : decode_task_runner_(decode_task_runner), | 77 : decode_task_runner_(decode_task_runner), |
77 consumer_(consumer), | 78 consumer_(consumer), |
(...skipping 15 matching lines...) Expand all Loading... |
93 decoder_.reset(new VideoDecoderVerbatim()); | 94 decoder_.reset(new VideoDecoderVerbatim()); |
94 } else if (codec == ChannelConfig::CODEC_VP8) { | 95 } else if (codec == ChannelConfig::CODEC_VP8) { |
95 decoder_ = VideoDecoderVpx::CreateForVP8(); | 96 decoder_ = VideoDecoderVpx::CreateForVP8(); |
96 } else if (codec == ChannelConfig::CODEC_VP9) { | 97 } else if (codec == ChannelConfig::CODEC_VP9) { |
97 decoder_ = VideoDecoderVpx::CreateForVP9(); | 98 decoder_ = VideoDecoderVpx::CreateForVP9(); |
98 } else { | 99 } else { |
99 NOTREACHED() << "Invalid Encoding found: " << codec; | 100 NOTREACHED() << "Invalid Encoding found: " << codec; |
100 } | 101 } |
101 | 102 |
102 if (consumer_->GetPixelFormat() == FrameConsumer::FORMAT_RGBA) { | 103 if (consumer_->GetPixelFormat() == FrameConsumer::FORMAT_RGBA) { |
103 scoped_ptr<VideoDecoder> wrapper( | 104 decoder_ = |
104 new RgbToBgrVideoDecoderFilter(decoder_.Pass())); | 105 make_scoped_ptr(new RgbToBgrVideoDecoderFilter(std::move(decoder_))); |
105 decoder_ = wrapper.Pass(); | |
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 void SoftwareVideoRenderer::ProcessVideoPacket(scoped_ptr<VideoPacket> packet, | 114 void SoftwareVideoRenderer::ProcessVideoPacket(scoped_ptr<VideoPacket> packet, |
115 const base::Closure& done) { | 115 const base::Closure& done) { |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 | 166 |
167 if (perf_tracker_) | 167 if (perf_tracker_) |
168 perf_tracker_->OnFrameDecoded(frame_id); | 168 perf_tracker_->OnFrameDecoded(frame_id); |
169 | 169 |
170 if (!frame) { | 170 if (!frame) { |
171 if (!done.is_null()) | 171 if (!done.is_null()) |
172 done.Run(); | 172 done.Run(); |
173 return; | 173 return; |
174 } | 174 } |
175 | 175 |
176 consumer_->DrawFrame(frame.Pass(), | 176 consumer_->DrawFrame(std::move(frame), |
177 base::Bind(&SoftwareVideoRenderer::OnFrameRendered, | 177 base::Bind(&SoftwareVideoRenderer::OnFrameRendered, |
178 weak_factory_.GetWeakPtr(), frame_id, done)); | 178 weak_factory_.GetWeakPtr(), frame_id, done)); |
179 } | 179 } |
180 | 180 |
181 void SoftwareVideoRenderer::OnFrameRendered(int32_t frame_id, | 181 void SoftwareVideoRenderer::OnFrameRendered(int32_t frame_id, |
182 const base::Closure& done) { | 182 const base::Closure& done) { |
183 DCHECK(thread_checker_.CalledOnValidThread()); | 183 DCHECK(thread_checker_.CalledOnValidThread()); |
184 | 184 |
185 if (perf_tracker_) | 185 if (perf_tracker_) |
186 perf_tracker_->OnFramePainted(frame_id); | 186 perf_tracker_->OnFramePainted(frame_id); |
187 | 187 |
188 if (!done.is_null()) | 188 if (!done.is_null()) |
189 done.Run(); | 189 done.Run(); |
190 } | 190 } |
191 | 191 |
192 } // namespace remoting | 192 } // namespace remoting |
OLD | NEW |