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