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