blob: ed0dc55bb1f0d57955f621ec104e92bf68089803 [file] [log] [blame]
/*
* 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