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