Index: webrtc/modules/video_coding/codecs/test/videoprocessor_unittest.cc |
diff --git a/webrtc/modules/video_coding/codecs/test/videoprocessor_unittest.cc b/webrtc/modules/video_coding/codecs/test/videoprocessor_unittest.cc |
index 2a54358e0d6abb4c8ff6970e9bcd2b88c14b2490..07b1dab008f549329c727467195759859ee4e548 100644 |
--- a/webrtc/modules/video_coding/codecs/test/videoprocessor_unittest.cc |
+++ b/webrtc/modules/video_coding/codecs/test/videoprocessor_unittest.cc |
@@ -28,67 +28,104 @@ using ::testing::Return; |
namespace webrtc { |
namespace test { |
-// Very basic testing for VideoProcessor. It's mostly tested by running the |
-// video_quality_measurement program. |
+namespace { |
+ |
+const VideoCodecType kCodecType = kVideoCodecVP8; |
+ |
+const int kWidth = 352; |
+const int kHeight = 288; |
+const int kFrameLength = |
+ kWidth * kHeight + 2 * ((kWidth + 1) / 2) * ((kHeight + 1) / 2); |
+const int kNumFrames = 2; |
+ |
+const int kStartBitrate = 100; |
+const int kStartFramerate = 15; |
+ |
+} // namespace |
+ |
class VideoProcessorTest : public testing::Test { |
protected: |
- MockVideoEncoder encoder_mock_; |
- MockVideoDecoder decoder_mock_; |
- MockFrameReader frame_reader_mock_; |
- MockFrameWriter frame_writer_mock_; |
- MockPacketManipulator packet_manipulator_mock_; |
- Stats stats_; |
- TestConfig config_; |
- VideoCodec codec_settings_; |
- |
- VideoProcessorTest() {} |
- virtual ~VideoProcessorTest() {} |
- void SetUp() { |
- // Get a codec configuration struct and configure it. |
- VideoCodingModule::Codec(kVideoCodecVP8, &codec_settings_); |
+ VideoProcessorTest() { |
+ VideoCodingModule::Codec(kCodecType, &codec_settings_); |
config_.codec_settings = &codec_settings_; |
- config_.codec_settings->startBitrate = 100; |
- config_.codec_settings->width = 352; |
- config_.codec_settings->height = 288; |
+ config_.codec_settings->startBitrate = kStartBitrate; |
+ config_.codec_settings->width = kWidth; |
+ config_.codec_settings->height = kHeight; |
+ |
+ EXPECT_CALL(frame_reader_mock_, NumberOfFrames()) |
+ .WillOnce(Return(kNumFrames)); |
+ EXPECT_CALL(frame_reader_mock_, FrameLength()) |
+ .WillRepeatedly(Return(kFrameLength)); |
+ processor_.reset(new VideoProcessorImpl( |
+ &encoder_mock_, &decoder_mock_, &frame_reader_mock_, |
+ &frame_writer_mock_, &packet_manipulator_mock_, config_, &stats_, |
+ nullptr /* source_frame_writer */, nullptr /* encoded_frame_writer */, |
+ nullptr /* decoded_frame_writer */)); |
+ |
+ Init(); |
} |
- void TearDown() {} |
- void ExpectInit() { |
+ ~VideoProcessorTest() override { Release(); } |
+ |
+ void Init() { |
EXPECT_CALL(encoder_mock_, InitEncode(_, _, _)).Times(1); |
- EXPECT_CALL(encoder_mock_, RegisterEncodeCompleteCallback(_)) |
- .Times(AtLeast(1)); |
+ EXPECT_CALL(encoder_mock_, RegisterEncodeCompleteCallback(_)).Times(1); |
EXPECT_CALL(decoder_mock_, InitDecode(_, _)).Times(1); |
- EXPECT_CALL(decoder_mock_, RegisterDecodeCompleteCallback(_)) |
- .Times(AtLeast(1)); |
- EXPECT_CALL(frame_reader_mock_, NumberOfFrames()).WillRepeatedly(Return(1)); |
- EXPECT_CALL(frame_reader_mock_, FrameLength()).WillOnce(Return(152064)); |
+ EXPECT_CALL(decoder_mock_, RegisterDecodeCompleteCallback(_)).Times(1); |
+ |
+ processor_->Init(); |
} |
+ |
+ void ExpectProcessOneFrame() { |
+ EXPECT_CALL(frame_reader_mock_, ReadFrame()) |
+ .WillOnce(Return(I420Buffer::Create(50, 50))); |
+ EXPECT_CALL(encoder_mock_, Encode(_, _, _)).Times(1); |
+ // Cannot EXPECT callbacks, since our MockVideo{En,De}coders do not |
+ // generate callbacks. |
+ } |
+ |
+ void Release() { |
+ EXPECT_CALL(encoder_mock_, RegisterEncodeCompleteCallback(_)).Times(1); |
+ EXPECT_CALL(decoder_mock_, RegisterDecodeCompleteCallback(_)).Times(1); |
+ |
+ EXPECT_CALL(encoder_mock_, Release()).Times(1); |
+ EXPECT_CALL(decoder_mock_, Release()).Times(1); |
+ |
+ processor_->Release(); |
+ } |
+ |
+ testing::StrictMock<MockVideoEncoder> encoder_mock_; |
+ testing::StrictMock<MockVideoDecoder> decoder_mock_; |
+ testing::StrictMock<MockFrameReader> frame_reader_mock_; |
+ testing::StrictMock<MockFrameWriter> frame_writer_mock_; |
+ testing::StrictMock<MockPacketManipulator> packet_manipulator_mock_; |
+ TestConfig config_; |
+ VideoCodec codec_settings_; |
+ Stats stats_; |
+ std::unique_ptr<VideoProcessor> processor_; |
}; |
-TEST_F(VideoProcessorTest, Init) { |
- ExpectInit(); |
- VideoProcessorImpl video_processor( |
- &encoder_mock_, &decoder_mock_, &frame_reader_mock_, &frame_writer_mock_, |
- &packet_manipulator_mock_, config_, &stats_, |
- nullptr /* source_frame_writer */, nullptr /* encoded_frame_writer */, |
- nullptr /* decoded_frame_writer */); |
- video_processor.Init(); |
+TEST_F(VideoProcessorTest, InitRelease) {} |
+ |
+TEST_F(VideoProcessorTest, SetRates) { |
+ EXPECT_CALL(encoder_mock_, SetRateAllocation(_, kStartFramerate)).Times(1); |
+ processor_->SetRates(kStartBitrate, kStartFramerate); |
+ |
+ // Frame statistics should be reset after new rates have been set. |
+ EXPECT_EQ(0, processor_->NumberDroppedFrames()); |
+ EXPECT_EQ(0, processor_->NumberSpatialResizes()); |
} |
-TEST_F(VideoProcessorTest, ProcessFrame) { |
- ExpectInit(); |
- EXPECT_CALL(encoder_mock_, Encode(_, _, _)).Times(1); |
- EXPECT_CALL(frame_reader_mock_, ReadFrame()) |
- .WillOnce(Return(I420Buffer::Create(50, 50))); |
- // Since we don't return any callback from the mock, the decoder will not |
- // be more than initialized... |
- VideoProcessorImpl video_processor( |
- &encoder_mock_, &decoder_mock_, &frame_reader_mock_, &frame_writer_mock_, |
- &packet_manipulator_mock_, config_, &stats_, |
- nullptr /* source_frame_writer */, nullptr /* encoded_frame_writer */, |
- nullptr /* decoded_frame_writer */); |
- video_processor.Init(); |
- video_processor.ProcessFrame(0); |
+TEST_F(VideoProcessorTest, ProcessFrames) { |
+ ExpectProcessOneFrame(); |
+ EXPECT_TRUE(processor_->ProcessFrame(0)); |
+ |
+ ExpectProcessOneFrame(); |
+ EXPECT_TRUE(processor_->ProcessFrame(1)); |
+ |
+ // End of file. |
+ EXPECT_CALL(frame_reader_mock_, ReadFrame()).WillOnce(Return(nullptr)); |
+ EXPECT_FALSE(processor_->ProcessFrame(2)); |
} |
} // namespace test |