#include #include #include "frame/frame.h" #include "hw/hw_factory.h" namespace rk3588 { namespace { Frame MakeNv12Frame(int w, int h) { Frame f; f.width = w; f.height = h; f.format = PixelFormat::NV12; const size_t size = static_cast(w) * h * 3 / 2; auto buf = std::make_shared>(size, 0); const size_t y_bytes = static_cast(w) * h; for (size_t i = 0; i < y_bytes; ++i) { (*buf)[i] = 80; } for (size_t i = y_bytes; i < size; ++i) { (*buf)[i] = 128; } f.data = buf->data(); f.data_size = buf->size(); f.SetOwner(buf); f.plane_count = 2; f.planes[0] = {f.data, w, static_cast(y_bytes), 0}; f.planes[1] = {f.data + y_bytes, w, static_cast(size - y_bytes), static_cast(y_bytes)}; f.SyncBufferFromFrame(); return f; } TEST(ImageProcessorTest, RgaVsSwscale_OutputShape) { #if defined(RK3588_ENABLE_RGA) && defined(RK3588_ENABLE_FFMPEG) SimpleJson rga_cfg(SimpleJson::Object{{"use_rga", true}}); SimpleJson sw_cfg(SimpleJson::Object{{"use_rga", false}}); auto rga = HwFactory::CreateImageProcessor(rga_cfg); auto sws = HwFactory::CreateImageProcessor(sw_cfg); ASSERT_NE(rga, nullptr); ASSERT_NE(sws, nullptr); Frame src = MakeNv12Frame(64, 48); Frame dst_rga; dst_rga.width = 128; dst_rga.height = 96; dst_rga.format = PixelFormat::RGB; EXPECT_TRUE(rga->Resize(src, dst_rga)); EXPECT_EQ(dst_rga.width, 128); EXPECT_EQ(dst_rga.height, 96); Frame dst_sws; dst_sws.width = 128; dst_sws.height = 96; dst_sws.format = PixelFormat::RGB; EXPECT_TRUE(sws->Resize(src, dst_sws)); EXPECT_EQ(dst_sws.width, 128); EXPECT_EQ(dst_sws.height, 96); #else GTEST_SKIP() << "RGA/FFmpeg not enabled"; #endif } TEST(ImageProcessorTest, ColorConversion_Nv12ToRgb) { #if defined(RK3588_ENABLE_FFMPEG) SimpleJson cfg(SimpleJson::Object{{"use_rga", false}}); auto proc = HwFactory::CreateImageProcessor(cfg); ASSERT_NE(proc, nullptr); Frame src = MakeNv12Frame(2, 2); Frame dst; dst.width = 2; dst.height = 2; dst.format = PixelFormat::RGB; Status st = proc->CvtColor(src, dst, PixelFormat::RGB); EXPECT_TRUE(st.IsOk()); EXPECT_EQ(dst.width, 2); EXPECT_EQ(dst.height, 2); EXPECT_EQ(dst.format, PixelFormat::RGB); EXPECT_NE(dst.data, nullptr); EXPECT_GT(dst.data_size, 0u); #else GTEST_SKIP() << "FFmpeg not enabled"; #endif } } // namespace } // namespace rk3588