blob: 6c5373149a04c9de6845a9d036cbbd861ebc70f2 [file] [log] [blame]
/*
* Copyright (C) 2007-2008 ARM Limited
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
/* ----------------------------------------------------------------
*
*
* File Name: armVCM4P10_TransformResidual4x4.c
* OpenMAX DL: v1.0.2
* Revision: 9641
* Date: Thursday, February 7, 2008
*
*
*
*
* H.264 transform module
*
*/
#include "omxtypes.h"
#include "armOMX.h"
#include "omxVC.h"
#include "armCOMM.h"
#include "armVC.h"
/*
* Description:
* Transform Residual 4x4 Coefficients
*
* Parameters:
* [in] pSrc Source 4x4 block
* [out] pDst Destination 4x4 block
*
*/
void armVCM4P10_TransformResidual4x4(OMX_S16* pDst, OMX_S16 *pSrc)
{
int i;
/* Transform rows */
for (i=0; i<16; i+=4)
{
int d0 = pSrc[i+0];
int d1 = pSrc[i+1];
int d2 = pSrc[i+2];
int d3 = pSrc[i+3];
int e0 = d0 + d2;
int e1 = d0 - d2;
int e2 = (d1>>1) - d3;
int e3 = d1 + (d3>>1);
int f0 = e0 + e3;
int f1 = e1 + e2;
int f2 = e1 - e2;
int f3 = e0 - e3;
pDst[i+0] = (OMX_S16)f0;
pDst[i+1] = (OMX_S16)f1;
pDst[i+2] = (OMX_S16)f2;
pDst[i+3] = (OMX_S16)f3;
}
/* Transform columns */
for (i=0; i<4; i++)
{
int f0 = pDst[i+0];
int f1 = pDst[i+4];
int f2 = pDst[i+8];
int f3 = pDst[i+12];
int g0 = f0 + f2;
int g1 = f0 - f2;
int g2 = (f1>>1) - f3;
int g3 = f1 + (f3>>1);
int h0 = g0 + g3;
int h1 = g1 + g2;
int h2 = g1 - g2;
int h3 = g0 - g3;
pDst[i+0] = (OMX_S16)((h0+32)>>6);
pDst[i+4] = (OMX_S16)((h1+32)>>6);
pDst[i+8] = (OMX_S16)((h2+32)>>6);
pDst[i+12] = (OMX_S16)((h3+32)>>6);
}
}