|  | /* | 
|  | *  Copyright 2022 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 <cstddef> | 
|  | #include <memory> | 
|  | #include <optional> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "absl/strings/string_view.h" | 
|  | #include "api/test/pclf/media_configuration.h" | 
|  | #include "api/test/video/video_frame_writer.h" | 
|  | #include "api/video/video_frame.h" | 
|  | #include "test/gmock.h" | 
|  | #include "test/gtest.h" | 
|  | #include "test/testsupport/file_utils.h" | 
|  |  | 
|  | namespace webrtc { | 
|  | namespace webrtc_pc_e2e { | 
|  | namespace { | 
|  |  | 
|  | using ::testing::Eq; | 
|  |  | 
|  | TEST(PclfVideoSubscriptionTest, | 
|  | MaxFromSenderSpecEqualIndependentOfOtherFields) { | 
|  | VideoResolution r1(VideoResolution::Spec::kMaxFromSender); | 
|  | r1.set_width(1); | 
|  | r1.set_height(2); | 
|  | r1.set_fps(3); | 
|  | VideoResolution r2(VideoResolution::Spec::kMaxFromSender); | 
|  | r1.set_width(4); | 
|  | r1.set_height(5); | 
|  | r1.set_fps(6); | 
|  | EXPECT_EQ(r1, r2); | 
|  | } | 
|  |  | 
|  | TEST(PclfVideoSubscriptionTest, WhenSpecIsNotSetFieldsAreCompared) { | 
|  | VideoResolution test_resolution(/*width=*/1, /*height=*/2, | 
|  | /*fps=*/3); | 
|  | VideoResolution equal_resolution(/*width=*/1, /*height=*/2, | 
|  | /*fps=*/3); | 
|  | VideoResolution different_width(/*width=*/10, /*height=*/2, | 
|  | /*fps=*/3); | 
|  | VideoResolution different_height(/*width=*/1, /*height=*/20, | 
|  | /*fps=*/3); | 
|  | VideoResolution different_fps(/*width=*/1, /*height=*/20, | 
|  | /*fps=*/30); | 
|  |  | 
|  | EXPECT_EQ(test_resolution, equal_resolution); | 
|  | EXPECT_NE(test_resolution, different_width); | 
|  | EXPECT_NE(test_resolution, different_height); | 
|  | EXPECT_NE(test_resolution, different_fps); | 
|  | } | 
|  |  | 
|  | TEST(PclfVideoSubscriptionTest, GetMaxResolutionForEmptyReturnsNullopt) { | 
|  | std::optional<VideoResolution> resolution = | 
|  | VideoSubscription::GetMaxResolution(std::vector<VideoConfig>{}); | 
|  | ASSERT_FALSE(resolution.has_value()); | 
|  | } | 
|  |  | 
|  | TEST(PclfVideoSubscriptionTest, GetMaxResolutionSelectMaxForEachDimention) { | 
|  | VideoConfig max_width(/*width=*/1000, /*height=*/1, /*fps=*/1); | 
|  | VideoConfig max_height(/*width=*/1, /*height=*/100, /*fps=*/1); | 
|  | VideoConfig max_fps(/*width=*/1, /*height=*/1, /*fps=*/10); | 
|  |  | 
|  | std::optional<VideoResolution> resolution = | 
|  | VideoSubscription::GetMaxResolution( | 
|  | std::vector<VideoConfig>{max_width, max_height, max_fps}); | 
|  | ASSERT_TRUE(resolution.has_value()); | 
|  | EXPECT_EQ(resolution->width(), static_cast<size_t>(1000)); | 
|  | EXPECT_EQ(resolution->height(), static_cast<size_t>(100)); | 
|  | EXPECT_EQ(resolution->fps(), 10); | 
|  | } | 
|  |  | 
|  | struct TestVideoFrameWriter : public test::VideoFrameWriter { | 
|  | public: | 
|  | TestVideoFrameWriter(absl::string_view file_name_prefix, | 
|  | const VideoResolution& resolution) | 
|  | : file_name_prefix(file_name_prefix), resolution(resolution) {} | 
|  |  | 
|  | bool WriteFrame(const VideoFrame& /* frame */) override { return true; } | 
|  |  | 
|  | void Close() override {} | 
|  |  | 
|  | std::string file_name_prefix; | 
|  | VideoResolution resolution; | 
|  | }; | 
|  |  | 
|  | TEST(VideoDumpOptionsTest, InputVideoWriterHasCorrectFileName) { | 
|  | VideoResolution resolution(/*width=*/1280, /*height=*/720, /*fps=*/30); | 
|  |  | 
|  | TestVideoFrameWriter* writer = nullptr; | 
|  | VideoDumpOptions options("foo", /*sampling_modulo=*/1, | 
|  | /*export_frame_ids=*/false, | 
|  | /*video_frame_writer_factory=*/ | 
|  | [&](absl::string_view file_name_prefix, | 
|  | const VideoResolution& resolution) { | 
|  | auto out = std::make_unique<TestVideoFrameWriter>( | 
|  | file_name_prefix, resolution); | 
|  | writer = out.get(); | 
|  | return out; | 
|  | }); | 
|  | std::unique_ptr<test::VideoFrameWriter> created_writer = | 
|  | options.CreateInputDumpVideoFrameWriter("alice-video", resolution); | 
|  |  | 
|  | ASSERT_TRUE(writer != nullptr); | 
|  | ASSERT_THAT(writer->file_name_prefix, | 
|  | Eq(test::JoinFilename("foo", "alice-video_1280x720_30"))); | 
|  | ASSERT_THAT(writer->resolution, Eq(resolution)); | 
|  | } | 
|  |  | 
|  | TEST(VideoDumpOptionsTest, OutputVideoWriterHasCorrectFileName) { | 
|  | VideoResolution resolution(/*width=*/1280, /*height=*/720, /*fps=*/30); | 
|  |  | 
|  | TestVideoFrameWriter* writer = nullptr; | 
|  | VideoDumpOptions options("foo", /*sampling_modulo=*/1, | 
|  | /*export_frame_ids=*/false, | 
|  | /*video_frame_writer_factory=*/ | 
|  | [&](absl::string_view file_name_prefix, | 
|  | const VideoResolution& resolution) { | 
|  | auto out = std::make_unique<TestVideoFrameWriter>( | 
|  | file_name_prefix, resolution); | 
|  | writer = out.get(); | 
|  | return out; | 
|  | }); | 
|  | std::unique_ptr<test::VideoFrameWriter> created_writer = | 
|  | options.CreateOutputDumpVideoFrameWriter("alice-video", "bob", | 
|  | resolution); | 
|  |  | 
|  | ASSERT_TRUE(writer != nullptr); | 
|  | ASSERT_THAT(writer->file_name_prefix, | 
|  | Eq(test::JoinFilename("foo", "alice-video_bob_1280x720_30"))); | 
|  | ASSERT_THAT(writer->resolution, Eq(resolution)); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace webrtc_pc_e2e | 
|  | }  // namespace webrtc |