quantizer_test.cc (3413B)
1 // Copyright (c) the JPEG XL Project Authors. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 #include "lib/jxl/quantizer.h" 7 8 #include <jxl/memory_manager.h> 9 10 #include <cstddef> 11 #include <cstdint> 12 13 #include "lib/jxl/dec_bit_reader.h" 14 #include "lib/jxl/enc_aux_out.h" 15 #include "lib/jxl/enc_bit_writer.h" 16 #include "lib/jxl/enc_fields.h" 17 #include "lib/jxl/fields.h" 18 #include "lib/jxl/image.h" 19 #include "lib/jxl/image_test_utils.h" 20 #include "lib/jxl/quant_weights.h" 21 #include "lib/jxl/test_memory_manager.h" 22 #include "lib/jxl/test_utils.h" 23 #include "lib/jxl/testing.h" 24 25 namespace jxl { 26 namespace { 27 28 void TestEquivalence(int qxsize, int qysize, const Quantizer& quantizer1, 29 const Quantizer& quantizer2) { 30 ASSERT_NEAR(quantizer1.inv_quant_dc(), quantizer2.inv_quant_dc(), 1e-7); 31 } 32 33 TEST(QuantizerTest, QuantizerParams) { 34 for (uint32_t i = 1; i < 10000; ++i) { 35 QuantizerParams p; 36 p.global_scale = i; 37 size_t extension_bits = 0; 38 size_t total_bits = 0; 39 EXPECT_TRUE(Bundle::CanEncode(p, &extension_bits, &total_bits)); 40 EXPECT_EQ(0u, extension_bits); 41 EXPECT_GE(total_bits, 4u); 42 } 43 } 44 45 TEST(QuantizerTest, BitStreamRoundtripSameQuant) { 46 JxlMemoryManager* memory_manager = jxl::test::MemoryManager(); 47 const int qxsize = 8; 48 const int qysize = 8; 49 DequantMatrices dequant; 50 Quantizer quantizer1(dequant); 51 JXL_TEST_ASSIGN_OR_DIE( 52 ImageI raw_quant_field, 53 ImageI::Create(jxl::test::MemoryManager(), qxsize, qysize)); 54 quantizer1.SetQuant(0.17f, 0.17f, &raw_quant_field); 55 BitWriter writer{memory_manager}; 56 QuantizerParams params = quantizer1.GetParams(); 57 EXPECT_TRUE( 58 WriteQuantizerParams(params, &writer, LayerType::Header, nullptr)); 59 writer.ZeroPadToByte(); 60 const size_t bits_written = writer.BitsWritten(); 61 Quantizer quantizer2(dequant); 62 BitReader reader(writer.GetSpan()); 63 EXPECT_TRUE(quantizer2.Decode(&reader)); 64 EXPECT_TRUE(reader.JumpToByteBoundary()); 65 EXPECT_EQ(reader.TotalBitsConsumed(), bits_written); 66 EXPECT_TRUE(reader.Close()); 67 TestEquivalence(qxsize, qysize, quantizer1, quantizer2); 68 } 69 70 TEST(QuantizerTest, BitStreamRoundtripRandomQuant) { 71 JxlMemoryManager* memory_manager = jxl::test::MemoryManager(); 72 const int qxsize = 8; 73 const int qysize = 8; 74 DequantMatrices dequant; 75 Quantizer quantizer1(dequant); 76 JXL_TEST_ASSIGN_OR_DIE(ImageI raw_quant_field, 77 ImageI::Create(memory_manager, qxsize, qysize)); 78 quantizer1.SetQuant(0.17f, 0.17f, &raw_quant_field); 79 float quant_dc = 0.17f; 80 JXL_TEST_ASSIGN_OR_DIE(ImageF qf, 81 ImageF::Create(memory_manager, qxsize, qysize)); 82 RandomFillImage(&qf, 0.0f, 1.0f); 83 ASSERT_TRUE(quantizer1.SetQuantField(quant_dc, qf, &raw_quant_field)); 84 BitWriter writer{memory_manager}; 85 QuantizerParams params = quantizer1.GetParams(); 86 EXPECT_TRUE( 87 WriteQuantizerParams(params, &writer, LayerType::Header, nullptr)); 88 writer.ZeroPadToByte(); 89 const size_t bits_written = writer.BitsWritten(); 90 Quantizer quantizer2(dequant); 91 BitReader reader(writer.GetSpan()); 92 EXPECT_TRUE(quantizer2.Decode(&reader)); 93 EXPECT_TRUE(reader.JumpToByteBoundary()); 94 EXPECT_EQ(reader.TotalBitsConsumed(), bits_written); 95 EXPECT_TRUE(reader.Close()); 96 TestEquivalence(qxsize, qysize, quantizer1, quantizer2); 97 } 98 } // namespace 99 } // namespace jxl