189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* 289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Copyright (C) 2007-2008 ARM Limited 389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * you may not use this file except in compliance with the License. 689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * You may obtain a copy of the License at 789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * See the License for the specific language governing permissions and 1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * limitations under the License. 1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/** 1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * File Name: armVCM4P2_ACDCPredict.c 2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * OpenMAX DL: v1.0.2 2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Revision: 9641 22868a6a357018e5872e064b7a13a9b891e2078962Glenn Kasten * Date: Thursday, February 7, 2008 2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * 25868a6a357018e5872e064b7a13a9b891e2078962Glenn Kasten * 261ab85ec401801ef9a9184650d0f5a1639b45eeb9Glenn Kasten * 2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Description: 289f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten * Contains module for DC/AC coefficient prediction 299f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten * 3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */ 3115304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh 3215304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh#include "omxtypes.h" 3315304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh#include "armOMX.h" 3415304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh 35e33054eb968cbf8ccaee1b0ff0301403902deed6Glenn Kasten#include "armVC.h" 3615304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh#include "armCOMM.h" 3758f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten 38dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten/** 3915304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * Function: armVCM4P2_ACDCPredict 409f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten * 419f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten * Description: 429f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten * Performs adaptive DC/AC coefficient prediction for an intra block. Prior 4304cd0186305e2b59d23c9147787046c6662029ccGlenn Kasten * to the function call, prediction direction (predDir) should be selected 44b42f318d9733f88c7eb9bedfd33b086b8ea5dff5Glenn Kasten * as specified in subclause 7.4.3.1 of ISO/IEC 14496-2. 45c9b2e20f7c9a71e07ef398152709c76079decbcdGlenn Kasten * 46c9b2e20f7c9a71e07ef398152709c76079decbcdGlenn Kasten * Remarks: 47b42f318d9733f88c7eb9bedfd33b086b8ea5dff5Glenn Kasten * 48b42f318d9733f88c7eb9bedfd33b086b8ea5dff5Glenn Kasten * Parameters: 49b42f318d9733f88c7eb9bedfd33b086b8ea5dff5Glenn Kasten * [in] pSrcDst pointer to the coefficient buffer which contains 5015304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * the quantized coefficient residuals (PQF) of the 5115304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * current block 52b42f318d9733f88c7eb9bedfd33b086b8ea5dff5Glenn Kasten * [in] pPredBufRow pointer to the coefficient row buffer 53b42f318d9733f88c7eb9bedfd33b086b8ea5dff5Glenn Kasten * [in] pPredBufCol pointer to the coefficient column buffer 54e541269be94f3a1072932d51537905b120ef4733Andy Hung * [in] curQP quantization parameter of the current block. curQP 55e541269be94f3a1072932d51537905b120ef4733Andy Hung * may equal to predQP especially when the current 56cac3daa6332bf6d1f7d26adc4a9915f3d7992dd9Glenn Kasten * block and the predictor block are in the same 57dd8104cc5367262f0e5f13df4e79f131e8d560bbGlenn Kasten * macroblock. 5815304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * [in] predQP quantization parameter of the predictor block 5915304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * [in] predDir indicates the prediction direction which takes one 6015304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * of the following values: 6115304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * OMX_VC_HORIZONTAL predict horizontally 6215304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh * OMX_VC_VERTICAL predict vertically 6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * [in] ACPredFlag a flag indicating if AC prediction should be 6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * performed. It is equal to ac_pred_flag in the bit 6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * stream syntax of MPEG-4 6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * [in] videoComp video component type (luminance, chrominance or 67aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten * alpha) of the current block 689f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten * [in] flag This flag defines the if one wants to use this functions to 6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * calculate PQF (set 1, prediction) or QF (set 0, reconstruction) 7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * [out] pPreACPredict pointer to the predicted coefficients buffer. 7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * Filled ONLY if it is not NULL 7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * [out] pSrcDst pointer to the coefficient buffer which contains 73eba51fb3a361f67a6a64d5a16eba6084fe27d60eGlenn Kasten * the quantized coefficients (QF) of the current 7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * block 7558f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten * [out] pPredBufRow pointer to the updated coefficient row buffer 76624a7fcb377f2a40109c16de5109ae8ea1f67a69Glenn Kasten * [out] pPredBufCol pointer to the updated coefficient column buffer 77bce50bfc3846ab008bafa75c5d3f29fd7b5395f7Glenn Kasten * [out] pSumErr pointer to the updated sum of the difference 7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * between predicted and unpredicted coefficients 7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * If this is NULL, do not update 80838b3d8bafa4a781e277870dee4e0390165cff52Glenn Kasten * 819f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten * Return Value: 8227f7b2a8fe899565487d8a326676a5f7d0a05a37Glenn Kasten * Standard OMXResult result. See enumeration for possible result codes. 83828f883a43f66f77d776a75d0ea2b87c7c826071Glenn Kasten * 84aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten */ 85e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten 86e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn KastenOMXResult armVCM4P2_ACDCPredict( 87e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten OMX_S16 * pSrcDst, 8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project OMX_S16 * pPreACPredict, 899f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten OMX_S16 * pPredBufRow, 90828f883a43f66f77d776a75d0ea2b87c7c826071Glenn Kasten OMX_S16 * pPredBufCol, 9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project OMX_INT curQP, 9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project OMX_INT predQP, 9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project OMX_INT predDir, 9489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project OMX_INT ACPredFlag, 9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project OMXVCM4P2VideoComponent videoComp, 9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project OMX_U8 flag, 9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project OMX_INT *pSumErr 9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project) 9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 10068337edf595a0c345ba4b8adcd4f1e541a1d7eb7Glenn Kasten OMX_INT dcScaler, i; 1015a6cd224d07c05b496b6aca050ce5ecf96f125afGlenn Kasten OMX_S16 tempPred; 10268337edf595a0c345ba4b8adcd4f1e541a1d7eb7Glenn Kasten 10368337edf595a0c345ba4b8adcd4f1e541a1d7eb7Glenn Kasten /* Argument error checks */ 10468337edf595a0c345ba4b8adcd4f1e541a1d7eb7Glenn Kasten armRetArgErrIf(pSrcDst == NULL, OMX_Sts_BadArgErr); 10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project armRetArgErrIf(pPredBufRow == NULL, OMX_Sts_BadArgErr); 106089e87201522c8979ac8f00fa729e907f54c790bGlenn Kasten armRetArgErrIf(pPredBufCol == NULL, OMX_Sts_BadArgErr); 107089e87201522c8979ac8f00fa729e907f54c790bGlenn Kasten armRetArgErrIf(curQP <= 0, OMX_Sts_BadArgErr); 10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project armRetArgErrIf(predQP <= 0, OMX_Sts_BadArgErr); 109d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen armRetArgErrIf((predDir != 1) && (predDir != 2), OMX_Sts_BadArgErr); 11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project armRetArgErrIf(!armIs4ByteAligned(pSrcDst), OMX_Sts_BadArgErr); 11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project armRetArgErrIf(!armIs4ByteAligned(pPredBufRow), OMX_Sts_BadArgErr); 11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project armRetArgErrIf(!armIs4ByteAligned(pPredBufCol), OMX_Sts_BadArgErr); 11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 114eba51fb3a361f67a6a64d5a16eba6084fe27d60eGlenn Kasten 11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /* Set DC scaler value to avoid some compilers giving a warning. */ 11658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten dcScaler=0; 117624a7fcb377f2a40109c16de5109ae8ea1f67a69Glenn Kasten 118bce50bfc3846ab008bafa75c5d3f29fd7b5395f7Glenn Kasten /* Calculate the DC scaler value */ 11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (videoComp == OMX_VC_LUMINANCE) 12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 121838b3d8bafa4a781e277870dee4e0390165cff52Glenn Kasten if (curQP >= 1 && curQP <= 4) 122be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent { 1239f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten dcScaler = 8; 12427f7b2a8fe899565487d8a326676a5f7d0a05a37Glenn Kasten } 12527f7b2a8fe899565487d8a326676a5f7d0a05a37Glenn Kasten else if (curQP >= 5 && curQP <= 8) 12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 127bce50bfc3846ab008bafa75c5d3f29fd7b5395f7Glenn Kasten dcScaler = 2 * curQP; 128838b3d8bafa4a781e277870dee4e0390165cff52Glenn Kasten } 129bce50bfc3846ab008bafa75c5d3f29fd7b5395f7Glenn Kasten else if (curQP >= 9 && curQP <= 24) 13086f04663032ddaa25110149d709bbf896ad83b02Glenn Kasten { 13186f04663032ddaa25110149d709bbf896ad83b02Glenn Kasten dcScaler = curQP + 8; 1329f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 1339f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten else 1349f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten { 1359f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten dcScaler = (2 * curQP) - 16; 1369f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 1379f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 1389f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten else if (videoComp == OMX_VC_CHROMINANCE) 1399f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten { 1409f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten if (curQP >= 1 && curQP <= 4) 1419f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten { 1429f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten dcScaler = 8; 1439f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 1449f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten else if (curQP >= 5 && curQP <= 24) 1459f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten { 1469f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten dcScaler = (curQP + 13)/2; 1479f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 1489f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten else 1499f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten { 1509f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten dcScaler = curQP - 6; 1519f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 1529f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten } 1539f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 1549f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten if (pPreACPredict != NULL) 1551703cdfee717b1b312bf8979816a9e2f16a82e5dEric Laurent { 1561703cdfee717b1b312bf8979816a9e2f16a82e5dEric Laurent pPreACPredict[0] = predDir; 157089e87201522c8979ac8f00fa729e907f54c790bGlenn Kasten } 1581dd70b9f04961a06fcb73a97fca10a53b3245d3cEric Laurent 1599f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten if (predDir == OMX_VC_VERTICAL) 16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /* F[0][0]//dc_scaler */ 16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project tempPred = armIntDivAwayFromZero(pPredBufRow[0], dcScaler); 1635f631515d098c29603cda88f7a7e7580a2d55b57Glenn Kasten } 164c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent else 165c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /* F[0][0]//dc_scaler */ 167ac0bbe16f3eba46b3d8057b66c2aff9101fc6f7dJeff Brown tempPred = armIntDivAwayFromZero(pPredBufCol[0], dcScaler); 16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 170f0f33c4acd231fa95deb9eeef2c46b0129e64463Glenn Kasten /* Updating the DC value to the row and col buffer */ 171f0f33c4acd231fa95deb9eeef2c46b0129e64463Glenn Kasten *(pPredBufRow - 8) = *pPredBufCol; 17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 173e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten if (flag) 174e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten { 17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /* Cal and store F[0][0] into the col buffer */ 17658f30210ea540b6ce5aa6a46330cd3499483cb97Glenn Kasten *pPredBufCol = pSrcDst[0] * dcScaler; 177fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin 17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /* PQF = QF - F[0][0]//dc_scaler */ 1799f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten pSrcDst[0] -= tempPred; 180c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent } 181fce7a473248381cc83a01855f92581077d3c9ee2Dima Zavin else 182cac3daa6332bf6d1f7d26adc4a9915f3d7992dd9Glenn Kasten { 183c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent /* QF = PQF + F[0][0]//dc_scaler */ 18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pSrcDst[0] += tempPred; 185291bb6d8947c5b0c062f0895d623c529259bfa39Glenn Kasten 186291bb6d8947c5b0c062f0895d623c529259bfa39Glenn Kasten /* Saturate */ 187cac3daa6332bf6d1f7d26adc4a9915f3d7992dd9Glenn Kasten pSrcDst[0] = armClip (-2048, 2047, pSrcDst[0]); 188291bb6d8947c5b0c062f0895d623c529259bfa39Glenn Kasten 189291bb6d8947c5b0c062f0895d623c529259bfa39Glenn Kasten /* Cal and store F[0][0] into the col buffer */ 1902e4664677d72ce54201d3fd0beb0e10280add93cGlenn Kasten *pPredBufCol = pSrcDst[0] * dcScaler; 19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 1920d255b2d9061ba31f13ada3fc0f7e51916407176Jean-Michel Trivi 1939f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (ACPredFlag == 1) 19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 196a42ff007a17d63df22c60dd5e5fd811ee45ca1b3Glenn Kasten if (predDir == OMX_VC_VERTICAL) 197e541269be94f3a1072932d51537905b120ef4733Andy Hung { 198a42ff007a17d63df22c60dd5e5fd811ee45ca1b3Glenn Kasten for (i = 1; i < 8; i++) 199c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent { 200c85df82b1e8b05714268926a8bb3deb9c65f9a22Glenn Kasten tempPred = armIntDivAwayFromZero \ 201c85df82b1e8b05714268926a8bb3deb9c65f9a22Glenn Kasten (pPredBufRow[i] * predQP, curQP); 202c85df82b1e8b05714268926a8bb3deb9c65f9a22Glenn Kasten if (flag) 203c85df82b1e8b05714268926a8bb3deb9c65f9a22Glenn Kasten { 204c85df82b1e8b05714268926a8bb3deb9c65f9a22Glenn Kasten /* Updating QF to the row buff */ 205e3aa659e9cee7df5c12a80d285cc29ab3b2cbb39Glenn Kasten pPredBufRow[i] = pSrcDst[i]; 20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /*PQFX[v][0] = QFX[v][0] - (QFA[v][0] * QPA) // QPX */ 207b42f318d9733f88c7eb9bedfd33b086b8ea5dff5Glenn Kasten pSrcDst[i] -= tempPred; 208ac0bbe16f3eba46b3d8057b66c2aff9101fc6f7dJeff Brown /* Sum of absolute values of AC prediction error, this can 209ac0bbe16f3eba46b3d8057b66c2aff9101fc6f7dJeff Brown be used as a reference to choose whether to use 21015304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh AC prediction */ 211b42f318d9733f88c7eb9bedfd33b086b8ea5dff5Glenn Kasten *pSumErr += armAbs(pSrcDst[i]); 212b42f318d9733f88c7eb9bedfd33b086b8ea5dff5Glenn Kasten /* pPreACPredict[1~7] store the error signal 21315304d601cbf83be6519ca53e1a26b97d50d0192Chia-chi Yeh after AC prediction */ 214c2f1f07084818942352c6bbfb36af9b6b330eb4eEric Laurent pPreACPredict[i] = pSrcDst[i]; 2153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block } 21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project else 21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project { 21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /*QFX[v][0] = PQFX[v][0] + (QFA[v][0] * QPA) // QPX */ 21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pSrcDst[i] += tempPred; 2209f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /* Saturate */ 22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pSrcDst[i] = armClip (-2048, 2047, pSrcDst[i]); 223b3b2e23fcf7e050710d23b82a6682c0f3d869b69Glenn Kasten 224b3b2e23fcf7e050710d23b82a6682c0f3d869b69Glenn Kasten /* Updating QF to the row buff */ 22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pPredBufRow[i] = pSrcDst[i]; 2264a0efb77198c69df711ab369ac482a42dbdfab07Glenn Kasten } 2274a0efb77198c69df711ab369ac482a42dbdfab07Glenn Kasten } 22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 229aea7ea06394bcb155972d82055d4ea59962e4051Glenn Kasten else 230ac0bbe16f3eba46b3d8057b66c2aff9101fc6f7dJeff Brown { 231ac0bbe16f3eba46b3d8057b66c2aff9101fc6f7dJeff Brown for (i = 8; i < 64; i += 8) 232ac0bbe16f3eba46b3d8057b66c2aff9101fc6f7dJeff Brown { 233ac0bbe16f3eba46b3d8057b66c2aff9101fc6f7dJeff Brown tempPred = armIntDivAwayFromZero \ 234ac0bbe16f3eba46b3d8057b66c2aff9101fc6f7dJeff Brown (pPredBufCol[i>>3] * predQP, curQP); 235ac0bbe16f3eba46b3d8057b66c2aff9101fc6f7dJeff Brown if (flag) 236ac0bbe16f3eba46b3d8057b66c2aff9101fc6f7dJeff Brown { 237879707057cde0a83b5f6143c918c66b8f4a97581Glenn Kasten /* Updating QF to col buff */ 238879707057cde0a83b5f6143c918c66b8f4a97581Glenn Kasten pPredBufCol[i>>3] = pSrcDst[i]; 239879707057cde0a83b5f6143c918c66b8f4a97581Glenn Kasten /*PQFX[0][u] = QFX[0][u] - (QFA[0][u] * QPA) // QPX */ 240879707057cde0a83b5f6143c918c66b8f4a97581Glenn Kasten pSrcDst[i] -= tempPred; 241879707057cde0a83b5f6143c918c66b8f4a97581Glenn Kasten /* Sum of absolute values of AC prediction error, this can 242879707057cde0a83b5f6143c918c66b8f4a97581Glenn Kasten be used as a reference to choose whether to use AC 243ac0bbe16f3eba46b3d8057b66c2aff9101fc6f7dJeff Brown prediction */ 24434f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent *pSumErr += armAbs(pSrcDst[i]); 245ac0bbe16f3eba46b3d8057b66c2aff9101fc6f7dJeff Brown /* pPreACPredict[1~7] store the error signal 246879707057cde0a83b5f6143c918c66b8f4a97581Glenn Kasten after AC prediction */ 24738e905b3cbba4da443d799b16999989781afc6d8Glenn Kasten pPreACPredict[i>>3] = pSrcDst[i]; 248879707057cde0a83b5f6143c918c66b8f4a97581Glenn Kasten } 249879707057cde0a83b5f6143c918c66b8f4a97581Glenn Kasten else 250879707057cde0a83b5f6143c918c66b8f4a97581Glenn Kasten { 251879707057cde0a83b5f6143c918c66b8f4a97581Glenn Kasten /*QFX[0][u] = PQFX[0][u] + (QFA[0][u] * QPA) // QPX */ 252879707057cde0a83b5f6143c918c66b8f4a97581Glenn Kasten pSrcDst[i] += tempPred; 25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project /* Saturate */ 25534f1d8ecd23169a5f299937e3aaf1bd7937578a0Eric Laurent pSrcDst[i] = armClip (-2048, 2047, pSrcDst[i]); 25689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 25768337edf595a0c345ba4b8adcd4f1e541a1d7eb7Glenn Kasten /* Updating QF to col buff */ 25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project pPredBufCol[i>>3] = pSrcDst[i]; 25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 260573266210fb2b2e7d86fbd46d0dfe16763611d91Eric Laurent } 26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 2627d563247cdac0509009d579bbf849157d47c38a9Jean-Michel Trivi } 26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return OMX_Sts_NoErr; 265d457c970c8d08519cd77280a90b61ae1e342cfe3Marco Nelissen} 2669f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 2679f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten/*End of File*/ 2689f80dd223d83d9bb9077fb6baee056cee4eaf7e5Glenn Kasten 26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project