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