/src/aom/av1/encoder/palette.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 2016, 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 | | /*!\file |
13 | | * \brief Declares functions used in palette search. |
14 | | */ |
15 | | #ifndef AOM_AV1_ENCODER_PALETTE_H_ |
16 | | #define AOM_AV1_ENCODER_PALETTE_H_ |
17 | | |
18 | | #include "av1/common/blockd.h" |
19 | | |
20 | | #ifdef __cplusplus |
21 | | extern "C" { |
22 | | #endif |
23 | | |
24 | | struct AV1_COMP; |
25 | | struct PICK_MODE_CONTEXT; |
26 | | struct macroblock; |
27 | | |
28 | | /*!\cond */ |
29 | 0 | #define AV1_K_MEANS_RENAME(func, dim) func##_dim##dim |
30 | | |
31 | | void AV1_K_MEANS_RENAME(av1_k_means, 1)(const int16_t *data, int16_t *centroids, |
32 | | uint8_t *indices, int n, int k, |
33 | | int max_itr); |
34 | | void AV1_K_MEANS_RENAME(av1_k_means, 2)(const int16_t *data, int16_t *centroids, |
35 | | uint8_t *indices, int n, int k, |
36 | | int max_itr); |
37 | | /*!\endcond */ |
38 | | |
39 | | /*!\brief Calculates the cluster to which each data point belong. |
40 | | * |
41 | | * \ingroup palette_mode_search |
42 | | * \param[in] data The data points whose cluster indices are |
43 | | * to be computed. The data layout is |
44 | | * NUM_DATA_POINTS X DATA_DIM. |
45 | | * \param[in] centroids Pointer to the centroids. The data layout |
46 | | * is NUM_CENTROIDS X DATA_DIM. |
47 | | * \param[in] indices Pointer to store the computed indices. |
48 | | * \param[in] n Number of data points. |
49 | | * \param[in] k Number of clusters. |
50 | | * \param[in] dim Data dimension. |
51 | | * |
52 | | * \remark Returns nothing, but saves each data's cluster index in \a indices. |
53 | | */ |
54 | | static inline void av1_calc_indices(const int16_t *data, |
55 | | const int16_t *centroids, uint8_t *indices, |
56 | 0 | int n, int k, int dim) { |
57 | 0 | assert(n > 0); |
58 | 0 | assert(k > 0); |
59 | 0 | if (dim == 1) { |
60 | 0 | av1_calc_indices_dim1(data, centroids, indices, /*total_dist=*/NULL, n, k); |
61 | 0 | } else if (dim == 2) { |
62 | 0 | av1_calc_indices_dim2(data, centroids, indices, /*total_dist=*/NULL, n, k); |
63 | 0 | } else { |
64 | 0 | assert(0 && "Untemplated k means dimension"); |
65 | 0 | } |
66 | 0 | } Unexecuted instantiation: av1_cx_iface.c:av1_calc_indices Unexecuted instantiation: bitstream.c:av1_calc_indices Unexecuted instantiation: encodeframe.c:av1_calc_indices Unexecuted instantiation: encoder.c:av1_calc_indices Unexecuted instantiation: encoder_utils.c:av1_calc_indices Unexecuted instantiation: ethread.c:av1_calc_indices Unexecuted instantiation: palette.c:av1_calc_indices Unexecuted instantiation: partition_search.c:av1_calc_indices Unexecuted instantiation: rdopt.c:av1_calc_indices Unexecuted instantiation: nonrd_pickmode.c:av1_calc_indices Unexecuted instantiation: superres_scale.c:av1_calc_indices Unexecuted instantiation: svc_layercontext.c:av1_calc_indices Unexecuted instantiation: temporal_filter.c:av1_calc_indices Unexecuted instantiation: intra_mode_search.c:av1_calc_indices Unexecuted instantiation: compound_type.c:av1_calc_indices Unexecuted instantiation: encode_strategy.c:av1_calc_indices |
67 | | |
68 | | /*!\brief Performs k-means cluster on the data. |
69 | | * |
70 | | * \ingroup palette_mode_search |
71 | | * \param[in] data The data points to be clustered. The data |
72 | | * layout is NUM_DATA_POINTS X DATA_DIM. |
73 | | * \param[in] centroids Pointer to store the computed centroids. |
74 | | * The data layout is |
75 | | * NUM_CENTROIDS X DATA_DIM. |
76 | | * \param[in] indices Pointer to store the computed indices. For |
77 | | * each training data. |
78 | | * \param[in] n Number of data points. |
79 | | * \param[in] k Number of clusters. |
80 | | * \param[in] dim Data dimension. |
81 | | * \param[in] max_itr Maximum number of iterations to run. |
82 | | * |
83 | | * \remark Returns nothing, but saves each cluster's centroid in centroids and |
84 | | * each data's cluster index in \a indices. |
85 | | * |
86 | | * \attention The output centroids are rounded off to nearest integers. |
87 | | */ |
88 | | static inline void av1_k_means(const int16_t *data, int16_t *centroids, |
89 | | uint8_t *indices, int n, int k, int dim, |
90 | 0 | int max_itr) { |
91 | 0 | assert(n > 0); |
92 | 0 | assert(k > 0); |
93 | 0 | if (dim == 1) { |
94 | 0 | AV1_K_MEANS_RENAME(av1_k_means, 1)(data, centroids, indices, n, k, max_itr); |
95 | 0 | } else if (dim == 2) { |
96 | 0 | AV1_K_MEANS_RENAME(av1_k_means, 2)(data, centroids, indices, n, k, max_itr); |
97 | 0 | } else { |
98 | 0 | assert(0 && "Untemplated k means dimension"); |
99 | 0 | } |
100 | 0 | } Unexecuted instantiation: av1_cx_iface.c:av1_k_means Unexecuted instantiation: bitstream.c:av1_k_means Unexecuted instantiation: encodeframe.c:av1_k_means Unexecuted instantiation: encoder.c:av1_k_means Unexecuted instantiation: encoder_utils.c:av1_k_means Unexecuted instantiation: ethread.c:av1_k_means Unexecuted instantiation: palette.c:av1_k_means Unexecuted instantiation: partition_search.c:av1_k_means Unexecuted instantiation: rdopt.c:av1_k_means Unexecuted instantiation: nonrd_pickmode.c:av1_k_means Unexecuted instantiation: superres_scale.c:av1_k_means Unexecuted instantiation: svc_layercontext.c:av1_k_means Unexecuted instantiation: temporal_filter.c:av1_k_means Unexecuted instantiation: intra_mode_search.c:av1_k_means Unexecuted instantiation: compound_type.c:av1_k_means Unexecuted instantiation: encode_strategy.c:av1_k_means |
101 | | |
102 | | /*!\brief Checks what colors are in the color cache. |
103 | | * |
104 | | * \ingroup palette_mode_search |
105 | | * \param[in] color_cache A cache of colors. |
106 | | * \param[in] n_cache Number of colors in the cache. |
107 | | * \param[in] colors New base colors. |
108 | | * \param[in] n_colors Number of new colors. |
109 | | * \param[in] cache_color_found Stores what cached colors are presented in |
110 | | * colors. |
111 | | * \param[in] out_cache_colors Stores what colors are not in the cache. |
112 | | * |
113 | | * \return Returns the number of colors that are not in cache. In addition, |
114 | | * records whether each cache color is presented in colors in cache_color_found, |
115 | | * and stores and stores the out of cache colors in out_cache_colors. |
116 | | */ |
117 | | int av1_index_color_cache(const uint16_t *color_cache, int n_cache, |
118 | | const uint16_t *colors, int n_colors, |
119 | | uint8_t *cache_color_found, int *out_cache_colors); |
120 | | |
121 | | /*!\brief Gets the rate cost for each delta-encoding v palette. |
122 | | * |
123 | | * \ingroup palette_mode_search |
124 | | * \param[in] pmi Struct that stores the palette mode info. |
125 | | * \param[in] bit_depth Pixel bitdepth of the sequence. |
126 | | * \param[in] zero_count Stores the number of zero deltas. |
127 | | * \param[in] min_bits Minimum bits for the deltas. Sets to |
128 | | * bit_depth - 4. |
129 | | * |
130 | | * \return Returns the number of bits used to transmit each v palette color |
131 | | * delta and assigns zero_count with the number of deltas being 0. |
132 | | */ |
133 | | int av1_get_palette_delta_bits_v(const PALETTE_MODE_INFO *const pmi, |
134 | | int bit_depth, int *zero_count, int *min_bits); |
135 | | |
136 | | /*!\brief Gets the rate cost for transmitting luma palette color values. |
137 | | * |
138 | | * \ingroup palette_mode_search |
139 | | * \param[in] pmi Struct that stores the palette mode info. |
140 | | * \param[in] color_cache Color cache presented at the decoder. |
141 | | * \param[in] n_cache Number of colors in the cache. |
142 | | * \param[in] bit_depth Pixel bitdepth of the sequence. |
143 | | * |
144 | | * \return Returns the rate needed to transmit the palette. Note that this does |
145 | | * not include the cost of transmitted the color map. |
146 | | */ |
147 | | int av1_palette_color_cost_y(const PALETTE_MODE_INFO *const pmi, |
148 | | const uint16_t *color_cache, int n_cache, |
149 | | int bit_depth); |
150 | | |
151 | | /*!\brief Gets the rate cost for transmitting luma palette chroma values. |
152 | | * |
153 | | * \ingroup palette_mode_search |
154 | | * \param[in] pmi Struct that stores the palette mode info. |
155 | | * \param[in] color_cache Color cache presented at the decoder. |
156 | | * \param[in] n_cache Number of colors in the cache. |
157 | | * \param[in] bit_depth Pixel bitdepth of the sequence. |
158 | | * |
159 | | * \return Returns the rate needed to transmit the palette. Note that this does |
160 | | * not include the cost of transmitted the color map. |
161 | | */ |
162 | | int av1_palette_color_cost_uv(const PALETTE_MODE_INFO *const pmi, |
163 | | const uint16_t *color_cache, int n_cache, |
164 | | int bit_depth); |
165 | | |
166 | | /*!\brief Search for the best palette in the luma plane. |
167 | | * |
168 | | * \ingroup palette_mode_search |
169 | | * \callergraph |
170 | | * This function is used in both inter and intra frame coding. |
171 | | */ |
172 | | void av1_rd_pick_palette_intra_sby( |
173 | | const struct AV1_COMP *cpi, struct macroblock *x, BLOCK_SIZE bsize, |
174 | | int dc_mode_cost, MB_MODE_INFO *best_mbmi, uint8_t *best_palette_color_map, |
175 | | int64_t *best_rd, int *rate, int *rate_tokenonly, int64_t *distortion, |
176 | | uint8_t *skippable, int *beat_best_rd, struct PICK_MODE_CONTEXT *ctx, |
177 | | uint8_t *best_blk_skip, uint8_t *tx_type_map); |
178 | | |
179 | | /*!\brief Search for the best palette in the chroma plane. |
180 | | * |
181 | | * \ingroup palette_mode_search |
182 | | * \callergraph |
183 | | * This function is used in both inter and intra frame coding. |
184 | | */ |
185 | | void av1_rd_pick_palette_intra_sbuv(const struct AV1_COMP *cpi, |
186 | | struct macroblock *x, int dc_mode_cost, |
187 | | uint8_t *best_palette_color_map, |
188 | | MB_MODE_INFO *const best_mbmi, |
189 | | int64_t *best_rd, int *rate, |
190 | | int *rate_tokenonly, int64_t *distortion, |
191 | | uint8_t *skippable); |
192 | | |
193 | | /*!\brief Resets palette color map for chroma channels. |
194 | | */ |
195 | | void av1_restore_uv_color_map(const struct AV1_COMP *cpi, struct macroblock *x); |
196 | | |
197 | | #ifdef __cplusplus |
198 | | } // extern "C" |
199 | | #endif |
200 | | |
201 | | #endif // AOM_AV1_ENCODER_PALETTE_H_ |