dct.cpp revision 377b2ec9a2885f9b6405b07ba900a9e3f4349c38
1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* ------------------------------------------------------------------ 2d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines * Copyright (C) 1998-2009 PacketVideo 3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License. 6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at 7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software 11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * express or implied. 14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions 15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * and limitations under the License. 16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * ------------------------------------------------------------------- 176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr */ 186315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "mp4enc_lib.h" 19e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "mp4lib_int.h" 206315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "dct_inline.h" 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 2243730fe3c839af391efe6bdf56b0479860121924Shih-wei Liao#define FDCT_SHIFT 10 2323c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 24e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#ifdef __cplusplus 25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaoextern "C" 269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao{ 2723c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines#endif 2823c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines 2923c4358f12bd9d0ba7166eceebd683db95a41b3fStephen Hines /**************************************************************************/ 300a3f20ec28ed6f5ae1ed5d61f6b6e3e577f7f5d1Shih-wei Liao /* Function: BlockDCT_AANwSub 316e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines Date: 7/31/01 326315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr Input: 336315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr Output: out[64] ==> next block 34d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines Purpose: Do subtraction for zero MV first 35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Modified: 36641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang **************************************************************************/ 37641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 38641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang Void BlockDCT_AANwSub(Short *out, UChar *cur, UChar *pred, Int width) 39641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang { 40e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines Short *dst; 41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Int k0, k1, k2, k3, k4, k5, k6, k7; 42e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines Int round; 43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Int k12 = 0x022A02D4; 447682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala Int k14 = 0x0188053A; 457682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala Int abs_sum; 467682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala Int mask; 477682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala Int tmp, tmp2; 487682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala Int ColTh; 497682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 507682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala dst = out + 64 ; 517682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala ColTh = *dst; 527682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala out += 128; 537682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala round = 1 << (FDCT_SHIFT - 1); 547682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 557682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala do /* fdct_nextrow */ 567682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala { 577682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala /* assuming the block is word-aligned */ 587682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala mask = 0x1FE; 597682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala tmp = *((Int*) cur); /* contains 4 pixels */ 60fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines tmp2 = *((Int*) pred); /* prediction 4 pixels */ 617682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k0 = tmp2 & 0xFF; 627682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k1 = mask & (tmp << 1); 637682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k0 = k1 - (k0 << 1); 647682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k1 = (tmp2 >> 8) & 0xFF; 657682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k2 = mask & (tmp >> 7); 667682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k1 = k2 - (k1 << 1); 677682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k2 = (tmp2 >> 16) & 0xFF; 687682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k3 = mask & (tmp >> 15); 697682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k2 = k3 - (k2 << 1); 707682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k3 = (tmp2 >> 24) & 0xFF; 717682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k4 = mask & (tmp >> 23); 727682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k3 = k4 - (k3 << 1); 737682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala tmp = *((Int*)(cur + 4)); /* another 4 pixels */ 747682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala tmp2 = *((Int*)(pred + 4)); 757682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k4 = tmp2 & 0xFF; 767682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k5 = mask & (tmp << 1); 777682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k4 = k5 - (k4 << 1); 785f3da4bf52b327dbf5b6a33f340196f43d542159Nicolas Collin k5 = (tmp2 >> 8) & 0xFF; 795f3da4bf52b327dbf5b6a33f340196f43d542159Nicolas Collin k6 = mask & (tmp >> 7); 805f3da4bf52b327dbf5b6a33f340196f43d542159Nicolas Collin k5 = k6 - (k5 << 1); 817682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k6 = (tmp2 >> 16) & 0xFF; 827682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k7 = mask & (tmp >> 15); 837682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k6 = k7 - (k6 << 1); 847682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k7 = (tmp2 >> 24) & 0xFF; 857682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala tmp = mask & (tmp >> 23); 867682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k7 = tmp - (k7 << 1); 877682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala cur += width; 887682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala pred += 16; 897682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala 907682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala /* fdct_1 */ 917682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k0 = k0 + k7; 927682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k7 = k0 - (k7 << 1); 937682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k1 = k1 + k6; 947682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k6 = k1 - (k6 << 1); 957682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k2 = k2 + k5; 967682b663581dd8f67b422f6f2f31692ab2f870e3Matt Wala k5 = k2 - (k5 << 1); 97474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k3 = k3 + k4; 98474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k4 = k3 - (k4 << 1); 99474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet 100474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k0 = k0 + k3; 101474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k3 = k0 - (k3 << 1); 102474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k1 = k1 + k2; 103cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k2 = k1 - (k2 << 1); 104474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet 105474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k0 = k0 + k1; 106474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k1 = k0 - (k1 << 1); 107474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /**********/ 108474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet dst[0] = k0; 109474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet dst[4] = k1; /* col. 4 */ 110cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet /* fdct_2 */ 111474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k4 = k4 + k5; 112cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k5 = k5 + k6; 113474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k6 = k6 + k7; 114cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k2 = k2 + k3; 115474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /* MUL2C k2,k5,724,FDCT_SHIFT */ 116cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet /* k0, k1 become scratch */ 117474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /* assume FAST MULTIPLY */ 118cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k1 = mla724(k12, k5, round); 119474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k0 = mla724(k12, k2, round); 120cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet 121474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k5 = k1 >> FDCT_SHIFT; 122cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k2 = k0 >> FDCT_SHIFT; 123474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /*****************/ 124cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k2 = k2 + k3; 125474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k3 = (k3 << 1) - k2; 126e46265d27df092fbd911075403ec04d9c7ef8de1Tim Murray /********/ 127e46265d27df092fbd911075403ec04d9c7ef8de1Tim Murray dst[2] = k2; /* col. 2 */ 128cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k3 <<= 1; /* scale up col. 6 */ 129474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet dst[6] = k3; /* col. 6 */ 130474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /* fdct_3 */ 131cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 132474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /* assume FAST MULTIPLY */ 133cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet /* k0, k1 are output */ 134474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k0 = k4 - k6; 135cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet 136474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k1 = mla392(k0, k14, round); 137cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k0 = mla554(k4, k12, k1); 138474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k1 = mla1338(k6, k14, k1); 139cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet 140474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k4 = k0 >> FDCT_SHIFT; 141cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k6 = k1 >> FDCT_SHIFT; 142474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /***********************/ 143e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar k5 = k5 + k7; 144e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar k7 = (k7 << 1) - k5; 145cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k4 = k4 + k7; 146474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k7 = (k7 << 1) - k4; 147cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k5 = k5 + k6; 148474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k4 <<= 1; /* scale up col.5 */ 149474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k6 = k5 - (k6 << 1); 150474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /********/ 151474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet dst[5] = k4; /* col. 5 */ 152474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k6 <<= 2; /* scale up col. 7 */ 153474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet dst[1] = k5; /* col. 1 */ 154cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet dst[7] = k6; /* col. 7 */ 155474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet dst[3] = k7; /* col. 3 */ 156474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet dst += 8; 157474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet } 158cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet while (dst < out); 159cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet 160cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet out -= 64; 161cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet dst = out + 8; 162cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet 163cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet /* Vertical Block Loop */ 164cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet do /* Vertical 8xDCT loop */ 165cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet { 166cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k0 = out[0]; 167cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k1 = out[8]; 168cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k2 = out[16]; 169cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k3 = out[24]; 170cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k4 = out[32]; 171cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k5 = out[40]; 172cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k6 = out[48]; 173fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines k7 = out[56]; 174fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines /* deadzone thresholding for column */ 175474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet 176474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7); 177474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet 17824e79f69125cf87fcaa78c04510a831037203eebStephen Hines if (abs_sum < ColTh) 17924e79f69125cf87fcaa78c04510a831037203eebStephen Hines { 18024e79f69125cf87fcaa78c04510a831037203eebStephen Hines out[0] = 0x7fff; 18148d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines out++; 18224e79f69125cf87fcaa78c04510a831037203eebStephen Hines continue; 18313fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines } 18413fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines 18524e79f69125cf87fcaa78c04510a831037203eebStephen Hines /* fdct_1 */ 186ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray k0 = k0 + k7; 187d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k7 = k0 - (k7 << 1); 18811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k1 = k1 + k6; 18924e79f69125cf87fcaa78c04510a831037203eebStephen Hines k6 = k1 - (k6 << 1); 190ee4016d1247d3fbe50822de279d3da273d8aef4cTim Murray k2 = k2 + k5; 191d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k5 = k2 - (k5 << 1); 19224e79f69125cf87fcaa78c04510a831037203eebStephen Hines k3 = k3 + k4; 19324e79f69125cf87fcaa78c04510a831037203eebStephen Hines k4 = k3 - (k4 << 1); 19424e79f69125cf87fcaa78c04510a831037203eebStephen Hines 19524e79f69125cf87fcaa78c04510a831037203eebStephen Hines k0 = k0 + k3; 196d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k3 = k0 - (k3 << 1); 197d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k1 = k1 + k2; 19811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k2 = k1 - (k2 << 1); 199d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet 200d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k0 = k0 + k1; 20124e79f69125cf87fcaa78c04510a831037203eebStephen Hines k1 = k0 - (k1 << 1); 2026e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines /**********/ 20324e79f69125cf87fcaa78c04510a831037203eebStephen Hines out[32] = k1; /* row 4 */ 20424e79f69125cf87fcaa78c04510a831037203eebStephen Hines out[0] = k0; /* row 0 */ 20524e79f69125cf87fcaa78c04510a831037203eebStephen Hines /* fdct_2 */ 20624e79f69125cf87fcaa78c04510a831037203eebStephen Hines k4 = k4 + k5; 20724e79f69125cf87fcaa78c04510a831037203eebStephen Hines k5 = k5 + k6; 20824e79f69125cf87fcaa78c04510a831037203eebStephen Hines k6 = k6 + k7; 20948d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines k2 = k2 + k3; 21024e79f69125cf87fcaa78c04510a831037203eebStephen Hines /* MUL2C k2,k5,724,FDCT_SHIFT */ 21113fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines /* k0, k1 become scratch */ 21213fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines /* assume FAST MULTIPLY */ 21324e79f69125cf87fcaa78c04510a831037203eebStephen Hines k1 = mla724(k12, k5, round); 214b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k0 = mla724(k12, k2, round); 21524e79f69125cf87fcaa78c04510a831037203eebStephen Hines 216d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k5 = k1 >> FDCT_SHIFT; 2179207a2e495c8363606861e4f034504ec5c153dabLogan Chien k2 = k0 >> FDCT_SHIFT; 2185abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes /*****************/ 21924e79f69125cf87fcaa78c04510a831037203eebStephen Hines k2 = k2 + k3; 22024e79f69125cf87fcaa78c04510a831037203eebStephen Hines k3 = (k3 << 1) - k2; 22124e79f69125cf87fcaa78c04510a831037203eebStephen Hines k3 <<= 1; /* scale up col. 6 */ 22224e79f69125cf87fcaa78c04510a831037203eebStephen Hines /********/ 22324e79f69125cf87fcaa78c04510a831037203eebStephen Hines out[48] = k3; /* row 6 */ 224b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet out[16] = k2; /* row 2 */ 22524e79f69125cf87fcaa78c04510a831037203eebStephen Hines /* fdct_3 */ 226d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 2279207a2e495c8363606861e4f034504ec5c153dabLogan Chien /* assume FAST MULTIPLY */ 2285abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes /* k0, k1 are output */ 22924e79f69125cf87fcaa78c04510a831037203eebStephen Hines k0 = k4 - k6; 23024e79f69125cf87fcaa78c04510a831037203eebStephen Hines 23124e79f69125cf87fcaa78c04510a831037203eebStephen Hines k1 = mla392(k0, k14, round); 232d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k0 = mla554(k4, k12, k1); 2339207a2e495c8363606861e4f034504ec5c153dabLogan Chien k1 = mla1338(k6, k14, k1); 2345abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes 23524e79f69125cf87fcaa78c04510a831037203eebStephen Hines k4 = k0 >> FDCT_SHIFT; 23624e79f69125cf87fcaa78c04510a831037203eebStephen Hines k6 = k1 >> FDCT_SHIFT; 23724e79f69125cf87fcaa78c04510a831037203eebStephen Hines /***********************/ 23848d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines k5 = k5 + k7; 23913fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k7 = (k7 << 1) - k5; 2405abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k4 = k4 + k7; 241d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k7 = (k7 << 1) - k4; 24224e79f69125cf87fcaa78c04510a831037203eebStephen Hines k5 = k5 + k6; 243d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k4 <<= 1; /* scale up col. 5 */ 24424e79f69125cf87fcaa78c04510a831037203eebStephen Hines k6 = k5 - (k6 << 1); 24524e79f69125cf87fcaa78c04510a831037203eebStephen Hines /********/ 246474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet out[24] = k7 ; /* row 3 */ 247474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k6 <<= 2; /* scale up col. 7 */ 248474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet out[56] = k6 ; /* row 7 */ 249474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet out[8] = k5 ; /* row 1 */ 250474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet out[40] = k4 ; /* row 5 */ 251474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet out++; 2525abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes } 253474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet while ((uintptr_t)out < (uintptr_t)dst) ; 254474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet 25524e79f69125cf87fcaa78c04510a831037203eebStephen Hines return ; 256e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines } 257e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines 25848d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines /**************************************************************************/ 259e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines /* Function: Block4x4DCT_AANwSub 26013fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines Date: 7/31/01 26113fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines Input: 2629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Output: out[64] ==> next block 2635abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes Purpose: Do subtraction for zero MV first before 4x4 DCT 2645abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes Modified: 265462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao **************************************************************************/ 2669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 2679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Void Block4x4DCT_AANwSub(Short *out, UChar *cur, UChar *pred, Int width) 2681f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao { 269b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet Short *dst; 270b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet register Int k0, k1, k2, k3, k4, k5, k6, k7; 2719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Int round; 2729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Int k12 = 0x022A02D4; 273b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet Int k14 = 0x0188053A; 2745abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes Int mask; 2759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Int tmp, tmp2; 2769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Int abs_sum; 277cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet Int ColTh; 2786315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 279d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines dst = out + 64 ; 280462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao ColTh = *dst; 2819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out += 128; 282cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines round = 1 << (FDCT_SHIFT - 1); 283d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet 2849207a2e495c8363606861e4f034504ec5c153dabLogan Chien do /* fdct_nextrow */ 2855abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes { 286cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines /* assuming the block is word-aligned */ 2876e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines mask = 0x1FE; 2885abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes tmp = *((Int*) cur); /* contains 4 pixels */ 289cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines tmp2 = *((Int*) pred); /* prediction 4 pixels */ 290cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines k0 = tmp2 & 0xFF; 29124e79f69125cf87fcaa78c04510a831037203eebStephen Hines k1 = mask & (tmp << 1); 2925abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k0 = k1 - (k0 << 1); 2939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k1 = (tmp2 >> 8) & 0xFF; 2945abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k2 = mask & (tmp >> 7); 2955abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k1 = k2 - (k1 << 1); 2969207a2e495c8363606861e4f034504ec5c153dabLogan Chien k2 = (tmp2 >> 16) & 0xFF; 2975abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k3 = mask & (tmp >> 15); 2982ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines k2 = k3 - (k2 << 1); 2992ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines k3 = (tmp2 >> 24) & 0xFF; 300f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao k4 = mask & (tmp >> 23); 301e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k3 = k4 - (k3 << 1); 302e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines tmp = *((Int*)(cur + 4)); /* another 4 pixels */ 303e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines tmp2 = *((Int*)(pred + 4)); 304e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k4 = tmp2 & 0xFF; 3055abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k5 = mask & (tmp << 1); 3069207a2e495c8363606861e4f034504ec5c153dabLogan Chien k4 = k5 - (k4 << 1); 3075abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k5 = (tmp2 >> 8) & 0xFF; 308e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k6 = mask & (tmp >> 7); 309e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k5 = k6 - (k5 << 1); 3109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k6 = (tmp2 >> 16) & 0xFF; 3119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k7 = mask & (tmp >> 15); 3125abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k6 = k7 - (k6 << 1); 313f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao k7 = (tmp2 >> 24) & 0xFF; 3149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao tmp = mask & (tmp >> 23); 3159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k7 = tmp - (k7 << 1); 316f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao cur += width; 3179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao pred += 16; 3189ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* fdct_1 */ 3209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k0 = k0 + k7; 3219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k7 = k0 - (k7 << 1); 3220da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang k1 = k1 + k6; 323e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k6 = k1 - (k6 << 1); 324b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k2 = k2 + k5; 325462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k5 = k2 - (k5 << 1); 32613fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k3 = k3 + k4; 32713fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k4 = k3 - (k4 << 1); 3285abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes 3290da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang k0 = k0 + k3; 3302ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines k3 = k0 - (k3 << 1); 3312ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines k1 = k1 + k2; 3322ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines k2 = k1 - (k2 << 1); 3332ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines 3342ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines k0 = k0 + k1; 335d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet /**********/ 336d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet dst[0] = k0; 337d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet /* fdct_2 */ 338d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k4 = k4 + k5; 3395abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k5 = k5 + k6; 3402ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines k6 = k6 + k7; 3419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k2 = k2 + k3; 342462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* MUL2C k2,k5,724,FDCT_SHIFT */ 3439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* k0, k1 become scratch */ 3449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* assume FAST MULTIPLY */ 3459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k1 = mla724(k12, k5, round); 346e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k0 = mla724(k12, k2, round); 347d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet 348ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k5 = k1 >> FDCT_SHIFT; 349ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k2 = k0 >> FDCT_SHIFT; 350ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines /*****************/ 3515abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k2 = k2 + k3; 352c808a99831115928b4648f4c8b86dc682594217aStephen Hines /********/ 35324e79f69125cf87fcaa78c04510a831037203eebStephen Hines dst[2] = k2; /* col. 2 */ 354b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet /* fdct_3 */ 355b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 356462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* assume FAST MULTIPLY */ 357aa82e74b08fcdc2e4e6c1f6796699566b331b656Stephen Hines /* k0, k1 are output */ 358d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k0 = k4 - k6; 359aa82e74b08fcdc2e4e6c1f6796699566b331b656Stephen Hines 3605abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k1 = mla392(k0, k14, round); 361aa82e74b08fcdc2e4e6c1f6796699566b331b656Stephen Hines k0 = mla554(k4, k12, k1); 36213fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k1 = mla1338(k6, k14, k1); 36313fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines 36413fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k4 = k0 >> FDCT_SHIFT; 36513fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k6 = k1 >> FDCT_SHIFT; 36613fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines /***********************/ 36713fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k5 = k5 + k7; 36813fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k7 = (k7 << 1) - k5; 36913fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k7 = k7 - k4; 37013fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k5 = k5 + k6; 3712e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang /********/ 3722e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang dst[1] = k5; /* col. 1 */ 3732e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang dst[3] = k7; /* col. 3 */ 37448d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines dst += 8; 37513fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines } 3765abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes while (dst < out); 3779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out -= 64; 3799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao dst = out + 4; 3809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* Vertical Block Loop */ 382b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet do /* Vertical 8xDCT loop */ 3839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao { 3849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k0 = out[0]; 3855abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k1 = out[8]; 386f8149d9e5a3795e9952717ee6346789a134c55c7Shih-wei Liao k2 = out[16]; 3879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k3 = out[24]; 388b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k4 = out[32]; 389462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k5 = out[40]; 3909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k6 = out[48]; 39148d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines k7 = out[56]; 39213fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines 3935abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7); 3949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 3959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (abs_sum < ColTh) 3969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao { 3972e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang out[0] = 0x7fff; 3982e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang out++; 399b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet continue; 4002e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang } 40148d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines /* fdct_1 */ 40213fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k0 = k0 + k7; 4032e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang k7 = k0 - (k7 << 1); 40448d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines k1 = k1 + k6; 40548d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines k6 = k1 - (k6 << 1); 40648d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines k2 = k2 + k5; 40748d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines k5 = k2 - (k5 << 1); 40848d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines k3 = k3 + k4; 4099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k4 = k3 - (k4 << 1); 41048d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines 4115abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k0 = k0 + k3; 412462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k3 = k0 - (k3 << 1); 4139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k1 = k1 + k2; 4149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k2 = k1 - (k2 << 1); 415462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 416e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k0 = k0 + k1; 4175abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes /**********/ 4185abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes out[0] = k0; /* row 0 */ 4195abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes /* fdct_2 */ 4205abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k4 = k4 + k5; 4215abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k5 = k5 + k6; 4225abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k6 = k6 + k7; 4235abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k2 = k2 + k3; 424e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines /* MUL2C k2,k5,724,FDCT_SHIFT */ 42548d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines /* k0, k1 become scratch */ 42613fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines /* assume FAST MULTIPLY */ 42713fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k1 = mla724(k12, k5, round); 428e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k0 = mla724(k12, k2, round); 429e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 430e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k5 = k1 >> FDCT_SHIFT; 43113fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k2 = k0 >> FDCT_SHIFT; 43278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /*****************/ 43378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k2 = k2 + k3; 434d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet /********/ 435d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet out[16] = k2; /* row 2 */ 436d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines /* fdct_3 */ 437d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 438d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines /* assume FAST MULTIPLY */ 439d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines /* k0, k1 are output */ 440d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k0 = k4 - k6; 44144f10063c2c08dab103a44cded0c3a288d65d43bStephen Hines 44244f10063c2c08dab103a44cded0c3a288d65d43bStephen Hines k1 = mla392(k0, k14, round); 443d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k0 = mla554(k4, k12, k1); 444b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k1 = mla1338(k6, k14, k1); 445d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines 4465abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k4 = k0 >> FDCT_SHIFT; 447d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k6 = k1 >> FDCT_SHIFT; 448d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines /***********************/ 449d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k5 = k5 + k7; 450d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k7 = (k7 << 1) - k5; 451d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k7 = k7 - k4 ; 452d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k5 = k5 + k6; 453d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines /********/ 454d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines out[24] = k7 ; /* row 3 */ 455d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines out[8] = k5 ; /* row 1 */ 456d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines out++; 457d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines } 458d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines while ((uintptr_t)out < (uintptr_t)dst) ; 45911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 460d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines return ; 461d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines } 462d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines 463d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines /**************************************************************************/ 464d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines /* Function: Block2x2DCT_AANwSub 46511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines Date: 7/31/01 46611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines Input: 46711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines Output: out[64] ==> next block 468d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines Purpose: Do subtraction for zero MV first before 2x2 DCT 469d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines Modified: 470d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines **************************************************************************/ 471d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines 47211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 473ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines Void Block2x2DCT_AANwSub(Short *out, UChar *cur, UChar *pred, Int width) 474ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines { 47511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines Short *dst; 476d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet register Int k0, k1, k2, k3, k4, k5, k6, k7; 47711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines Int round; 47878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines Int k12 = 0x022A02D4; 47911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines Int k14 = 0x018803B2; 48011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines Int mask; 48178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines Int tmp, tmp2; 482d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines Int abs_sum; 483d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines Int ColTh; 48411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 485ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines dst = out + 64 ; 486ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines ColTh = *dst; 4875abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes out += 128; 48878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines round = 1 << (FDCT_SHIFT - 1); 48978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 49078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines do /* fdct_nextrow */ 49178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines { 49278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /* assuming the block is word-aligned */ 493b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet mask = 0x1FE; 494b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet tmp = *((Int*) cur); /* contains 4 pixels */ 49578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines tmp2 = *((Int*) pred); /* prediction 4 pixels */ 49678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k0 = tmp2 & 0xFF; 497d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k1 = mask & (tmp << 1); 4985abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k0 = k1 - (k0 << 1); 499d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k1 = (tmp2 >> 8) & 0xFF; 500d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k2 = mask & (tmp >> 7); 501d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k1 = k2 - (k1 << 1); 502d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k2 = (tmp2 >> 16) & 0xFF; 503d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k3 = mask & (tmp >> 15); 504d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k2 = k3 - (k2 << 1); 505cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k3 = (tmp2 >> 24) & 0xFF; 50678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k4 = mask & (tmp >> 23); 50778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k3 = k4 - (k3 << 1); 50878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines tmp = *((Int*)(cur + 4)); /* another 4 pixels */ 5095abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes tmp2 = *((Int*)(pred + 4)); 51078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k4 = tmp2 & 0xFF; 51178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k5 = mask & (tmp << 1); 51278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k4 = k5 - (k4 << 1); 51378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k5 = (tmp2 >> 8) & 0xFF; 51478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k6 = mask & (tmp >> 7); 5155abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k5 = k6 - (k5 << 1); 51678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k6 = (tmp2 >> 16) & 0xFF; 51778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k7 = mask & (tmp >> 15); 51878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k6 = k7 - (k6 << 1); 51978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k7 = (tmp2 >> 24) & 0xFF; 52078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines tmp = mask & (tmp >> 23); 52178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k7 = tmp - (k7 << 1); 52278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines cur += width; 52378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines pred += 16; 52478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 52578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /* fdct_1 */ 52678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k0 = k0 + k7; 52778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k7 = k0 - (k7 << 1); 5285abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k1 = k1 + k6; 52978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k6 = k1 - (k6 << 1); 5305abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k2 = k2 + k5; 53178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k5 = k2 - (k5 << 1); 53278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k3 = k3 + k4; 53378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k4 = k3 - (k4 << 1); 53478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 53578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k0 = k0 + k3; 53678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k3 = k0 - (k3 << 1); 53778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k1 = k1 + k2; 53878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k2 = k1 - (k2 << 1); 53978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 54078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k0 = k0 + k1; 54178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /**********/ 54278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines dst[0] = k0; 54378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /* fdct_2 */ 54478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k4 = k4 + k5; 54578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k5 = k5 + k6; 54678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k6 = k6 + k7; 54778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /* MUL2C k2,k5,724,FDCT_SHIFT */ 54878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /* k0, k1 become scratch */ 54978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /* assume FAST MULTIPLY */ 550b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k1 = mla724(k12, k5, round); 55178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 552d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k5 = k1 >> FDCT_SHIFT; 553ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines /*****************/ 55478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /********/ 55578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /* fdct_3 */ 55678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 55778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /* assume FAST MULTIPLY */ 55878e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /* k0, k1 are output */ 55978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k1 = mla392(k4, k14, round); 56078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k1 = mla946(k6, k14, k1); 56178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 56211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k6 = k1 >> FDCT_SHIFT; 56311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines /***********************/ 56411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k5 = k5 + k7; 56511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k5 = k5 + k6; 56611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines /********/ 56711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines dst[1] = k5; 56811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines dst += 8; 569d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet } 570d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet while (dst < out); 57111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines out -= 64; 572d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet dst = out + 2; 573d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet /* Vertical Block Loop */ 57411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines do /* Vertical 8xDCT loop */ 575d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet { 576d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k0 = out[0]; 57711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k1 = out[8]; 578d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k2 = out[16]; 57911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k3 = out[24]; 58011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k4 = out[32]; 58111274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k5 = out[40]; 58211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k6 = out[48]; 58378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k7 = out[56]; 58478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 58578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7); 58678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 58711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines if (abs_sum < ColTh) 58811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines { 589d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet out[0] = 0x7fff; 590d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet out++; 591d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet continue; 59211274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines } 59311274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines /* fdct_1 */ 59411274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k0 = k0 + k7; 59511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k7 = k0 - (k7 << 1); 59611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k1 = k1 + k6; 59711274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k6 = k1 - (k6 << 1); 59811274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k2 = k2 + k5; 59911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k5 = k2 - (k5 << 1); 60011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k3 = k3 + k4; 601ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k4 = k3 - (k4 << 1); 602ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines 603ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k0 = k0 + k3; 604ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k3 = k0 - (k3 << 1); 605ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k1 = k1 + k2; 606ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k2 = k1 - (k2 << 1); 607ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines 608ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k0 = k0 + k1; 609ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines /**********/ 610ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines out[0] = k0; /* row 0 */ 611ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines /* fdct_2 */ 612ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k4 = k4 + k5; 613ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k5 = k5 + k6; 614ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k6 = k6 + k7; 615ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines /* MUL2C k2,k5,724,FDCT_SHIFT */ 616ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines /* k0, k1 become scratch */ 617ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines /* assume FAST MULTIPLY */ 618b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k1 = mla724(k12, k5, round); 619b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet 62078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k5 = k1 >> FDCT_SHIFT; 621d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet /*****************/ 622d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet /********/ 623ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines /* fdct_3 */ 62478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 62578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /* assume FAST MULTIPLY */ 62678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /* k0, k1 are output */ 62778e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k1 = mla392(k4, k14, round); 628b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k1 = mla946(k6, k14, k1); 629b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet 630b13b85e31ac978254cb1ed7653f149f8a3eef460Stephen Hines k6 = k1 >> FDCT_SHIFT; 631b13b85e31ac978254cb1ed7653f149f8a3eef460Stephen Hines /***********************/ 632fdae63e8142f56521813f59e0c506ed3a1636021Stephen Hines k5 = k5 + k7; 633fdae63e8142f56521813f59e0c506ed3a1636021Stephen Hines k5 = k5 + k6; 63444f10063c2c08dab103a44cded0c3a288d65d43bStephen Hines /********/ 6355abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes out[8] = k5 ; /* row 1 */ 636b13b85e31ac978254cb1ed7653f149f8a3eef460Stephen Hines out++; 637b13b85e31ac978254cb1ed7653f149f8a3eef460Stephen Hines } 638b13b85e31ac978254cb1ed7653f149f8a3eef460Stephen Hines while ((uintptr_t)out < (uintptr_t)dst) ; 639b13b85e31ac978254cb1ed7653f149f8a3eef460Stephen Hines 640d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet return ; 641ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines } 64278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 64378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /**************************************************************************/ 64478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /* Function: BlockDCT_AANIntra 645b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet Date: 8/9/01 646b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet Input: rec 647d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet Output: out[64] ==> next block 648ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines Purpose: Input directly from rec frame. 64978e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines Modified: 65078e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines **************************************************************************/ 65178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines 65278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines Void BlockDCT_AANIntra(Short *out, UChar *cur, UChar *dummy2, Int width) 65378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines { 65478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines Short *dst; 65578e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines Int k0, k1, k2, k3, k4, k5, k6, k7; 65678e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines Int round; 657e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines Int k12 = 0x022A02D4; 658e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines Int k14 = 0x0188053A; 659e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines Int abs_sum; 660e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines Int mask; 661eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet Int *curInt, tmp; 662eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet Int ColTh; 663eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet 664eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet OSCL_UNUSED_ARG(dummy2); 665eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet 666eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet dst = out + 64 ; 667eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet ColTh = *dst; 668eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet out += 128; 669eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet round = 1 << (FDCT_SHIFT - 1); 670eca0534a31b6185d6ab758f5e97acd7a4cb21e8eJean-Luc Brouillet 671e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines do /* fdct_nextrow */ 672e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines { 673e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines mask = 0x1FE; 67448d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines curInt = (Int*) cur; 67513fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines tmp = curInt[0]; /* contains 4 pixels */ 67613fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k0 = mask & (tmp << 1); 67713fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k1 = mask & (tmp >> 7); 678e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k2 = mask & (tmp >> 15); 679e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k3 = mask & (tmp >> 23); 680e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines tmp = curInt[1]; /* another 4 pixels */ 681e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k4 = mask & (tmp << 1); 68248d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines k5 = mask & (tmp >> 7); 68348d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines k6 = mask & (tmp >> 15); 684d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k7 = mask & (tmp >> 23); 685d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet cur += width; 68648d893dc7794b3cfb74f35955ca763ee4170f9adStephen Hines /* fdct_1 */ 687d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k0 = k0 + k7; 688e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k7 = k0 - (k7 << 1); 689e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k1 = k1 + k6; 690e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k6 = k1 - (k6 << 1); 691e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k2 = k2 + k5; 692e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k5 = k2 - (k5 << 1); 693e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k3 = k3 + k4; 694e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k4 = k3 - (k4 << 1); 695d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet 696d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k0 = k0 + k3; 697d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k3 = k0 - (k3 << 1); 698ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k1 = k1 + k2; 699ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k2 = k1 - (k2 << 1); 70011274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 70178e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k0 = k0 + k1; 70278e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k1 = k0 - (k1 << 1); 70378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines /**********/ 704ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines dst[0] = k0; 705ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines dst[4] = k1; /* col. 4 */ 70633ea573b6df7b7fe48d2b68d4c479f33082e3c0dStephen Hines /* fdct_2 */ 707ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k4 = k4 + k5; 70813fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k5 = k5 + k6; 709ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k6 = k6 + k7; 710ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k2 = k2 + k3; 711ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines /* MUL2C k2,k5,724,FDCT_SHIFT */ 712ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines /* k0, k1 become scratch */ 7135abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes /* assume FAST MULTIPLY */ 714ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k1 = mla724(k12, k5, round); 71511274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines k0 = mla724(k12, k2, round); 71611274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines 717d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k5 = k1 >> FDCT_SHIFT; 718d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k2 = k0 >> FDCT_SHIFT; 71911274a7324b478ec13e1d10a1b81350b34a65ab1Stephen Hines /*****************/ 720d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k2 = k2 + k3; 721ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines k3 = (k3 << 1) - k2; 722ab94bccca64c9b126cbd1b732aa5e681d8639b99Stephen Hines /********/ 72378e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines dst[2] = k2; /* col. 2 */ 72478e69cb06b9b0683b2ac9dcafde87b867690ef2fStephen Hines k3 <<= 1; /* scale up col. 6 */ 725e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines dst[6] = k3; /* col. 6 */ 726e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines /* fdct_3 */ 727e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 7288de1922e037612f2521acac2f4c4289a9f71450dStephen Hines /* assume FAST MULTIPLY */ 729e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines /* k0, k1 are output */ 730e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k0 = k4 - k6; 7315abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes 732e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k1 = mla392(k0, k14, round); 733e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k0 = mla554(k4, k12, k1); 734e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k1 = mla1338(k6, k14, k1); 7355abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes 736e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k4 = k0 >> FDCT_SHIFT; 737e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k6 = k1 >> FDCT_SHIFT; 738e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines /***********************/ 739b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k5 = k5 + k7; 7405abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k7 = (k7 << 1) - k5; 741e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k4 = k4 + k7; 742e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k7 = (k7 << 1) - k4; 743b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k5 = k5 + k6; 744b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k4 <<= 1; /* scale up col.5 */ 745e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k6 = k5 - (k6 << 1); 746e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines /********/ 747b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet dst[5] = k4; /* col. 5 */ 748474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k6 <<= 2; /* scale up col. 7 */ 7495abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes dst[1] = k5; /* col. 1 */ 750474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet dst[7] = k6; /* col. 7 */ 751e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines dst[3] = k7; /* col. 3 */ 752474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet dst += 8; 753e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines } 754e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines while (dst < out); 755e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 756cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines out -= 64; 757cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines dst = out + 8; 758cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines 759dd6206bb61bf8df2ed6b643abe8a29c48a315685Stephen Hines /* Vertical Block Loop */ 760cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines do /* Vertical 8xDCT loop */ 761cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines { 762cd440ee9b3bdb7985a20b2cd4b0f8229de34f0a9Stephen Hines k0 = out[0]; 763e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k1 = out[8]; 764e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k2 = out[16]; 7655abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k3 = out[24]; 76683f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao k4 = out[32]; 76783f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao k5 = out[40]; 76883f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao k6 = out[48]; 76983f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao k7 = out[56]; 77083f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao /* deadzone thresholding for column */ 77183f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao 77283f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7); 77383f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao 77483f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao if (abs_sum < ColTh) 7755abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes { 77683f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao out[0] = 0x7fff; 77783f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao out++; 77883f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao continue; 77983f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao } 78083f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao 78183f0c6261efc8f397fc2509e3862bc6d0eb1e1c4Shih-wei Liao /* fdct_1 */ 782e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k0 = k0 + k7; 783e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k7 = k0 - (k7 << 1); 784e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k1 = k1 + k6; 785e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k6 = k1 - (k6 << 1); 786e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k2 = k2 + k5; 787b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k5 = k2 - (k5 << 1); 788b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k3 = k3 + k4; 789e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k4 = k3 - (k4 << 1); 79013fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines 79113fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k0 = k0 + k3; 792e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k3 = k0 - (k3 << 1); 793e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k1 = k1 + k2; 794e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k2 = k1 - (k2 << 1); 795e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 796e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k0 = k0 + k1; 797e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k1 = k0 - (k1 << 1); 798e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines /**********/ 799e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines out[32] = k1; /* row 4 */ 800e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines out[0] = k0; /* row 0 */ 801e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines /* fdct_2 */ 802b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k4 = k4 + k5; 803e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k5 = k5 + k6; 804e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k6 = k6 + k7; 805e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k2 = k2 + k3; 806e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines /* MUL2C k2,k5,724,FDCT_SHIFT */ 807e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines /* k0, k1 become scratch */ 808340b5550cf63b6beae3b12c2e91377bce7704c34Stephen Hines /* assume FAST MULTIPLY */ 809e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k1 = mla724(k12, k5, round); 810e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k0 = mla724(k12, k2, round); 811e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines 812e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k5 = k1 >> FDCT_SHIFT; 813e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k2 = k0 >> FDCT_SHIFT; 814e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines /*****************/ 815e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k2 = k2 + k3; 816e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k3 = (k3 << 1) - k2; 817e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines k3 <<= 1; /* scale up col. 6 */ 818e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines /********/ 8199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out[48] = k3; /* row 6 */ 8209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out[16] = k2; /* row 2 */ 82113fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines /* fdct_3 */ 82213fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 8239ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* assume FAST MULTIPLY */ 8249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* k0, k1 are output */ 8259ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k0 = k4 - k6; 8269ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k1 = mla392(k0, k14, round); 8289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k0 = mla554(k4, k12, k1); 8299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k1 = mla1338(k6, k14, k1); 8309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 831b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k4 = k0 >> FDCT_SHIFT; 832b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k6 = k1 >> FDCT_SHIFT; 8335abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes /***********************/ 8349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k5 = k5 + k7; 8359ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k7 = (k7 << 1) - k5; 836cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k4 = k4 + k7; 8379ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k7 = (k7 << 1) - k4; 838cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k5 = k5 + k6; 83992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang k4 <<= 1; /* scale up col. 5 */ 8409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k6 = k5 - (k6 << 1); 8419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /********/ 8429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out[24] = k7 ; /* row 3 */ 8439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k6 <<= 2; /* scale up col. 7 */ 8449ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out[56] = k6 ; /* row 7 */ 845cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet out[8] = k5 ; /* row 1 */ 84692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang out[40] = k4 ; /* row 5 */ 84792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang out++; 84892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 84992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang while ((uintptr_t)out < (uintptr_t)dst) ; 85092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 85192b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang return ; 85292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang } 853cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet 85492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang /**************************************************************************/ 85592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang /* Function: Block4x4DCT_AANIntra 85692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang Date: 8/9/01 85792b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang Input: prev 85892b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang Output: out[64] ==> next block 85992b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang Purpose: Input directly from prev frame. output 2x2 DCT 86092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang Modified: 861cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet **************************************************************************/ 86292b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang 86392b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang Void Block4x4DCT_AANIntra(Short *out, UChar *cur, UChar *dummy2, Int width) 86492b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang { 86592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang Short *dst; 86692b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang register Int k0, k1, k2, k3, k4, k5, k6, k7; 8679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Int round; 8689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Int k12 = 0x022A02D4; 8699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Int k14 = 0x0188053A; 87092b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang Int mask; 8719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Int *curInt, tmp; 8729ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Int abs_sum; 8739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Int ColTh; 8749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao OSCL_UNUSED_ARG(dummy2); 8769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao dst = out + 64 ; 8789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ColTh = *dst; 8799ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out += 128; 8809ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao round = 1 << (FDCT_SHIFT - 1); 8819ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 8829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao do /* fdct_nextrow */ 883b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet { 884b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet mask = 0x1FE; 88592b344a51c6c4934e96882bd401e4b13d6d03db8Zonr Chang curInt = (Int*) cur; 8869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao tmp = curInt[0]; /* contains 4 pixels */ 8879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k0 = mask & (tmp << 1); 8889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k1 = mask & (tmp >> 7); 8899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k2 = mask & (tmp >> 15); 8909ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k3 = mask & (tmp >> 23); 891b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet tmp = curInt[1]; /* another 4 pixels */ 892b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k4 = mask & (tmp << 1); 8939ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k5 = mask & (tmp >> 7); 8949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k6 = mask & (tmp >> 15); 8952e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang k7 = mask & (tmp >> 23); 8962e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang cur += width; 8972e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang /* fdct_1 */ 898b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k0 = k0 + k7; 8992e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang k7 = k0 - (k7 << 1); 9002e1dba6c779a0ae55c76d36a3c03553e16725ab7Zonr Chang k1 = k1 + k6; 9019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k6 = k1 - (k6 << 1); 902d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k2 = k2 + k5; 903d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet k5 = k2 - (k5 << 1); 9049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k3 = k3 + k4; 9059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k4 = k3 - (k4 << 1); 9069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 9079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k0 = k0 + k3; 9089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k3 = k0 - (k3 << 1); 909462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k1 = k1 + k2; 9101f0d88fbff28e4e2dd563d93c8fe0047381c09ccShih-wei Liao k2 = k1 - (k2 << 1); 91113fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines 91213fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k0 = k0 + k1; 9139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /**********/ 91413fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines dst[0] = k0; 91513fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines /* fdct_2 */ 916d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k4 = k4 + k5; 9175abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k5 = k5 + k6; 918d5a84f6d49d64738e4bb7c9dea7242e48acad959Stephen Hines k6 = k6 + k7; 919462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k2 = k2 + k3; 920462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* MUL2C k2,k5,724,FDCT_SHIFT */ 9219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* k0, k1 become scratch */ 9229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* assume FAST MULTIPLY */ 92313fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k1 = mla724(k12, k5, round); 92413fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines k0 = mla724(k12, k2, round); 925462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 926462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k5 = k1 >> FDCT_SHIFT; 927c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet k2 = k0 >> FDCT_SHIFT; 928c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet /*****************/ 929462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k2 = k2 + k3; 930462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /********/ 931c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet dst[2] = k2; /* col. 2 */ 932c95381a2c3b6e9117901eef0687e861e4d533bfeJean-Luc Brouillet /* fdct_3 */ 933462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 934462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* assume FAST MULTIPLY */ 9356b6320ad5faee29e0f75fe937e40156746ef9e80Zonr Chang /* k0, k1 are output */ 9366b6320ad5faee29e0f75fe937e40156746ef9e80Zonr Chang k0 = k4 - k6; 9376b6320ad5faee29e0f75fe937e40156746ef9e80Zonr Chang 938a41ce1d98094da84643995d40d71c529905123fcZonr Chang k1 = mla392(k0, k14, round); 9396b6320ad5faee29e0f75fe937e40156746ef9e80Zonr Chang k0 = mla554(k4, k12, k1); 9400da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang k1 = mla1338(k6, k14, k1); 9410da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang 9426315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr k4 = k0 >> FDCT_SHIFT; 9435abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k6 = k1 >> FDCT_SHIFT; 9440da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang /***********************/ 9450da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang k5 = k5 + k7; 9460da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang k7 = (k7 << 1) - k5; 947b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k7 = k7 - k4; 9480da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang k5 = k5 + k6; 9490da0a7dc51c25943fe31d0bfccbdfee326a3199cZonr Chang /********/ 950b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet dst[1] = k5; /* col. 1 */ 951b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet dst[3] = k7; /* col. 3 */ 952462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao dst += 8; 953462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 9543cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang while (dst < out); 9553cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang 9563cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang out -= 64; 957641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang dst = out + 4; 9585abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes 9593cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang /* Vertical Block Loop */ 960641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang do /* Vertical 8xDCT loop */ 961641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang { 962641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang k0 = out[0]; 963641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang k1 = out[8]; 964641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang k2 = out[16]; 965641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang k3 = out[24]; 966641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang k4 = out[32]; 967a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang k5 = out[40]; 968a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang k6 = out[48]; 969a7a828d1ff95c5a8f2327f56a137a2bcb3a9a8faZonr Chang k7 = out[56]; 9709ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 971b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7); 972b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang 9739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao if (abs_sum < ColTh) 9749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao { 9755abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes out[0] = 0x7fff; 9769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out++; 9779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao continue; 9789ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 979462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* fdct_1 */ 980462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k0 = k0 + k7; 981cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k7 = k0 - (k7 << 1); 982b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang k1 = k1 + k6; 9839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k6 = k1 - (k6 << 1); 9849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k2 = k2 + k5; 985462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k5 = k2 - (k5 << 1); 986b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang k3 = k3 + k4; 987474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k4 = k3 - (k4 << 1); 9883eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines 9893eb819ad8beec566a73b288204f9b75c2bb1d4e6Stephen Hines k0 = k0 + k3; 990474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k3 = k0 - (k3 << 1); 9919ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k1 = k1 + k2; 992462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k2 = k1 - (k2 << 1); 993b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang 994b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang k0 = k0 + k1; 9959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /**********/ 9969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out[0] = k0; /* row 0 */ 9979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* fdct_2 */ 9989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k4 = k4 + k5; 9999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k5 = k5 + k6; 1000cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet k6 = k6 + k7; 1001b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet k2 = k2 + k3; 10025abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes /* MUL2C k2,k5,724,FDCT_SHIFT */ 10039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* k0, k1 become scratch */ 10049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* assume FAST MULTIPLY */ 1005b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang k1 = mla724(k12, k5, round); 1006b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang k0 = mla724(k12, k2, round); 1007b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang 1008b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang k5 = k1 >> FDCT_SHIFT; 1009474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k2 = k0 >> FDCT_SHIFT; 1010474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /*****************/ 1011474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k2 = k2 + k3; 1012474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /********/ 1013b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang out[16] = k2; /* row 2 */ 1014b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang /* fdct_3 */ 1015b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 1016474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /* assume FAST MULTIPLY */ 1017474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /* k0, k1 are output */ 1018474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k0 = k4 - k6; 1019474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet 10209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k1 = mla392(k0, k14, round); 10219ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k0 = mla554(k4, k12, k1); 1022feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k1 = mla1338(k6, k14, k1); 1023feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines 1024feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k4 = k0 >> FDCT_SHIFT; 1025feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k6 = k1 >> FDCT_SHIFT; 1026feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines /***********************/ 1027feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k5 = k5 + k7; 1028feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k7 = (k7 << 1) - k5; 1029feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k7 = k7 - k4 ; 1030feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k5 = k5 + k6; 1031feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines /********/ 1032b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines out[24] = k7 ; /* row 3 */ 1033feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines out[8] = k5 ; /* row 1 */ 1034b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines out++; 1035b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines } 1036b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines while ((uintptr_t)out < (uintptr_t)dst) ; 1037b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines 1038b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines return ; 1039b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines } 1040b0fabe574945bfa85e688e77e9dcb5341fe08840Stephen Hines 1041feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines /**************************************************************************/ 1042feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines /* Function: Block2x2DCT_AANIntra 1043feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines Date: 8/9/01 1044feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines Input: prev 1045feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines Output: out[64] ==> next block 1046feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines Purpose: Input directly from prev frame. output 2x2 DCT 1047feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines Modified: 1048feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines **************************************************************************/ 1049feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines 1050feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines Void Block2x2DCT_AANIntra(Short *out, UChar *cur, UChar *dummy2, Int width) 1051feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines { 1052feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines Short *dst; 1053cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet register Int k0, k1, k2, k3, k4, k5, k6, k7; 1054feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines Int round; 1055feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines Int k12 = 0x022A02D4; 1056feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines Int k14 = 0x018803B2; 1057feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines Int mask; 1058feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines Int *curInt, tmp; 1059cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet Int abs_sum; 1060cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet Int ColTh; 1061cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet 1062feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines OSCL_UNUSED_ARG(dummy2); 1063feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines 1064feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines dst = out + 64 ; 1065feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines ColTh = *dst; 1066feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines out += 128; 1067feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines round = 1 << (FDCT_SHIFT - 1); 1068feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines 1069feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines do /* fdct_nextrow */ 1070feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines { 1071feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines mask = 0x1FE; 1072feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines curInt = (Int*) cur; 1073feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines tmp = curInt[0]; /* contains 4 pixels */ 1074feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k0 = mask & (tmp << 1); 1075feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k1 = mask & (tmp >> 7); 1076feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k2 = mask & (tmp >> 15); 1077feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k3 = mask & (tmp >> 23); 1078feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines tmp = curInt[1]; /* another 4 pixels */ 1079feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k4 = mask & (tmp << 1); 1080feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k5 = mask & (tmp >> 7); 1081feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k6 = mask & (tmp >> 15); 1082feaca06fcb0772e9e972a0d61b17259fc5124d50Stephen Hines k7 = mask & (tmp >> 23); 10839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao cur += width; 1084474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet 1085474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /* fdct_1 */ 10866e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines k0 = k0 + k7; 10879ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines k7 = k0 - (k7 << 1); 10889ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines k1 = k1 + k6; 10899ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines k6 = k1 - (k6 << 1); 10909ae18b2bbee0b08afd400542e863dd665ff76059Stephen Hines k2 = k2 + k5; 1091474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k5 = k2 - (k5 << 1); 1092462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k3 = k3 + k4; 1093462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k4 = k3 - (k4 << 1); 1094cec9b65aa890dea58e39951900ae13efb8d11703Jean-Luc Brouillet 10952ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines k0 = k0 + k3; 10965abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k3 = k0 - (k3 << 1); 10979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k1 = k1 + k2; 1098462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k2 = k1 - (k2 << 1); 10999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 11009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k0 = k0 + k1; 1101be27482cdeaf08576bc39b72a15d35d13014a636Logan /**********/ 1102b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet dst[0] = k0; 1103474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /* fdct_2 */ 11045abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes k4 = k4 + k5; 1105474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k5 = k5 + k6; 11069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k6 = k6 + k7; 1107474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /* MUL2C k2,k5,724,FDCT_SHIFT */ 1108474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /* k0, k1 become scratch */ 1109474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet /* assume FAST MULTIPLY */ 1110474655a402e70cb329e1bcd4ebbe00bdc5be4206Jean-Luc Brouillet k1 = mla724(k12, k5, round); 11119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 11129ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k5 = k1 >> FDCT_SHIFT; 11139ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /*****************/ 11149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /********/ 1115b1771ef128b10c4d4575634828006bfba20b1d9cZonr Chang /* fdct_3 */ 11169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 11179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* assume FAST MULTIPLY */ 1118d3f7527b105d21f1c69d3473eb88a762f2c3ab5aJean-Luc Brouillet /* k0, k1 are output */ 11192ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines k1 = mla392(k4, k14, round); 11209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k1 = mla946(k6, k14, k1); 1121462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 11229ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k6 = k1 >> FDCT_SHIFT; 1123462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /***********************/ 11249ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k5 = k5 + k7; 1125462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k5 = k5 + k6; 1126462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /********/ 11279ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao dst[1] = k5; 11289ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao dst += 8; 11299ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 11309ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao while (dst < out); 11319ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out -= 64; 11322ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines dst = out + 2; 1133462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* Vertical Block Loop */ 11349ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao do /* Vertical 8xDCT loop */ 11355abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes { 11369ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k0 = out[0]; 11376b6320ad5faee29e0f75fe937e40156746ef9e80Zonr Chang k1 = out[8]; 11382b8fb64be3047df940a219872b331eb11de2758dStephen Hines k2 = out[16]; 1139462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k3 = out[24]; 1140462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k4 = out[32]; 11419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k5 = out[40]; 11422b8fb64be3047df940a219872b331eb11de2758dStephen Hines k6 = out[48]; 11439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k7 = out[56]; 114413fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines 114513fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines abs_sum = sum_abs(k0, k1, k2, k3, k4, k5, k6, k7); 114613fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines 11472b8fb64be3047df940a219872b331eb11de2758dStephen Hines if (abs_sum < ColTh) 1148e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines { 11495abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes out[0] = 0x7fff; 1150e5e64432476a44b59c61ded233b1149109c7a7c3Stephen Hines out++; 1151462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao continue; 1152462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 11537c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao /* fdct_1 */ 11549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k0 = k0 + k7; 11559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k7 = k0 - (k7 << 1); 11569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k1 = k1 + k6; 11579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k6 = k1 - (k6 << 1); 11589ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k2 = k2 + k5; 11599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k5 = k2 - (k5 << 1); 11609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k3 = k3 + k4; 11619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k4 = k3 - (k4 << 1); 11629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 11639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k0 = k0 + k3; 11649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k3 = k0 - (k3 << 1); 1165d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray k1 = k1 + k2; 1166d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray k2 = k1 - (k2 << 1); 1167d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray 1168d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray k0 = k0 + k1; 1169d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray /**********/ 1170d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray out[0] = k0; /* row 0 */ 1171d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray /* fdct_2 */ 1172d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray k4 = k4 + k5; 1173d56a92fc2b1d417ce53d9550548fe1661fa37d40Tim Murray k5 = k5 + k6; 1174462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao k6 = k6 + k7; 11759ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* MUL2C k2,k5,724,FDCT_SHIFT */ 1176462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* k0, k1 become scratch */ 11779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* assume FAST MULTIPLY */ 1178e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar k1 = mla724(k12, k5, round); 1179e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar 1180e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar k5 = k1 >> FDCT_SHIFT; 1181e4dd17d7b2a292a600756da7680beecd78f74033Pirama Arumuga Nainar /*****************/ 11829ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /********/ 11839ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* fdct_3 */ 11849ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* ROTATE k4,k6,392,946, FDCT_SHIFT */ 11859ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* assume FAST MULTIPLY */ 11869ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* k0, k1 are output */ 11879ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k1 = mla392(k4, k14, round); 11889ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao k1 = mla946(k6, k14, k1); 11899ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 119091a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao k6 = k1 >> FDCT_SHIFT; 119191a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao /***********************/ 119291a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao k5 = k5 + k7; 119391a3783ce1f4eb9ad6e9c1ecdbd27f3d6dc58634Shih-wei Liao k5 = k5 + k6; 11949ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /********/ 11959ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out[8] = k5 ; /* row 1 */ 11969ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao out++; 11979ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 11989ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao while ((uintptr_t)out < (uintptr_t)dst) ; 11999ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12009ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao return ; 12019ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 12029ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /**************************************************************************/ 12039ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* Function: Block1x1DCTwSub 12049ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Date: 8/9/01 12059ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Input: block 12069ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Output: y 12079ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Purpose: Compute DC value only 12089ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Modified: 12099ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao **************************************************************************/ 12109ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void Block1x1DCTwSub(Short *out, UChar *cur, UChar *pred, Int width) 12119ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao { 1212a5d2c232d56b04292cb51c8fb343aef990f7970fStephen Hines UChar *end; 1213a5d2c232d56b04292cb51c8fb343aef990f7970fStephen Hines Int temp = 0; 12149ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Int offset2; 12159ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 12169ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao offset2 = width - 8; 12179ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao end = pred + (16 << 3); 12186e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines do 1219462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao { 12209ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao temp += (*cur++ - *pred++); 1221462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao temp += (*cur++ - *pred++); 12225abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes temp += (*cur++ - *pred++); 1223462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao temp += (*cur++ - *pred++); 1224462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao temp += (*cur++ - *pred++); 1225641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang temp += (*cur++ - *pred++); 1226641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang temp += (*cur++ - *pred++); 1227641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang temp += (*cur++ - *pred++); 1228641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang cur += offset2; 1229641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang pred += 8; 1230fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines } 1231fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines while (pred < end) ; 1232fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines 1233fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines out[1] = out[2] = out[3] = out[4] = out[5] = out[6] = out[7] = 0; 12345abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes out[0] = temp >> 3; 1235fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines 1236fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines return ; 1237fdd1ba13a69501a1b91fdc9be31413215d467497Stephen Hines } 12389ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1239462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /**************************************************************************/ 12409ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao /* Function: Block1x1DCTIntra 12419ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Date: 8/9/01 12429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Input: prev 12439ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Output: out 1244b095e05fef8f0230ab42eaed7a06c3b2d698189aJean-Luc Brouillet Purpose: Compute DC value only 12459ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Modified: 1246462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao **************************************************************************/ 12479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao void Block1x1DCTIntra(Short *out, UChar *cur, UChar *dummy2, Int width) 124813fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines { 124913fad85b3c99a37c17d8acfec72f46b8ee64e912Stephen Hines UChar *end; 12509ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Int temp = 0; 12519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao ULong word; 12522ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines 12532ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines OSCL_UNUSED_ARG(dummy2); 12549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 1255462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao end = cur + (width << 3); 12565abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes do 12572ef9bc0cfbca2152d972c0975005f8c897c2a42cStephen Hines { 12585abbe0e9ca2508260b627ffef2bf01e2554e8357Chris Wailes word = *((ULong*)cur); 12599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao temp += (word >> 24); 1260462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao temp += ((word >> 16) & 0xFF); 12619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao temp += ((word >> 8) & 0xFF); 1262462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao temp += (word & 0xFF); 1263462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 12647c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao word = *((ULong*)(cur + 4)); 12657c67e578c760408dba0c2f64da6e074dd8b56fd9Shih-wei Liao temp += (word >> 24); 12669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao temp += ((word >> 16) & 0xFF); 1267462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao temp += ((word >> 8) & 0xFF); 1268462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao temp += (word & 0xFF); 12693cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang 12703cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang cur += width; 12713cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang } 1272641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang while (cur < end) ; 12733cd3dd327445fcfa49f0e96cb2de2055bce541e9Zonr Chang 1274641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang out[1] = out[2] = out[3] = out[4] = out[5] = out[6] = out[7] = 0; 1275641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang out[0] = temp >> 3; 1276641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1277641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang return ; 1278641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang } 1279641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang 1280641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang#ifdef __cplusplus 1281641558f02fe6ce0ee3ae5076eb366c25e2ad5903Zonr Chang} 12826315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#endif 12836315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr 12846315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr