ec_test.cc (4999B)
1 /* 2 * Copyright (c) 2017, Alliance for Open Media. All rights reserved. 3 * 4 * This source code is subject to the terms of the BSD 2 Clause License and 5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License 6 * was not distributed with this source code in the LICENSE file, you can 7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open 8 * Media Patent License 1.0 was not distributed with this source code in the 9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent. 10 */ 11 12 #include "gtest/gtest.h" 13 14 #include <cstdlib> 15 #include <memory> 16 #include <new> 17 18 #include "aom_dsp/entenc.h" 19 #include "aom_dsp/entdec.h" 20 21 TEST(EC_TEST, random_ec_test) { 22 od_ec_enc enc; 23 od_ec_dec dec; 24 int sz; 25 int i; 26 int ret; 27 unsigned int seed; 28 unsigned char *ptr; 29 uint32_t ptr_sz; 30 char *seed_str; 31 ret = 0; 32 seed_str = getenv("EC_TEST_SEED"); 33 if (seed_str) { 34 seed = atoi(seed_str); 35 } else { 36 seed = 0xdaa1a; 37 } 38 srand(seed); 39 od_ec_enc_init(&enc, 1); 40 /*Test compatibility between multiple different encode/decode routines.*/ 41 for (i = 0; i < 409600; i++) { 42 int j; 43 sz = rand() / ((RAND_MAX >> (rand() % 9U)) + 1U); 44 std::unique_ptr<unsigned[]> fz(new (std::nothrow) unsigned[sz]); 45 ASSERT_NE(fz, nullptr); 46 std::unique_ptr<unsigned[]> fts(new (std::nothrow) unsigned[sz]); 47 ASSERT_NE(fts, nullptr); 48 std::unique_ptr<unsigned[]> data(new (std::nothrow) unsigned[sz]); 49 ASSERT_NE(data, nullptr); 50 std::unique_ptr<unsigned[]> tell(new (std::nothrow) unsigned[sz + 1]); 51 ASSERT_NE(tell, nullptr); 52 std::unique_ptr<unsigned[]> enc_method(new (std::nothrow) unsigned[sz]); 53 ASSERT_NE(enc_method, nullptr); 54 od_ec_enc_reset(&enc); 55 tell[0] = od_ec_enc_tell_frac(&enc); 56 for (j = 0; j < sz; j++) { 57 data[j] = rand() / ((RAND_MAX >> 1) + 1); 58 59 fts[j] = CDF_PROB_BITS; 60 fz[j] = (rand() % (CDF_PROB_TOP - 2)) >> (CDF_PROB_BITS - fts[j]); 61 fz[j] = OD_MAXI(fz[j], 1); 62 enc_method[j] = 3 + (rand() & 1); 63 switch (enc_method[j]) { 64 case 3: { 65 od_ec_encode_bool_q15(&enc, data[j], 66 OD_ICDF(fz[j] << (CDF_PROB_BITS - fts[j]))); 67 break; 68 } 69 case 4: { 70 uint16_t cdf[2]; 71 cdf[0] = OD_ICDF(fz[j]); 72 cdf[1] = OD_ICDF(1U << fts[j]); 73 od_ec_encode_cdf_q15(&enc, data[j], cdf, 2); 74 break; 75 } 76 } 77 78 tell[j + 1] = od_ec_enc_tell_frac(&enc); 79 } 80 ptr = od_ec_enc_done(&enc, &ptr_sz); 81 ASSERT_NE(ptr, nullptr); 82 EXPECT_GE(((od_ec_enc_tell(&enc) + 7U) >> 3), ptr_sz) 83 << "od_ec_enc_tell() lied: " 84 "there's " 85 << ptr_sz << " bytes instead of " << ((od_ec_enc_tell(&enc) + 7) >> 3) 86 << " (Random seed: " << seed << ")\n"; 87 od_ec_dec_init(&dec, ptr, ptr_sz); 88 EXPECT_EQ(od_ec_dec_tell_frac(&dec), tell[0]) 89 << "od_ec_dec_tell() mismatch between encoder and decoder " 90 "at symbol 0: " 91 << (unsigned)od_ec_dec_tell_frac(&dec) << " instead of " << tell[0] 92 << " (Random seed: " << seed << ").\n"; 93 for (j = 0; j < sz; j++) { 94 int dec_method; 95 unsigned int sym = data[j] + 1; // Initialize sym to an invalid value. 96 97 dec_method = 3 + (rand() & 1); 98 99 switch (dec_method) { 100 case 3: { 101 sym = od_ec_decode_bool_q15( 102 &dec, OD_ICDF(fz[j] << (CDF_PROB_BITS - fts[j]))); 103 break; 104 } 105 case 4: { 106 uint16_t cdf[2]; 107 cdf[0] = OD_ICDF(fz[j]); 108 cdf[1] = OD_ICDF(1U << fts[j]); 109 sym = od_ec_decode_cdf_q15(&dec, cdf, 2); 110 break; 111 } 112 } 113 114 EXPECT_EQ(sym, data[j]) 115 << "Decoded " << sym << " instead of " << data[j] 116 << " with fz=" << fz[j] << " and ftb=" << fts[j] << "at position " 117 << j << " of " << sz << " (Random seed: " << seed << ").\n" 118 << "Encoding method: " << enc_method[j] 119 << " decoding method: " << dec_method << "\n"; 120 EXPECT_EQ(od_ec_dec_tell_frac(&dec), tell[j + 1]) 121 << "od_ec_dec_tell() mismatch between encoder and " 122 "decoder at symbol " 123 << j + 1 << ": " << (unsigned)od_ec_dec_tell_frac(&dec) 124 << " instead of " << tell[j + 1] << " (Random seed: " << seed 125 << ").\n"; 126 } 127 } 128 od_ec_enc_reset(&enc); 129 od_ec_encode_bool_q15(&enc, 0, OD_ICDF(16384)); 130 od_ec_encode_bool_q15(&enc, 0, OD_ICDF(16384)); 131 od_ec_encode_bool_q15(&enc, 0, OD_ICDF(16384)); 132 od_ec_encode_bool_q15(&enc, 0, OD_ICDF(16384)); 133 od_ec_encode_bool_q15(&enc, 0, OD_ICDF(24576)); 134 od_ec_enc_reset(&enc); 135 od_ec_encode_bool_q15(&enc, 0, OD_ICDF(16384)); 136 od_ec_encode_bool_q15(&enc, 0, OD_ICDF(16384)); 137 od_ec_encode_bool_q15(&enc, 1, OD_ICDF(32256)); 138 od_ec_encode_bool_q15(&enc, 0, OD_ICDF(24576)); 139 ptr = od_ec_enc_done(&enc, &ptr_sz); 140 ASSERT_NE(ptr, nullptr); 141 EXPECT_EQ(ptr_sz, 2u); 142 EXPECT_EQ(ptr[0], 63); 143 od_ec_enc_clear(&enc); 144 EXPECT_EQ(ret, 0); 145 }