xref: /aosp_15_r20/external/libvpx/vpx_dsp/psnr.c (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2016 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #include <math.h>
12*fb1b10abSAndroid Build Coastguard Worker #include <assert.h>
13*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_dsp_rtcd.h"
14*fb1b10abSAndroid Build Coastguard Worker #include "vpx_dsp/psnr.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "vpx_scale/yv12config.h"
16*fb1b10abSAndroid Build Coastguard Worker 
vpx_sse_to_psnr(double samples,double peak,double sse)17*fb1b10abSAndroid Build Coastguard Worker double vpx_sse_to_psnr(double samples, double peak, double sse) {
18*fb1b10abSAndroid Build Coastguard Worker   if (sse > 0.0) {
19*fb1b10abSAndroid Build Coastguard Worker     const double psnr = 10.0 * log10(samples * peak * peak / sse);
20*fb1b10abSAndroid Build Coastguard Worker     return psnr > MAX_PSNR ? MAX_PSNR : psnr;
21*fb1b10abSAndroid Build Coastguard Worker   } else {
22*fb1b10abSAndroid Build Coastguard Worker     return MAX_PSNR;
23*fb1b10abSAndroid Build Coastguard Worker   }
24*fb1b10abSAndroid Build Coastguard Worker }
25*fb1b10abSAndroid Build Coastguard Worker 
26*fb1b10abSAndroid Build Coastguard Worker /* TODO(yaowu): The block_variance calls the unoptimized versions of variance()
27*fb1b10abSAndroid Build Coastguard Worker  * and highbd_8_variance(). It should not.
28*fb1b10abSAndroid Build Coastguard Worker  */
encoder_sse(const uint8_t * a,int a_stride,const uint8_t * b,int b_stride,int w,int h)29*fb1b10abSAndroid Build Coastguard Worker static int64_t encoder_sse(const uint8_t *a, int a_stride, const uint8_t *b,
30*fb1b10abSAndroid Build Coastguard Worker                            int b_stride, int w, int h) {
31*fb1b10abSAndroid Build Coastguard Worker   int i, j;
32*fb1b10abSAndroid Build Coastguard Worker   int64_t sse = 0;
33*fb1b10abSAndroid Build Coastguard Worker 
34*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < h; i++) {
35*fb1b10abSAndroid Build Coastguard Worker     for (j = 0; j < w; j++) {
36*fb1b10abSAndroid Build Coastguard Worker       const int diff = a[j] - b[j];
37*fb1b10abSAndroid Build Coastguard Worker       sse += diff * diff;
38*fb1b10abSAndroid Build Coastguard Worker     }
39*fb1b10abSAndroid Build Coastguard Worker 
40*fb1b10abSAndroid Build Coastguard Worker     a += a_stride;
41*fb1b10abSAndroid Build Coastguard Worker     b += b_stride;
42*fb1b10abSAndroid Build Coastguard Worker   }
43*fb1b10abSAndroid Build Coastguard Worker 
44*fb1b10abSAndroid Build Coastguard Worker   return sse;
45*fb1b10abSAndroid Build Coastguard Worker }
46*fb1b10abSAndroid Build Coastguard Worker 
47*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
encoder_highbd_sse(const uint8_t * a8,int a_stride,const uint8_t * b8,int b_stride,int w,int h)48*fb1b10abSAndroid Build Coastguard Worker static int64_t encoder_highbd_sse(const uint8_t *a8, int a_stride,
49*fb1b10abSAndroid Build Coastguard Worker                                   const uint8_t *b8, int b_stride, int w,
50*fb1b10abSAndroid Build Coastguard Worker                                   int h) {
51*fb1b10abSAndroid Build Coastguard Worker   int i, j;
52*fb1b10abSAndroid Build Coastguard Worker   int64_t sse = 0;
53*fb1b10abSAndroid Build Coastguard Worker 
54*fb1b10abSAndroid Build Coastguard Worker   const uint16_t *a = CONVERT_TO_SHORTPTR(a8);
55*fb1b10abSAndroid Build Coastguard Worker   const uint16_t *b = CONVERT_TO_SHORTPTR(b8);
56*fb1b10abSAndroid Build Coastguard Worker 
57*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < h; i++) {
58*fb1b10abSAndroid Build Coastguard Worker     for (j = 0; j < w; j++) {
59*fb1b10abSAndroid Build Coastguard Worker       const int diff = a[j] - b[j];
60*fb1b10abSAndroid Build Coastguard Worker       sse += diff * diff;
61*fb1b10abSAndroid Build Coastguard Worker     }
62*fb1b10abSAndroid Build Coastguard Worker     a += a_stride;
63*fb1b10abSAndroid Build Coastguard Worker     b += b_stride;
64*fb1b10abSAndroid Build Coastguard Worker   }
65*fb1b10abSAndroid Build Coastguard Worker 
66*fb1b10abSAndroid Build Coastguard Worker   return sse;
67*fb1b10abSAndroid Build Coastguard Worker }
68*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
69*fb1b10abSAndroid Build Coastguard Worker 
get_sse(const uint8_t * a,int a_stride,const uint8_t * b,int b_stride,int width,int height)70*fb1b10abSAndroid Build Coastguard Worker static int64_t get_sse(const uint8_t *a, int a_stride, const uint8_t *b,
71*fb1b10abSAndroid Build Coastguard Worker                        int b_stride, int width, int height) {
72*fb1b10abSAndroid Build Coastguard Worker   const int dw = width % 16;
73*fb1b10abSAndroid Build Coastguard Worker   const int dh = height % 16;
74*fb1b10abSAndroid Build Coastguard Worker   int64_t total_sse = 0;
75*fb1b10abSAndroid Build Coastguard Worker   int x, y;
76*fb1b10abSAndroid Build Coastguard Worker 
77*fb1b10abSAndroid Build Coastguard Worker   if (dw > 0) {
78*fb1b10abSAndroid Build Coastguard Worker     total_sse += encoder_sse(&a[width - dw], a_stride, &b[width - dw], b_stride,
79*fb1b10abSAndroid Build Coastguard Worker                              dw, height);
80*fb1b10abSAndroid Build Coastguard Worker   }
81*fb1b10abSAndroid Build Coastguard Worker 
82*fb1b10abSAndroid Build Coastguard Worker   if (dh > 0) {
83*fb1b10abSAndroid Build Coastguard Worker     total_sse +=
84*fb1b10abSAndroid Build Coastguard Worker         encoder_sse(&a[(height - dh) * a_stride], a_stride,
85*fb1b10abSAndroid Build Coastguard Worker                     &b[(height - dh) * b_stride], b_stride, width - dw, dh);
86*fb1b10abSAndroid Build Coastguard Worker   }
87*fb1b10abSAndroid Build Coastguard Worker 
88*fb1b10abSAndroid Build Coastguard Worker   for (y = 0; y < height / 16; ++y) {
89*fb1b10abSAndroid Build Coastguard Worker     const uint8_t *pa = a;
90*fb1b10abSAndroid Build Coastguard Worker     const uint8_t *pb = b;
91*fb1b10abSAndroid Build Coastguard Worker     for (x = 0; x < width / 16; ++x) {
92*fb1b10abSAndroid Build Coastguard Worker       total_sse += vpx_sse(pa, a_stride, pb, b_stride, 16, 16);
93*fb1b10abSAndroid Build Coastguard Worker 
94*fb1b10abSAndroid Build Coastguard Worker       pa += 16;
95*fb1b10abSAndroid Build Coastguard Worker       pb += 16;
96*fb1b10abSAndroid Build Coastguard Worker     }
97*fb1b10abSAndroid Build Coastguard Worker 
98*fb1b10abSAndroid Build Coastguard Worker     a += 16 * a_stride;
99*fb1b10abSAndroid Build Coastguard Worker     b += 16 * b_stride;
100*fb1b10abSAndroid Build Coastguard Worker   }
101*fb1b10abSAndroid Build Coastguard Worker 
102*fb1b10abSAndroid Build Coastguard Worker   return total_sse;
103*fb1b10abSAndroid Build Coastguard Worker }
104*fb1b10abSAndroid Build Coastguard Worker 
105*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
highbd_get_sse_shift(const uint8_t * a8,int a_stride,const uint8_t * b8,int b_stride,int width,int height,unsigned int input_shift)106*fb1b10abSAndroid Build Coastguard Worker static int64_t highbd_get_sse_shift(const uint8_t *a8, int a_stride,
107*fb1b10abSAndroid Build Coastguard Worker                                     const uint8_t *b8, int b_stride, int width,
108*fb1b10abSAndroid Build Coastguard Worker                                     int height, unsigned int input_shift) {
109*fb1b10abSAndroid Build Coastguard Worker   const uint16_t *a = CONVERT_TO_SHORTPTR(a8);
110*fb1b10abSAndroid Build Coastguard Worker   const uint16_t *b = CONVERT_TO_SHORTPTR(b8);
111*fb1b10abSAndroid Build Coastguard Worker   int64_t total_sse = 0;
112*fb1b10abSAndroid Build Coastguard Worker   int x, y;
113*fb1b10abSAndroid Build Coastguard Worker   for (y = 0; y < height; ++y) {
114*fb1b10abSAndroid Build Coastguard Worker     for (x = 0; x < width; ++x) {
115*fb1b10abSAndroid Build Coastguard Worker       int64_t diff;
116*fb1b10abSAndroid Build Coastguard Worker       diff = (a[x] >> input_shift) - (b[x] >> input_shift);
117*fb1b10abSAndroid Build Coastguard Worker       total_sse += diff * diff;
118*fb1b10abSAndroid Build Coastguard Worker     }
119*fb1b10abSAndroid Build Coastguard Worker     a += a_stride;
120*fb1b10abSAndroid Build Coastguard Worker     b += b_stride;
121*fb1b10abSAndroid Build Coastguard Worker   }
122*fb1b10abSAndroid Build Coastguard Worker   return total_sse;
123*fb1b10abSAndroid Build Coastguard Worker }
124*fb1b10abSAndroid Build Coastguard Worker 
highbd_get_sse(const uint8_t * a,int a_stride,const uint8_t * b,int b_stride,int width,int height)125*fb1b10abSAndroid Build Coastguard Worker static int64_t highbd_get_sse(const uint8_t *a, int a_stride, const uint8_t *b,
126*fb1b10abSAndroid Build Coastguard Worker                               int b_stride, int width, int height) {
127*fb1b10abSAndroid Build Coastguard Worker   int64_t total_sse = 0;
128*fb1b10abSAndroid Build Coastguard Worker   int x, y;
129*fb1b10abSAndroid Build Coastguard Worker   const int dw = width % 16;
130*fb1b10abSAndroid Build Coastguard Worker   const int dh = height % 16;
131*fb1b10abSAndroid Build Coastguard Worker   if (dw > 0) {
132*fb1b10abSAndroid Build Coastguard Worker     total_sse += encoder_highbd_sse(&a[width - dw], a_stride, &b[width - dw],
133*fb1b10abSAndroid Build Coastguard Worker                                     b_stride, dw, height);
134*fb1b10abSAndroid Build Coastguard Worker   }
135*fb1b10abSAndroid Build Coastguard Worker   if (dh > 0) {
136*fb1b10abSAndroid Build Coastguard Worker     total_sse += encoder_highbd_sse(&a[(height - dh) * a_stride], a_stride,
137*fb1b10abSAndroid Build Coastguard Worker                                     &b[(height - dh) * b_stride], b_stride,
138*fb1b10abSAndroid Build Coastguard Worker                                     width - dw, dh);
139*fb1b10abSAndroid Build Coastguard Worker   }
140*fb1b10abSAndroid Build Coastguard Worker   for (y = 0; y < height / 16; ++y) {
141*fb1b10abSAndroid Build Coastguard Worker     const uint8_t *pa = a;
142*fb1b10abSAndroid Build Coastguard Worker     const uint8_t *pb = b;
143*fb1b10abSAndroid Build Coastguard Worker     for (x = 0; x < width / 16; ++x) {
144*fb1b10abSAndroid Build Coastguard Worker       total_sse += vpx_highbd_sse(pa, a_stride, pb, b_stride, 16, 16);
145*fb1b10abSAndroid Build Coastguard Worker       pa += 16;
146*fb1b10abSAndroid Build Coastguard Worker       pb += 16;
147*fb1b10abSAndroid Build Coastguard Worker     }
148*fb1b10abSAndroid Build Coastguard Worker     a += 16 * a_stride;
149*fb1b10abSAndroid Build Coastguard Worker     b += 16 * b_stride;
150*fb1b10abSAndroid Build Coastguard Worker   }
151*fb1b10abSAndroid Build Coastguard Worker   return total_sse;
152*fb1b10abSAndroid Build Coastguard Worker }
153*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
154*fb1b10abSAndroid Build Coastguard Worker 
vpx_get_y_sse(const YV12_BUFFER_CONFIG * a,const YV12_BUFFER_CONFIG * b)155*fb1b10abSAndroid Build Coastguard Worker int64_t vpx_get_y_sse(const YV12_BUFFER_CONFIG *a,
156*fb1b10abSAndroid Build Coastguard Worker                       const YV12_BUFFER_CONFIG *b) {
157*fb1b10abSAndroid Build Coastguard Worker   assert(a->y_crop_width == b->y_crop_width);
158*fb1b10abSAndroid Build Coastguard Worker   assert(a->y_crop_height == b->y_crop_height);
159*fb1b10abSAndroid Build Coastguard Worker 
160*fb1b10abSAndroid Build Coastguard Worker   return get_sse(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride,
161*fb1b10abSAndroid Build Coastguard Worker                  a->y_crop_width, a->y_crop_height);
162*fb1b10abSAndroid Build Coastguard Worker }
163*fb1b10abSAndroid Build Coastguard Worker 
164*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
vpx_highbd_get_y_sse(const YV12_BUFFER_CONFIG * a,const YV12_BUFFER_CONFIG * b)165*fb1b10abSAndroid Build Coastguard Worker int64_t vpx_highbd_get_y_sse(const YV12_BUFFER_CONFIG *a,
166*fb1b10abSAndroid Build Coastguard Worker                              const YV12_BUFFER_CONFIG *b) {
167*fb1b10abSAndroid Build Coastguard Worker   assert(a->y_crop_width == b->y_crop_width);
168*fb1b10abSAndroid Build Coastguard Worker   assert(a->y_crop_height == b->y_crop_height);
169*fb1b10abSAndroid Build Coastguard Worker   assert((a->flags & YV12_FLAG_HIGHBITDEPTH) != 0);
170*fb1b10abSAndroid Build Coastguard Worker   assert((b->flags & YV12_FLAG_HIGHBITDEPTH) != 0);
171*fb1b10abSAndroid Build Coastguard Worker 
172*fb1b10abSAndroid Build Coastguard Worker   return highbd_get_sse(a->y_buffer, a->y_stride, b->y_buffer, b->y_stride,
173*fb1b10abSAndroid Build Coastguard Worker                         a->y_crop_width, a->y_crop_height);
174*fb1b10abSAndroid Build Coastguard Worker }
175*fb1b10abSAndroid Build Coastguard Worker #endif  // CONFIG_VP9_HIGHBITDEPTH
176*fb1b10abSAndroid Build Coastguard Worker 
177*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
vpx_calc_highbd_psnr(const YV12_BUFFER_CONFIG * a,const YV12_BUFFER_CONFIG * b,PSNR_STATS * psnr,uint32_t bit_depth,uint32_t in_bit_depth)178*fb1b10abSAndroid Build Coastguard Worker void vpx_calc_highbd_psnr(const YV12_BUFFER_CONFIG *a,
179*fb1b10abSAndroid Build Coastguard Worker                           const YV12_BUFFER_CONFIG *b, PSNR_STATS *psnr,
180*fb1b10abSAndroid Build Coastguard Worker                           uint32_t bit_depth, uint32_t in_bit_depth) {
181*fb1b10abSAndroid Build Coastguard Worker   const int widths[3] = { a->y_crop_width, a->uv_crop_width, a->uv_crop_width };
182*fb1b10abSAndroid Build Coastguard Worker   const int heights[3] = { a->y_crop_height, a->uv_crop_height,
183*fb1b10abSAndroid Build Coastguard Worker                            a->uv_crop_height };
184*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *a_planes[3] = { a->y_buffer, a->u_buffer, a->v_buffer };
185*fb1b10abSAndroid Build Coastguard Worker   const int a_strides[3] = { a->y_stride, a->uv_stride, a->uv_stride };
186*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *b_planes[3] = { b->y_buffer, b->u_buffer, b->v_buffer };
187*fb1b10abSAndroid Build Coastguard Worker   const int b_strides[3] = { b->y_stride, b->uv_stride, b->uv_stride };
188*fb1b10abSAndroid Build Coastguard Worker   int i;
189*fb1b10abSAndroid Build Coastguard Worker   uint64_t total_sse = 0;
190*fb1b10abSAndroid Build Coastguard Worker   uint32_t total_samples = 0;
191*fb1b10abSAndroid Build Coastguard Worker   const double peak = (double)((1 << in_bit_depth) - 1);
192*fb1b10abSAndroid Build Coastguard Worker   const unsigned int input_shift = bit_depth - in_bit_depth;
193*fb1b10abSAndroid Build Coastguard Worker 
194*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 3; ++i) {
195*fb1b10abSAndroid Build Coastguard Worker     const int w = widths[i];
196*fb1b10abSAndroid Build Coastguard Worker     const int h = heights[i];
197*fb1b10abSAndroid Build Coastguard Worker     const uint32_t samples = w * h;
198*fb1b10abSAndroid Build Coastguard Worker     uint64_t sse;
199*fb1b10abSAndroid Build Coastguard Worker     if (a->flags & YV12_FLAG_HIGHBITDEPTH) {
200*fb1b10abSAndroid Build Coastguard Worker       if (input_shift) {
201*fb1b10abSAndroid Build Coastguard Worker         sse = highbd_get_sse_shift(a_planes[i], a_strides[i], b_planes[i],
202*fb1b10abSAndroid Build Coastguard Worker                                    b_strides[i], w, h, input_shift);
203*fb1b10abSAndroid Build Coastguard Worker       } else {
204*fb1b10abSAndroid Build Coastguard Worker         sse = highbd_get_sse(a_planes[i], a_strides[i], b_planes[i],
205*fb1b10abSAndroid Build Coastguard Worker                              b_strides[i], w, h);
206*fb1b10abSAndroid Build Coastguard Worker       }
207*fb1b10abSAndroid Build Coastguard Worker     } else {
208*fb1b10abSAndroid Build Coastguard Worker       sse = get_sse(a_planes[i], a_strides[i], b_planes[i], b_strides[i], w, h);
209*fb1b10abSAndroid Build Coastguard Worker     }
210*fb1b10abSAndroid Build Coastguard Worker     psnr->sse[1 + i] = sse;
211*fb1b10abSAndroid Build Coastguard Worker     psnr->samples[1 + i] = samples;
212*fb1b10abSAndroid Build Coastguard Worker     psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, peak, (double)sse);
213*fb1b10abSAndroid Build Coastguard Worker 
214*fb1b10abSAndroid Build Coastguard Worker     total_sse += sse;
215*fb1b10abSAndroid Build Coastguard Worker     total_samples += samples;
216*fb1b10abSAndroid Build Coastguard Worker   }
217*fb1b10abSAndroid Build Coastguard Worker 
218*fb1b10abSAndroid Build Coastguard Worker   psnr->sse[0] = total_sse;
219*fb1b10abSAndroid Build Coastguard Worker   psnr->samples[0] = total_samples;
220*fb1b10abSAndroid Build Coastguard Worker   psnr->psnr[0] =
221*fb1b10abSAndroid Build Coastguard Worker       vpx_sse_to_psnr((double)total_samples, peak, (double)total_sse);
222*fb1b10abSAndroid Build Coastguard Worker }
223*fb1b10abSAndroid Build Coastguard Worker 
224*fb1b10abSAndroid Build Coastguard Worker #endif  // !CONFIG_VP9_HIGHBITDEPTH
225*fb1b10abSAndroid Build Coastguard Worker 
vpx_calc_psnr(const YV12_BUFFER_CONFIG * a,const YV12_BUFFER_CONFIG * b,PSNR_STATS * psnr)226*fb1b10abSAndroid Build Coastguard Worker void vpx_calc_psnr(const YV12_BUFFER_CONFIG *a, const YV12_BUFFER_CONFIG *b,
227*fb1b10abSAndroid Build Coastguard Worker                    PSNR_STATS *psnr) {
228*fb1b10abSAndroid Build Coastguard Worker   static const double peak = 255.0;
229*fb1b10abSAndroid Build Coastguard Worker   const int widths[3] = { a->y_crop_width, a->uv_crop_width, a->uv_crop_width };
230*fb1b10abSAndroid Build Coastguard Worker   const int heights[3] = { a->y_crop_height, a->uv_crop_height,
231*fb1b10abSAndroid Build Coastguard Worker                            a->uv_crop_height };
232*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *a_planes[3] = { a->y_buffer, a->u_buffer, a->v_buffer };
233*fb1b10abSAndroid Build Coastguard Worker   const int a_strides[3] = { a->y_stride, a->uv_stride, a->uv_stride };
234*fb1b10abSAndroid Build Coastguard Worker   const uint8_t *b_planes[3] = { b->y_buffer, b->u_buffer, b->v_buffer };
235*fb1b10abSAndroid Build Coastguard Worker   const int b_strides[3] = { b->y_stride, b->uv_stride, b->uv_stride };
236*fb1b10abSAndroid Build Coastguard Worker   int i;
237*fb1b10abSAndroid Build Coastguard Worker   uint64_t total_sse = 0;
238*fb1b10abSAndroid Build Coastguard Worker   uint32_t total_samples = 0;
239*fb1b10abSAndroid Build Coastguard Worker 
240*fb1b10abSAndroid Build Coastguard Worker   for (i = 0; i < 3; ++i) {
241*fb1b10abSAndroid Build Coastguard Worker     const int w = widths[i];
242*fb1b10abSAndroid Build Coastguard Worker     const int h = heights[i];
243*fb1b10abSAndroid Build Coastguard Worker     const uint32_t samples = w * h;
244*fb1b10abSAndroid Build Coastguard Worker     const uint64_t sse =
245*fb1b10abSAndroid Build Coastguard Worker         get_sse(a_planes[i], a_strides[i], b_planes[i], b_strides[i], w, h);
246*fb1b10abSAndroid Build Coastguard Worker     psnr->sse[1 + i] = sse;
247*fb1b10abSAndroid Build Coastguard Worker     psnr->samples[1 + i] = samples;
248*fb1b10abSAndroid Build Coastguard Worker     psnr->psnr[1 + i] = vpx_sse_to_psnr(samples, peak, (double)sse);
249*fb1b10abSAndroid Build Coastguard Worker 
250*fb1b10abSAndroid Build Coastguard Worker     total_sse += sse;
251*fb1b10abSAndroid Build Coastguard Worker     total_samples += samples;
252*fb1b10abSAndroid Build Coastguard Worker   }
253*fb1b10abSAndroid Build Coastguard Worker 
254*fb1b10abSAndroid Build Coastguard Worker   psnr->sse[0] = total_sse;
255*fb1b10abSAndroid Build Coastguard Worker   psnr->samples[0] = total_samples;
256*fb1b10abSAndroid Build Coastguard Worker   psnr->psnr[0] =
257*fb1b10abSAndroid Build Coastguard Worker       vpx_sse_to_psnr((double)total_samples, peak, (double)total_sse);
258*fb1b10abSAndroid Build Coastguard Worker }
259