diff --git a/api/test/frame_generator_interface.h b/api/test/frame_generator_interface.h index 691b6ee3f7..6d8da3d621 100644 --- a/api/test/frame_generator_interface.h +++ b/api/test/frame_generator_interface.h @@ -32,7 +32,7 @@ class FrameGeneratorInterface { absl::optional update_rect; }; - enum class OutputType { kI420, kI420A, kI010 }; + enum class OutputType { kI420, kI420A, kI010, kNV12 }; virtual ~FrameGeneratorInterface() = default; diff --git a/api/video/nv12_buffer.cc b/api/video/nv12_buffer.cc index 4604f1dcea..d6f0183408 100644 --- a/api/video/nv12_buffer.cc +++ b/api/video/nv12_buffer.cc @@ -60,6 +60,19 @@ rtc::scoped_refptr NV12Buffer::Create(int width, stride_uv); } +// static +rtc::scoped_refptr NV12Buffer::Copy( + const I420BufferInterface& i420_buffer) { + rtc::scoped_refptr buffer = + NV12Buffer::Create(i420_buffer.width(), i420_buffer.height()); + libyuv::I420ToNV12( + i420_buffer.DataY(), i420_buffer.StrideY(), i420_buffer.DataU(), + i420_buffer.StrideU(), i420_buffer.DataV(), i420_buffer.StrideV(), + buffer->MutableDataY(), buffer->StrideY(), buffer->MutableDataUV(), + buffer->StrideUV(), buffer->width(), buffer->height()); + return buffer; +} + rtc::scoped_refptr NV12Buffer::ToI420() { rtc::scoped_refptr i420_buffer = I420Buffer::Create(width(), height()); diff --git a/api/video/nv12_buffer.h b/api/video/nv12_buffer.h index 7ffef9100b..039f767e10 100644 --- a/api/video/nv12_buffer.h +++ b/api/video/nv12_buffer.h @@ -31,6 +31,8 @@ class RTC_EXPORT NV12Buffer : public NV12BufferInterface { int height, int stride_y, int stride_uv); + static rtc::scoped_refptr Copy( + const I420BufferInterface& i420_buffer); rtc::scoped_refptr ToI420() override; diff --git a/test/BUILD.gn b/test/BUILD.gn index 300a083832..8e27bc4c26 100644 --- a/test/BUILD.gn +++ b/test/BUILD.gn @@ -53,6 +53,7 @@ rtc_library("frame_generator_impl") { "../api/video:video_frame", "../api/video:video_frame_i010", "../api/video:video_frame_i420", + "../api/video:video_frame_nv12", "../api/video:video_rtp_headers", "../api/video_codecs:video_codecs_api", "../common_video", diff --git a/test/frame_generator.cc b/test/frame_generator.cc index caaa5e6321..6c551d410c 100644 --- a/test/frame_generator.cc +++ b/test/frame_generator.cc @@ -16,6 +16,7 @@ #include #include "api/video/i010_buffer.h" +#include "api/video/nv12_buffer.h" #include "api/video/video_rotation.h" #include "common_video/include/video_frame_buffer.h" #include "common_video/libyuv/include/webrtc_libyuv.h" @@ -70,7 +71,8 @@ FrameGeneratorInterface::VideoFrameData SquareGenerator::NextFrame() { rtc::scoped_refptr buffer = nullptr; switch (type_) { case OutputType::kI420: - case OutputType::kI010: { + case OutputType::kI010: + case OutputType::kNV12: { buffer = CreateI420Buffer(width_, height_); break; } @@ -96,6 +98,8 @@ FrameGeneratorInterface::VideoFrameData SquareGenerator::NextFrame() { if (type_ == OutputType::kI010) { buffer = I010Buffer::Copy(*buffer->ToI420()); + } else if (type_ == OutputType::kNV12) { + buffer = NV12Buffer::Copy(*buffer->ToI420()); } return VideoFrameData(buffer, absl::nullopt); diff --git a/video/video_quality_test.cc b/video/video_quality_test.cc index 75d09c3b5c..ea884bf6fd 100644 --- a/video/video_quality_test.cc +++ b/video/video_quality_test.cc @@ -1104,6 +1104,11 @@ void VideoQualityTest::CreateCapturers() { static_cast(params_.video[video_idx].width), static_cast(params_.video[video_idx].height), test::FrameGeneratorInterface::OutputType::kI010, absl::nullopt); + } else if (params_.video[video_idx].clip_path == "GeneratorNV12") { + frame_generator = test::CreateSquareFrameGenerator( + static_cast(params_.video[video_idx].width), + static_cast(params_.video[video_idx].height), + test::FrameGeneratorInterface::OutputType::kNV12, absl::nullopt); } else if (params_.video[video_idx].clip_path.empty()) { video_sources_[video_idx] = test::CreateVideoCapturer( params_.video[video_idx].width, params_.video[video_idx].height,