190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/* 2f71323e297a928af368937089d3ed71239786f86Andreas Huber * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * 4f71323e297a928af368937089d3ed71239786f86Andreas Huber * Use of this source code is governed by a BSD-style license 5f71323e297a928af368937089d3ed71239786f86Andreas Huber * that can be found in the LICENSE file in the root of the source 6f71323e297a928af368937089d3ed71239786f86Andreas Huber * tree. An additional intellectual property rights grant can be found 7f71323e297a928af368937089d3ed71239786f86Andreas Huber * in the file PATENTS. All contributing project authors may 8f71323e297a928af368937089d3ed71239786f86Andreas Huber * be found in the AUTHORS file in the root of the source tree. 990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */ 1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include <math.h> 1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 13da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian#include "./vp8_rtcd.h" 14da49e34c1fb5e99681f4ad99c21d9cfd83eddb96Vignesh Venkatasubramanian 157bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_short_fdct4x4_c(short *input, short *output, int pitch) { 167bc9febe8749e98a3812a0dc4380ceae75c29450Johann int i; 177bc9febe8749e98a3812a0dc4380ceae75c29450Johann int a1, b1, c1, d1; 187bc9febe8749e98a3812a0dc4380ceae75c29450Johann short *ip = input; 197bc9febe8749e98a3812a0dc4380ceae75c29450Johann short *op = output; 207bc9febe8749e98a3812a0dc4380ceae75c29450Johann 217bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < 4; ++i) { 227bc9febe8749e98a3812a0dc4380ceae75c29450Johann a1 = ((ip[0] + ip[3]) * 8); 237bc9febe8749e98a3812a0dc4380ceae75c29450Johann b1 = ((ip[1] + ip[2]) * 8); 247bc9febe8749e98a3812a0dc4380ceae75c29450Johann c1 = ((ip[1] - ip[2]) * 8); 257bc9febe8749e98a3812a0dc4380ceae75c29450Johann d1 = ((ip[0] - ip[3]) * 8); 267bc9febe8749e98a3812a0dc4380ceae75c29450Johann 277bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[0] = a1 + b1; 287bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[2] = a1 - b1; 297bc9febe8749e98a3812a0dc4380ceae75c29450Johann 307bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[1] = (c1 * 2217 + d1 * 5352 + 14500) >> 12; 317bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[3] = (d1 * 2217 - c1 * 5352 + 7500) >> 12; 327bc9febe8749e98a3812a0dc4380ceae75c29450Johann 337bc9febe8749e98a3812a0dc4380ceae75c29450Johann ip += pitch / 2; 347bc9febe8749e98a3812a0dc4380ceae75c29450Johann op += 4; 357bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 367bc9febe8749e98a3812a0dc4380ceae75c29450Johann ip = output; 377bc9febe8749e98a3812a0dc4380ceae75c29450Johann op = output; 387bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < 4; ++i) { 397bc9febe8749e98a3812a0dc4380ceae75c29450Johann a1 = ip[0] + ip[12]; 407bc9febe8749e98a3812a0dc4380ceae75c29450Johann b1 = ip[4] + ip[8]; 417bc9febe8749e98a3812a0dc4380ceae75c29450Johann c1 = ip[4] - ip[8]; 427bc9febe8749e98a3812a0dc4380ceae75c29450Johann d1 = ip[0] - ip[12]; 437bc9febe8749e98a3812a0dc4380ceae75c29450Johann 447bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[0] = (a1 + b1 + 7) >> 4; 457bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[8] = (a1 - b1 + 7) >> 4; 467bc9febe8749e98a3812a0dc4380ceae75c29450Johann 477bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[4] = ((c1 * 2217 + d1 * 5352 + 12000) >> 16) + (d1 != 0); 487bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[12] = (d1 * 2217 - c1 * 5352 + 51000) >> 16; 497bc9febe8749e98a3812a0dc4380ceae75c29450Johann 507bc9febe8749e98a3812a0dc4380ceae75c29450Johann ip++; 517bc9febe8749e98a3812a0dc4380ceae75c29450Johann op++; 527bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 5490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 557bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_short_fdct8x4_c(short *input, short *output, int pitch) { 567bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_short_fdct4x4_c(input, output, pitch); 577bc9febe8749e98a3812a0dc4380ceae75c29450Johann vp8_short_fdct4x4_c(input + 4, output + 16, pitch); 5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber 607bc9febe8749e98a3812a0dc4380ceae75c29450Johannvoid vp8_short_walsh4x4_c(short *input, short *output, int pitch) { 617bc9febe8749e98a3812a0dc4380ceae75c29450Johann int i; 627bc9febe8749e98a3812a0dc4380ceae75c29450Johann int a1, b1, c1, d1; 637bc9febe8749e98a3812a0dc4380ceae75c29450Johann int a2, b2, c2, d2; 647bc9febe8749e98a3812a0dc4380ceae75c29450Johann short *ip = input; 657bc9febe8749e98a3812a0dc4380ceae75c29450Johann short *op = output; 667bc9febe8749e98a3812a0dc4380ceae75c29450Johann 677bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < 4; ++i) { 687bc9febe8749e98a3812a0dc4380ceae75c29450Johann a1 = ((ip[0] + ip[2]) * 4); 697bc9febe8749e98a3812a0dc4380ceae75c29450Johann d1 = ((ip[1] + ip[3]) * 4); 707bc9febe8749e98a3812a0dc4380ceae75c29450Johann c1 = ((ip[1] - ip[3]) * 4); 717bc9febe8749e98a3812a0dc4380ceae75c29450Johann b1 = ((ip[0] - ip[2]) * 4); 727bc9febe8749e98a3812a0dc4380ceae75c29450Johann 737bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[0] = a1 + d1 + (a1 != 0); 747bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[1] = b1 + c1; 757bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[2] = b1 - c1; 767bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[3] = a1 - d1; 777bc9febe8749e98a3812a0dc4380ceae75c29450Johann ip += pitch / 2; 787bc9febe8749e98a3812a0dc4380ceae75c29450Johann op += 4; 797bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 807bc9febe8749e98a3812a0dc4380ceae75c29450Johann 817bc9febe8749e98a3812a0dc4380ceae75c29450Johann ip = output; 827bc9febe8749e98a3812a0dc4380ceae75c29450Johann op = output; 837bc9febe8749e98a3812a0dc4380ceae75c29450Johann 847bc9febe8749e98a3812a0dc4380ceae75c29450Johann for (i = 0; i < 4; ++i) { 857bc9febe8749e98a3812a0dc4380ceae75c29450Johann a1 = ip[0] + ip[8]; 867bc9febe8749e98a3812a0dc4380ceae75c29450Johann d1 = ip[4] + ip[12]; 877bc9febe8749e98a3812a0dc4380ceae75c29450Johann c1 = ip[4] - ip[12]; 887bc9febe8749e98a3812a0dc4380ceae75c29450Johann b1 = ip[0] - ip[8]; 897bc9febe8749e98a3812a0dc4380ceae75c29450Johann 907bc9febe8749e98a3812a0dc4380ceae75c29450Johann a2 = a1 + d1; 917bc9febe8749e98a3812a0dc4380ceae75c29450Johann b2 = b1 + c1; 927bc9febe8749e98a3812a0dc4380ceae75c29450Johann c2 = b1 - c1; 937bc9febe8749e98a3812a0dc4380ceae75c29450Johann d2 = a1 - d1; 947bc9febe8749e98a3812a0dc4380ceae75c29450Johann 957bc9febe8749e98a3812a0dc4380ceae75c29450Johann a2 += a2 < 0; 967bc9febe8749e98a3812a0dc4380ceae75c29450Johann b2 += b2 < 0; 977bc9febe8749e98a3812a0dc4380ceae75c29450Johann c2 += c2 < 0; 987bc9febe8749e98a3812a0dc4380ceae75c29450Johann d2 += d2 < 0; 997bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1007bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[0] = (a2 + 3) >> 3; 1017bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[4] = (b2 + 3) >> 3; 1027bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[8] = (c2 + 3) >> 3; 1037bc9febe8749e98a3812a0dc4380ceae75c29450Johann op[12] = (d2 + 3) >> 3; 1047bc9febe8749e98a3812a0dc4380ceae75c29450Johann 1057bc9febe8749e98a3812a0dc4380ceae75c29450Johann ip++; 1067bc9febe8749e98a3812a0dc4380ceae75c29450Johann op++; 1077bc9febe8749e98a3812a0dc4380ceae75c29450Johann } 10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber} 109