| /* | |
| * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. | |
| * | |
| * Use of this source code is governed by a BSD-style license | |
| * that can be found in the LICENSE file in the root of the source | |
| * tree. An additional intellectual property rights grant can be found | |
| * in the file PATENTS. All contributing project authors may | |
| * be found in the AUTHORS file in the root of the source tree. | |
| */ | |
| #include "modules/video_coding/utility/framerate_controller_deprecated.h" | |
| #include <cstddef> | |
| #include <cstdint> | |
| #include "test/gtest.h" | |
| namespace webrtc { | |
| TEST(FramerateControllerDeprecated, KeepTargetFramerate) { | |
| const float input_framerate_fps = 20; | |
| const float target_framerate_fps = 5; | |
| const float max_abs_framerate_error_fps = target_framerate_fps * 0.1f; | |
| const size_t input_duration_secs = 3; | |
| const size_t num_input_frames = input_duration_secs * input_framerate_fps; | |
| FramerateControllerDeprecated framerate_controller(target_framerate_fps); | |
| size_t num_dropped_frames = 0; | |
| for (size_t frame_num = 0; frame_num < num_input_frames; ++frame_num) { | |
| const uint32_t timestamp_ms = | |
| static_cast<uint32_t>(1000 * frame_num / input_framerate_fps); | |
| if (framerate_controller.DropFrame(timestamp_ms)) { | |
| ++num_dropped_frames; | |
| } else { | |
| framerate_controller.AddFrame(timestamp_ms); | |
| } | |
| } | |
| const float output_framerate_fps = | |
| static_cast<float>(num_input_frames - num_dropped_frames) / | |
| input_duration_secs; | |
| EXPECT_NEAR(output_framerate_fps, target_framerate_fps, | |
| max_abs_framerate_error_fps); | |
| } | |
| TEST(FramerateControllerDeprecated, DoNotDropAnyFramesIfTargerEqualsInput) { | |
| const float input_framerate_fps = 30; | |
| const size_t input_duration_secs = 3; | |
| const size_t num_input_frames = input_duration_secs * input_framerate_fps; | |
| FramerateControllerDeprecated framerate_controller(input_framerate_fps); | |
| size_t num_dropped_frames = 0; | |
| for (size_t frame_num = 0; frame_num < num_input_frames; ++frame_num) { | |
| const uint32_t timestamp_ms = | |
| static_cast<uint32_t>(1000 * frame_num / input_framerate_fps); | |
| if (framerate_controller.DropFrame(timestamp_ms)) { | |
| ++num_dropped_frames; | |
| } else { | |
| framerate_controller.AddFrame(timestamp_ms); | |
| } | |
| } | |
| EXPECT_EQ(num_dropped_frames, 0U); | |
| } | |
| TEST(FramerateControllerDeprecated, DoNotDropFrameWhenTimestampJumpsBackward) { | |
| FramerateControllerDeprecated framerate_controller(30); | |
| ASSERT_FALSE(framerate_controller.DropFrame(66)); | |
| framerate_controller.AddFrame(66); | |
| EXPECT_FALSE(framerate_controller.DropFrame(33)); | |
| } | |
| TEST(FramerateControllerDeprecated, DropFrameIfItIsTooCloseToPreviousFrame) { | |
| FramerateControllerDeprecated framerate_controller(30); | |
| ASSERT_FALSE(framerate_controller.DropFrame(33)); | |
| framerate_controller.AddFrame(33); | |
| EXPECT_TRUE(framerate_controller.DropFrame(34)); | |
| } | |
| TEST(FramerateControllerDeprecated, FrameDroppingStartsFromSecondInputFrame) { | |
| const float input_framerate_fps = 23; | |
| const float target_framerate_fps = 19; | |
| const uint32_t input_frame_duration_ms = | |
| static_cast<uint32_t>(1000 / input_framerate_fps); | |
| FramerateControllerDeprecated framerate_controller(target_framerate_fps); | |
| ASSERT_FALSE(framerate_controller.DropFrame(1 * input_frame_duration_ms)); | |
| framerate_controller.AddFrame(1 * input_frame_duration_ms); | |
| EXPECT_TRUE(framerate_controller.DropFrame(2 * input_frame_duration_ms)); | |
| } | |
| } // namespace webrtc |