159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong/* ------------------------------------------------------------------ 259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * Copyright (C) 1998-2009 PacketVideo 359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * 459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * you may not use this file except in compliance with the License. 659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * You may obtain a copy of the License at 759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * 859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * http://www.apache.org/licenses/LICENSE-2.0 959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * 1059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * Unless required by applicable law or agreed to in writing, software 1159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 1359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * express or implied. 1459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * See the License for the specific language governing permissions 1559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * and limitations under the License. 1659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong * ------------------------------------------------------------------- 1759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong */ 1859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#include "mp4enc_lib.h" 1959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#include "mp4lib_int.h" 2059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#include "dct_inline.h" 2159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 2259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#define FDCT_SHIFT 10 2359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 2459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#ifdef __cplusplus 2559f566c4ec3dfc097ad8163523e522280b27e5c3James Dongextern "C" 2659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong{ 2759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#endif 2859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 2959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**************************************************************************/ 3059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* Function: BlockDCT_AANwSub 3159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Date: 7/31/01 3259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Input: 3359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Output: out[64] ==> next block 3459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Purpose: Do subtraction for zero MV first 3559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Modified: 3659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong **************************************************************************/ 3759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 3859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Void BlockDCT_AANwSub(Short *out, UChar *cur, UChar *pred, Int width) 3959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 4059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Short *dst; 4159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int k0, k1, k2, k3, k4, k5, k6, k7; 4259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int round; 4359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int k12 = 0x022A02D4; 4459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int k14 = 0x0188053A; 4559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int abs_sum; 4659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int mask; 4759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int tmp, tmp2; 4859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int ColTh; 4959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 5059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst = out + 64 ; 5159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong ColTh = *dst; 5259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out += 128; 5359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong round = 1 << (FDCT_SHIFT - 1); 5459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 5559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong do /* fdct_nextrow */ 5659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 5759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assuming the block is word-aligned */ 5859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong mask = 0x1FE; 5959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = *((Int*) cur); /* contains 4 pixels */ 6059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp2 = *((Int*) pred); /* prediction 4 pixels */ 6159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = tmp2 & 0xFF; 6259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mask & (tmp << 1); 6359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k1 - (k0 << 1); 6459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = (tmp2 >> 8) & 0xFF; 6559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = mask & (tmp >> 7); 6659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k2 - (k1 << 1); 6759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = (tmp2 >> 16) & 0xFF; 6859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = mask & (tmp >> 15); 6959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k3 - (k2 << 1); 7059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = (tmp2 >> 24) & 0xFF; 7159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = mask & (tmp >> 23); 7259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k4 - (k3 << 1); 7359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = *((Int*)(cur + 4)); /* another 4 pixels */ 7459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp2 = *((Int*)(pred + 4)); 7559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = tmp2 & 0xFF; 7659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = mask & (tmp << 1); 7759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k5 - (k4 << 1); 7859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = (tmp2 >> 8) & 0xFF; 7959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = mask & (tmp >> 7); 8059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k6 - (k5 << 1); 8159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = (tmp2 >> 16) & 0xFF; 8259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = mask & (tmp >> 15); 8359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k7 - (k6 << 1); 8459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (tmp2 >> 24) & 0xFF; 8559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = mask & (tmp >> 23); 8659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = tmp - (k7 << 1); 8759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong cur += width; 8859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong pred += 16; 8959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 9059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_1 */ 9159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k7; 9259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k0 - (k7 << 1); 9359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k6; 9459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 - (k6 << 1); 9559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k5; 9659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k2 - (k5 << 1); 9759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k3 + k4; 9859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k3 - (k4 << 1); 9959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 10059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k3; 10159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k0 - (k3 << 1); 10259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k2; 10359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k1 - (k2 << 1); 10459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 10559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k1; 10659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k0 - (k1 << 1); 10759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**********/ 10859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[0] = k0; 10959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[4] = k1; /* col. 4 */ 11059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_2 */ 11159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k5; 11259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 11359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k6 + k7; 11459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 11559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* MUL2C k2,k5,724,FDCT_SHIFT */ 11659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 become scratch */ 11759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 11859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla724(k12, k5, round); 11959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla724(k12, k2, round); 12059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 12159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k1 >> FDCT_SHIFT; 12259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k0 >> FDCT_SHIFT; 12359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /*****************/ 12459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 12559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = (k3 << 1) - k2; 12659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 12759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[2] = k2; /* col. 2 */ 12859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 <<= 1; /* scale up col. 6 */ 12959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[6] = k3; /* col. 6 */ 13059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_3 */ 13159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 13259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 13359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 are output */ 13459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k4 - k6; 13559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 13659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla392(k0, k14, round); 13759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla554(k4, k12, k1); 13859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla1338(k6, k14, k1); 13959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 14059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k0 >> FDCT_SHIFT; 14159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 >> FDCT_SHIFT; 14259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /***********************/ 14359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k7; 14459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (k7 << 1) - k5; 14559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k7; 14659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (k7 << 1) - k4; 14759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 14859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 <<= 1; /* scale up col.5 */ 14959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k5 - (k6 << 1); 15059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 15159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[5] = k4; /* col. 5 */ 15259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 <<= 2; /* scale up col. 7 */ 15359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[1] = k5; /* col. 1 */ 15459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[7] = k6; /* col. 7 */ 15559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[3] = k7; /* col. 3 */ 15659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst += 8; 15759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 15859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong while (dst < out); 15959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 16059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out -= 64; 16159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst = out + 8; 16259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 16359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* Vertical Block Loop */ 16459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong do /* Vertical 8xDCT loop */ 16559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 16659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = out[0]; 16759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = out[8]; 16859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = out[16]; 16959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = out[24]; 17059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = out[32]; 17159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = out[40]; 17259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = out[48]; 17359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = out[56]; 17459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* deadzone thresholding for column */ 17559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 17659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7); 17759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 17859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if (abs_sum < ColTh) 17959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 18059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[0] = 0x7fff; 18159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out++; 18259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong continue; 18359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 18459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 18559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_1 */ 18659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k7; 18759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k0 - (k7 << 1); 18859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k6; 18959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 - (k6 << 1); 19059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k5; 19159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k2 - (k5 << 1); 19259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k3 + k4; 19359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k3 - (k4 << 1); 19459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 19559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k3; 19659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k0 - (k3 << 1); 19759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k2; 19859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k1 - (k2 << 1); 19959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 20059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k1; 20159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k0 - (k1 << 1); 20259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**********/ 20359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[32] = k1; /* row 4 */ 20459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[0] = k0; /* row 0 */ 20559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_2 */ 20659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k5; 20759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 20859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k6 + k7; 20959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 21059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* MUL2C k2,k5,724,FDCT_SHIFT */ 21159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 become scratch */ 21259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 21359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla724(k12, k5, round); 21459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla724(k12, k2, round); 21559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 21659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k1 >> FDCT_SHIFT; 21759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k0 >> FDCT_SHIFT; 21859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /*****************/ 21959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 22059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = (k3 << 1) - k2; 22159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 <<= 1; /* scale up col. 6 */ 22259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 22359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[48] = k3; /* row 6 */ 22459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[16] = k2; /* row 2 */ 22559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_3 */ 22659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 22759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 22859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 are output */ 22959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k4 - k6; 23059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 23159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla392(k0, k14, round); 23259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla554(k4, k12, k1); 23359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla1338(k6, k14, k1); 23459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 23559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k0 >> FDCT_SHIFT; 23659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 >> FDCT_SHIFT; 23759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /***********************/ 23859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k7; 23959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (k7 << 1) - k5; 24059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k7; 24159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (k7 << 1) - k4; 24259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 24359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 <<= 1; /* scale up col. 5 */ 24459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k5 - (k6 << 1); 24559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 24659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[24] = k7 ; /* row 3 */ 24759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 <<= 2; /* scale up col. 7 */ 24859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[56] = k6 ; /* row 7 */ 24959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[8] = k5 ; /* row 1 */ 25059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[40] = k4 ; /* row 5 */ 25159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out++; 25259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 253377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT while ((uintptr_t)out < (uintptr_t)dst) ; 25459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 25559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong return ; 25659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 25759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 25859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**************************************************************************/ 25959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* Function: Block4x4DCT_AANwSub 26059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Date: 7/31/01 26159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Input: 26259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Output: out[64] ==> next block 26359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Purpose: Do subtraction for zero MV first before 4x4 DCT 26459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Modified: 26559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong **************************************************************************/ 26659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 26759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Void Block4x4DCT_AANwSub(Short *out, UChar *cur, UChar *pred, Int width) 26859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 26959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Short *dst; 27059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong register Int k0, k1, k2, k3, k4, k5, k6, k7; 27159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int round; 27259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int k12 = 0x022A02D4; 27359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int k14 = 0x0188053A; 27459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int mask; 27559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int tmp, tmp2; 27659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int abs_sum; 27759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int ColTh; 27859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 27959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst = out + 64 ; 28059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong ColTh = *dst; 28159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out += 128; 28259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong round = 1 << (FDCT_SHIFT - 1); 28359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 28459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong do /* fdct_nextrow */ 28559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 28659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assuming the block is word-aligned */ 28759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong mask = 0x1FE; 28859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = *((Int*) cur); /* contains 4 pixels */ 28959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp2 = *((Int*) pred); /* prediction 4 pixels */ 29059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = tmp2 & 0xFF; 29159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mask & (tmp << 1); 29259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k1 - (k0 << 1); 29359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = (tmp2 >> 8) & 0xFF; 29459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = mask & (tmp >> 7); 29559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k2 - (k1 << 1); 29659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = (tmp2 >> 16) & 0xFF; 29759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = mask & (tmp >> 15); 29859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k3 - (k2 << 1); 29959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = (tmp2 >> 24) & 0xFF; 30059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = mask & (tmp >> 23); 30159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k4 - (k3 << 1); 30259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = *((Int*)(cur + 4)); /* another 4 pixels */ 30359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp2 = *((Int*)(pred + 4)); 30459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = tmp2 & 0xFF; 30559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = mask & (tmp << 1); 30659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k5 - (k4 << 1); 30759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = (tmp2 >> 8) & 0xFF; 30859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = mask & (tmp >> 7); 30959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k6 - (k5 << 1); 31059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = (tmp2 >> 16) & 0xFF; 31159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = mask & (tmp >> 15); 31259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k7 - (k6 << 1); 31359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (tmp2 >> 24) & 0xFF; 31459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = mask & (tmp >> 23); 31559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = tmp - (k7 << 1); 31659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong cur += width; 31759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong pred += 16; 31859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 31959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_1 */ 32059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k7; 32159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k0 - (k7 << 1); 32259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k6; 32359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 - (k6 << 1); 32459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k5; 32559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k2 - (k5 << 1); 32659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k3 + k4; 32759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k3 - (k4 << 1); 32859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 32959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k3; 33059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k0 - (k3 << 1); 33159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k2; 33259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k1 - (k2 << 1); 33359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 33459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k1; 33559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**********/ 33659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[0] = k0; 33759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_2 */ 33859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k5; 33959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 34059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k6 + k7; 34159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 34259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* MUL2C k2,k5,724,FDCT_SHIFT */ 34359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 become scratch */ 34459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 34559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla724(k12, k5, round); 34659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla724(k12, k2, round); 34759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 34859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k1 >> FDCT_SHIFT; 34959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k0 >> FDCT_SHIFT; 35059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /*****************/ 35159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 35259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 35359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[2] = k2; /* col. 2 */ 35459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_3 */ 35559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 35659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 35759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 are output */ 35859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k4 - k6; 35959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 36059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla392(k0, k14, round); 36159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla554(k4, k12, k1); 36259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla1338(k6, k14, k1); 36359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 36459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k0 >> FDCT_SHIFT; 36559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 >> FDCT_SHIFT; 36659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /***********************/ 36759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k7; 36859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (k7 << 1) - k5; 36959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k7 - k4; 37059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 37159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 37259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[1] = k5; /* col. 1 */ 37359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[3] = k7; /* col. 3 */ 37459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst += 8; 37559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 37659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong while (dst < out); 37759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 37859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out -= 64; 37959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst = out + 4; 38059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 38159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* Vertical Block Loop */ 38259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong do /* Vertical 8xDCT loop */ 38359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 38459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = out[0]; 38559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = out[8]; 38659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = out[16]; 38759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = out[24]; 38859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = out[32]; 38959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = out[40]; 39059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = out[48]; 39159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = out[56]; 39259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 39359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7); 39459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 39559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if (abs_sum < ColTh) 39659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 39759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[0] = 0x7fff; 39859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out++; 39959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong continue; 40059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 40159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_1 */ 40259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k7; 40359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k0 - (k7 << 1); 40459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k6; 40559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 - (k6 << 1); 40659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k5; 40759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k2 - (k5 << 1); 40859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k3 + k4; 40959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k3 - (k4 << 1); 41059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 41159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k3; 41259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k0 - (k3 << 1); 41359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k2; 41459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k1 - (k2 << 1); 41559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 41659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k1; 41759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**********/ 41859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[0] = k0; /* row 0 */ 41959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_2 */ 42059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k5; 42159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 42259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k6 + k7; 42359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 42459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* MUL2C k2,k5,724,FDCT_SHIFT */ 42559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 become scratch */ 42659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 42759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla724(k12, k5, round); 42859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla724(k12, k2, round); 42959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 43059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k1 >> FDCT_SHIFT; 43159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k0 >> FDCT_SHIFT; 43259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /*****************/ 43359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 43459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 43559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[16] = k2; /* row 2 */ 43659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_3 */ 43759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 43859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 43959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 are output */ 44059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k4 - k6; 44159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 44259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla392(k0, k14, round); 44359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla554(k4, k12, k1); 44459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla1338(k6, k14, k1); 44559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 44659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k0 >> FDCT_SHIFT; 44759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 >> FDCT_SHIFT; 44859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /***********************/ 44959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k7; 45059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (k7 << 1) - k5; 45159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k7 - k4 ; 45259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 45359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 45459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[24] = k7 ; /* row 3 */ 45559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[8] = k5 ; /* row 1 */ 45659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out++; 45759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 458377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT while ((uintptr_t)out < (uintptr_t)dst) ; 45959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 46059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong return ; 46159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 46259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 46359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**************************************************************************/ 46459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* Function: Block2x2DCT_AANwSub 46559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Date: 7/31/01 46659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Input: 46759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Output: out[64] ==> next block 46859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Purpose: Do subtraction for zero MV first before 2x2 DCT 46959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Modified: 47059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong **************************************************************************/ 47159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 47259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 47359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Void Block2x2DCT_AANwSub(Short *out, UChar *cur, UChar *pred, Int width) 47459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 47559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Short *dst; 47659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong register Int k0, k1, k2, k3, k4, k5, k6, k7; 47759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int round; 47859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int k12 = 0x022A02D4; 47959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int k14 = 0x018803B2; 48059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int mask; 48159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int tmp, tmp2; 48259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int abs_sum; 48359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int ColTh; 48459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 48559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst = out + 64 ; 48659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong ColTh = *dst; 48759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out += 128; 48859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong round = 1 << (FDCT_SHIFT - 1); 48959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 49059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong do /* fdct_nextrow */ 49159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 49259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assuming the block is word-aligned */ 49359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong mask = 0x1FE; 49459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = *((Int*) cur); /* contains 4 pixels */ 49559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp2 = *((Int*) pred); /* prediction 4 pixels */ 49659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = tmp2 & 0xFF; 49759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mask & (tmp << 1); 49859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k1 - (k0 << 1); 49959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = (tmp2 >> 8) & 0xFF; 50059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = mask & (tmp >> 7); 50159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k2 - (k1 << 1); 50259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = (tmp2 >> 16) & 0xFF; 50359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = mask & (tmp >> 15); 50459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k3 - (k2 << 1); 50559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = (tmp2 >> 24) & 0xFF; 50659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = mask & (tmp >> 23); 50759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k4 - (k3 << 1); 50859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = *((Int*)(cur + 4)); /* another 4 pixels */ 50959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp2 = *((Int*)(pred + 4)); 51059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = tmp2 & 0xFF; 51159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = mask & (tmp << 1); 51259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k5 - (k4 << 1); 51359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = (tmp2 >> 8) & 0xFF; 51459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = mask & (tmp >> 7); 51559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k6 - (k5 << 1); 51659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = (tmp2 >> 16) & 0xFF; 51759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = mask & (tmp >> 15); 51859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k7 - (k6 << 1); 51959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (tmp2 >> 24) & 0xFF; 52059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = mask & (tmp >> 23); 52159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = tmp - (k7 << 1); 52259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong cur += width; 52359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong pred += 16; 52459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 52559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_1 */ 52659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k7; 52759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k0 - (k7 << 1); 52859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k6; 52959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 - (k6 << 1); 53059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k5; 53159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k2 - (k5 << 1); 53259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k3 + k4; 53359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k3 - (k4 << 1); 53459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 53559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k3; 53659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k0 - (k3 << 1); 53759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k2; 53859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k1 - (k2 << 1); 53959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 54059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k1; 54159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**********/ 54259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[0] = k0; 54359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_2 */ 54459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k5; 54559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 54659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k6 + k7; 54759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* MUL2C k2,k5,724,FDCT_SHIFT */ 54859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 become scratch */ 54959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 55059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla724(k12, k5, round); 55159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 55259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k1 >> FDCT_SHIFT; 55359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /*****************/ 55459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 55559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_3 */ 55659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 55759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 55859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 are output */ 55959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla392(k4, k14, round); 56059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla946(k6, k14, k1); 56159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 56259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 >> FDCT_SHIFT; 56359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /***********************/ 56459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k7; 56559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 56659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 56759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[1] = k5; 56859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst += 8; 56959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 57059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong while (dst < out); 57159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out -= 64; 57259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst = out + 2; 57359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* Vertical Block Loop */ 57459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong do /* Vertical 8xDCT loop */ 57559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 57659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = out[0]; 57759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = out[8]; 57859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = out[16]; 57959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = out[24]; 58059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = out[32]; 58159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = out[40]; 58259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = out[48]; 58359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = out[56]; 58459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 58559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7); 58659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 58759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if (abs_sum < ColTh) 58859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 58959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[0] = 0x7fff; 59059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out++; 59159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong continue; 59259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 59359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_1 */ 59459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k7; 59559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k0 - (k7 << 1); 59659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k6; 59759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 - (k6 << 1); 59859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k5; 59959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k2 - (k5 << 1); 60059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k3 + k4; 60159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k3 - (k4 << 1); 60259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 60359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k3; 60459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k0 - (k3 << 1); 60559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k2; 60659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k1 - (k2 << 1); 60759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 60859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k1; 60959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**********/ 61059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[0] = k0; /* row 0 */ 61159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_2 */ 61259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k5; 61359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 61459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k6 + k7; 61559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* MUL2C k2,k5,724,FDCT_SHIFT */ 61659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 become scratch */ 61759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 61859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla724(k12, k5, round); 61959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 62059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k1 >> FDCT_SHIFT; 62159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /*****************/ 62259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 62359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_3 */ 62459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 62559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 62659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 are output */ 62759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla392(k4, k14, round); 62859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla946(k6, k14, k1); 62959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 63059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 >> FDCT_SHIFT; 63159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /***********************/ 63259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k7; 63359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 63459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 63559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[8] = k5 ; /* row 1 */ 63659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out++; 63759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 638377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT while ((uintptr_t)out < (uintptr_t)dst) ; 63959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 64059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong return ; 64159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 64259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 64359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**************************************************************************/ 64459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* Function: BlockDCT_AANIntra 64559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Date: 8/9/01 64659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Input: rec 64759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Output: out[64] ==> next block 64859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Purpose: Input directly from rec frame. 64959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Modified: 65059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong **************************************************************************/ 65159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 65259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Void BlockDCT_AANIntra(Short *out, UChar *cur, UChar *dummy2, Int width) 65359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 65459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Short *dst; 65559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int k0, k1, k2, k3, k4, k5, k6, k7; 65659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int round; 65759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int k12 = 0x022A02D4; 65859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int k14 = 0x0188053A; 65959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int abs_sum; 66059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int mask; 66159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int *curInt, tmp; 66259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int ColTh; 66359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 66459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong OSCL_UNUSED_ARG(dummy2); 66559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 66659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst = out + 64 ; 66759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong ColTh = *dst; 66859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out += 128; 66959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong round = 1 << (FDCT_SHIFT - 1); 67059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 67159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong do /* fdct_nextrow */ 67259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 67359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong mask = 0x1FE; 67459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong curInt = (Int*) cur; 67559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = curInt[0]; /* contains 4 pixels */ 67659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mask & (tmp << 1); 67759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mask & (tmp >> 7); 67859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = mask & (tmp >> 15); 67959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = mask & (tmp >> 23); 68059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = curInt[1]; /* another 4 pixels */ 68159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = mask & (tmp << 1); 68259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = mask & (tmp >> 7); 68359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = mask & (tmp >> 15); 68459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = mask & (tmp >> 23); 68559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong cur += width; 68659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_1 */ 68759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k7; 68859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k0 - (k7 << 1); 68959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k6; 69059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 - (k6 << 1); 69159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k5; 69259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k2 - (k5 << 1); 69359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k3 + k4; 69459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k3 - (k4 << 1); 69559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 69659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k3; 69759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k0 - (k3 << 1); 69859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k2; 69959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k1 - (k2 << 1); 70059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 70159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k1; 70259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k0 - (k1 << 1); 70359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**********/ 70459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[0] = k0; 70559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[4] = k1; /* col. 4 */ 70659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_2 */ 70759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k5; 70859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 70959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k6 + k7; 71059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 71159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* MUL2C k2,k5,724,FDCT_SHIFT */ 71259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 become scratch */ 71359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 71459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla724(k12, k5, round); 71559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla724(k12, k2, round); 71659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 71759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k1 >> FDCT_SHIFT; 71859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k0 >> FDCT_SHIFT; 71959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /*****************/ 72059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 72159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = (k3 << 1) - k2; 72259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 72359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[2] = k2; /* col. 2 */ 72459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 <<= 1; /* scale up col. 6 */ 72559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[6] = k3; /* col. 6 */ 72659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_3 */ 72759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 72859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 72959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 are output */ 73059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k4 - k6; 73159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 73259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla392(k0, k14, round); 73359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla554(k4, k12, k1); 73459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla1338(k6, k14, k1); 73559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 73659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k0 >> FDCT_SHIFT; 73759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 >> FDCT_SHIFT; 73859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /***********************/ 73959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k7; 74059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (k7 << 1) - k5; 74159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k7; 74259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (k7 << 1) - k4; 74359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 74459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 <<= 1; /* scale up col.5 */ 74559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k5 - (k6 << 1); 74659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 74759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[5] = k4; /* col. 5 */ 74859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 <<= 2; /* scale up col. 7 */ 74959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[1] = k5; /* col. 1 */ 75059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[7] = k6; /* col. 7 */ 75159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[3] = k7; /* col. 3 */ 75259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst += 8; 75359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 75459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong while (dst < out); 75559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 75659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out -= 64; 75759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst = out + 8; 75859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 75959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* Vertical Block Loop */ 76059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong do /* Vertical 8xDCT loop */ 76159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 76259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = out[0]; 76359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = out[8]; 76459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = out[16]; 76559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = out[24]; 76659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = out[32]; 76759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = out[40]; 76859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = out[48]; 76959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = out[56]; 77059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* deadzone thresholding for column */ 77159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 77259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7); 77359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 77459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if (abs_sum < ColTh) 77559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 77659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[0] = 0x7fff; 77759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out++; 77859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong continue; 77959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 78059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 78159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_1 */ 78259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k7; 78359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k0 - (k7 << 1); 78459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k6; 78559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 - (k6 << 1); 78659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k5; 78759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k2 - (k5 << 1); 78859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k3 + k4; 78959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k3 - (k4 << 1); 79059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 79159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k3; 79259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k0 - (k3 << 1); 79359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k2; 79459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k1 - (k2 << 1); 79559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 79659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k1; 79759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k0 - (k1 << 1); 79859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**********/ 79959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[32] = k1; /* row 4 */ 80059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[0] = k0; /* row 0 */ 80159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_2 */ 80259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k5; 80359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 80459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k6 + k7; 80559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 80659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* MUL2C k2,k5,724,FDCT_SHIFT */ 80759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 become scratch */ 80859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 80959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla724(k12, k5, round); 81059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla724(k12, k2, round); 81159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 81259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k1 >> FDCT_SHIFT; 81359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k0 >> FDCT_SHIFT; 81459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /*****************/ 81559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 81659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = (k3 << 1) - k2; 81759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 <<= 1; /* scale up col. 6 */ 81859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 81959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[48] = k3; /* row 6 */ 82059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[16] = k2; /* row 2 */ 82159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_3 */ 82259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 82359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 82459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 are output */ 82559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k4 - k6; 82659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 82759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla392(k0, k14, round); 82859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla554(k4, k12, k1); 82959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla1338(k6, k14, k1); 83059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 83159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k0 >> FDCT_SHIFT; 83259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 >> FDCT_SHIFT; 83359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /***********************/ 83459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k7; 83559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (k7 << 1) - k5; 83659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k7; 83759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (k7 << 1) - k4; 83859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 83959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 <<= 1; /* scale up col. 5 */ 84059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k5 - (k6 << 1); 84159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 84259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[24] = k7 ; /* row 3 */ 84359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 <<= 2; /* scale up col. 7 */ 84459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[56] = k6 ; /* row 7 */ 84559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[8] = k5 ; /* row 1 */ 84659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[40] = k4 ; /* row 5 */ 84759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out++; 84859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 849377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT while ((uintptr_t)out < (uintptr_t)dst) ; 85059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 85159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong return ; 85259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 85359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 85459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**************************************************************************/ 85559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* Function: Block4x4DCT_AANIntra 85659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Date: 8/9/01 85759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Input: prev 85859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Output: out[64] ==> next block 85959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Purpose: Input directly from prev frame. output 2x2 DCT 86059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Modified: 86159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong **************************************************************************/ 86259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 86359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Void Block4x4DCT_AANIntra(Short *out, UChar *cur, UChar *dummy2, Int width) 86459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 86559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Short *dst; 86659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong register Int k0, k1, k2, k3, k4, k5, k6, k7; 86759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int round; 86859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int k12 = 0x022A02D4; 86959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int k14 = 0x0188053A; 87059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int mask; 87159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int *curInt, tmp; 87259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int abs_sum; 87359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int ColTh; 87459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 87559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong OSCL_UNUSED_ARG(dummy2); 87659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 87759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst = out + 64 ; 87859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong ColTh = *dst; 87959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out += 128; 88059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong round = 1 << (FDCT_SHIFT - 1); 88159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 88259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong do /* fdct_nextrow */ 88359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 88459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong mask = 0x1FE; 88559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong curInt = (Int*) cur; 88659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = curInt[0]; /* contains 4 pixels */ 88759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mask & (tmp << 1); 88859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mask & (tmp >> 7); 88959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = mask & (tmp >> 15); 89059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = mask & (tmp >> 23); 89159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = curInt[1]; /* another 4 pixels */ 89259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = mask & (tmp << 1); 89359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = mask & (tmp >> 7); 89459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = mask & (tmp >> 15); 89559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = mask & (tmp >> 23); 89659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong cur += width; 89759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_1 */ 89859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k7; 89959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k0 - (k7 << 1); 90059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k6; 90159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 - (k6 << 1); 90259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k5; 90359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k2 - (k5 << 1); 90459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k3 + k4; 90559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k3 - (k4 << 1); 90659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 90759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k3; 90859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k0 - (k3 << 1); 90959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k2; 91059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k1 - (k2 << 1); 91159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 91259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k1; 91359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**********/ 91459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[0] = k0; 91559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_2 */ 91659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k5; 91759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 91859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k6 + k7; 91959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 92059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* MUL2C k2,k5,724,FDCT_SHIFT */ 92159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 become scratch */ 92259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 92359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla724(k12, k5, round); 92459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla724(k12, k2, round); 92559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 92659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k1 >> FDCT_SHIFT; 92759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k0 >> FDCT_SHIFT; 92859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /*****************/ 92959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 93059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 93159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[2] = k2; /* col. 2 */ 93259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_3 */ 93359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 93459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 93559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 are output */ 93659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k4 - k6; 93759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 93859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla392(k0, k14, round); 93959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla554(k4, k12, k1); 94059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla1338(k6, k14, k1); 94159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 94259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k0 >> FDCT_SHIFT; 94359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 >> FDCT_SHIFT; 94459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /***********************/ 94559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k7; 94659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (k7 << 1) - k5; 94759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k7 - k4; 94859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 94959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 95059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[1] = k5; /* col. 1 */ 95159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[3] = k7; /* col. 3 */ 95259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst += 8; 95359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 95459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong while (dst < out); 95559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 95659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out -= 64; 95759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst = out + 4; 95859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 95959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* Vertical Block Loop */ 96059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong do /* Vertical 8xDCT loop */ 96159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 96259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = out[0]; 96359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = out[8]; 96459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = out[16]; 96559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = out[24]; 96659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = out[32]; 96759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = out[40]; 96859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = out[48]; 96959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = out[56]; 97059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 97159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7); 97259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 97359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if (abs_sum < ColTh) 97459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 97559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[0] = 0x7fff; 97659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out++; 97759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong continue; 97859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 97959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_1 */ 98059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k7; 98159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k0 - (k7 << 1); 98259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k6; 98359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 - (k6 << 1); 98459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k5; 98559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k2 - (k5 << 1); 98659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k3 + k4; 98759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k3 - (k4 << 1); 98859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 98959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k3; 99059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k0 - (k3 << 1); 99159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k2; 99259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k1 - (k2 << 1); 99359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 99459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k1; 99559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**********/ 99659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[0] = k0; /* row 0 */ 99759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_2 */ 99859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k5; 99959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 100059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k6 + k7; 100159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 100259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* MUL2C k2,k5,724,FDCT_SHIFT */ 100359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 become scratch */ 100459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 100559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla724(k12, k5, round); 100659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla724(k12, k2, round); 100759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 100859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k1 >> FDCT_SHIFT; 100959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k0 >> FDCT_SHIFT; 101059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /*****************/ 101159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k3; 101259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 101359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[16] = k2; /* row 2 */ 101459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_3 */ 101559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 101659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 101759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 are output */ 101859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k4 - k6; 101959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 102059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla392(k0, k14, round); 102159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mla554(k4, k12, k1); 102259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla1338(k6, k14, k1); 102359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 102459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k0 >> FDCT_SHIFT; 102559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 >> FDCT_SHIFT; 102659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /***********************/ 102759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k7; 102859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = (k7 << 1) - k5; 102959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k7 - k4 ; 103059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 103159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 103259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[24] = k7 ; /* row 3 */ 103359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[8] = k5 ; /* row 1 */ 103459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out++; 103559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 1036377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT while ((uintptr_t)out < (uintptr_t)dst) ; 103759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 103859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong return ; 103959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 104059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 104159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**************************************************************************/ 104259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* Function: Block2x2DCT_AANIntra 104359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Date: 8/9/01 104459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Input: prev 104559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Output: out[64] ==> next block 104659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Purpose: Input directly from prev frame. output 2x2 DCT 104759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Modified: 104859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong **************************************************************************/ 104959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 105059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Void Block2x2DCT_AANIntra(Short *out, UChar *cur, UChar *dummy2, Int width) 105159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 105259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Short *dst; 105359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong register Int k0, k1, k2, k3, k4, k5, k6, k7; 105459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int round; 105559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int k12 = 0x022A02D4; 105659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int k14 = 0x018803B2; 105759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int mask; 105859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int *curInt, tmp; 105959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int abs_sum; 106059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int ColTh; 106159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 106259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong OSCL_UNUSED_ARG(dummy2); 106359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 106459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst = out + 64 ; 106559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong ColTh = *dst; 106659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out += 128; 106759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong round = 1 << (FDCT_SHIFT - 1); 106859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 106959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong do /* fdct_nextrow */ 107059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 107159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong mask = 0x1FE; 107259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong curInt = (Int*) cur; 107359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = curInt[0]; /* contains 4 pixels */ 107459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = mask & (tmp << 1); 107559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mask & (tmp >> 7); 107659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = mask & (tmp >> 15); 107759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = mask & (tmp >> 23); 107859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong tmp = curInt[1]; /* another 4 pixels */ 107959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = mask & (tmp << 1); 108059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = mask & (tmp >> 7); 108159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = mask & (tmp >> 15); 108259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = mask & (tmp >> 23); 108359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong cur += width; 108459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 108559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_1 */ 108659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k7; 108759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k0 - (k7 << 1); 108859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k6; 108959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 - (k6 << 1); 109059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k5; 109159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k2 - (k5 << 1); 109259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k3 + k4; 109359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k3 - (k4 << 1); 109459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 109559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k3; 109659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k0 - (k3 << 1); 109759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k2; 109859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k1 - (k2 << 1); 109959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 110059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k1; 110159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**********/ 110259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[0] = k0; 110359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_2 */ 110459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k5; 110559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 110659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k6 + k7; 110759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* MUL2C k2,k5,724,FDCT_SHIFT */ 110859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 become scratch */ 110959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 111059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla724(k12, k5, round); 111159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 111259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k1 >> FDCT_SHIFT; 111359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /*****************/ 111459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 111559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_3 */ 111659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 111759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 111859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 are output */ 111959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla392(k4, k14, round); 112059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla946(k6, k14, k1); 112159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 112259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 >> FDCT_SHIFT; 112359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /***********************/ 112459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k7; 112559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 112659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 112759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst[1] = k5; 112859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst += 8; 112959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 113059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong while (dst < out); 113159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out -= 64; 113259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong dst = out + 2; 113359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* Vertical Block Loop */ 113459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong do /* Vertical 8xDCT loop */ 113559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 113659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = out[0]; 113759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = out[8]; 113859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = out[16]; 113959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = out[24]; 114059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = out[32]; 114159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = out[40]; 114259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = out[48]; 114359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = out[56]; 114459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 114559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7); 114659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 114759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong if (abs_sum < ColTh) 114859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 114959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[0] = 0x7fff; 115059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out++; 115159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong continue; 115259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 115359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_1 */ 115459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k7; 115559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k7 = k0 - (k7 << 1); 115659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k6; 115759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 - (k6 << 1); 115859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k2 + k5; 115959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k2 - (k5 << 1); 116059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k3 + k4; 116159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k3 - (k4 << 1); 116259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 116359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k3; 116459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k3 = k0 - (k3 << 1); 116559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = k1 + k2; 116659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k2 = k1 - (k2 << 1); 116759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 116859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k0 = k0 + k1; 116959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**********/ 117059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[0] = k0; /* row 0 */ 117159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_2 */ 117259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k4 = k4 + k5; 117359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 117459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k6 + k7; 117559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* MUL2C k2,k5,724,FDCT_SHIFT */ 117659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 become scratch */ 117759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 117859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla724(k12, k5, round); 117959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 118059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k1 >> FDCT_SHIFT; 118159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /*****************/ 118259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 118359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* fdct_3 */ 118459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 118559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* assume FAST MULTIPLY */ 118659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* k0, k1 are output */ 118759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla392(k4, k14, round); 118859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k1 = mla946(k6, k14, k1); 118959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 119059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k6 = k1 >> FDCT_SHIFT; 119159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /***********************/ 119259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k7; 119359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong k5 = k5 + k6; 119459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /********/ 119559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[8] = k5 ; /* row 1 */ 119659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out++; 119759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 1198377b2ec9a2885f9b6405b07ba900a9e3f4349c38Kévin PETIT while ((uintptr_t)out < (uintptr_t)dst) ; 119959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 120059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong return ; 120159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 120259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**************************************************************************/ 120359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* Function: Block1x1DCTwSub 120459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Date: 8/9/01 120559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Input: block 120659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Output: y 120759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Purpose: Compute DC value only 120859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Modified: 120959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong **************************************************************************/ 121059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong void Block1x1DCTwSub(Short *out, UChar *cur, UChar *pred, Int width) 121159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 121259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong UChar *end; 121359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int temp = 0; 121459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int offset2; 121559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 121659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong offset2 = width - 8; 121759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong end = pred + (16 << 3); 121859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong do 121959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 122059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += (*cur++ - *pred++); 122159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += (*cur++ - *pred++); 122259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += (*cur++ - *pred++); 122359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += (*cur++ - *pred++); 122459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += (*cur++ - *pred++); 122559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += (*cur++ - *pred++); 122659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += (*cur++ - *pred++); 122759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += (*cur++ - *pred++); 122859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong cur += offset2; 122959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong pred += 8; 123059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 123159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong while (pred < end) ; 123259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 123359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[1] = out[2] = out[3] = out[4] = out[5] = out[6] = out[7] = 0; 123459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[0] = temp >> 3; 123559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 123659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong return ; 123759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 123859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 123959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /**************************************************************************/ 124059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong /* Function: Block1x1DCTIntra 124159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Date: 8/9/01 124259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Input: prev 124359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Output: out 124459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Purpose: Compute DC value only 124559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Modified: 124659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong **************************************************************************/ 124759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong void Block1x1DCTIntra(Short *out, UChar *cur, UChar *dummy2, Int width) 124859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 124959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong UChar *end; 125059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong Int temp = 0; 125159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong ULong word; 125259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 125359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong OSCL_UNUSED_ARG(dummy2); 125459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 125559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong end = cur + (width << 3); 125659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong do 125759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong { 125859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong word = *((ULong*)cur); 125959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += (word >> 24); 126059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += ((word >> 16) & 0xFF); 126159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += ((word >> 8) & 0xFF); 126259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += (word & 0xFF); 126359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 126459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong word = *((ULong*)(cur + 4)); 126559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += (word >> 24); 126659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += ((word >> 16) & 0xFF); 126759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += ((word >> 8) & 0xFF); 126859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong temp += (word & 0xFF); 126959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 127059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong cur += width; 127159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 127259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong while (cur < end) ; 127359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 127459f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[1] = out[2] = out[3] = out[4] = out[5] = out[6] = out[7] = 0; 127559f566c4ec3dfc097ad8163523e522280b27e5c3James Dong out[0] = temp >> 3; 127659f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 127759f566c4ec3dfc097ad8163523e522280b27e5c3James Dong return ; 127859f566c4ec3dfc097ad8163523e522280b27e5c3James Dong } 127959f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 128059f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#ifdef __cplusplus 128159f566c4ec3dfc097ad8163523e522280b27e5c3James Dong} 128259f566c4ec3dfc097ad8163523e522280b27e5c3James Dong#endif 128359f566c4ec3dfc097ad8163523e522280b27e5c3James Dong 1284