• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
FrameRect()19 const webrtc::DesktopRect FrameRect() {
20   return webrtc::DesktopRect::MakeSize(kFrameSize);
21 }
22 
FrameRegion()23 webrtc::DesktopRegion FrameRegion() {
24   return webrtc::DesktopRegion(FrameRect());
25 }
26 
FrameDelivery(const webrtc::DesktopSize & view_size,webrtc::DesktopFrame * buffer,const webrtc::DesktopRegion & region)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:
~FrameProducerTester()40   virtual ~FrameProducerTester() {};
41 
DrawBuffer(webrtc::DesktopFrame * buffer)42   virtual void DrawBuffer(webrtc::DesktopFrame* buffer) OVERRIDE {
43     frames.push(buffer);
44   };
45 
InvalidateRegion(const webrtc::DesktopRegion & region)46   virtual void InvalidateRegion(const webrtc::DesktopRegion& region) OVERRIDE {
47     NOTIMPLEMENTED();
48   };
49 
RequestReturnBuffers(const base::Closure & done)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 
SetOutputSizeAndClip(const webrtc::DesktopSize & view_size,const webrtc::DesktopRect & clip_area)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:
SetUp()73   virtual void SetUp() OVERRIDE {
74     frameProducer_.reset(new FrameProducerTester());
75     frameConsumer_.reset(new FrameConsumerBridge(base::Bind(&FrameDelivery)));
76     frameConsumer_->Initialize(frameProducer_.get());
77   }
TearDown()78   virtual void TearDown() OVERRIDE {}
79 
80   scoped_ptr<FrameProducerTester> frameProducer_;
81   scoped_ptr<FrameConsumerBridge> frameConsumer_;
82 };
83 
TEST(FrameConsumerBridgeTest_NotInitialized,CreateAndRelease)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 
TEST_F(FrameConsumerBridgeTest,ApplyBuffer)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 
TEST_F(FrameConsumerBridgeTest,SetSourceSize)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