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 Includes */ 23 /*****************************************************************************/ 24 /* System include files */ 25 #include <stdio.h> 26 #include <stdlib.h> 27 #include <string.h> 28 #include <math.h> 29 30 /* User include files */ 31 #include "ih264_typedefs.h" 32 #include "iv2.h" 33 #include "ive2.h" 34 #include "ih264e.h" 35 #include "app.h" 36 #include "psnr.h" 37 38 /*****************************************************************************/ 39 /* */ 40 /* Function Name : init_psnr */ 41 /* */ 42 /* Description : Initialize PSNR for the Y, U, V component */ 43 /* */ 44 /* Inputs : */ 45 /* */ 46 /* Globals : */ 47 /* */ 48 /* Processing : */ 49 /* */ 50 /* Outputs : */ 51 /* */ 52 /* Returns : */ 53 /* */ 54 /* Issues : */ 55 /* */ 56 /* Revision History: */ 57 /* */ 58 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 59 /* 28 12 2005 Ittiam Draft */ 60 /* */ 61 /*****************************************************************************/ 62 void init_psnr(app_ctxt_t *ps_app_ctxt) 63 { 64 ps_app_ctxt->adbl_psnr[0] = 0; 65 ps_app_ctxt->adbl_psnr[1] = 0; 66 ps_app_ctxt->adbl_psnr[2] = 0; 67 ps_app_ctxt->u4_psnr_cnt = 0; 68 } 69 70 71 /*****************************************************************************/ 72 /* */ 73 /* Function Name : compute_psnr */ 74 /* */ 75 /* Description : Computes the PSNR for the Y, U, V component */ 76 /* */ 77 /* Inputs : */ 78 /* */ 79 /* Globals : */ 80 /* */ 81 /* Processing : */ 82 /* */ 83 /* Outputs : */ 84 /* */ 85 /* Returns : */ 86 /* */ 87 /* Issues : */ 88 /* */ 89 /* Revision History: */ 90 /* */ 91 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 92 /* 28 12 2005 Ittiam Draft */ 93 /* */ 94 /*****************************************************************************/ 95 void compute_psnr(app_ctxt_t *ps_app_ctxt, iv_raw_buf_t *ps_buf1, iv_raw_buf_t *ps_buf2) 96 { 97 WORD32 i, j; 98 WORD32 comp; 99 DOUBLE df_psnr[3]; 100 WORD32 wd, ht, strd1, strd2; 101 UWORD8 *pu1_buf1, *pu1_buf2; 102 WORD32 incr1, incr2; 103 104 printf("\nPicNum %4d\t ", ps_app_ctxt->u4_psnr_cnt); 105 106 for(comp = 0; comp < 3; comp++) 107 { 108 df_psnr[comp] = 0; 109 pu1_buf1 = (UWORD8 *)ps_buf1->apv_bufs[comp]; 110 pu1_buf2 = (UWORD8 *)ps_buf2->apv_bufs[comp]; 111 wd = ps_buf1->au4_wd[comp]; 112 ht = ps_buf1->au4_ht[comp]; 113 strd1 = ps_buf1->au4_strd[comp]; 114 strd2 = ps_buf2->au4_strd[comp]; 115 incr1 = 1; 116 incr2 = 1; 117 118 if((IV_YUV_420SP_UV == ps_buf1->e_color_fmt) 119 || (IV_YUV_420SP_UV == ps_buf1->e_color_fmt)) 120 { 121 switch(comp) 122 { 123 case 0: 124 pu1_buf1 = ps_buf1->apv_bufs[0]; 125 break; 126 case 1: 127 if(IV_YUV_420SP_UV == ps_buf1->e_color_fmt) 128 pu1_buf1 = (UWORD8 *)ps_buf1->apv_bufs[1]; 129 else 130 pu1_buf1 = (UWORD8 *)ps_buf1->apv_bufs[1] + 1; 131 incr1 = 2; 132 break; 133 case 2: 134 if(IV_YUV_420SP_UV == ps_buf1->e_color_fmt) 135 pu1_buf1 = (UWORD8 *)ps_buf1->apv_bufs[1] + 1; 136 else 137 pu1_buf1 = ps_buf1->apv_bufs[1]; 138 incr1 = 2; 139 break; 140 } 141 } 142 if ((IV_YUV_420SP_UV == ps_buf2->e_color_fmt) 143 || (IV_YUV_420SP_UV == ps_buf2->e_color_fmt)) 144 { 145 switch(comp) 146 { 147 case 0: 148 pu1_buf2 = ps_buf2->apv_bufs[0]; 149 break; 150 case 1: 151 if(IV_YUV_420SP_UV == ps_buf2->e_color_fmt) 152 pu1_buf2 = ps_buf2->apv_bufs[1]; 153 else 154 pu1_buf2 = (UWORD8 *)ps_buf2->apv_bufs[1] + 1; 155 incr1 = 2; 156 break; 157 case 2: 158 if(IV_YUV_420SP_UV == ps_buf2->e_color_fmt) 159 pu1_buf2 = (UWORD8 *)ps_buf2->apv_bufs[1] + 1; 160 else 161 pu1_buf2 = ps_buf2->apv_bufs[1]; 162 incr1 = 2; 163 break; 164 } 165 } 166 167 for(i = 0; i < ht; i++) 168 { 169 for(j = 0; j < wd; j++) 170 { 171 WORD32 diff; 172 diff = (*pu1_buf1 - *pu1_buf2); 173 pu1_buf1 += incr1; 174 pu1_buf2 += incr2; 175 df_psnr[comp] += diff * diff; 176 } 177 pu1_buf1 += strd1 - ps_buf1->au4_wd[comp]; 178 pu1_buf2 += strd2 - ps_buf2->au4_wd[comp]; 179 } 180 df_psnr[comp] /= (wd * ht); 181 if(df_psnr[comp]) 182 df_psnr[comp] = 20 * log10(255 / sqrt(df_psnr[comp])); 183 else 184 df_psnr[comp] = 100; 185 186 ps_app_ctxt->adbl_psnr[comp] += df_psnr[comp]; 187 switch(comp) 188 { 189 case 0: 190 printf("Y :"); 191 break; 192 case 1: 193 printf("U :"); 194 break; 195 case 2: 196 printf("V :"); 197 break; 198 default: 199 break; 200 } 201 printf("%2.2f\t", df_psnr[comp]); 202 203 } 204 205 ps_app_ctxt->u4_psnr_cnt++; 206 } 207 208 209 /*****************************************************************************/ 210 /* */ 211 /* Function Name : print_average_psnr */ 212 /* */ 213 /* Description : Computes the average PSNR for the Y, U, V component */ 214 /* */ 215 /* Inputs : */ 216 /* */ 217 /* Globals : */ 218 /* */ 219 /* Processing : */ 220 /* */ 221 /* Outputs : */ 222 /* */ 223 /* Returns : */ 224 /* */ 225 /* Issues : */ 226 /* */ 227 /* Revision History: */ 228 /* */ 229 /* DD MM YYYY Author(s) Changes (Describe the changes made) */ 230 /* 28 12 2005 Ittiam Draft */ 231 /* */ 232 /*****************************************************************************/ 233 void print_average_psnr(app_ctxt_t *ps_app_ctxt) 234 { 235 printf("\n"); 236 237 printf("Avg PSNR Y : %-2.2f\n", (ps_app_ctxt->adbl_psnr[0] / ps_app_ctxt->u4_psnr_cnt)); 238 printf("Avg PSNR U : %-2.2f\n", (ps_app_ctxt->adbl_psnr[1] / ps_app_ctxt->u4_psnr_cnt)); 239 printf("Avg PSNR V : %-2.2f\n", (ps_app_ctxt->adbl_psnr[2] / ps_app_ctxt->u4_psnr_cnt)); 240 } 241 242