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