palette.h (8722B)
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 #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 int n, int k, int dim) { 57 assert(n > 0); 58 assert(k > 0); 59 if (dim == 1) { 60 av1_calc_indices_dim1(data, centroids, indices, /*total_dist=*/NULL, n, k); 61 } else if (dim == 2) { 62 av1_calc_indices_dim2(data, centroids, indices, /*total_dist=*/NULL, n, k); 63 } else { 64 assert(0 && "Untemplated k means dimension"); 65 } 66 } 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 int max_itr) { 91 assert(n > 0); 92 assert(k > 0); 93 if (dim == 1) { 94 AV1_K_MEANS_RENAME(av1_k_means, 1)(data, centroids, indices, n, k, max_itr); 95 } else if (dim == 2) { 96 AV1_K_MEANS_RENAME(av1_k_means, 2)(data, centroids, indices, n, k, max_itr); 97 } else { 98 assert(0 && "Untemplated k means dimension"); 99 } 100 } 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_