1 /*
2  * Copyright (c) 2018, 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 #ifndef AOM_TOOLS_TXFM_ANALYZER_TXFM_GRAPH_H_
13 #define AOM_TOOLS_TXFM_ANALYZER_TXFM_GRAPH_H_
14 
15 struct Node {
16   Node *inNode[2];
17   int inNodeNum;
18   int inNodeIdx[2];
19   double inWeight[2];
20   double value;
21   int nodeIdx;
22   int stageIdx;
23   int visited;
24 };
25 
26 #define PI (3.141592653589793238462643383279502884)
27 #define STAGENUM (10)
28 #define NODENUM (32)
29 #define COS_MOD (128)
30 
31 typedef enum {
32   TYPE_DCT = 0,
33   TYPE_ADST,
34   TYPE_IDCT,
35   TYPE_IADST,
36   TYPE_LAST
37 } TYPE_TXFM;
38 
39 TYPE_TXFM get_inv_type(TYPE_TXFM type);
40 void get_fun_name(char *str_fun_name, int str_buf_size, const TYPE_TXFM type,
41                   const int txfm_size);
42 
43 void get_txfm_type_name(char *str_fun_name, int str_buf_size,
44                         const TYPE_TXFM type, const int txfm_size);
45 void get_hybrid_2d_type_name(char *buf, int buf_size, const TYPE_TXFM type0,
46                              const TYPE_TXFM type1, const int txfm_size0,
47                              const int txfm_size1);
48 unsigned int get_max_bit(unsigned int x);
49 unsigned int bitwise_reverse(unsigned int x, int max_bit);
50 int get_idx(int ri, int ci, int cSize);
51 
52 int get_dct_stage_num(int size);
53 void reference_dct_1d(double *in, double *out, int size);
54 void reference_dct_2d(double *in, double *out, int size);
55 void connect_node(Node *node, int stage_num, int node_num, int stage_idx,
56                   int node_idx, int in0, double w0, int in1, double w1);
57 void propagate(Node *node, int stage_num, int node_num, int stage);
58 void init_graph(Node *node, int stage_num, int node_num);
59 void graph_reset_visited(Node *node, int stage_num, int node_num);
60 void gen_B_graph(Node *node, int stage_num, int node_num, int stage_idx,
61                  int node_idx, int N, int star);
62 void gen_P_graph(Node *node, int stage_num, int node_num, int stage_idx,
63                  int node_idx, int N);
64 
65 void gen_type1_graph(Node *node, int stage_num, int node_num, int stage_idx,
66                      int node_idx, int N);
67 void gen_type2_graph(Node *node, int stage_num, int node_num, int stage_idx,
68                      int node_idx, int N);
69 void gen_type3_graph(Node *node, int stage_num, int node_num, int stage_idx,
70                      int node_idx, int idx, int N);
71 void gen_type4_graph(Node *node, int stage_num, int node_num, int stage_idx,
72                      int node_idx, int idx, int N);
73 
74 void gen_R_graph(Node *node, int stage_num, int node_num, int stage_idx,
75                  int node_idx, int N);
76 
77 void gen_DCT_graph(Node *node, int stage_num, int node_num, int stage_idx,
78                    int node_idx, int N);
79 
80 void gen_DCT_graph_1d(Node *node, int stage_num, int node_num, int stage_idx,
81                       int node_idx, int dct_node_num);
82 void connect_layer_2d(Node *node, int stage_num, int node_num, int stage_idx,
83                       int node_idx, int dct_node_num);
84 
85 void gen_DCT_graph_2d(Node *node, int stage_num, int node_num, int stage_idx,
86                       int node_idx, int dct_node_num);
87 
88 void gen_adst_B_graph(Node *node, int stage_num, int node_num, int stage_idx,
89                       int node_idx, int adst_idx);
90 
91 void gen_adst_U_graph(Node *node, int stage_num, int node_num, int stage_idx,
92                       int node_idx, int adst_idx, int adst_node_num);
93 void gen_adst_T_graph(Node *node, int stage_num, int node_num, int stage_idx,
94                       int node_idx, double freq);
95 
96 void gen_adst_E_graph(Node *node, int stage_num, int node_num, int stage_idx,
97                       int node_idx, int adst_idx);
98 
99 void gen_adst_V_graph(Node *node, int stage_num, int node_num, int stage_idx,
100                       int node_idx, int adst_idx, int adst_node_num);
101 
102 void gen_adst_VJ_graph(Node *node, int stage_num, int node_num, int stage_idx,
103                        int node_idx, int adst_node_num);
104 void gen_adst_Q_graph(Node *node, int stage_num, int node_num, int stage_idx,
105                       int node_idx, int adst_node_num);
106 void gen_adst_Ibar_graph(Node *node, int stage_num, int node_num, int stage_idx,
107                          int node_idx, int adst_node_num);
108 
109 void gen_adst_D_graph(Node *node, int stage_num, int node_num, int stage_idx,
110                       int node_idx, int adst_node_num);
111 
112 int get_hadamard_idx(int x, int adst_node_num);
113 void gen_adst_Ht_graph(Node *node, int stage_num, int node_num, int stage_idx,
114                        int node_idx, int adst_node_num);
115 
116 int gen_adst_graph(Node *node, int stage_num, int node_num, int stage_idx,
117                    int node_idx, int adst_node_num);
118 int gen_iadst_graph(Node *node, int stage_num, int node_num, int stage_idx,
119                     int node_idx, int adst_node_num);
120 void reference_adst_1d(double *in, double *out, int size);
121 
122 int get_adst_stage_num(int adst_node_num);
123 int get_hybrid_stage_num(int type, int hybrid_node_num);
124 int get_hybrid_2d_stage_num(int type0, int type1, int hybrid_node_num);
125 int get_hybrid_2d_stage_num_new(int type0, int type1, int hybrid_node_num0,
126                                 int hybrid_node_num1);
127 int get_hybrid_amplify_factor(int type, int hybrid_node_num);
128 void gen_hybrid_graph_1d(Node *node, int stage_num, int node_num, int stage_idx,
129                          int node_idx, int hybrid_node_num, int type);
130 void gen_hybrid_graph_2d(Node *node, int stage_num, int node_num, int stage_idx,
131                          int node_idx, int hybrid_node_num, int type0,
132                          int type1);
133 void gen_hybrid_graph_2d_new(Node *node, int stage_num, int node_num,
134                              int stage_idx, int node_idx, int hybrid_node_num0,
135                              int hybrid_node_num1, int type0, int type1);
136 
137 void reference_hybrid_2d(double *in, double *out, int size, int type0,
138                          int type1);
139 
140 void reference_hybrid_2d_new(double *in, double *out, int size0, int size1,
141                              int type0, int type1);
142 void reference_adst_dct_2d(double *in, double *out, int size);
143 
144 void gen_code(Node *node, int stage_num, int node_num, TYPE_TXFM type);
145 
146 void gen_inv_graph(Node *node, int stage_num, int node_num, Node *invNode,
147                    int inv_stage_num, int inv_node_num, int inv_stage_idx,
148                    int inv_node_idx);
149 
150 TYPE_TXFM hybrid_char_to_int(char ctype);
151 
152 int64_t round_shift(int64_t value, int bit);
153 void round_shift_array(int32_t *arr, int size, int bit);
154 void estimate_value(Node *node, int stage_num, int node_num, int stage_idx,
155                     int node_idx, int estimate_bit);
156 void amplify_value(Node *node, int stage_num, int node_num, int stage_idx,
157                    int node_idx, int estimate_bit);
158 void propagate_estimate_amlify(Node *node, int stage_num, int node_num,
159                                int stage_idx, int amplify_bit,
160                                int estimate_bit);
161 #endif  // AOM_TOOLS_TXFM_ANALYZER_TXFM_GRAPH_H_
162