tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }