Home | History | Annotate | Download | only in encoder
      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