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 * icv_variance.c 24 * 25 * @brief 26 * This file contains the functions to compute variance 27 * 28 * @author 29 * Ittiam 30 * 31 * @par List of Functions: 32 * icv_variance_8x4() 33 * 34 * @remarks 35 * None 36 * 37 ******************************************************************************* 38 */ 39 /*****************************************************************************/ 40 /* File Includes */ 41 /*****************************************************************************/ 42 /* System include files */ 43 #include <stdio.h> 44 #include <stdint.h> 45 #include <string.h> 46 #include <stdlib.h> 47 #include <assert.h> 48 49 50 /* User include files */ 51 #include "icv_datatypes.h" 52 #include "icv_macros.h" 53 #include "icv_platform_macros.h" 54 #include "icv.h" 55 56 /** 57 ******************************************************************************* 58 * 59 * @brief 60 * Computes variance of a given 8x4 block 61 * 62 * @par Description 63 * Compute variance of a given 8x4 block 64 * 65 * @param[in] pu1_src 66 * Source 67 * 68 * @param[in] src_strd 69 * Source stride 70 * 71 * @param[in] wd 72 * Assumed to be 8 73 * 74 * @param[in] ht 75 * Assumed to be 4 76 * 77 * @returns 78 * Variance 79 * 80 * @remarks 81 * 82 ******************************************************************************* 83 */ 84 WORD32 icv_variance_8x4(UWORD8 *pu1_src, WORD32 src_strd, WORD32 wd, WORD32 ht) 85 { 86 WORD32 sum; 87 WORD32 sum_sqr; 88 WORD32 blk_sz; 89 WORD32 vrnc; 90 WORD32 i; 91 WORD32 j; 92 UNUSED(wd); 93 UNUSED(ht); 94 95 ASSERT(wd == 8); 96 ASSERT(ht == 4); 97 98 sum = 0; 99 sum_sqr = 0; 100 101 blk_sz = 8 * 4; 102 103 /*************************************************************************/ 104 /* variance */ 105 /* var = (n * SUM(x_i^2) - (SUM(x_i))^2) / (n^2); */ 106 /*************************************************************************/ 107 108 /*************************************************************************/ 109 /* The outer-loop runs for BLK_HT/2 times, because it */ 110 /* calculates the variance only for field area not frame one. */ 111 /*************************************************************************/ 112 for(j = 0; j < 4; j ++) 113 { 114 for(i = 0; i < 8; i++) 115 { 116 sum_sqr += (*pu1_src) * (*pu1_src); 117 sum += *pu1_src++; 118 } 119 pu1_src += (src_strd - 8); 120 } 121 122 vrnc = ((sum_sqr * blk_sz) - (sum * sum)) / (blk_sz * blk_sz); 123 124 return vrnc; 125 } 126 127