13306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/* ------------------------------------------------------------------ 23306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Copyright (C) 1998-2009 PacketVideo 33306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * 43306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Licensed under the Apache License, Version 2.0 (the "License"); 53306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * you may not use this file except in compliance with the License. 63306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * You may obtain a copy of the License at 73306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * 83306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * http://www.apache.org/licenses/LICENSE-2.0 93306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * 103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * Unless required by applicable law or agreed to in writing, software 113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * distributed under the License is distributed on an "AS IS" BASIS, 123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * express or implied. 143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * See the License for the specific language governing permissions 153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * and limitations under the License. 163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong * ------------------------------------------------------------------- 173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong */ 183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "mp4def.h" 193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "idct.h" 203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#include "motion_comp.h" 213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#ifdef FAST_IDCT 233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/**************************************************************** 253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* vca_idct.c : created 6/1/99 for several options 263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong* of hard-coded reduced idct function (using nz_coefs) 273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong******************************************************************/ 283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong/*****************************************************/ 303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong//pretested version 313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow0(int16 *, uint8 *, uint8 *, int) 323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return ; 343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctcol0(int16 *) 363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return ; 383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow1(int16 *blk, uint8 *pred, uint8 *dst, int width) 413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* shortcut */ 433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int tmp; 443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int i = 8; 453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint32 pred_word, dst_word; 463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int res, res2; 473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* preset the offset, such that we can take advantage pre-offset addressing mode */ 493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong width -= 4; 503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst -= width; 513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pred -= 12; 523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk -= 8; 533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (i--) 553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong tmp = (*(blk += 8) + 32) >> 6; 573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *blk = 0; 583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pred_word = *((uint32*)(pred += 12)); /* read 4 bytes from pred */ 603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = tmp + (pred_word & 0xFF); 613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(res); 623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res2 = tmp + ((pred_word >> 8) & 0xFF); 633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(res2); 643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word = (res2 << 8) | res; 653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = tmp + ((pred_word >> 16) & 0xFF); 663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(res); 673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 16); 683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = tmp + ((pred_word >> 24) & 0xFF); 693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(res); 703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 24); 713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((uint32*)(dst += width)) = dst_word; /* save 4 bytes to dst */ 723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pred_word = *((uint32*)(pred += 4)); /* read 4 bytes from pred */ 743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = tmp + (pred_word & 0xFF); 753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(res); 763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res2 = tmp + ((pred_word >> 8) & 0xFF); 773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(res2); 783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word = (res2 << 8) | res; 793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = tmp + ((pred_word >> 16) & 0xFF); 803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(res); 813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 16); 823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = tmp + ((pred_word >> 24) & 0xFF); 833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(res); 843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 24); 853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((uint32*)(dst += 4)) = dst_word; /* save 4 bytes to dst */ 863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return; 883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctcol1(int16 *blk) 913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ /* shortcut */ 923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[0] = blk[8] = blk[16] = blk[24] = blk[32] = blk[40] = blk[48] = blk[56] = 933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[0] << 3; 943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return; 953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow2(int16 *blk, uint8 *pred, uint8 *dst, int width) 983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 x0, x1, x2, x4, x5; 1003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int i = 8; 1013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint32 pred_word, dst_word; 1023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int res, res2; 1033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* preset the offset, such that we can take advantage pre-offset addressing mode */ 1053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong width -= 4; 1063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst -= width; 1073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pred -= 12; 1083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk -= 8; 1093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (i--) 1113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 1123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* shortcut */ 1133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 = blk[9]; 1143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[9] = 0; 1153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 = ((*(blk += 8)) << 8) + 8192; 1163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *blk = 0; /* for proper rounding in the fourth stage */ 1173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* first stage */ 1193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = (W7 * x4 + 4) >> 3; 1203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 = (W1 * x4 + 4) >> 3; 1213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* third stage */ 1233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = (181 * (x4 + x5) + 128) >> 8; 1243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = (181 * (x4 - x5) + 128) >> 8; 1253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* fourth stage */ 1273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pred_word = *((uint32*)(pred += 12)); /* read 4 bytes from pred */ 1283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x0 + x4) >> 14; 1293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP1(res); 1303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res2 = (x0 + x2) >> 14; 1313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP2(res2); 1323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word = (res2 << 8) | res; 1333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x0 + x1) >> 14; 1343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP3(res); 1353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 16); 1363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x0 + x5) >> 14; 1373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP4(res); 1383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 24); 1393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((uint32*)(dst += width)) = dst_word; /* save 4 bytes to dst */ 1403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pred_word = *((uint32*)(pred += 4)); /* read 4 bytes from pred */ 1423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x0 - x5) >> 14; 1433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP1(res); 1443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res2 = (x0 - x1) >> 14; 1453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP2(res2); 1463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word = (res2 << 8) | res; 1473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x0 - x2) >> 14; 1483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP3(res); 1493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 16); 1503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x0 - x4) >> 14; 1513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP4(res); 1523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 24); 1533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((uint32*)(dst += 4)) = dst_word; /* save 4 bytes to dst */ 1543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 1553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return ; 1563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 1573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctcol2(int16 *blk) 1593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 1603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 x0, x1, x3, x5, x7;//, x8; 1613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = blk[8]; 1633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 = ((int32)blk[0] << 11) + 128; 1643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* both upper and lower*/ 1653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x7 = W7 * x1; 1673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = W1 * x1; 1683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x3 = x7; 1703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = (181 * (x1 - x7) + 128) >> 8; 1713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x7 = (181 * (x1 + x7) + 128) >> 8; 1723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[0] = (x0 + x1) >> 8; 1743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[8] = (x0 + x7) >> 8; 1753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[16] = (x0 + x5) >> 8; 1763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[24] = (x0 + x3) >> 8; 1773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[56] = (x0 - x1) >> 8; 1783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[48] = (x0 - x7) >> 8; 1793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[40] = (x0 - x5) >> 8; 1803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[32] = (x0 - x3) >> 8; 1813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return ; 1833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 1843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow3(int16 *blk, uint8 *pred, uint8 *dst, int width) 1863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 1873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 x0, x1, x2, x3, x4, x5, x6, x7, x8; 1883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int i = 8; 1893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint32 pred_word, dst_word; 1903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int res, res2; 1913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* preset the offset, such that we can take advantage pre-offset addressing mode */ 1933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong width -= 4; 1943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst -= width; 1953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pred -= 12; 1963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk -= 8; 1973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 1983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (i--) 1993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 2003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = blk[10]; 2013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[10] = 0; 2023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = blk[9]; 2033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[9] = 0; 2043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 = ((*(blk += 8)) << 8) + 8192; 2053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *blk = 0; /* for proper rounding in the fourth stage */ 2063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* both upper and lower*/ 2073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* both x2orx6 and x0orx4 */ 2083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 = x0; 2103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x6 = (W6 * x2 + 4) >> 3; 2113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = (W2 * x2 + 4) >> 3; 2123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x0 - x2; 2133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 += x2; 2143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = x8; 2153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x4 - x6; 2163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 += x6; 2173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x6 = x8; 2183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x7 = (W7 * x1 + 4) >> 3; 2203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = (W1 * x1 + 4) >> 3; 2213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x3 = x7; 2223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = (181 * (x1 - x7) + 128) >> 8; 2233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x7 = (181 * (x1 + x7) + 128) >> 8; 2243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pred_word = *((uint32*)(pred += 12)); /* read 4 bytes from pred */ 2263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x0 + x1) >> 14; 2273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP1(res); 2283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res2 = (x4 + x7) >> 14; 2293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP2(res2); 2303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word = (res2 << 8) | res; 2313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x6 + x5) >> 14; 2323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP3(res); 2333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 16); 2343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x2 + x3) >> 14; 2353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP4(res); 2363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 24); 2373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((uint32*)(dst += width)) = dst_word; /* save 4 bytes to dst */ 2383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pred_word = *((uint32*)(pred += 4)); /* read 4 bytes from pred */ 2403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x2 - x3) >> 14; 2413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP1(res); 2423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res2 = (x6 - x5) >> 14; 2433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP2(res2); 2443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word = (res2 << 8) | res; 2453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x4 - x7) >> 14; 2463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP3(res); 2473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 16); 2483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x0 - x1) >> 14; 2493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP4(res); 2503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 24); 2513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((uint32*)(dst += 4)) = dst_word; /* save 4 bytes to dst */ 2523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 2533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return ; 2553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 2563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctcol3(int16 *blk) 2583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 2593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 x0, x1, x2, x3, x4, x5, x6, x7, x8; 2603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = blk[16]; 2623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = blk[8]; 2633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 = ((int32)blk[0] << 11) + 128; 2643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 = x0; 2663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x6 = W6 * x2; 2673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = W2 * x2; 2683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x0 - x2; 2693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 += x2; 2703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = x8; 2713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x4 - x6; 2723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 += x6; 2733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x6 = x8; 2743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x7 = W7 * x1; 2763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = W1 * x1; 2773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x3 = x7; 2783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = (181 * (x1 - x7) + 128) >> 8; 2793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x7 = (181 * (x1 + x7) + 128) >> 8; 2803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[0] = (x0 + x1) >> 8; 2823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[8] = (x4 + x7) >> 8; 2833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[16] = (x6 + x5) >> 8; 2843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[24] = (x2 + x3) >> 8; 2853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[56] = (x0 - x1) >> 8; 2863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[48] = (x4 - x7) >> 8; 2873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[40] = (x6 - x5) >> 8; 2883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[32] = (x2 - x3) >> 8; 2893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return; 2913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 2923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 2943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow4(int16 *blk, uint8 *pred, uint8 *dst, int width) 2953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 2963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 x0, x1, x2, x3, x4, x5, x6, x7, x8; 2973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int i = 8; 2983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint32 pred_word, dst_word; 2993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int res, res2; 3003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* preset the offset, such that we can take advantage pre-offset addressing mode */ 3023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong width -= 4; 3033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst -= width; 3043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pred -= 12; 3053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk -= 8; 3063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (i--) 3083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 3093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = blk[10]; 3103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[10] = 0; 3113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = blk[9]; 3123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[9] = 0; 3133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x3 = blk[11]; 3143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[11] = 0; 3153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 = ((*(blk += 8)) << 8) + 8192; 3163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *blk = 0; /* for proper rounding in the fourth stage */ 3173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 = x0; 3193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x6 = (W6 * x2 + 4) >> 3; 3203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = (W2 * x2 + 4) >> 3; 3213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x0 - x2; 3223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 += x2; 3233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = x8; 3243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x4 - x6; 3253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 += x6; 3263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x6 = x8; 3273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x7 = (W7 * x1 + 4) >> 3; 3293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = (W1 * x1 + 4) >> 3; 3303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = (W3 * x3 + 4) >> 3; 3313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x3 = (- W5 * x3 + 4) >> 3; 3323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x1 - x5; 3333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 += x5; 3343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = x8; 3353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x7 - x3; 3363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x3 += x7; 3373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x7 = (181 * (x5 + x8) + 128) >> 8; 3383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = (181 * (x5 - x8) + 128) >> 8; 3393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pred_word = *((uint32*)(pred += 12)); /* read 4 bytes from pred */ 3413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x0 + x1) >> 14; 3423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP1(res); 3433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res2 = (x4 + x7) >> 14; 3443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP2(res2); 3453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word = (res2 << 8) | res; 3463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x6 + x5) >> 14; 3473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP3(res); 3483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 16); 3493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x2 + x3) >> 14; 3503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP4(res); 3513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 24); 3523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((uint32*)(dst += width)) = dst_word; /* save 4 bytes to dst */ 3533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong pred_word = *((uint32*)(pred += 4)); /* read 4 bytes from pred */ 3553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x2 - x3) >> 14; 3563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP1(res); 3573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res2 = (x6 - x5) >> 14; 3583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP2(res2); 3593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word = (res2 << 8) | res; 3603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x4 - x7) >> 14; 3613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP3(res); 3623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 16); 3633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong res = (x0 - x1) >> 14; 3643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong ADD_AND_CLIP4(res); 3653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong dst_word |= (res << 24); 3663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((uint32*)(dst += 4)) = dst_word; /* save 4 bytes to dst */ 3673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 3683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return ; 3693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 3703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctcol4(int16 *blk) 3723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 3733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 x0, x1, x2, x3, x4, x5, x6, x7, x8; 3743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = blk[16]; 3753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = blk[8]; 3763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x3 = blk[24]; 3773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 = ((int32)blk[0] << 11) + 128; 3783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 = x0; 3803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x6 = W6 * x2; 3813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = W2 * x2; 3823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x0 - x2; 3833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 += x2; 3843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = x8; 3853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x4 - x6; 3863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 += x6; 3873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x6 = x8; 3883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 3893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x7 = W7 * x1; 3903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = W1 * x1; 3913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = W3 * x3; 3923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x3 = -W5 * x3; 3933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x1 - x5; 3943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 += x5; 3953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = x8; 3963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x7 - x3; 3973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x3 += x7; 3983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x7 = (181 * (x5 + x8) + 128) >> 8; 3993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = (181 * (x5 - x8) + 128) >> 8; 4003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[0] = (x0 + x1) >> 8; 4033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[8] = (x4 + x7) >> 8; 4043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[16] = (x6 + x5) >> 8; 4053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[24] = (x2 + x3) >> 8; 4063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[56] = (x0 - x1) >> 8; 4073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[48] = (x4 - x7) >> 8; 4083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[40] = (x6 - x5) >> 8; 4093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[32] = (x2 - x3) >> 8; 4103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return ; 4123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 4133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow0_intra(int16 *, PIXEL *, int) 4153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 4163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return ; 4173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 4183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow1_intra(int16 *blk, PIXEL *comp, int width) 4203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 4213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* shortcut */ 4223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 tmp; 4233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int i = 8; 4243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int offset = width; 4253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong uint32 word; 4263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong comp -= offset; 4283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (i--) 4293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong tmp = ((blk[0] + 32) >> 6); 4313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[0] = 0; 4323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(tmp) 4333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = (tmp << 8) | tmp; 4353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = (word << 16) | word; 4363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((uint32*)(comp += offset)) = word; 4383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((uint32*)(comp + 4)) = word; 4393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk += B_SIZE; 4443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 4453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return; 4463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 4473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow2_intra(int16 *blk, PIXEL *comp, int width) 4493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 4503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 x0, x1, x2, x4, x5, temp; 4513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int i = 8; 4523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int offset = width; 4533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 word; 4543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong comp -= offset; 4563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (i--) 4573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 4583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* shortcut */ 4593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 = blk[1]; 4603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[1] = 0; 4613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 = ((int32)blk[0] << 8) + 8192; 4623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[0] = 0; /* for proper rounding in the fourth stage */ 4633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* first stage */ 4653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = (W7 * x4 + 4) >> 3; 4663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 = (W1 * x4 + 4) >> 3; 4673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* third stage */ 4693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = (181 * (x4 + x5) + 128) >> 8; 4703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = (181 * (x4 - x5) + 128) >> 8; 4713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* fourth stage */ 4733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = ((x0 + x4) >> 14); 4743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(word) 4753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x0 + x2) >> 14); 4773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 4783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 8); 4793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x0 + x1) >> 14); 4803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 4813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 16); 4823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x0 + x5) >> 14); 4833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 4843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 24); 4853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((int32*)(comp += offset)) = word; 4863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 4873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = ((x0 - x5) >> 14); 4883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(word) 4893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x0 - x1) >> 14); 4903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 4913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 8); 4923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x0 - x2) >> 14); 4933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 4943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 16); 4953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x0 - x4) >> 14); 4963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 4973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 24); 4983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((int32*)(comp + 4)) = word; 4993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk += B_SIZE; 5013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return ; 5033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 5043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow3_intra(int16 *blk, PIXEL *comp, int width) 5063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 5073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 x0, x1, x2, x3, x4, x5, x6, x7, x8, temp; 5083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int i = 8; 5093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int offset = width; 5103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 word; 5113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong comp -= offset; 5133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (i--) 5153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = blk[2]; 5173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[2] = 0; 5183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = blk[1]; 5193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[1] = 0; 5203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 = ((int32)blk[0] << 8) + 8192; 5213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[0] = 0;/* for proper rounding in the fourth stage */ 5223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* both upper and lower*/ 5233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong /* both x2orx6 and x0orx4 */ 5243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 = x0; 5263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x6 = (W6 * x2 + 4) >> 3; 5273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = (W2 * x2 + 4) >> 3; 5283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x0 - x2; 5293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 += x2; 5303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = x8; 5313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x4 - x6; 5323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 += x6; 5333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x6 = x8; 5343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x7 = (W7 * x1 + 4) >> 3; 5363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = (W1 * x1 + 4) >> 3; 5373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x3 = x7; 5383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = (181 * (x1 - x7) + 128) >> 8; 5393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x7 = (181 * (x1 + x7) + 128) >> 8; 5403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = ((x0 + x1) >> 14); 5423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(word) 5433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x4 + x7) >> 14); 5443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 5453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 8); 5463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x6 + x5) >> 14); 5493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 5503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 16); 5513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x2 + x3) >> 14); 5533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 5543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 24); 5553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((int32*)(comp += offset)) = word; 5563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = ((x2 - x3) >> 14); 5583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(word) 5593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x6 - x5) >> 14); 5613306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 5623306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 8); 5633306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5643306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x4 - x7) >> 14); 5653306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 5663306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 16); 5673306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5683306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x0 - x1) >> 14); 5693306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 5703306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 24); 5713306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((int32*)(comp + 4)) = word; 5723306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5733306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk += B_SIZE; 5743306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 5753306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return ; 5763306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 5773306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5783306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dongvoid idctrow4_intra(int16 *blk, PIXEL *comp, int width) 5793306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong{ 5803306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 x0, x1, x2, x3, x4, x5, x6, x7, x8, temp; 5813306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int i = 8; 5823306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int offset = width; 5833306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong int32 word; 5843306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5853306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong comp -= offset; 5863306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5873306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong while (i--) 5883306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong { 5893306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = blk[2]; 5903306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[2] = 0; 5913306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = blk[1]; 5923306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[1] = 0; 5933306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x3 = blk[3]; 5943306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[3] = 0; 5953306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 = ((int32)blk[0] << 8) + 8192; 5963306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk[0] = 0;/* for proper rounding in the fourth stage */ 5973306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 5983306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 = x0; 5993306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x6 = (W6 * x2 + 4) >> 3; 6003306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = (W2 * x2 + 4) >> 3; 6013306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x0 - x2; 6023306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x0 += x2; 6033306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x2 = x8; 6043306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x4 - x6; 6053306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x4 += x6; 6063306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x6 = x8; 6073306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6083306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x7 = (W7 * x1 + 4) >> 3; 6093306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 = (W1 * x1 + 4) >> 3; 6103306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = (W3 * x3 + 4) >> 3; 6113306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x3 = (- W5 * x3 + 4) >> 3; 6123306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x1 - x5; 6133306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x1 += x5; 6143306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = x8; 6153306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x8 = x7 - x3; 6163306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x3 += x7; 6173306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x7 = (181 * (x5 + x8) + 128) >> 8; 6183306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong x5 = (181 * (x5 - x8) + 128) >> 8; 6193306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6203306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = ((x0 + x1) >> 14); 6213306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(word) 6223306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6233306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x4 + x7) >> 14); 6243306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 6253306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 8); 6263306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6273306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6283306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x6 + x5) >> 14); 6293306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 6303306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 16); 6313306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6323306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x2 + x3) >> 14); 6333306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 6343306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 24); 6353306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((int32*)(comp += offset)) = word; 6363306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6373306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = ((x2 - x3) >> 14); 6383306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(word) 6393306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6403306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x6 - x5) >> 14); 6413306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 6423306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 8); 6433306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6443306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x4 - x7) >> 14); 6453306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 6463306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 16); 6473306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6483306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong temp = ((x0 - x1) >> 14); 6493306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong CLIP_RESULT(temp) 6503306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong word = word | (temp << 24); 6513306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong *((int32*)(comp + 4)) = word; 6523306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6533306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong blk += B_SIZE; 6543306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong } 6553306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6563306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong return ; 6573306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong} 6583306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 6593306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong#endif 6603306cfee3bf38ab207a0504e49c2d492bb73ffbfJames Dong 661