1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "testing/gmock/include/gmock/gmock.h"
12a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "testing/gtest/include/gtest/gtest.h"
13a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/codecs/interface/mock/mock_video_codec_interface.h"
14a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/codecs/test/mock/mock_packet_manipulator.h"
15a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/codecs/test/videoprocessor.h"
16a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/modules/video_coding/main/interface/video_coding.h"
17a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/test/testsupport/mock/mock_frame_reader.h"
18a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/test/testsupport/mock/mock_frame_writer.h"
19a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/test/testsupport/packet_reader.h"
20a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/test/testsupport/unittest_utils.h"
21a557f436b9d694d5a0a045e0295e1794f2df48eapbos@webrtc.org#include "webrtc/typedefs.h"
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgusing ::testing::_;
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgusing ::testing::AtLeast;
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgusing ::testing::Return;
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace test {
29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Very basic testing for VideoProcessor. It's mostly tested by running the
31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// video_quality_measurement program.
32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass VideoProcessorTest: public testing::Test {
33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org protected:
34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  MockVideoEncoder encoder_mock_;
35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  MockVideoDecoder decoder_mock_;
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  MockFrameReader frame_reader_mock_;
37b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  MockFrameWriter frame_writer_mock_;
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  MockPacketManipulator packet_manipulator_mock_;
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  Stats stats_;
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  TestConfig config_;
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VideoCodec codec_settings_;
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VideoProcessorTest() {}
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  virtual ~VideoProcessorTest() {}
45b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void SetUp() {
46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Get a codec configuration struct and configure it.
47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    VideoCodingModule::Codec(kVideoCodecVP8, &codec_settings_);
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    config_.codec_settings = &codec_settings_;
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    config_.codec_settings->startBitrate = 100;
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    config_.codec_settings->width = 352;
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    config_.codec_settings->height = 288;
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void TearDown() {}
54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
55b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  void ExpectInit() {
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_CALL(encoder_mock_, InitEncode(_, _, _))
57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .Times(1);
58b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_CALL(encoder_mock_, RegisterEncodeCompleteCallback(_))
59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .Times(AtLeast(1));
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_CALL(decoder_mock_, InitDecode(_, _))
61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .Times(1);
62b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_CALL(decoder_mock_, RegisterDecodeCompleteCallback(_))
63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .Times(AtLeast(1));
64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_CALL(frame_reader_mock_, NumberOfFrames())
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org      .WillOnce(Return(1));
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    EXPECT_CALL(frame_reader_mock_, FrameLength())
673bbed74cdcf1f27ce82104ce645ec0dcdd36902dmikhal@webrtc.org      .WillOnce(Return(152064));
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  }
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
71b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(VideoProcessorTest, Init) {
72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ExpectInit();
73b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VideoProcessorImpl video_processor(&encoder_mock_, &decoder_mock_,
74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     &frame_reader_mock_,
75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     &frame_writer_mock_,
76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     &packet_manipulator_mock_, config_,
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     &stats_);
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_TRUE(video_processor.Init());
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgTEST_F(VideoProcessorTest, ProcessFrame) {
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ExpectInit();
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_CALL(encoder_mock_, Encode(_, _, _))
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    .Times(1);
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  EXPECT_CALL(frame_reader_mock_, ReadFrame(_))
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    .WillOnce(Return(true));
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // Since we don't return any callback from the mock, the decoder will not
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  // be more than initialized...
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  VideoProcessorImpl video_processor(&encoder_mock_, &decoder_mock_,
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     &frame_reader_mock_,
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     &frame_writer_mock_,
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     &packet_manipulator_mock_, config_,
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                     &stats_);
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  ASSERT_TRUE(video_processor.Init());
95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  video_processor.ProcessFrame(0);
96b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace test
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}  // namespace webrtc
100