17ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian/* 27ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian * Copyright (c) 2014 The WebM project authors. All Rights Reserved. 37ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian * 47ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian * Use of this source code is governed by a BSD-style license 57ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian * that can be found in the LICENSE file in the root of the source 67ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian * tree. An additional intellectual property rights grant can be found 77ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian * in the file PATENTS. All contributing project authors may 87ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian * be found in the AUTHORS file in the root of the source tree. 97ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian */ 1068e1c830ade592be74773e249bf94e2bbfb50de7Johann#include <stdlib.h> 1168e1c830ade592be74773e249bf94e2bbfb50de7Johann 1268e1c830ade592be74773e249bf94e2bbfb50de7Johann#include "./vpx_dsp_rtcd.h" 137ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#include "vpx_ports/mem.h" 147ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1568e1c830ade592be74773e249bf94e2bbfb50de7Johannunsigned int vpx_avg_8x8_c(const uint8_t *s, int p) { 167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int i, j; 177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int sum = 0; 187bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < 8; ++i, s += p) 197bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (j = 0; j < 8; sum += s[j], ++j) { 207bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian return (sum + 32) >> 6; 237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 2568e1c830ade592be74773e249bf94e2bbfb50de7Johannunsigned int vpx_avg_4x4_c(const uint8_t *s, int p) { 267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int i, j; 277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int sum = 0; 287bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < 4; ++i, s += p) 297bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (j = 0; j < 4; sum += s[j], ++j) { 307bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian return (sum + 8) >> 4; 337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// src_diff: first pass, 9 bit, dynamic range [-255, 255] 367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// second pass, 12 bit, dynamic range [-2040, 2040] 377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanianstatic void hadamard_col8(const int16_t *src_diff, int src_stride, 387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t *coeff) { 397ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t b0 = src_diff[0 * src_stride] + src_diff[1 * src_stride]; 407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t b1 = src_diff[0 * src_stride] - src_diff[1 * src_stride]; 417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t b2 = src_diff[2 * src_stride] + src_diff[3 * src_stride]; 427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t b3 = src_diff[2 * src_stride] - src_diff[3 * src_stride]; 437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t b4 = src_diff[4 * src_stride] + src_diff[5 * src_stride]; 447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t b5 = src_diff[4 * src_stride] - src_diff[5 * src_stride]; 457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t b6 = src_diff[6 * src_stride] + src_diff[7 * src_stride]; 467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t b7 = src_diff[6 * src_stride] - src_diff[7 * src_stride]; 477ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t c0 = b0 + b2; 497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t c1 = b1 + b3; 507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t c2 = b0 - b2; 517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t c3 = b1 - b3; 527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t c4 = b4 + b6; 537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t c5 = b5 + b7; 547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t c6 = b4 - b6; 557ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t c7 = b5 - b7; 567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian coeff[0] = c0 + c4; 587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian coeff[7] = c1 + c5; 597ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian coeff[3] = c2 + c6; 607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian coeff[4] = c3 + c7; 617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian coeff[2] = c0 - c4; 627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian coeff[6] = c1 - c5; 637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian coeff[1] = c2 - c6; 647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian coeff[5] = c3 - c7; 657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 667ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 6768e1c830ade592be74773e249bf94e2bbfb50de7Johann// The order of the output coeff of the hadamard is not important. For 6868e1c830ade592be74773e249bf94e2bbfb50de7Johann// optimization purposes the final transpose may be skipped. 6968e1c830ade592be74773e249bf94e2bbfb50de7Johannvoid vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, 700a39d0a697ff3603e8c100300fda363658e10b23James Zern tran_low_t *coeff) { 717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int idx; 727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t buffer[64]; 730a39d0a697ff3603e8c100300fda363658e10b23James Zern int16_t buffer2[64]; 747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t *tmp_buf = &buffer[0]; 757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (idx = 0; idx < 8; ++idx) { 767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian hadamard_col8(src_diff, src_stride, tmp_buf); // src_diff: 9 bit 777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // dynamic range [-255, 255] 787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tmp_buf += 8; 797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian ++src_diff; 807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 827ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian tmp_buf = &buffer[0]; 837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (idx = 0; idx < 8; ++idx) { 840a39d0a697ff3603e8c100300fda363658e10b23James Zern hadamard_col8(tmp_buf, 8, buffer2 + 8 * idx); // tmp_buf: 12 bit 850a39d0a697ff3603e8c100300fda363658e10b23James Zern // dynamic range [-2040, 2040] 860a39d0a697ff3603e8c100300fda363658e10b23James Zern // buffer2: 15 bit 870a39d0a697ff3603e8c100300fda363658e10b23James Zern // dynamic range [-16320, 16320] 887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian ++tmp_buf; 897ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 900a39d0a697ff3603e8c100300fda363658e10b23James Zern 910a39d0a697ff3603e8c100300fda363658e10b23James Zern for (idx = 0; idx < 64; ++idx) coeff[idx] = (tran_low_t)buffer2[idx]; 927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// In place 16x16 2D Hadamard transform 9568e1c830ade592be74773e249bf94e2bbfb50de7Johannvoid vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, 960a39d0a697ff3603e8c100300fda363658e10b23James Zern tran_low_t *coeff) { 977ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int idx; 987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (idx = 0; idx < 4; ++idx) { 997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // src_diff: 9 bit, dynamic range [-255, 255] 1007bc9febe8749e98a3812a0dc4380ceae75c29450Johann const int16_t *src_ptr = 1017bc9febe8749e98a3812a0dc4380ceae75c29450Johann src_diff + (idx >> 1) * 8 * src_stride + (idx & 0x01) * 8; 10268e1c830ade592be74773e249bf94e2bbfb50de7Johann vpx_hadamard_8x8_c(src_ptr, src_stride, coeff + idx * 64); 1037ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 1047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // coeff: 15 bit, dynamic range [-16320, 16320] 1067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (idx = 0; idx < 64; ++idx) { 1070a39d0a697ff3603e8c100300fda363658e10b23James Zern tran_low_t a0 = coeff[0]; 1080a39d0a697ff3603e8c100300fda363658e10b23James Zern tran_low_t a1 = coeff[64]; 1090a39d0a697ff3603e8c100300fda363658e10b23James Zern tran_low_t a2 = coeff[128]; 1100a39d0a697ff3603e8c100300fda363658e10b23James Zern tran_low_t a3 = coeff[192]; 1117ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1120a39d0a697ff3603e8c100300fda363658e10b23James Zern tran_low_t b0 = (a0 + a1) >> 1; // (a0 + a1): 16 bit, [-32640, 32640] 1130a39d0a697ff3603e8c100300fda363658e10b23James Zern tran_low_t b1 = (a0 - a1) >> 1; // b0-b3: 15 bit, dynamic range 1140a39d0a697ff3603e8c100300fda363658e10b23James Zern tran_low_t b2 = (a2 + a3) >> 1; // [-16320, 16320] 1150a39d0a697ff3603e8c100300fda363658e10b23James Zern tran_low_t b3 = (a2 - a3) >> 1; 1167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1177bc9febe8749e98a3812a0dc4380ceae75c29450Johann coeff[0] = b0 + b2; // 16 bit, [-32640, 32640] 1187bc9febe8749e98a3812a0dc4380ceae75c29450Johann coeff[64] = b1 + b3; 1197ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian coeff[128] = b0 - b2; 1207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian coeff[192] = b1 - b3; 1217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1227ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian ++coeff; 1237ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 1247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 1257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// coeff: 16 bits, dynamic range [-32640, 32640]. 1277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// length: value range {16, 64, 256, 1024}. 1280a39d0a697ff3603e8c100300fda363658e10b23James Zernint vpx_satd_c(const tran_low_t *coeff, int length) { 1297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int i; 1307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int satd = 0; 1317bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < length; ++i) satd += abs(coeff[i]); 1327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // satd: 26 bits, dynamic range [-32640 * 1024, 32640 * 1024] 13468e1c830ade592be74773e249bf94e2bbfb50de7Johann return satd; 1357ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 1367ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1377ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// Integer projection onto row vectors. 1387ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// height: value range {16, 32, 64}. 13968e1c830ade592be74773e249bf94e2bbfb50de7Johannvoid vpx_int_pro_row_c(int16_t hbuf[16], const uint8_t *ref, 1407ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const int ref_stride, const int height) { 1417ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int idx; 1427ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian const int norm_factor = height >> 1; 1437ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (idx = 0; idx < 16; ++idx) { 1447ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int i; 1457ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian hbuf[idx] = 0; 1467ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // hbuf[idx]: 14 bit, dynamic range [0, 16320]. 1477bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < height; ++i) hbuf[idx] += ref[i * ref_stride]; 1487ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // hbuf[idx]: 9 bit, dynamic range [0, 510]. 1497ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian hbuf[idx] /= norm_factor; 1507ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian ++ref; 1517ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 1527ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 1537ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1547ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// width: value range {16, 32, 64}. 15568e1c830ade592be74773e249bf94e2bbfb50de7Johannint16_t vpx_int_pro_col_c(const uint8_t *ref, const int width) { 1567ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int idx; 1577ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int16_t sum = 0; 1587ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // sum: 14 bit, dynamic range [0, 16320] 1597bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (idx = 0; idx < width; ++idx) sum += ref[idx]; 1607ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian return sum; 1617ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 1627ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1637ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// ref: [0 - 510] 1647ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// src: [0 - 510] 1657ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian// bwl: {2, 3, 4} 1667bc9febe8749e98a3812a0dc4380ceae75c29450Johannint vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl) { 1677ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int i; 1687ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int width = 4 << bwl; 1697ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int sse = 0, mean = 0, var; 1707ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1717ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (i = 0; i < width; ++i) { 1727ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int diff = ref[i] - src[i]; // diff: dynamic range [-510, 510], 10 bits. 1737ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian mean += diff; // mean: dynamic range 16 bits. 1747ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian sse += diff * diff; // sse: dynamic range 26 bits. 1757ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 1767ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1777ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian // (mean * mean): dynamic range 31 bits. 1787ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian var = sse - ((mean * mean) >> (bwl + 2)); 1797ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian return var; 1807ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 1817ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 18268e1c830ade592be74773e249bf94e2bbfb50de7Johannvoid vpx_minmax_8x8_c(const uint8_t *s, int p, const uint8_t *d, int dp, 1837ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int *min, int *max) { 1847ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int i, j; 1857ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *min = 255; 1867ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *max = 0; 1877ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (i = 0; i < 8; ++i, s += p, d += dp) { 1887ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (j = 0; j < 8; ++j) { 1897bc9febe8749e98a3812a0dc4380ceae75c29450Johann int diff = abs(s[j] - d[j]); 1907ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *min = diff < *min ? diff : *min; 1917ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *max = diff > *max ? diff : *max; 1927ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 1937ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 1947ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 1957ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 1967ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#if CONFIG_VP9_HIGHBITDEPTH 19768e1c830ade592be74773e249bf94e2bbfb50de7Johannunsigned int vpx_highbd_avg_8x8_c(const uint8_t *s8, int p) { 1987ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int i, j; 1997ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int sum = 0; 2007bc9febe8749e98a3812a0dc4380ceae75c29450Johann const uint16_t *s = CONVERT_TO_SHORTPTR(s8); 2017bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < 8; ++i, s += p) 2027bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (j = 0; j < 8; sum += s[j], ++j) { 2037bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 2047ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 2057ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian return (sum + 32) >> 6; 2067ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 2077ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 20868e1c830ade592be74773e249bf94e2bbfb50de7Johannunsigned int vpx_highbd_avg_4x4_c(const uint8_t *s8, int p) { 2097ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int i, j; 2107ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int sum = 0; 2117bc9febe8749e98a3812a0dc4380ceae75c29450Johann const uint16_t *s = CONVERT_TO_SHORTPTR(s8); 2127bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < 4; ++i, s += p) 2137bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (j = 0; j < 4; sum += s[j], ++j) { 2147bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 2157ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 2167ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian return (sum + 8) >> 4; 2177ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 2187ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian 21968e1c830ade592be74773e249bf94e2bbfb50de7Johannvoid vpx_highbd_minmax_8x8_c(const uint8_t *s8, int p, const uint8_t *d8, 2207ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int dp, int *min, int *max) { 2217ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian int i, j; 2227bc9febe8749e98a3812a0dc4380ceae75c29450Johann const uint16_t *s = CONVERT_TO_SHORTPTR(s8); 2237bc9febe8749e98a3812a0dc4380ceae75c29450Johann const uint16_t *d = CONVERT_TO_SHORTPTR(d8); 2247ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *min = 255; 2257ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *max = 0; 2267ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (i = 0; i < 8; ++i, s += p, d += dp) { 2277ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian for (j = 0; j < 8; ++j) { 2287bc9febe8749e98a3812a0dc4380ceae75c29450Johann int diff = abs(s[j] - d[j]); 2297ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *min = diff < *min ? diff : *min; 2307ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian *max = diff > *max ? diff : *max; 2317ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 2327ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian } 2337ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian} 2347ce0a1d1337c01056ba24006efab21f00e179e04Vignesh Venkatasubramanian#endif // CONFIG_VP9_HIGHBITDEPTH 235