// Copyright 2020 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include <algorithm> #include <limits> #include <optional> #include "base/command_line.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/strings/string_number_conversions.h" #include "media/base/media_switches.h" #include "media/base/media_util.h" #include "media/base/test_data_util.h" #include "media/base/video_bitrate_allocation.h" #include "media/base/video_codecs.h" #include "media/base/video_decoder_config.h" #include "media/gpu/buildflags.h" #include "media/gpu/gpu_video_encode_accelerator_helpers.h" #include "media/gpu/test/raw_video.h" #include "media/gpu/test/video_encoder/bitstream_file_writer.h" #include "media/gpu/test/video_encoder/bitstream_validator.h" #include "media/gpu/test/video_encoder/decoder_buffer_validator.h" #include "media/gpu/test/video_encoder/video_encoder.h" #include "media/gpu/test/video_encoder/video_encoder_client.h" #include "media/gpu/test/video_encoder/video_encoder_test_environment.h" #include "media/gpu/test/video_frame_file_writer.h" #include "media/gpu/test/video_frame_validator.h" #include "media/gpu/test/video_test_environment.h" #include "media/gpu/test/video_test_helpers.h" #include "testing/gtest/include/gtest/gtest.h" namespace media { namespace test { namespace { // Video encoder tests usage message. Make sure to also update the documentation // under docs/media/gpu/video_encoder_test_usage.md when making changes here. constexpr const char* usage_msg = …; // Video encoder tests help message. constexpr const char* help_msg = …; // Default video to be used if no test video was specified. constexpr base::FilePath::CharType kDefaultTestVideoPath[] = …); // The number of frames to encode for bitrate check test cases. // TODO(hiroh): Decrease this values to make the test faster. constexpr size_t kNumFramesToEncodeForBitrateCheck = …; // Tolerance factor for how encoded bitrate can differ from requested bitrate. constexpr double kBitrateTolerance = …; constexpr double kVariableBitrateTolerance = …; // The event timeout used in bitrate check tests because encoding 2160p and // validating |kNumFramesToEncodeBitrateCheck| frames take much time. constexpr base::TimeDelta kBitrateCheckEventTimeout = …; media::test::VideoEncoderTestEnvironment* g_env; // Whether we validate the bitstream produced by the encoder. bool g_enable_bitstream_validator = …; // Declared PSNR threshold here, not in VideoEncoderTestEnvironment because it // is specific in video_encode_accelerator_tests. double g_psnr_threshold = …; // Video encode test class. Performs setup and teardown for each single test. class VideoEncoderTest : public ::testing::Test { … }; } // namespace // Encode video from start to end. Wait for the kFlushDone event at the end of // the stream, that notifies us all frames have been encoded. TEST_F(VideoEncoderTest, FlushAtEndOfStream) { … } // Test initializing the video encoder. The test will be successful if the video // encoder is capable of setting up the encoder for the specified codec and // resolution. The test only verifies initialization and doesn't do any // encoding. TEST_F(VideoEncoderTest, Initialize) { … } // Create a video encoder and immediately destroy it without initializing. The // video encoder will be automatically destroyed when the video encoder goes out // of scope at the end of the test. The test will pass if no asserts or crashes // are triggered upon destroying. TEST_F(VideoEncoderTest, DestroyBeforeInitialize) { … } // Test forcing key frames while encoding a video. TEST_F(VideoEncoderTest, ForceKeyFrame) { … } // Test forcing key frame to the first and second frames. TEST_F(VideoEncoderTest, ForceTheFirstAndSecondKeyFrames) { … } // Encode video from start to end. Multiple buffer encodes will be queued in the // encoder, without waiting for the result of the previous encode requests. TEST_F(VideoEncoderTest, FlushAtEndOfStream_MultipleOutstandingEncodes) { … } // Encode multiple videos simultaneously from start to finish. TEST_F(VideoEncoderTest, FlushAtEndOfStream_MultipleConcurrentEncodes) { … } TEST_F(VideoEncoderTest, BitrateCheck) { … } #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) // TODO(https://crbugs.com/350994517): NV12 DMABuf test does not apply to // Windows. There should be similar test for this with NV12 DXGI buffers added. TEST_F(VideoEncoderTest, FlushAtEndOfStream_NV12Dmabuf) { … } // TODO(https://crbugs.com/350994517): These are for scaling and cropping, // which requires GMB support. Enable these tests when GMB is supported // for VEA tests on Windows. // Downscaling is required in VideoEncodeAccelerator when zero-copy video // capture is enabled. One example is simulcast, camera produces 360p VideoFrame // and there are two VideoEncodeAccelerator for 360p and 180p. VideoEncoder for // 180p is fed 360p and thus has to perform the scaling from 360p to 180p. TEST_F(VideoEncoderTest, FlushAtEndOfStream_NV12DmabufScaling) { … } // Encode VideoFrames with cropping the rectangle (0, 60, size). // Cropping is required in VideoEncodeAccelerator when zero-copy video // capture is enabled. One example is when 640x360 capture recording is // requested, a camera cannot produce the resolution and instead produces // 640x480 frames with visible_rect=0, 60, 640x360. TEST_F(VideoEncoderTest, FlushAtEndOfStream_NV12DmabufCroppingTopAndBottom) { … } // Encode VideoFrames with cropping the rectangle (60, 0, size). // Cropping is required in VideoEncodeAccelerator when zero-copy video // capture is enabled. One example is when 640x360 capture recording is // requested, a camera cannot produce the resolution and instead produces // 760x360 frames with visible_rect=60, 0, 640x360. TEST_F(VideoEncoderTest, FlushAtEndOfStream_NV12DmabufCroppingRightAndLeft) { … } #endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) // This tests deactivate and activating spatial layers during encoding. TEST_F(VideoEncoderTest, DeactivateAndActivateSpatialLayers) { … } #if BUILDFLAG(USE_VAAPI) TEST_F(VideoEncoderTest, FlushAtEndOfStream_NV12Dmabuf_EnableDropFrame) { … } #endif // BUILDFLAG(USE_VAAPI) } // namespace test } // namespace media int main(int argc, char** argv) { … }