10c1bc742181ded4930842b46e9507372f0b1b963James Dong/* ----------------------------------------------------------------
20c1bc742181ded4930842b46e9507372f0b1b963James Dong *
30c1bc742181ded4930842b46e9507372f0b1b963James Dong *
40c1bc742181ded4930842b46e9507372f0b1b963James Dong * File Name:  armVCM4P10_PredictIntraDC4x4.c
50c1bc742181ded4930842b46e9507372f0b1b963James Dong * OpenMAX DL: v1.0.2
60c1bc742181ded4930842b46e9507372f0b1b963James Dong * Revision:   9641
70c1bc742181ded4930842b46e9507372f0b1b963James Dong * Date:       Thursday, February 7, 2008
80c1bc742181ded4930842b46e9507372f0b1b963James Dong *
90c1bc742181ded4930842b46e9507372f0b1b963James Dong * (c) Copyright 2007-2008 ARM Limited. All Rights Reserved.
100c1bc742181ded4930842b46e9507372f0b1b963James Dong *
110c1bc742181ded4930842b46e9507372f0b1b963James Dong *
120c1bc742181ded4930842b46e9507372f0b1b963James Dong *
130c1bc742181ded4930842b46e9507372f0b1b963James Dong * H.264 4x4 intra prediction module
140c1bc742181ded4930842b46e9507372f0b1b963James Dong *
150c1bc742181ded4930842b46e9507372f0b1b963James Dong */
160c1bc742181ded4930842b46e9507372f0b1b963James Dong
170c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxtypes.h"
180c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armOMX.h"
190c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "omxVC.h"
200c1bc742181ded4930842b46e9507372f0b1b963James Dong
210c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armCOMM.h"
220c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "armVC.h"
230c1bc742181ded4930842b46e9507372f0b1b963James Dong
240c1bc742181ded4930842b46e9507372f0b1b963James Dong/*
250c1bc742181ded4930842b46e9507372f0b1b963James Dong * Description:
260c1bc742181ded4930842b46e9507372f0b1b963James Dong * Perform DC style intra prediction, averaging upper and left block
270c1bc742181ded4930842b46e9507372f0b1b963James Dong *
280c1bc742181ded4930842b46e9507372f0b1b963James Dong * Parameters:
290c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pSrcLeft		Pointer to the buffer of 16 left coefficients:
300c1bc742181ded4930842b46e9507372f0b1b963James Dong *								p[x, y] (x = -1, y = 0..3)
310c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	pSrcAbove		Pointer to the buffer of 16 above coefficients:
320c1bc742181ded4930842b46e9507372f0b1b963James Dong *								p[x,y] (x = 0..3, y = -1)
330c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	leftStep		Step of left coefficient buffer
340c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	dstStep			Step of the destination buffer
350c1bc742181ded4930842b46e9507372f0b1b963James Dong * [in]	availability	Neighboring 16x16 MB availability flag
360c1bc742181ded4930842b46e9507372f0b1b963James Dong * [out]	pDst			Pointer to the destination buffer
370c1bc742181ded4930842b46e9507372f0b1b963James Dong *
380c1bc742181ded4930842b46e9507372f0b1b963James Dong * Return Value:
390c1bc742181ded4930842b46e9507372f0b1b963James Dong * None
400c1bc742181ded4930842b46e9507372f0b1b963James Dong */
410c1bc742181ded4930842b46e9507372f0b1b963James Dong
420c1bc742181ded4930842b46e9507372f0b1b963James Dongvoid armVCM4P10_PredictIntraDC4x4(
430c1bc742181ded4930842b46e9507372f0b1b963James Dong     const OMX_U8* pSrcLeft,
440c1bc742181ded4930842b46e9507372f0b1b963James Dong     const OMX_U8 *pSrcAbove,
450c1bc742181ded4930842b46e9507372f0b1b963James Dong     OMX_U8* pDst,
460c1bc742181ded4930842b46e9507372f0b1b963James Dong     OMX_INT leftStep,
470c1bc742181ded4930842b46e9507372f0b1b963James Dong     OMX_INT dstStep,
480c1bc742181ded4930842b46e9507372f0b1b963James Dong     OMX_S32 availability
490c1bc742181ded4930842b46e9507372f0b1b963James Dong)
500c1bc742181ded4930842b46e9507372f0b1b963James Dong{
510c1bc742181ded4930842b46e9507372f0b1b963James Dong    int x, y, Sum=0, Count = 0;
520c1bc742181ded4930842b46e9507372f0b1b963James Dong
530c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (availability & OMX_VC_LEFT)
540c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
550c1bc742181ded4930842b46e9507372f0b1b963James Dong        for (y=0; y<4; y++)
560c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
570c1bc742181ded4930842b46e9507372f0b1b963James Dong            Sum += pSrcLeft[y*leftStep];
580c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
590c1bc742181ded4930842b46e9507372f0b1b963James Dong        Count++;
600c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
610c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (availability & OMX_VC_UPPER)
620c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
630c1bc742181ded4930842b46e9507372f0b1b963James Dong        for (x=0; x<4; x++)
640c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
650c1bc742181ded4930842b46e9507372f0b1b963James Dong            Sum += pSrcAbove[x];
660c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
670c1bc742181ded4930842b46e9507372f0b1b963James Dong        Count++;
680c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
690c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (Count==0)
700c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
710c1bc742181ded4930842b46e9507372f0b1b963James Dong        Sum = 128;
720c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
730c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (Count==1)
740c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
750c1bc742181ded4930842b46e9507372f0b1b963James Dong        Sum = (Sum + 2) >> 2;
760c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
770c1bc742181ded4930842b46e9507372f0b1b963James Dong    else /* Count = 2 */
780c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
790c1bc742181ded4930842b46e9507372f0b1b963James Dong        Sum = (Sum + 4) >> 3;
800c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
810c1bc742181ded4930842b46e9507372f0b1b963James Dong    for (y=0; y<4; y++)
820c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
830c1bc742181ded4930842b46e9507372f0b1b963James Dong        for (x=0; x<4; x++)
840c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
850c1bc742181ded4930842b46e9507372f0b1b963James Dong            pDst[y*dstStep+x] = (OMX_U8)Sum;
860c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
870c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
880c1bc742181ded4930842b46e9507372f0b1b963James Dong}
89