1233d2500723e5594f3e7c70896ffeeef32b9c950ywan/* 2233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3233d2500723e5594f3e7c70896ffeeef32b9c950ywan * 4233d2500723e5594f3e7c70896ffeeef32b9c950ywan * Use of this source code is governed by a BSD-style license 5233d2500723e5594f3e7c70896ffeeef32b9c950ywan * that can be found in the LICENSE file in the root of the source 6233d2500723e5594f3e7c70896ffeeef32b9c950ywan * tree. An additional intellectual property rights grant can be found 7233d2500723e5594f3e7c70896ffeeef32b9c950ywan * in the file PATENTS. All contributing project authors may 8233d2500723e5594f3e7c70896ffeeef32b9c950ywan * be found in the AUTHORS file in the root of the source tree. 9233d2500723e5594f3e7c70896ffeeef32b9c950ywan */ 10233d2500723e5594f3e7c70896ffeeef32b9c950ywan 11233d2500723e5594f3e7c70896ffeeef32b9c950ywan 12233d2500723e5594f3e7c70896ffeeef32b9c950ywan#include <math.h> 13233d2500723e5594f3e7c70896ffeeef32b9c950ywan 14233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_short_fdct4x4_c(short *input, short *output, int pitch) 15233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 16233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 17233d2500723e5594f3e7c70896ffeeef32b9c950ywan int a1, b1, c1, d1; 18233d2500723e5594f3e7c70896ffeeef32b9c950ywan short *ip = input; 19233d2500723e5594f3e7c70896ffeeef32b9c950ywan short *op = output; 20233d2500723e5594f3e7c70896ffeeef32b9c950ywan 21233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 4; i++) 22233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 23233d2500723e5594f3e7c70896ffeeef32b9c950ywan a1 = ((ip[0] + ip[3]) * 8); 24233d2500723e5594f3e7c70896ffeeef32b9c950ywan b1 = ((ip[1] + ip[2]) * 8); 25233d2500723e5594f3e7c70896ffeeef32b9c950ywan c1 = ((ip[1] - ip[2]) * 8); 26233d2500723e5594f3e7c70896ffeeef32b9c950ywan d1 = ((ip[0] - ip[3]) * 8); 27233d2500723e5594f3e7c70896ffeeef32b9c950ywan 28233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[0] = a1 + b1; 29233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[2] = a1 - b1; 30233d2500723e5594f3e7c70896ffeeef32b9c950ywan 31233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[1] = (c1 * 2217 + d1 * 5352 + 14500)>>12; 32233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[3] = (d1 * 2217 - c1 * 5352 + 7500)>>12; 33233d2500723e5594f3e7c70896ffeeef32b9c950ywan 34233d2500723e5594f3e7c70896ffeeef32b9c950ywan ip += pitch / 2; 35233d2500723e5594f3e7c70896ffeeef32b9c950ywan op += 4; 36233d2500723e5594f3e7c70896ffeeef32b9c950ywan 37233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 38233d2500723e5594f3e7c70896ffeeef32b9c950ywan ip = output; 39233d2500723e5594f3e7c70896ffeeef32b9c950ywan op = output; 40233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 4; i++) 41233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 42233d2500723e5594f3e7c70896ffeeef32b9c950ywan a1 = ip[0] + ip[12]; 43233d2500723e5594f3e7c70896ffeeef32b9c950ywan b1 = ip[4] + ip[8]; 44233d2500723e5594f3e7c70896ffeeef32b9c950ywan c1 = ip[4] - ip[8]; 45233d2500723e5594f3e7c70896ffeeef32b9c950ywan d1 = ip[0] - ip[12]; 46233d2500723e5594f3e7c70896ffeeef32b9c950ywan 47233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[0] = ( a1 + b1 + 7)>>4; 48233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[8] = ( a1 - b1 + 7)>>4; 49233d2500723e5594f3e7c70896ffeeef32b9c950ywan 50233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[4] =((c1 * 2217 + d1 * 5352 + 12000)>>16) + (d1!=0); 51233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[12] = (d1 * 2217 - c1 * 5352 + 51000)>>16; 52233d2500723e5594f3e7c70896ffeeef32b9c950ywan 53233d2500723e5594f3e7c70896ffeeef32b9c950ywan ip++; 54233d2500723e5594f3e7c70896ffeeef32b9c950ywan op++; 55233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 56233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 57233d2500723e5594f3e7c70896ffeeef32b9c950ywan 58233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_short_fdct8x4_c(short *input, short *output, int pitch) 59233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 60233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_short_fdct4x4_c(input, output, pitch); 61233d2500723e5594f3e7c70896ffeeef32b9c950ywan vp8_short_fdct4x4_c(input + 4, output + 16, pitch); 62233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 63233d2500723e5594f3e7c70896ffeeef32b9c950ywan 64233d2500723e5594f3e7c70896ffeeef32b9c950ywanvoid vp8_short_walsh4x4_c(short *input, short *output, int pitch) 65233d2500723e5594f3e7c70896ffeeef32b9c950ywan{ 66233d2500723e5594f3e7c70896ffeeef32b9c950ywan int i; 67233d2500723e5594f3e7c70896ffeeef32b9c950ywan int a1, b1, c1, d1; 68233d2500723e5594f3e7c70896ffeeef32b9c950ywan int a2, b2, c2, d2; 69233d2500723e5594f3e7c70896ffeeef32b9c950ywan short *ip = input; 70233d2500723e5594f3e7c70896ffeeef32b9c950ywan short *op = output; 71233d2500723e5594f3e7c70896ffeeef32b9c950ywan 72233d2500723e5594f3e7c70896ffeeef32b9c950ywan 73233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 4; i++) 74233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 75233d2500723e5594f3e7c70896ffeeef32b9c950ywan a1 = ((ip[0] + ip[2]) * 4); 76233d2500723e5594f3e7c70896ffeeef32b9c950ywan d1 = ((ip[1] + ip[3]) * 4); 77233d2500723e5594f3e7c70896ffeeef32b9c950ywan c1 = ((ip[1] - ip[3]) * 4); 78233d2500723e5594f3e7c70896ffeeef32b9c950ywan b1 = ((ip[0] - ip[2]) * 4); 79233d2500723e5594f3e7c70896ffeeef32b9c950ywan 80233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[0] = a1 + d1 + (a1!=0); 81233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[1] = b1 + c1; 82233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[2] = b1 - c1; 83233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[3] = a1 - d1; 84233d2500723e5594f3e7c70896ffeeef32b9c950ywan ip += pitch / 2; 85233d2500723e5594f3e7c70896ffeeef32b9c950ywan op += 4; 86233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 87233d2500723e5594f3e7c70896ffeeef32b9c950ywan 88233d2500723e5594f3e7c70896ffeeef32b9c950ywan ip = output; 89233d2500723e5594f3e7c70896ffeeef32b9c950ywan op = output; 90233d2500723e5594f3e7c70896ffeeef32b9c950ywan 91233d2500723e5594f3e7c70896ffeeef32b9c950ywan for (i = 0; i < 4; i++) 92233d2500723e5594f3e7c70896ffeeef32b9c950ywan { 93233d2500723e5594f3e7c70896ffeeef32b9c950ywan a1 = ip[0] + ip[8]; 94233d2500723e5594f3e7c70896ffeeef32b9c950ywan d1 = ip[4] + ip[12]; 95233d2500723e5594f3e7c70896ffeeef32b9c950ywan c1 = ip[4] - ip[12]; 96233d2500723e5594f3e7c70896ffeeef32b9c950ywan b1 = ip[0] - ip[8]; 97233d2500723e5594f3e7c70896ffeeef32b9c950ywan 98233d2500723e5594f3e7c70896ffeeef32b9c950ywan a2 = a1 + d1; 99233d2500723e5594f3e7c70896ffeeef32b9c950ywan b2 = b1 + c1; 100233d2500723e5594f3e7c70896ffeeef32b9c950ywan c2 = b1 - c1; 101233d2500723e5594f3e7c70896ffeeef32b9c950ywan d2 = a1 - d1; 102233d2500723e5594f3e7c70896ffeeef32b9c950ywan 103233d2500723e5594f3e7c70896ffeeef32b9c950ywan a2 += a2<0; 104233d2500723e5594f3e7c70896ffeeef32b9c950ywan b2 += b2<0; 105233d2500723e5594f3e7c70896ffeeef32b9c950ywan c2 += c2<0; 106233d2500723e5594f3e7c70896ffeeef32b9c950ywan d2 += d2<0; 107233d2500723e5594f3e7c70896ffeeef32b9c950ywan 108233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[0] = (a2+3) >> 3; 109233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[4] = (b2+3) >> 3; 110233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[8] = (c2+3) >> 3; 111233d2500723e5594f3e7c70896ffeeef32b9c950ywan op[12]= (d2+3) >> 3; 112233d2500723e5594f3e7c70896ffeeef32b9c950ywan 113233d2500723e5594f3e7c70896ffeeef32b9c950ywan ip++; 114233d2500723e5594f3e7c70896ffeeef32b9c950ywan op++; 115233d2500723e5594f3e7c70896ffeeef32b9c950ywan } 116233d2500723e5594f3e7c70896ffeeef32b9c950ywan} 117