Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(882)

Side by Side Diff: remoting/client/rectangle_update_decoder.cc

Issue 23677011: Byte-swap the video frame pixels before passing them to Java. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/rectangle_update_decoder.h" 5 #include "remoting/client/rectangle_update_decoder.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/callback.h" 8 #include "base/callback.h"
9 #include "base/callback_helpers.h" 9 #include "base/callback_helpers.h"
10 #include "base/location.h" 10 #include "base/location.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/single_thread_task_runner.h" 12 #include "base/single_thread_task_runner.h"
13 #include "remoting/base/util.h" 13 #include "remoting/base/util.h"
14 #include "remoting/codec/video_decoder.h" 14 #include "remoting/codec/video_decoder.h"
15 #include "remoting/codec/video_decoder_verbatim.h" 15 #include "remoting/codec/video_decoder_verbatim.h"
16 #include "remoting/codec/video_decoder_vp8.h" 16 #include "remoting/codec/video_decoder_vp8.h"
17 #include "remoting/client/frame_consumer.h" 17 #include "remoting/client/frame_consumer.h"
18 #include "remoting/protocol/session_config.h" 18 #include "remoting/protocol/session_config.h"
19 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" 19 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
20 20
21 #if defined(OS_ANDROID)
Sergey Ulanov 2013/09/20 18:35:15 No need to wrap this include in ifdefs (even if yo
Lambros 2013/09/25 18:40:41 Done.
22 #include "third_party/libyuv/include/libyuv/convert_argb.h"
23 #endif // OS_ANDROID
24
21 using base::Passed; 25 using base::Passed;
22 using remoting::protocol::ChannelConfig; 26 using remoting::protocol::ChannelConfig;
23 using remoting::protocol::SessionConfig; 27 using remoting::protocol::SessionConfig;
24 28
25 namespace remoting { 29 namespace remoting {
26 30
31 #if defined(OS_ANDROID)
Sergey Ulanov 2013/09/20 18:35:15 Can we make this more generic so it's easier to re
Lambros 2013/09/25 18:40:41 Done.
32 class VideoDecoderWrapper : public VideoDecoder {
Sergey Ulanov 2013/09/20 18:35:15 Maybe call it RgbToBgrVideoDecoderFilter?
Lambros 2013/09/25 18:40:41 Done.
33 public:
34 VideoDecoderWrapper(scoped_ptr<VideoDecoder> parent)
35 : parent_(parent.Pass()) {
36 }
37
38 virtual void Initialize(const SkISize& screen_size) OVERRIDE {
39 parent_->Initialize(screen_size);
40 }
41
42 virtual DecodeResult DecodePacket(const VideoPacket* packet)
43 OVERRIDE {
Sergey Ulanov 2013/09/20 18:35:15 nit: OVERRIDE must be on one line with the last pa
Lambros 2013/09/25 18:40:41 Hmm.. wrapping wasn't needed anyway.
44 return parent_->DecodePacket(packet);
45 }
46
47 virtual bool IsReadyForData() OVERRIDE {
Sergey Ulanov 2013/09/20 18:35:15 VideoDecoder interface has rotten over time. There
Lambros 2013/09/25 18:40:41 Done.
48 return parent_->IsReadyForData();
49 }
50
51 virtual VideoPacketFormat::Encoding Encoding() OVERRIDE {
52 return parent_->Encoding();
53 }
54
55 virtual void Invalidate(const SkISize& view_size,
56 const SkRegion& region) OVERRIDE {
57 return parent_->Invalidate(view_size, region);
58 }
59
60 virtual void RenderFrame(const SkISize& view_size,
61 const SkIRect& clip_area,
62 uint8* image_buffer,
63 int image_stride,
64 SkRegion* output_region) OVERRIDE {
65 parent_->RenderFrame(view_size, clip_area, image_buffer, image_stride,
66 output_region);
67
68 // Byte-swap the pixels for compatibility with the android.graphics.Bitmap
69 // class.
70 static const int kBytesPerPixelRGB32 = 4;
Sergey Ulanov 2013/09/20 18:35:15 Please add this const in VideoDecoder interface an
Lambros 2013/09/25 18:40:41 Done.
71 for (SkRegion::Iterator i(*output_region); !i.done(); i.next()) {
72 SkIRect rect = i.rect();
73 uint8* pixels = image_buffer + (rect.top() * image_stride) +
74 (rect.left() * kBytesPerPixelRGB32);
75 libyuv::ABGRToARGB(pixels, image_stride, pixels, image_stride,
Sergey Ulanov 2013/09/20 18:35:15 It would be great if we could get data in the righ
fbarchard 2013/09/20 21:50:58 If this is coming from the codec as I420, libyuv c
Sergey Ulanov 2013/09/20 21:56:03 Decoder uses media::ScaleYUVToRGB32WithRect() for
Lambros 2013/09/25 18:40:41 Added TODO.
76 rect.width(), rect.height());
77 }
78 }
79
80 virtual const SkRegion* GetImageShape() OVERRIDE {
81 return parent_->GetImageShape();
82 }
83
84 private:
85 scoped_ptr<VideoDecoder> parent_;
86 };
87 #endif // OS_ANDROID
88
27 RectangleUpdateDecoder::RectangleUpdateDecoder( 89 RectangleUpdateDecoder::RectangleUpdateDecoder(
28 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, 90 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
29 scoped_refptr<base::SingleThreadTaskRunner> decode_task_runner, 91 scoped_refptr<base::SingleThreadTaskRunner> decode_task_runner,
30 scoped_refptr<FrameConsumerProxy> consumer) 92 scoped_refptr<FrameConsumerProxy> consumer)
31 : main_task_runner_(main_task_runner), 93 : main_task_runner_(main_task_runner),
32 decode_task_runner_(decode_task_runner), 94 decode_task_runner_(decode_task_runner),
33 consumer_(consumer), 95 consumer_(consumer),
34 source_size_(SkISize::Make(0, 0)), 96 source_size_(SkISize::Make(0, 0)),
35 source_dpi_(SkIPoint::Make(0, 0)), 97 source_dpi_(SkIPoint::Make(0, 0)),
36 view_size_(SkISize::Make(0, 0)), 98 view_size_(SkISize::Make(0, 0)),
37 clip_area_(SkIRect::MakeEmpty()), 99 clip_area_(SkIRect::MakeEmpty()),
38 paint_scheduled_(false), 100 paint_scheduled_(false),
39 latest_sequence_number_(0) { 101 latest_sequence_number_(0) {
40 } 102 }
41 103
42 RectangleUpdateDecoder::~RectangleUpdateDecoder() { 104 RectangleUpdateDecoder::~RectangleUpdateDecoder() {
43 } 105 }
44 106
45 void RectangleUpdateDecoder::Initialize(const SessionConfig& config) { 107 void RectangleUpdateDecoder::Initialize(const SessionConfig& config) {
46 // Initialize decoder based on the selected codec. 108 // Initialize decoder based on the selected codec.
47 ChannelConfig::Codec codec = config.video_config().codec; 109 ChannelConfig::Codec codec = config.video_config().codec;
48 if (codec == ChannelConfig::CODEC_VERBATIM) { 110 if (codec == ChannelConfig::CODEC_VERBATIM) {
49 decoder_.reset(new VideoDecoderVerbatim()); 111 decoder_.reset(new VideoDecoderVerbatim());
50 } else if (codec == ChannelConfig::CODEC_VP8) { 112 } else if (codec == ChannelConfig::CODEC_VP8) {
51 decoder_.reset(new VideoDecoderVp8()); 113 decoder_.reset(new VideoDecoderVp8());
52 } else { 114 } else {
53 NOTREACHED() << "Invalid Encoding found: " << codec; 115 NOTREACHED() << "Invalid Encoding found: " << codec;
54 } 116 }
117
118 #if defined (OS_ANDROID)
Sergey Ulanov 2013/09/20 18:35:15 I think it's better to make this more generic. The
Lambros 2013/09/25 18:40:41 Done - added output format getter to FrameConsumer
119 scoped_ptr<VideoDecoder> wrapper(new VideoDecoderWrapper(decoder_.Pass()));
120 decoder_ = wrapper.Pass();
121 #endif // OS_ANDROID
55 } 122 }
56 123
57 void RectangleUpdateDecoder::DecodePacket(scoped_ptr<VideoPacket> packet, 124 void RectangleUpdateDecoder::DecodePacket(scoped_ptr<VideoPacket> packet,
58 const base::Closure& done) { 125 const base::Closure& done) {
59 DCHECK(decode_task_runner_->BelongsToCurrentThread()); 126 DCHECK(decode_task_runner_->BelongsToCurrentThread());
60 127
61 base::ScopedClosureRunner done_runner(done); 128 base::ScopedClosureRunner done_runner(done);
62 129
63 bool decoder_needs_reset = false; 130 bool decoder_needs_reset = false;
64 bool notify_size_or_dpi_change = false; 131 bool notify_size_or_dpi_change = false;
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 347
281 done.Run(); 348 done.Run();
282 } 349 }
283 350
284 ChromotingStats* RectangleUpdateDecoder::GetStats() { 351 ChromotingStats* RectangleUpdateDecoder::GetStats() {
285 DCHECK(main_task_runner_->BelongsToCurrentThread()); 352 DCHECK(main_task_runner_->BelongsToCurrentThread());
286 return &stats_; 353 return &stats_;
287 } 354 }
288 355
289 } // namespace remoting 356 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698