1/****************************************************************************** 2 * 3 * Copyright (C) 2015 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at: 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 * 17 ***************************************************************************** 18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore 19*/ 20/** 21******************************************************************************* 22* @file 23* ih264_trans_macros.h 24* 25* @brief 26* The file contains definitions of macros that perform forward and inverse 27* quantization 28* 29* @author 30* Ittiam 31* 32* @remark 33* None 34* 35******************************************************************************* 36*/ 37 38#ifndef IH264_TRANS_MACROS_H_ 39#define IH264_TRANS_MACROS_H_ 40 41/*****************************************************************************/ 42/* Function Macros */ 43/*****************************************************************************/ 44 45/** 46****************************************************************************** 47 * @brief Macro to perform forward quantization. 48 * @description The value to be quantized is first compared with a threshold. 49 * If the value is less than the threshold, the quantization value is returned 50 * as zero else the value is quantized traditionally as per the rules of 51 * h264 specification 52****************************************************************************** 53 */ 54#define FWD_QUANT(i4_value, u4_abs_value, i4_sign, threshold, scale, rndfactor, qbits, u4_nnz) \ 55 {\ 56 if (i4_value < 0)\ 57 {\ 58 u4_abs_value = -i4_value;\ 59 i4_sign = -1;\ 60 }\ 61 else\ 62 {\ 63 u4_abs_value = i4_value;\ 64 i4_sign = 1;\ 65 }\ 66 if (u4_abs_value < threshold)\ 67 {\ 68 i4_value = 0;\ 69 }\ 70 else\ 71 {\ 72 u4_abs_value *= scale;\ 73 u4_abs_value += rndfactor;\ 74 u4_abs_value >>= qbits;\ 75 i4_value = u4_abs_value * i4_sign;\ 76 if (i4_value)\ 77 {\ 78 u4_nnz++;\ 79 }\ 80 }\ 81 } 82 83/** 84****************************************************************************** 85 * @brief Macro to perform inverse quantization. 86 * @remarks The value can also be de-quantized as 87 * if (u4_qp_div_6 < 4) 88 * { 89 * i4_value = (quant_scale * weight_scale * i4_value + (1 << (3-u4_qp_div_6))) 90 * i4_value >>= (4 - u4_qp_div_6) 91 * } 92 * else 93 * { 94 * i4_value = (quant_scale * weight_scale * i4_value) << (u4_qp_div_6 -4) 95 * } 96****************************************************************************** 97 */ 98#define INV_QUANT(i4_value, quant_scale, weight_scale, u4_qp_div_6, rndfactor, qbits)\ 99 {\ 100 i4_value *= quant_scale;\ 101 i4_value *= weight_scale;\ 102 i4_value += rndfactor;\ 103 i4_value <<= u4_qp_div_6;\ 104 i4_value >>= qbits;\ 105 } 106 107#define QUANT_H264(x,y,w,z,shft) (shft = ABS(x),\ 108 shft *= y,\ 109 shft += z,\ 110 shft = shft>>w,\ 111 shft = SIGNXY(shft,x)) 112 113#define IQUANT_H264(x,y,wscal,w,shft) (shft = x, \ 114 shft *=y, \ 115 shft *=wscal, \ 116 shft = shft<<w) 117 118#define IQUANT_lev_H264(x,y,wscal,add_f,w,shft) (shft = x, \ 119 shft *=y, \ 120 shft *=wscal, \ 121 shft+= add_f, \ 122 shft = shft>>w) 123 124#endif /* IH264_TRANS_MACROS_H_ */ 125