summaryrefslogtreecommitdiff
path: root/third_party/aom/test/scan_test.cc
blob: 2b11bd1fbcbbec5bbf8d4bc00c6cbe1c573b9eee (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
 * Copyright (c) 2016, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 2 Clause License and
 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
 * was not distributed with this source code in the LICENSE file, you can
 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
 * Media Patent License 1.0 was not distributed with this source code in the
 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
 */

#include "av1/common/common_data.h"
#include "av1/common/scan.h"
#include "third_party/googletest/src/googletest/include/gtest/gtest.h"

namespace {

TEST(ScanTest, av1_augment_prob) {
  const TX_SIZE tx_size = TX_4X4;
  const TX_TYPE tx_type = DCT_DCT;
  const int tx1d_size = tx_size_wide[tx_size];
  uint32_t prob[16] = { 8, 8, 7, 7, 8, 8, 4, 2, 3, 3, 2, 2, 2, 2, 2, 2 };
  const uint32_t ref_prob[16] = {
    8, 8, 7, 7, 8, 8, 4, 2, 3, 3, 2, 2, 2, 2, 2, 2
  };
  av1_augment_prob(tx_size, tx_type, prob);
  for (int r = 0; r < tx1d_size; ++r) {
    for (int c = 0; c < tx1d_size; ++c) {
      const uint32_t idx = r * tx1d_size + c;
      EXPECT_EQ(ref_prob[idx], prob[idx] >> 16);
    }
  }

  const SCAN_ORDER *sc = get_default_scan(tx_size, tx_type, 0);
  const uint32_t mask = (1 << 16) - 1;
  for (int r = 0; r < tx1d_size; ++r) {
    for (int c = 0; c < tx1d_size; ++c) {
      const uint32_t ref_idx = r * tx1d_size + c;
      const uint32_t scan_idx = mask ^ (prob[r * tx1d_size + c] & mask);
      const uint32_t idx = sc->scan[scan_idx];
      EXPECT_EQ(ref_idx, idx);
    }
  }
}

#if USE_TOPOLOGICAL_SORT
TEST(ScanTest, av1_update_sort_order) {
  const TX_SIZE tx_size = TX_4X4;
  const TX_TYPE tx_type = DCT_DCT;
  const uint32_t prob[16] = { 15, 14, 11, 10, 13, 12, 9, 5,
                              8,  7,  4,  2,  6,  3,  1, 0 };
  const int16_t ref_sort_order[16] = { 0, 1,  4, 5,  2,  3,  6,  8,
                                       9, 12, 7, 10, 13, 11, 14, 15 };
  int16_t sort_order[16];
  av1_update_sort_order(tx_size, tx_type, prob, sort_order);
  for (int i = 0; i < 16; ++i) EXPECT_EQ(ref_sort_order[i], sort_order[i]);
}
#endif

#if USE_TOPOLOGICAL_SORT
TEST(ScanTest, av1_update_scan_order) {
  TX_SIZE tx_size = TX_4X4;
  const TX_TYPE tx_type = DCT_DCT;
  const uint32_t prob[16] = { 10, 12, 14, 9, 11, 13, 15, 5,
                              8,  7,  4,  2, 6,  3,  1,  0 };
  int16_t sort_order[16];
  int16_t scan[16];
  int16_t iscan[16];
  const int16_t ref_iscan[16] = { 0, 1, 2,  6,  3, 4,  5,  10,
                                  7, 8, 11, 13, 9, 12, 14, 15 };

  av1_update_sort_order(tx_size, tx_type, prob, sort_order);
  av1_update_scan_order(tx_size, sort_order, scan, iscan);

  for (int i = 0; i < 16; ++i) {
    EXPECT_EQ(ref_iscan[i], iscan[i]);
    EXPECT_EQ(i, scan[ref_iscan[i]]);
  }
}
#endif

TEST(ScanTest, av1_update_neighbors) {
  TX_SIZE tx_size = TX_4X4;
  // raster order
  const int16_t scan[16] = { 0, 1, 2,  3,  4,  5,  6,  7,
                             8, 9, 10, 11, 12, 13, 14, 15 };
  int16_t nb[(16 + 1) * 2];
  const int16_t ref_nb[(16 + 1) * 2] = { 0,  0,  0,  0,  1,  1,  2, 2, 0,
                                         1,  1,  4,  2,  5,  3,  6, 4, 5,
                                         5,  8,  6,  9,  7,  10, 8, 9, 9,
                                         12, 10, 13, 11, 14, 0,  0 };

  // raster order's scan and iscan are the same
  av1_update_neighbors(tx_size, scan, scan, nb);

  for (int i = 0; i < (16 + 1) * 2; ++i) {
    EXPECT_EQ(ref_nb[i], nb[i]);
  }
}

#if USE_2X2_PROB
TEST(ScanTest, av1_down_sample_scan_count) {
  const uint32_t non_zero_count[256] = {
    13, 12, 11, 10, 0,  0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 13, 9, 10, 8, 0, 0,
    0,  0,  0,  0,  0,  0, 0, 0,  0, 0, 11, 12, 9, 8, 0, 0, 0,  0, 0,  0, 0, 0,
    0,  0,  0,  0,  13, 9, 9, 10, 0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0,  0, 0, 0,
    0,  0,  0,  0,  0,  0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0,  0, 0, 0,
    0,  0,  0,  0,  0,  0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0,  0, 0, 0,
    0,  0,  0,  0,  0,  0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0,  0, 0, 0,
    0,  0,  0,  0,  0,  0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0,  0, 0, 0,
    0,  0,  0,  0,  0,  0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0,  0, 0, 0,
    0,  0,  0,  0,  0,  0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0,  0, 0, 0,
    0,  0,  0,  0,  0,  0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0,  0, 0, 0,
    0,  0,  0,  0,  0,  0, 0, 0,  0, 0, 0,  0,  0, 0, 0, 0, 0,  0, 0,  0, 0, 0,
    0,  0,  0,  0,  0,  0, 0, 0,  0, 0, 0,  0,  0, 0,
  };
  const uint32_t ref_non_zero_count_ds[64] = {
    13, 11, 0, 0, 0, 0, 0, 0, 11, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0,  0,  0, 0, 0, 0, 0, 0, 0,  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  };
  uint32_t non_zero_count_ds[64];
  av1_down_sample_scan_count(non_zero_count_ds, non_zero_count, TX_16X16);
  for (int i = 0; i < 64; ++i) {
    EXPECT_EQ(ref_non_zero_count_ds[i], non_zero_count_ds[i]);
  }
}
#endif

}  // namespace