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