1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************/
18*495ae853SAndroid Build Coastguard Worker
19*495ae853SAndroid Build Coastguard Worker /* System Include Files */
20*495ae853SAndroid Build Coastguard Worker #include <math.h>
21*495ae853SAndroid Build Coastguard Worker
22*495ae853SAndroid Build Coastguard Worker #include "ih264_macros.h"
23*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
24*495ae853SAndroid Build Coastguard Worker #include "psnr.h"
25*495ae853SAndroid Build Coastguard Worker
get_sse(UWORD8 * pu1_src_luma,UWORD8 * pu1_rec_luma,UWORD8 * pu1_src_chroma,UWORD8 * pu1_rec_chroma,WORD32 src_strd,WORD32 rec_strd,WORD32 width,WORD32 height,DOUBLE pd_sse[3])26*495ae853SAndroid Build Coastguard Worker void get_sse(UWORD8 *pu1_src_luma, UWORD8 *pu1_rec_luma, UWORD8 *pu1_src_chroma,
27*495ae853SAndroid Build Coastguard Worker UWORD8 *pu1_rec_chroma, WORD32 src_strd, WORD32 rec_strd, WORD32 width, WORD32 height,
28*495ae853SAndroid Build Coastguard Worker DOUBLE pd_sse[3])
29*495ae853SAndroid Build Coastguard Worker {
30*495ae853SAndroid Build Coastguard Worker WORD32 i, j;
31*495ae853SAndroid Build Coastguard Worker
32*495ae853SAndroid Build Coastguard Worker for(j = 0; j < height; j++)
33*495ae853SAndroid Build Coastguard Worker {
34*495ae853SAndroid Build Coastguard Worker for(i = 0; i < width; i++)
35*495ae853SAndroid Build Coastguard Worker {
36*495ae853SAndroid Build Coastguard Worker WORD32 diff = pu1_src_luma[i] - pu1_rec_luma[i];
37*495ae853SAndroid Build Coastguard Worker pd_sse[0] += diff * diff;
38*495ae853SAndroid Build Coastguard Worker }
39*495ae853SAndroid Build Coastguard Worker pu1_src_luma += src_strd;
40*495ae853SAndroid Build Coastguard Worker pu1_rec_luma += rec_strd;
41*495ae853SAndroid Build Coastguard Worker }
42*495ae853SAndroid Build Coastguard Worker
43*495ae853SAndroid Build Coastguard Worker for(j = 0; j < height / 2; j++)
44*495ae853SAndroid Build Coastguard Worker {
45*495ae853SAndroid Build Coastguard Worker for(i = 0; i < width / 2; i++)
46*495ae853SAndroid Build Coastguard Worker {
47*495ae853SAndroid Build Coastguard Worker WORD32 diff = pu1_src_chroma[i * 2] - pu1_rec_chroma[i * 2];
48*495ae853SAndroid Build Coastguard Worker pd_sse[1] += diff * diff;
49*495ae853SAndroid Build Coastguard Worker diff = pu1_src_chroma[i * 2 + 1] - pu1_rec_chroma[i * 2 + 1];
50*495ae853SAndroid Build Coastguard Worker pd_sse[2] += diff * diff;
51*495ae853SAndroid Build Coastguard Worker }
52*495ae853SAndroid Build Coastguard Worker pu1_src_chroma += src_strd;
53*495ae853SAndroid Build Coastguard Worker pu1_rec_chroma += rec_strd;
54*495ae853SAndroid Build Coastguard Worker }
55*495ae853SAndroid Build Coastguard Worker }
56*495ae853SAndroid Build Coastguard Worker
sse_to_psnr(DOUBLE samples,DOUBLE sse)57*495ae853SAndroid Build Coastguard Worker DOUBLE sse_to_psnr(DOUBLE samples, DOUBLE sse)
58*495ae853SAndroid Build Coastguard Worker {
59*495ae853SAndroid Build Coastguard Worker DOUBLE psnr;
60*495ae853SAndroid Build Coastguard Worker if(samples <= 0) return -1;
61*495ae853SAndroid Build Coastguard Worker if (sse<=0) return MAX_PSNR;
62*495ae853SAndroid Build Coastguard Worker psnr = 10.0 * (log10(samples) + 2*log10(255) - log10(sse));
63*495ae853SAndroid Build Coastguard Worker psnr = MIN(MAX_PSNR, psnr);
64*495ae853SAndroid Build Coastguard Worker return psnr;
65*495ae853SAndroid Build Coastguard Worker }
66