1 /*
2 * Copyright (c) 2013 The WebM project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #ifndef VP9_COMMON_VP9_SCAN_H_
12 #define VP9_COMMON_VP9_SCAN_H_
13
14 #include "vpx/vpx_integer.h"
15 #include "vpx_ports/mem.h"
16
17 #include "vp9/common/vp9_enums.h"
18
19 #define MAX_NEIGHBORS 2
20
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();
72
get_scan_4x4(TX_TYPE tx_type)73 static INLINE const int16_t* get_scan_4x4(TX_TYPE tx_type) {
74 switch (tx_type) {
75 case ADST_DCT:
76 return vp9_row_scan_4x4;
77 case DCT_ADST:
78 return vp9_col_scan_4x4;
79 default:
80 return vp9_default_scan_4x4;
81 }
82 }
83
get_scan_nb_4x4(TX_TYPE tx_type,const int16_t ** scan,const int16_t ** nb)84 static INLINE void get_scan_nb_4x4(TX_TYPE tx_type,
85 const int16_t **scan, const int16_t **nb) {
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
get_iscan_4x4(TX_TYPE tx_type)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
get_scan_8x8(TX_TYPE tx_type)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
get_scan_nb_8x8(TX_TYPE tx_type,const int16_t ** scan,const int16_t ** nb)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
get_iscan_8x8(TX_TYPE tx_type)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
get_scan_16x16(TX_TYPE tx_type)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
get_scan_nb_16x16(TX_TYPE tx_type,const int16_t ** scan,const int16_t ** nb)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
get_iscan_16x16(TX_TYPE tx_type)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
get_coef_context(const int16_t * neighbors,const uint8_t * token_cache,int c)193 static INLINE int get_coef_context(const int16_t *neighbors,
194 const uint8_t *token_cache, int c) {
195 return (1 + token_cache[neighbors[MAX_NEIGHBORS * c + 0]] +
196 token_cache[neighbors[MAX_NEIGHBORS * c + 1]]) >> 1;
197 }
198
199 #endif // VP9_COMMON_VP9_SCAN_H_
200