xref: /aosp_15_r20/external/libvpx/test/vp9_lossless_test.cc (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2013 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #include "gtest/gtest.h"
12*fb1b10abSAndroid Build Coastguard Worker 
13*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_config.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "test/codec_factory.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "test/encode_test_driver.h"
16*fb1b10abSAndroid Build Coastguard Worker #include "test/i420_video_source.h"
17*fb1b10abSAndroid Build Coastguard Worker #include "test/util.h"
18*fb1b10abSAndroid Build Coastguard Worker #include "test/y4m_video_source.h"
19*fb1b10abSAndroid Build Coastguard Worker 
20*fb1b10abSAndroid Build Coastguard Worker namespace {
21*fb1b10abSAndroid Build Coastguard Worker 
22*fb1b10abSAndroid Build Coastguard Worker const int kMaxPsnr = 100;
23*fb1b10abSAndroid Build Coastguard Worker 
24*fb1b10abSAndroid Build Coastguard Worker class LosslessTest
25*fb1b10abSAndroid Build Coastguard Worker     : public ::libvpx_test::EncoderTest,
26*fb1b10abSAndroid Build Coastguard Worker       public ::libvpx_test::CodecTestWithParam<libvpx_test::TestMode> {
27*fb1b10abSAndroid Build Coastguard Worker  protected:
LosslessTest()28*fb1b10abSAndroid Build Coastguard Worker   LosslessTest()
29*fb1b10abSAndroid Build Coastguard Worker       : EncoderTest(GET_PARAM(0)), psnr_(kMaxPsnr), nframes_(0),
30*fb1b10abSAndroid Build Coastguard Worker         encoding_mode_(GET_PARAM(1)) {}
31*fb1b10abSAndroid Build Coastguard Worker 
32*fb1b10abSAndroid Build Coastguard Worker   ~LosslessTest() override = default;
33*fb1b10abSAndroid Build Coastguard Worker 
SetUp()34*fb1b10abSAndroid Build Coastguard Worker   void SetUp() override {
35*fb1b10abSAndroid Build Coastguard Worker     InitializeConfig();
36*fb1b10abSAndroid Build Coastguard Worker     SetMode(encoding_mode_);
37*fb1b10abSAndroid Build Coastguard Worker   }
38*fb1b10abSAndroid Build Coastguard Worker 
PreEncodeFrameHook(::libvpx_test::VideoSource * video,::libvpx_test::Encoder * encoder)39*fb1b10abSAndroid Build Coastguard Worker   void PreEncodeFrameHook(::libvpx_test::VideoSource *video,
40*fb1b10abSAndroid Build Coastguard Worker                           ::libvpx_test::Encoder *encoder) override {
41*fb1b10abSAndroid Build Coastguard Worker     if (video->frame() == 0) {
42*fb1b10abSAndroid Build Coastguard Worker       // Only call Control if quantizer > 0 to verify that using quantizer
43*fb1b10abSAndroid Build Coastguard Worker       // alone will activate lossless
44*fb1b10abSAndroid Build Coastguard Worker       if (cfg_.rc_max_quantizer > 0 || cfg_.rc_min_quantizer > 0) {
45*fb1b10abSAndroid Build Coastguard Worker         encoder->Control(VP9E_SET_LOSSLESS, 1);
46*fb1b10abSAndroid Build Coastguard Worker       }
47*fb1b10abSAndroid Build Coastguard Worker     }
48*fb1b10abSAndroid Build Coastguard Worker   }
49*fb1b10abSAndroid Build Coastguard Worker 
BeginPassHook(unsigned int)50*fb1b10abSAndroid Build Coastguard Worker   void BeginPassHook(unsigned int /*pass*/) override {
51*fb1b10abSAndroid Build Coastguard Worker     psnr_ = kMaxPsnr;
52*fb1b10abSAndroid Build Coastguard Worker     nframes_ = 0;
53*fb1b10abSAndroid Build Coastguard Worker   }
54*fb1b10abSAndroid Build Coastguard Worker 
PSNRPktHook(const vpx_codec_cx_pkt_t * pkt)55*fb1b10abSAndroid Build Coastguard Worker   void PSNRPktHook(const vpx_codec_cx_pkt_t *pkt) override {
56*fb1b10abSAndroid Build Coastguard Worker     if (pkt->data.psnr.psnr[0] < psnr_) psnr_ = pkt->data.psnr.psnr[0];
57*fb1b10abSAndroid Build Coastguard Worker   }
58*fb1b10abSAndroid Build Coastguard Worker 
GetMinPsnr() const59*fb1b10abSAndroid Build Coastguard Worker   double GetMinPsnr() const { return psnr_; }
60*fb1b10abSAndroid Build Coastguard Worker 
61*fb1b10abSAndroid Build Coastguard Worker  private:
62*fb1b10abSAndroid Build Coastguard Worker   double psnr_;
63*fb1b10abSAndroid Build Coastguard Worker   unsigned int nframes_;
64*fb1b10abSAndroid Build Coastguard Worker   libvpx_test::TestMode encoding_mode_;
65*fb1b10abSAndroid Build Coastguard Worker };
66*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(LosslessTest,TestLossLessEncoding)67*fb1b10abSAndroid Build Coastguard Worker TEST_P(LosslessTest, TestLossLessEncoding) {
68*fb1b10abSAndroid Build Coastguard Worker   const vpx_rational timebase = { 33333333, 1000000000 };
69*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_timebase = timebase;
70*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 2000;
71*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_lag_in_frames = 25;
72*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
73*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 0;
74*fb1b10abSAndroid Build Coastguard Worker 
75*fb1b10abSAndroid Build Coastguard Worker   init_flags_ = VPX_CODEC_USE_PSNR;
76*fb1b10abSAndroid Build Coastguard Worker 
77*fb1b10abSAndroid Build Coastguard Worker   // intentionally changed the dimension for better testing coverage
78*fb1b10abSAndroid Build Coastguard Worker   libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
79*fb1b10abSAndroid Build Coastguard Worker                                      timebase.den, timebase.num, 0, 10);
80*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
81*fb1b10abSAndroid Build Coastguard Worker   const double psnr_lossless = GetMinPsnr();
82*fb1b10abSAndroid Build Coastguard Worker   EXPECT_GE(psnr_lossless, kMaxPsnr);
83*fb1b10abSAndroid Build Coastguard Worker }
84*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(LosslessTest,TestLossLessEncoding444)85*fb1b10abSAndroid Build Coastguard Worker TEST_P(LosslessTest, TestLossLessEncoding444) {
86*fb1b10abSAndroid Build Coastguard Worker   libvpx_test::Y4mVideoSource video("rush_hour_444.y4m", 0, 10);
87*fb1b10abSAndroid Build Coastguard Worker 
88*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_profile = 1;
89*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_timebase = video.timebase();
90*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 2000;
91*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_lag_in_frames = 25;
92*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 0;
93*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 0;
94*fb1b10abSAndroid Build Coastguard Worker 
95*fb1b10abSAndroid Build Coastguard Worker   init_flags_ = VPX_CODEC_USE_PSNR;
96*fb1b10abSAndroid Build Coastguard Worker 
97*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
98*fb1b10abSAndroid Build Coastguard Worker   const double psnr_lossless = GetMinPsnr();
99*fb1b10abSAndroid Build Coastguard Worker   EXPECT_GE(psnr_lossless, kMaxPsnr);
100*fb1b10abSAndroid Build Coastguard Worker }
101*fb1b10abSAndroid Build Coastguard Worker 
TEST_P(LosslessTest,TestLossLessEncodingCtrl)102*fb1b10abSAndroid Build Coastguard Worker TEST_P(LosslessTest, TestLossLessEncodingCtrl) {
103*fb1b10abSAndroid Build Coastguard Worker   const vpx_rational timebase = { 33333333, 1000000000 };
104*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_timebase = timebase;
105*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_target_bitrate = 2000;
106*fb1b10abSAndroid Build Coastguard Worker   cfg_.g_lag_in_frames = 25;
107*fb1b10abSAndroid Build Coastguard Worker   // Intentionally set Q > 0, to make sure control can be used to activate
108*fb1b10abSAndroid Build Coastguard Worker   // lossless
109*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_min_quantizer = 10;
110*fb1b10abSAndroid Build Coastguard Worker   cfg_.rc_max_quantizer = 20;
111*fb1b10abSAndroid Build Coastguard Worker 
112*fb1b10abSAndroid Build Coastguard Worker   init_flags_ = VPX_CODEC_USE_PSNR;
113*fb1b10abSAndroid Build Coastguard Worker 
114*fb1b10abSAndroid Build Coastguard Worker   libvpx_test::I420VideoSource video("hantro_collage_w352h288.yuv", 352, 288,
115*fb1b10abSAndroid Build Coastguard Worker                                      timebase.den, timebase.num, 0, 10);
116*fb1b10abSAndroid Build Coastguard Worker   ASSERT_NO_FATAL_FAILURE(RunLoop(&video));
117*fb1b10abSAndroid Build Coastguard Worker   const double psnr_lossless = GetMinPsnr();
118*fb1b10abSAndroid Build Coastguard Worker   EXPECT_GE(psnr_lossless, kMaxPsnr);
119*fb1b10abSAndroid Build Coastguard Worker }
120*fb1b10abSAndroid Build Coastguard Worker 
121*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_REALTIME_ONLY
122*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(LosslessTest,
123*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Values(::libvpx_test::kRealTime));
124*fb1b10abSAndroid Build Coastguard Worker #else
125*fb1b10abSAndroid Build Coastguard Worker VP9_INSTANTIATE_TEST_SUITE(LosslessTest,
126*fb1b10abSAndroid Build Coastguard Worker                            ::testing::Values(::libvpx_test::kRealTime,
127*fb1b10abSAndroid Build Coastguard Worker                                              ::libvpx_test::kOnePassGood,
128*fb1b10abSAndroid Build Coastguard Worker                                              ::libvpx_test::kTwoPassGood));
129*fb1b10abSAndroid Build Coastguard Worker #endif
130*fb1b10abSAndroid Build Coastguard Worker }  // namespace
131