recenter.h (1915B)
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_AOM_DSP_RECENTER_H_ 13 #define AOM_AOM_DSP_RECENTER_H_ 14 15 #include "config/aom_config.h" 16 17 #include "aom/aom_integer.h" 18 19 // Inverse recenters a non-negative literal v around a reference r 20 static inline uint16_t inv_recenter_nonneg(uint16_t r, uint16_t v) { 21 if (v > (r << 1)) 22 return v; 23 else if ((v & 1) == 0) 24 return (v >> 1) + r; 25 else 26 return r - ((v + 1) >> 1); 27 } 28 29 // Inverse recenters a non-negative literal v in [0, n-1] around a 30 // reference r also in [0, n-1] 31 static inline uint16_t inv_recenter_finite_nonneg(uint16_t n, uint16_t r, 32 uint16_t v) { 33 if ((r << 1) <= n) { 34 return inv_recenter_nonneg(r, v); 35 } else { 36 return n - 1 - inv_recenter_nonneg(n - 1 - r, v); 37 } 38 } 39 40 // Recenters a non-negative literal v around a reference r 41 static inline uint16_t recenter_nonneg(uint16_t r, uint16_t v) { 42 if (v > (r << 1)) 43 return v; 44 else if (v >= r) 45 return ((v - r) << 1); 46 else 47 return ((r - v) << 1) - 1; 48 } 49 50 // Recenters a non-negative literal v in [0, n-1] around a 51 // reference r also in [0, n-1] 52 static inline uint16_t recenter_finite_nonneg(uint16_t n, uint16_t r, 53 uint16_t v) { 54 if ((r << 1) <= n) { 55 return recenter_nonneg(r, v); 56 } else { 57 return recenter_nonneg(n - 1 - r, n - 1 - v); 58 } 59 } 60 61 #endif // AOM_AOM_DSP_RECENTER_H_