1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include <algorithm>
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/media/webrtc/webrtc_video_capturer_adapter.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/base/video_frame.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content {
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class WebRtcVideoCapturerAdapterTest
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public sigslot::has_slots<>,
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      public ::testing::Test {
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  WebRtcVideoCapturerAdapterTest()
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      : adapter_(false),
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        output_frame_width_(0),
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        output_frame_height_(0) {
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    adapter_.SignalFrameCaptured.connect(
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        this, &WebRtcVideoCapturerAdapterTest::OnFrameCaptured);
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~WebRtcVideoCapturerAdapterTest() {}
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void TestSourceCropFrame(int capture_width,
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           int capture_height,
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           int cropped_width,
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           int cropped_height,
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           int natural_width,
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                           int natural_height) {
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const int horiz_crop = ((capture_width - cropped_width) / 2);
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const int vert_crop = ((capture_height - cropped_height) / 2);
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    gfx::Size coded_size(capture_width, capture_height);
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gfx::Size natural_size(natural_width, natural_height);
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    gfx::Rect view_rect(horiz_crop, vert_crop, cropped_width, cropped_height);
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    scoped_refptr<media::VideoFrame> frame =
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        media::VideoFrame::CreateFrame(media::VideoFrame::I420,
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       coded_size, view_rect, natural_size,
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       base::TimeDelta());
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    adapter_.OnFrameCaptured(frame);
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(natural_width, output_frame_width_);
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(natural_height, output_frame_height_);
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void OnFrameCaptured(cricket::VideoCapturer* capturer,
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                       const cricket::CapturedFrame* frame) {
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    output_frame_width_ = frame->width;
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    output_frame_height_ = frame->height;
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  WebRtcVideoCapturerAdapter adapter_;
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int output_frame_width_;
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  int output_frame_height_;
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(WebRtcVideoCapturerAdapterTest, CropFrameTo640360) {
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestSourceCropFrame(640, 480, 640, 360, 640, 360);
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(WebRtcVideoCapturerAdapterTest, CropFrameTo320320) {
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestSourceCropFrame(640, 480, 480, 480, 320, 320);
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(WebRtcVideoCapturerAdapterTest, Scale720To640360) {
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TestSourceCropFrame(1280, 720, 1280, 720, 640, 360);
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace content
72