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
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_ports/config.h"
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "dequantize.h"
1479f15823c34ae1e423108295e416213200bb280fAndreas Huber#include "vp8/common/idct.h"
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_mem/vpx_mem.h"
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8_short_idct4x4llm_c(short *input, short *output, int pitch) ;
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern void vp8_short_idct4x4llm_1_c(short *input, short *output, int pitch);
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Hubervoid vp8_dequantize_b_c(BLOCKD *d)
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    short *DQ  = d->dqcoeff;
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    short *Q   = d->qcoeff;
26538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    short *DQC = d->dequant;
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < 16; i++)
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        DQ[i] = Q[i] * DQC[i];
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34f71323e297a928af368937089d3ed71239786f86Andreas Hubervoid vp8_dequant_idct_add_c(short *input, short *dq, unsigned char *pred,
35f71323e297a928af368937089d3ed71239786f86Andreas Huber                            unsigned char *dest, int pitch, int stride)
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
37f71323e297a928af368937089d3ed71239786f86Andreas Huber    short output[16];
38f71323e297a928af368937089d3ed71239786f86Andreas Huber    short *diff_ptr = output;
39f71323e297a928af368937089d3ed71239786f86Andreas Huber    int r, c;
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 0; i < 16; i++)
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        input[i] = dq[i] * input[i];
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* the idct halves ( >> 1) the pitch */
48f71323e297a928af368937089d3ed71239786f86Andreas Huber    vp8_short_idct4x4llm_c(input, output, 4 << 1);
49f71323e297a928af368937089d3ed71239786f86Andreas Huber
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memset(input, 0, 32);
51f71323e297a928af368937089d3ed71239786f86Andreas Huber
52f71323e297a928af368937089d3ed71239786f86Andreas Huber    for (r = 0; r < 4; r++)
53f71323e297a928af368937089d3ed71239786f86Andreas Huber    {
54f71323e297a928af368937089d3ed71239786f86Andreas Huber        for (c = 0; c < 4; c++)
55f71323e297a928af368937089d3ed71239786f86Andreas Huber        {
56f71323e297a928af368937089d3ed71239786f86Andreas Huber            int a = diff_ptr[c] + pred[c];
57f71323e297a928af368937089d3ed71239786f86Andreas Huber
58f71323e297a928af368937089d3ed71239786f86Andreas Huber            if (a < 0)
59f71323e297a928af368937089d3ed71239786f86Andreas Huber                a = 0;
60f71323e297a928af368937089d3ed71239786f86Andreas Huber
61f71323e297a928af368937089d3ed71239786f86Andreas Huber            if (a > 255)
62f71323e297a928af368937089d3ed71239786f86Andreas Huber                a = 255;
63f71323e297a928af368937089d3ed71239786f86Andreas Huber
64f71323e297a928af368937089d3ed71239786f86Andreas Huber            dest[c] = (unsigned char) a;
65f71323e297a928af368937089d3ed71239786f86Andreas Huber        }
66f71323e297a928af368937089d3ed71239786f86Andreas Huber
67f71323e297a928af368937089d3ed71239786f86Andreas Huber        dest += stride;
68f71323e297a928af368937089d3ed71239786f86Andreas Huber        diff_ptr += 4;
69f71323e297a928af368937089d3ed71239786f86Andreas Huber        pred += pitch;
70f71323e297a928af368937089d3ed71239786f86Andreas Huber    }
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
73f71323e297a928af368937089d3ed71239786f86Andreas Hubervoid vp8_dequant_dc_idct_add_c(short *input, short *dq, unsigned char *pred,
74f71323e297a928af368937089d3ed71239786f86Andreas Huber                               unsigned char *dest, int pitch, int stride,
75f71323e297a928af368937089d3ed71239786f86Andreas Huber                               int Dc)
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber{
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    int i;
78f71323e297a928af368937089d3ed71239786f86Andreas Huber    short output[16];
79f71323e297a928af368937089d3ed71239786f86Andreas Huber    short *diff_ptr = output;
80f71323e297a928af368937089d3ed71239786f86Andreas Huber    int r, c;
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    input[0] = (short)Dc;
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    for (i = 1; i < 16; i++)
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        input[i] = dq[i] * input[i];
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    }
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
89538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber    /* the idct halves ( >> 1) the pitch */
90f71323e297a928af368937089d3ed71239786f86Andreas Huber    vp8_short_idct4x4llm_c(input, output, 4 << 1);
91f71323e297a928af368937089d3ed71239786f86Andreas Huber
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_memset(input, 0, 32);
93f71323e297a928af368937089d3ed71239786f86Andreas Huber
94f71323e297a928af368937089d3ed71239786f86Andreas Huber    for (r = 0; r < 4; r++)
95f71323e297a928af368937089d3ed71239786f86Andreas Huber    {
96f71323e297a928af368937089d3ed71239786f86Andreas Huber        for (c = 0; c < 4; c++)
97f71323e297a928af368937089d3ed71239786f86Andreas Huber        {
98f71323e297a928af368937089d3ed71239786f86Andreas Huber            int a = diff_ptr[c] + pred[c];
99f71323e297a928af368937089d3ed71239786f86Andreas Huber
100f71323e297a928af368937089d3ed71239786f86Andreas Huber            if (a < 0)
101f71323e297a928af368937089d3ed71239786f86Andreas Huber                a = 0;
102f71323e297a928af368937089d3ed71239786f86Andreas Huber
103f71323e297a928af368937089d3ed71239786f86Andreas Huber            if (a > 255)
104f71323e297a928af368937089d3ed71239786f86Andreas Huber                a = 255;
105f71323e297a928af368937089d3ed71239786f86Andreas Huber
106f71323e297a928af368937089d3ed71239786f86Andreas Huber            dest[c] = (unsigned char) a;
107f71323e297a928af368937089d3ed71239786f86Andreas Huber        }
108f71323e297a928af368937089d3ed71239786f86Andreas Huber
109f71323e297a928af368937089d3ed71239786f86Andreas Huber        dest += stride;
110f71323e297a928af368937089d3ed71239786f86Andreas Huber        diff_ptr += 4;
111f71323e297a928af368937089d3ed71239786f86Andreas Huber        pred += pitch;
112f71323e297a928af368937089d3ed71239786f86Andreas Huber    }
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
114