/******************************************************************************
 *
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at:
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 *****************************************************************************
 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/

/*****************************************************************************/
/* File Includes                                                             */
/*****************************************************************************/
/* System include files */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <sys/time.h>

/* User include files */
#include "ih264_typedefs.h"
#include "iv2.h"
#include "ive2.h"
#include "ih264e.h"
#include "app.h"
#include "psnr.h"

/*****************************************************************************/
/*                                                                           */
/*  Function Name : init_psnr                                                */
/*                                                                           */
/*  Description   : Initialize  PSNR for the Y, U, V component               */
/*                                                                           */
/*  Inputs        :                                                          */
/*                                                                           */
/*  Globals       :                                                          */
/*                                                                           */
/*  Processing    :                                                          */
/*                                                                           */
/*  Outputs       :                                                          */
/*                                                                           */
/*  Returns       :                                                          */
/*                                                                           */
/*  Issues        :                                                          */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         28 12 2005   Ittiam          Draft                                */
/*                                                                           */
/*****************************************************************************/
void init_psnr(app_ctxt_t *ps_app_ctxt)
{
    ps_app_ctxt->adbl_psnr[0]   = 0;
    ps_app_ctxt->adbl_psnr[1]   = 0;
    ps_app_ctxt->adbl_psnr[2]   = 0;
    ps_app_ctxt->u4_psnr_cnt    = 0;
}


/*****************************************************************************/
/*                                                                           */
/*  Function Name : compute_psnr                                             */
/*                                                                           */
/*  Description   : Computes the PSNR for the Y, U, V component              */
/*                                                                           */
/*  Inputs        :                                                          */
/*                                                                           */
/*  Globals       :                                                          */
/*                                                                           */
/*  Processing    :                                                          */
/*                                                                           */
/*  Outputs       :                                                          */
/*                                                                           */
/*  Returns       :                                                          */
/*                                                                           */
/*  Issues        :                                                          */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         28 12 2005   Ittiam          Draft                                */
/*                                                                           */
/*****************************************************************************/
void compute_psnr(app_ctxt_t *ps_app_ctxt, iv_raw_buf_t *ps_buf1, iv_raw_buf_t *ps_buf2)
{
    WORD32 i, j;
    WORD32 comp;
    DOUBLE df_psnr[3];
    WORD32 wd, ht, strd1, strd2;
    UWORD8 *pu1_buf1, *pu1_buf2;
    WORD32 incr1, incr2;

    printf("\nPicNum %4d\t ", ps_app_ctxt->u4_psnr_cnt);

    for(comp = 0; comp < 3; comp++)
    {
        df_psnr[comp] = 0;
        pu1_buf1 = (UWORD8 *)ps_buf1->apv_bufs[comp];
        pu1_buf2 = (UWORD8 *)ps_buf2->apv_bufs[comp];
        wd = ps_buf1->au4_wd[comp];
        ht = ps_buf1->au4_ht[comp];
        strd1 = ps_buf1->au4_strd[comp];
        strd2 = ps_buf2->au4_strd[comp];
        incr1 = 1;
        incr2 = 1;

        if((IV_YUV_420SP_UV == ps_buf1->e_color_fmt)
                        || (IV_YUV_420SP_UV == ps_buf1->e_color_fmt))
        {
            switch(comp)
            {
                case 0:
                    pu1_buf1 = ps_buf1->apv_bufs[0];
                    break;
                case 1:
                    if(IV_YUV_420SP_UV == ps_buf1->e_color_fmt)
                        pu1_buf1 = (UWORD8 *)ps_buf1->apv_bufs[1];
                    else
                        pu1_buf1 = (UWORD8 *)ps_buf1->apv_bufs[1] + 1;
                    incr1 = 2;
                    break;
                case 2:
                    if(IV_YUV_420SP_UV == ps_buf1->e_color_fmt)
                        pu1_buf1 = (UWORD8 *)ps_buf1->apv_bufs[1] + 1;
                    else
                        pu1_buf1 = ps_buf1->apv_bufs[1];
                    incr1 = 2;
                    break;
            }
        }
        if ((IV_YUV_420SP_UV == ps_buf2->e_color_fmt)
                        || (IV_YUV_420SP_UV == ps_buf2->e_color_fmt))
        {
            switch(comp)
            {
                case 0:
                    pu1_buf2 = ps_buf2->apv_bufs[0];
                    break;
                case 1:
                    if(IV_YUV_420SP_UV == ps_buf2->e_color_fmt)
                        pu1_buf2 = ps_buf2->apv_bufs[1];
                    else
                        pu1_buf2 = (UWORD8 *)ps_buf2->apv_bufs[1] + 1;
                    incr1 = 2;
                    break;
                case 2:
                    if(IV_YUV_420SP_UV == ps_buf2->e_color_fmt)
                        pu1_buf2 = (UWORD8 *)ps_buf2->apv_bufs[1] + 1;
                    else
                        pu1_buf2 = ps_buf2->apv_bufs[1];
                    incr1 = 2;
                    break;
            }
        }

        for(i = 0; i < ht; i++)
        {
            for(j = 0; j < wd; j++)
            {
                WORD32 diff;
                diff = (*pu1_buf1 - *pu1_buf2);
                pu1_buf1 += incr1;
                pu1_buf2 += incr2;
                df_psnr[comp] += diff * diff;
            }
            pu1_buf1 += strd1 - ps_buf1->au4_wd[comp];
            pu1_buf2 += strd2 - ps_buf2->au4_wd[comp];
        }
        df_psnr[comp] /= (wd * ht);
        if(df_psnr[comp])
            df_psnr[comp] = 20 * log10(255 / sqrt(df_psnr[comp]));
        else
            df_psnr[comp] = 100;

        ps_app_ctxt->adbl_psnr[comp] += df_psnr[comp];
        switch(comp)
        {
            case 0:
                printf("Y :");
                break;
            case 1:
                printf("U :");
                break;
            case 2:
                printf("V :");
                break;
            default:
                break;
        }
        printf("%2.2f\t", df_psnr[comp]);

    }

    ps_app_ctxt->u4_psnr_cnt++;
}


/*****************************************************************************/
/*                                                                           */
/*  Function Name : print_average_psnr                                       */
/*                                                                           */
/*  Description   : Computes the average PSNR for the Y, U, V component      */
/*                                                                           */
/*  Inputs        :                                                          */
/*                                                                           */
/*  Globals       :                                                          */
/*                                                                           */
/*  Processing    :                                                          */
/*                                                                           */
/*  Outputs       :                                                          */
/*                                                                           */
/*  Returns       :                                                          */
/*                                                                           */
/*  Issues        :                                                          */
/*                                                                           */
/*  Revision History:                                                        */
/*                                                                           */
/*         DD MM YYYY   Author(s)       Changes (Describe the changes made)  */
/*         28 12 2005   Ittiam          Draft                                */
/*                                                                           */
/*****************************************************************************/
void print_average_psnr(app_ctxt_t *ps_app_ctxt)
{
    printf("\n");

    printf("Avg PSNR Y                      : %-2.2f\n", (ps_app_ctxt->adbl_psnr[0] / ps_app_ctxt->u4_psnr_cnt));
    printf("Avg PSNR U                      : %-2.2f\n", (ps_app_ctxt->adbl_psnr[1] / ps_app_ctxt->u4_psnr_cnt));
    printf("Avg PSNR V                      : %-2.2f\n", (ps_app_ctxt->adbl_psnr[2] / ps_app_ctxt->u4_psnr_cnt));
}

