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