1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* 2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Use of this source code is governed by a BSD-style license 5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * that can be found in the LICENSE file in the root of the source 6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * tree. An additional intellectual property rights grant can be found 7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * in the file PATENTS. All contributing project authors may 8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * be found in the AUTHORS file in the root of the source tree. 9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/**************************************************************************** 13474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Notes: 14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * This implementation makes use of 16 bit fixed point verio of two multiply 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * constants: 17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 1. sqrt(2) * cos (pi/8) 18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 2. sqrt(2) * sin (pi/8) 19474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Becuase the first constant is bigger than 1, to maintain the same 16 bit 20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * fixed point precision as the second one, we use a trick of 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * x * a = x + x*(a-1) 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * so 23474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * x * sqrt(2) * cos (pi/8) = x + x * (sqrt(2) *cos(pi/8)-1). 24474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org **************************************************************************/ 25474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic const int cospi8sqrt2minus1 = 20091; 26474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic const int sinpi8sqrt2 = 35468; 27167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 28167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid vp8_short_idct4x4llm_c(short *input, unsigned char *pred_ptr, 29167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int pred_stride, unsigned char *dst_ptr, 30167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int dst_stride) 31474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 32474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 33167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int r, c; 34474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int a1, b1, c1, d1; 35167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org short output[16]; 36474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org short *ip = input; 37474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org short *op = output; 38474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int temp1, temp2; 39167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int shortpitch = 4; 40474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 41474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < 4; i++) 42474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 43474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org a1 = ip[0] + ip[8]; 44474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org b1 = ip[0] - ip[8]; 45474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 46167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org temp1 = (ip[4] * sinpi8sqrt2) >> 16; 47167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org temp2 = ip[12] + ((ip[12] * cospi8sqrt2minus1) >> 16); 48474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org c1 = temp1 - temp2; 49474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 50167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org temp1 = ip[4] + ((ip[4] * cospi8sqrt2minus1) >> 16); 51167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org temp2 = (ip[12] * sinpi8sqrt2) >> 16; 52474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org d1 = temp1 + temp2; 53474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 54474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[shortpitch*0] = a1 + d1; 55474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[shortpitch*3] = a1 - d1; 56474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 57474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[shortpitch*1] = b1 + c1; 58474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[shortpitch*2] = b1 - c1; 59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 60474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ip++; 61474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op++; 62474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ip = output; 65474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op = output; 66474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 67474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < 4; i++) 68474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 69474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org a1 = ip[0] + ip[2]; 70474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org b1 = ip[0] - ip[2]; 71474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 72167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org temp1 = (ip[1] * sinpi8sqrt2) >> 16; 73167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org temp2 = ip[3] + ((ip[3] * cospi8sqrt2minus1) >> 16); 74474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org c1 = temp1 - temp2; 75474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 76167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org temp1 = ip[1] + ((ip[1] * cospi8sqrt2minus1) >> 16); 77167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org temp2 = (ip[3] * sinpi8sqrt2) >> 16; 78474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org d1 = temp1 + temp2; 79474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 80474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 81474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[0] = (a1 + d1 + 4) >> 3; 82474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[3] = (a1 - d1 + 4) >> 3; 83474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 84474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[1] = (b1 + c1 + 4) >> 3; 85474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[2] = (b1 - c1 + 4) >> 3; 86474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 87474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ip += shortpitch; 88474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op += shortpitch; 89474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 90474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 91167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ip = output; 92167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org for (r = 0; r < 4; r++) 93474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 94167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org for (c = 0; c < 4; c++) 95167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 96167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int a = ip[c] + pred_ptr[c] ; 97167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 98167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (a < 0) 99167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org a = 0; 100167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 101167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org if (a > 255) 102167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org a = 255; 103167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 104167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst_ptr[c] = (unsigned char) a ; 105167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 106167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org ip += 4; 107167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst_ptr += dst_stride; 108167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pred_ptr += pred_stride; 109474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 110474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 111474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 112167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid vp8_dc_only_idct_add_c(short input_dc, unsigned char *pred_ptr, 113167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int pred_stride, unsigned char *dst_ptr, 114167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int dst_stride) 115474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 116474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int a1 = ((input_dc + 4) >> 3); 117474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int r, c; 118474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 119474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (r = 0; r < 4; r++) 120474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 121474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (c = 0; c < 4; c++) 122474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 123474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int a = a1 + pred_ptr[c] ; 124474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 125474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (a < 0) 126474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org a = 0; 127474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 128474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org if (a > 255) 129474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org a = 255; 130474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 131474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org dst_ptr[c] = (unsigned char) a ; 132474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 133474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 134167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org dst_ptr += dst_stride; 135167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org pred_ptr += pred_stride; 136474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 137474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 138474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 139474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 140167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid vp8_short_inv_walsh4x4_c(short *input, short *mb_dqcoeff) 141474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 142167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org short output[16]; 143474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 144474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int a1, b1, c1, d1; 145474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int a2, b2, c2, d2; 146474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org short *ip = input; 147474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org short *op = output; 148474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 149474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < 4; i++) 150474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 151474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org a1 = ip[0] + ip[12]; 152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org b1 = ip[4] + ip[8]; 153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org c1 = ip[4] - ip[8]; 154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org d1 = ip[0] - ip[12]; 155474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 156474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[0] = a1 + b1; 157474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[4] = c1 + d1; 158474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[8] = a1 - b1; 159474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[12] = d1 - c1; 160474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ip++; 161474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op++; 162474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 163474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 164474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ip = output; 165474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op = output; 166474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 167474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org for (i = 0; i < 4; i++) 168474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 169474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org a1 = ip[0] + ip[3]; 170474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org b1 = ip[1] + ip[2]; 171474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org c1 = ip[1] - ip[2]; 172474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org d1 = ip[0] - ip[3]; 173474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 174474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org a2 = a1 + b1; 175474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org b2 = c1 + d1; 176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org c2 = a1 - b1; 177474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org d2 = d1 - c1; 178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 179474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[0] = (a2 + 3) >> 3; 180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[1] = (b2 + 3) >> 3; 181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[2] = (c2 + 3) >> 3; 182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op[3] = (d2 + 3) >> 3; 183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org ip += 4; 185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org op += 4; 186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 187167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 188167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org for(i = 0; i < 16; i++) 189167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org { 190167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mb_dqcoeff[i * 16] = output[i]; 191167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 194167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvoid vp8_short_inv_walsh4x4_1_c(short *input, short *mb_dqcoeff) 195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org{ 196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int i; 197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org int a1; 198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org a1 = ((input[0] + 3) >> 3); 200167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org for(i = 0; i < 16; i++) 201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org { 202167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org mb_dqcoeff[i * 16] = a1; 203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 205