xref: /aosp_15_r20/external/libavc/encoder/psnr.c (revision 495ae853bb871d1e5a258cb02c2cc13cde8ddb9a)
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