OLD | NEW |
(Empty) | |
| 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 |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "remoting/ios/bridge/frame_consumer_bridge.h" |
| 6 |
| 7 #include <queue> |
| 8 #include <gtest/gtest.h> |
| 9 |
| 10 #include "base/bind.h" |
| 11 #include "base/memory/scoped_ptr.h" |
| 12 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" |
| 13 #include "third_party/webrtc/modules/desktop_capture/desktop_region.h" |
| 14 |
| 15 namespace { |
| 16 const webrtc::DesktopSize kFrameSize(100, 100); |
| 17 const webrtc::DesktopVector kDpi(100, 100); |
| 18 |
| 19 const webrtc::DesktopRect FrameRect() { |
| 20 return webrtc::DesktopRect::MakeSize(kFrameSize); |
| 21 } |
| 22 |
| 23 webrtc::DesktopRegion FrameRegion() { |
| 24 return webrtc::DesktopRegion(FrameRect()); |
| 25 } |
| 26 |
| 27 void FrameDelivery(const webrtc::DesktopSize& view_size, |
| 28 webrtc::DesktopFrame* buffer, |
| 29 const webrtc::DesktopRegion& region) { |
| 30 ASSERT_TRUE(view_size.equals(kFrameSize)); |
| 31 ASSERT_TRUE(region.Equals(FrameRegion())); |
| 32 }; |
| 33 |
| 34 } // namespace |
| 35 |
| 36 namespace remoting { |
| 37 |
| 38 class FrameProducerTester : public FrameProducer { |
| 39 public: |
| 40 virtual ~FrameProducerTester() {}; |
| 41 |
| 42 virtual void DrawBuffer(webrtc::DesktopFrame* buffer) OVERRIDE { |
| 43 frames.push(buffer); |
| 44 }; |
| 45 |
| 46 virtual void InvalidateRegion(const webrtc::DesktopRegion& region) OVERRIDE { |
| 47 NOTIMPLEMENTED(); |
| 48 }; |
| 49 |
| 50 virtual void RequestReturnBuffers(const base::Closure& done) OVERRIDE { |
| 51 // Don't have to actually return the buffers. This function is really |
| 52 // saying don't use the references anymore, they are now invalid. |
| 53 while (!frames.empty()) { |
| 54 frames.pop(); |
| 55 } |
| 56 done.Run(); |
| 57 }; |
| 58 |
| 59 virtual void SetOutputSizeAndClip(const webrtc::DesktopSize& view_size, |
| 60 const webrtc::DesktopRect& clip_area) |
| 61 OVERRIDE { |
| 62 viewSize = view_size; |
| 63 clipArea = clip_area; |
| 64 }; |
| 65 |
| 66 std::queue<webrtc::DesktopFrame*> frames; |
| 67 webrtc::DesktopSize viewSize; |
| 68 webrtc::DesktopRect clipArea; |
| 69 }; |
| 70 |
| 71 class FrameConsumerBridgeTest : public ::testing::Test { |
| 72 protected: |
| 73 virtual void SetUp() OVERRIDE { |
| 74 frameProducer_.reset(new FrameProducerTester()); |
| 75 frameConsumer_.reset(new FrameConsumerBridge(base::Bind(&FrameDelivery))); |
| 76 frameConsumer_->Initialize(frameProducer_.get()); |
| 77 } |
| 78 virtual void TearDown() OVERRIDE {} |
| 79 |
| 80 scoped_ptr<FrameProducerTester> frameProducer_; |
| 81 scoped_ptr<FrameConsumerBridge> frameConsumer_; |
| 82 }; |
| 83 |
| 84 TEST(FrameConsumerBridgeTest_NotInitialized, CreateAndRelease) { |
| 85 scoped_ptr<FrameConsumerBridge> frameConsumer_( |
| 86 new FrameConsumerBridge(base::Bind(&FrameDelivery))); |
| 87 ASSERT_TRUE(frameConsumer_.get() != NULL); |
| 88 frameConsumer_.reset(); |
| 89 ASSERT_TRUE(frameConsumer_.get() == NULL); |
| 90 } |
| 91 |
| 92 TEST_F(FrameConsumerBridgeTest, ApplyBuffer) { |
| 93 webrtc::DesktopFrame* frame = NULL; |
| 94 ASSERT_EQ(0, frameProducer_->frames.size()); |
| 95 frameConsumer_->SetSourceSize(kFrameSize, kDpi); |
| 96 ASSERT_EQ(1, frameProducer_->frames.size()); |
| 97 |
| 98 // Return the frame, and ensure we get it back |
| 99 frame = frameProducer_->frames.front(); |
| 100 frameProducer_->frames.pop(); |
| 101 ASSERT_EQ(0, frameProducer_->frames.size()); |
| 102 frameConsumer_->ApplyBuffer( |
| 103 kFrameSize, FrameRect(), frame, FrameRegion(), FrameRegion()); |
| 104 ASSERT_EQ(1, frameProducer_->frames.size()); |
| 105 ASSERT_TRUE(frame == frameProducer_->frames.front()); |
| 106 ASSERT_TRUE(frame->data() == frameProducer_->frames.front()->data()); |
| 107 |
| 108 // Change the SourceSize, we should get a new frame, but when the old frame is |
| 109 // submitted we will not get it back. |
| 110 frameConsumer_->SetSourceSize(webrtc::DesktopSize(1, 1), kDpi); |
| 111 ASSERT_EQ(2, frameProducer_->frames.size()); |
| 112 frame = frameProducer_->frames.front(); |
| 113 frameProducer_->frames.pop(); |
| 114 ASSERT_EQ(1, frameProducer_->frames.size()); |
| 115 frameConsumer_->ApplyBuffer( |
| 116 kFrameSize, FrameRect(), frame, FrameRegion(), FrameRegion()); |
| 117 ASSERT_EQ(1, frameProducer_->frames.size()); |
| 118 } |
| 119 |
| 120 TEST_F(FrameConsumerBridgeTest, SetSourceSize) { |
| 121 frameConsumer_->SetSourceSize(webrtc::DesktopSize(0, 0), |
| 122 webrtc::DesktopVector(0, 0)); |
| 123 ASSERT_TRUE(frameProducer_->viewSize.equals(webrtc::DesktopSize(0, 0))); |
| 124 ASSERT_TRUE(frameProducer_->clipArea.equals( |
| 125 webrtc::DesktopRect::MakeLTRB(0, 0, 0, 0))); |
| 126 ASSERT_EQ(1, frameProducer_->frames.size()); |
| 127 ASSERT_TRUE( |
| 128 frameProducer_->frames.front()->size().equals(webrtc::DesktopSize(0, 0))); |
| 129 |
| 130 frameConsumer_->SetSourceSize(kFrameSize, kDpi); |
| 131 ASSERT_TRUE(frameProducer_->viewSize.equals(kFrameSize)); |
| 132 ASSERT_TRUE(frameProducer_->clipArea.equals(FrameRect())); |
| 133 ASSERT_EQ(2, frameProducer_->frames.size()); |
| 134 frameProducer_->frames.pop(); |
| 135 ASSERT_TRUE(frameProducer_->frames.front()->size().equals(kFrameSize)); |
| 136 } |
| 137 |
| 138 } // namespace remoting |
OLD | NEW |