OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2013 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebM project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #ifndef VP9_COMMON_VP9_SCAN_H_ | 11 #ifndef VP9_COMMON_VP9_SCAN_H_ |
12 #define VP9_COMMON_VP9_SCAN_H_ | 12 #define VP9_COMMON_VP9_SCAN_H_ |
13 | 13 |
14 #include "vpx/vpx_integer.h" | 14 #include "vpx/vpx_integer.h" |
15 #include "vpx_ports/mem.h" | 15 #include "vpx_ports/mem.h" |
16 | 16 |
17 #include "vp9/common/vp9_enums.h" | 17 #include "vp9/common/vp9_enums.h" |
| 18 #include "vp9/common/vp9_blockd.h" |
18 | 19 |
19 #define MAX_NEIGHBORS 2 | 20 #define MAX_NEIGHBORS 2 |
20 | 21 |
21 extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_4x4[16]); | |
22 extern DECLARE_ALIGNED(16, const int16_t, vp9_col_scan_4x4[16]); | |
23 extern DECLARE_ALIGNED(16, const int16_t, vp9_row_scan_4x4[16]); | |
24 | |
25 extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_8x8[64]); | |
26 extern DECLARE_ALIGNED(16, const int16_t, vp9_col_scan_8x8[64]); | |
27 extern DECLARE_ALIGNED(16, const int16_t, vp9_row_scan_8x8[64]); | |
28 | |
29 extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_16x16[256]); | |
30 extern DECLARE_ALIGNED(16, const int16_t, vp9_col_scan_16x16[256]); | |
31 extern DECLARE_ALIGNED(16, const int16_t, vp9_row_scan_16x16[256]); | |
32 | |
33 extern DECLARE_ALIGNED(16, const int16_t, vp9_default_scan_32x32[1024]); | |
34 | |
35 extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_4x4[16]); | |
36 extern DECLARE_ALIGNED(16, int16_t, vp9_col_iscan_4x4[16]); | |
37 extern DECLARE_ALIGNED(16, int16_t, vp9_row_iscan_4x4[16]); | |
38 | |
39 extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_8x8[64]); | |
40 extern DECLARE_ALIGNED(16, int16_t, vp9_col_iscan_8x8[64]); | |
41 extern DECLARE_ALIGNED(16, int16_t, vp9_row_iscan_8x8[64]); | |
42 | |
43 extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_16x16[256]); | |
44 extern DECLARE_ALIGNED(16, int16_t, vp9_col_iscan_16x16[256]); | |
45 extern DECLARE_ALIGNED(16, int16_t, vp9_row_iscan_16x16[256]); | |
46 | |
47 extern DECLARE_ALIGNED(16, int16_t, vp9_default_iscan_32x32[1024]); | |
48 | |
49 extern DECLARE_ALIGNED(16, int16_t, | |
50 vp9_default_scan_4x4_neighbors[17 * MAX_NEIGHBORS]); | |
51 extern DECLARE_ALIGNED(16, int16_t, | |
52 vp9_col_scan_4x4_neighbors[17 * MAX_NEIGHBORS]); | |
53 extern DECLARE_ALIGNED(16, int16_t, | |
54 vp9_row_scan_4x4_neighbors[17 * MAX_NEIGHBORS]); | |
55 extern DECLARE_ALIGNED(16, int16_t, | |
56 vp9_col_scan_8x8_neighbors[65 * MAX_NEIGHBORS]); | |
57 extern DECLARE_ALIGNED(16, int16_t, | |
58 vp9_row_scan_8x8_neighbors[65 * MAX_NEIGHBORS]); | |
59 extern DECLARE_ALIGNED(16, int16_t, | |
60 vp9_default_scan_8x8_neighbors[65 * MAX_NEIGHBORS]); | |
61 extern DECLARE_ALIGNED(16, int16_t, | |
62 vp9_col_scan_16x16_neighbors[257 * MAX_NEIGHBORS]); | |
63 extern DECLARE_ALIGNED(16, int16_t, | |
64 vp9_row_scan_16x16_neighbors[257 * MAX_NEIGHBORS]); | |
65 extern DECLARE_ALIGNED(16, int16_t, | |
66 vp9_default_scan_16x16_neighbors[257 * MAX_NEIGHBORS]); | |
67 extern DECLARE_ALIGNED(16, int16_t, | |
68 vp9_default_scan_32x32_neighbors[1025 * MAX_NEIGHBORS]); | |
69 | |
70 | |
71 void vp9_init_neighbors(); | 22 void vp9_init_neighbors(); |
72 | 23 |
73 static INLINE const int16_t* get_scan_4x4(TX_TYPE tx_type) { | 24 typedef struct { |
74 switch (tx_type) { | 25 const int16_t *scan; |
75 case ADST_DCT: | 26 const int16_t *iscan; |
76 return vp9_row_scan_4x4; | 27 const int16_t *neighbors; |
77 case DCT_ADST: | 28 } scan_order; |
78 return vp9_col_scan_4x4; | |
79 default: | |
80 return vp9_default_scan_4x4; | |
81 } | |
82 } | |
83 | 29 |
84 static INLINE void get_scan_nb_4x4(TX_TYPE tx_type, | 30 extern const scan_order vp9_default_scan_orders[TX_SIZES]; |
85 const int16_t **scan, const int16_t **nb) { | 31 extern const scan_order vp9_scan_orders[TX_SIZES][TX_TYPES]; |
86 switch (tx_type) { | |
87 case ADST_DCT: | |
88 *scan = vp9_row_scan_4x4; | |
89 *nb = vp9_row_scan_4x4_neighbors; | |
90 break; | |
91 case DCT_ADST: | |
92 *scan = vp9_col_scan_4x4; | |
93 *nb = vp9_col_scan_4x4_neighbors; | |
94 break; | |
95 default: | |
96 *scan = vp9_default_scan_4x4; | |
97 *nb = vp9_default_scan_4x4_neighbors; | |
98 break; | |
99 } | |
100 } | |
101 | |
102 static INLINE const int16_t* get_iscan_4x4(TX_TYPE tx_type) { | |
103 switch (tx_type) { | |
104 case ADST_DCT: | |
105 return vp9_row_iscan_4x4; | |
106 case DCT_ADST: | |
107 return vp9_col_iscan_4x4; | |
108 default: | |
109 return vp9_default_iscan_4x4; | |
110 } | |
111 } | |
112 | |
113 static INLINE const int16_t* get_scan_8x8(TX_TYPE tx_type) { | |
114 switch (tx_type) { | |
115 case ADST_DCT: | |
116 return vp9_row_scan_8x8; | |
117 case DCT_ADST: | |
118 return vp9_col_scan_8x8; | |
119 default: | |
120 return vp9_default_scan_8x8; | |
121 } | |
122 } | |
123 | |
124 static INLINE void get_scan_nb_8x8(TX_TYPE tx_type, | |
125 const int16_t **scan, const int16_t **nb) { | |
126 switch (tx_type) { | |
127 case ADST_DCT: | |
128 *scan = vp9_row_scan_8x8; | |
129 *nb = vp9_row_scan_8x8_neighbors; | |
130 break; | |
131 case DCT_ADST: | |
132 *scan = vp9_col_scan_8x8; | |
133 *nb = vp9_col_scan_8x8_neighbors; | |
134 break; | |
135 default: | |
136 *scan = vp9_default_scan_8x8; | |
137 *nb = vp9_default_scan_8x8_neighbors; | |
138 break; | |
139 } | |
140 } | |
141 | |
142 static INLINE const int16_t* get_iscan_8x8(TX_TYPE tx_type) { | |
143 switch (tx_type) { | |
144 case ADST_DCT: | |
145 return vp9_row_iscan_8x8; | |
146 case DCT_ADST: | |
147 return vp9_col_iscan_8x8; | |
148 default: | |
149 return vp9_default_iscan_8x8; | |
150 } | |
151 } | |
152 | |
153 static INLINE const int16_t* get_scan_16x16(TX_TYPE tx_type) { | |
154 switch (tx_type) { | |
155 case ADST_DCT: | |
156 return vp9_row_scan_16x16; | |
157 case DCT_ADST: | |
158 return vp9_col_scan_16x16; | |
159 default: | |
160 return vp9_default_scan_16x16; | |
161 } | |
162 } | |
163 | |
164 static INLINE void get_scan_nb_16x16(TX_TYPE tx_type, | |
165 const int16_t **scan, const int16_t **nb) { | |
166 switch (tx_type) { | |
167 case ADST_DCT: | |
168 *scan = vp9_row_scan_16x16; | |
169 *nb = vp9_row_scan_16x16_neighbors; | |
170 break; | |
171 case DCT_ADST: | |
172 *scan = vp9_col_scan_16x16; | |
173 *nb = vp9_col_scan_16x16_neighbors; | |
174 break; | |
175 default: | |
176 *scan = vp9_default_scan_16x16; | |
177 *nb = vp9_default_scan_16x16_neighbors; | |
178 break; | |
179 } | |
180 } | |
181 | |
182 static INLINE const int16_t* get_iscan_16x16(TX_TYPE tx_type) { | |
183 switch (tx_type) { | |
184 case ADST_DCT: | |
185 return vp9_row_iscan_16x16; | |
186 case DCT_ADST: | |
187 return vp9_col_iscan_16x16; | |
188 default: | |
189 return vp9_default_iscan_16x16; | |
190 } | |
191 } | |
192 | 32 |
193 static INLINE int get_coef_context(const int16_t *neighbors, | 33 static INLINE int get_coef_context(const int16_t *neighbors, |
194 uint8_t *token_cache, | 34 const uint8_t *token_cache, int c) { |
195 int c) { | |
196 return (1 + token_cache[neighbors[MAX_NEIGHBORS * c + 0]] + | 35 return (1 + token_cache[neighbors[MAX_NEIGHBORS * c + 0]] + |
197 token_cache[neighbors[MAX_NEIGHBORS * c + 1]]) >> 1; | 36 token_cache[neighbors[MAX_NEIGHBORS * c + 1]]) >> 1; |
198 } | 37 } |
199 | 38 |
200 #endif // VP9_COMMON_VP9_SCAN_H_ | 39 #endif // VP9_COMMON_VP9_SCAN_H_ |
OLD | NEW |