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