www.pudn.com > Lab534-VideoMotionDetect.rar > diff_ti_apply.c


/* 
 *  Copyright 2002 by Texas Instruments Incorporated. 
 *  All rights reserved. Property of Texas Instruments Incorporated. 
 *  Restricted rights to use, duplicate or disclose this code are 
 *  granted through contract. 
 *   
 */ 
/* 
 *  ======== diff_ti_apply.c ======== 
 *  Implementation of the color diff operation.  
 */ 
 
#pragma CODE_SECTION(DIFF_TI_apply, ".text:apply") 
 
#include  
 
#include "idiff.h" 
#include "diff_ti.h" 
#include "diff_ti_priv.h" 
 
     
/* 
 *  ======== DIFF_TI_apply ======== 
 * Function computes the difference between a reference frame 
 * and the current frame.  
 */     
Void DIFF_TI_apply(IDIFF_Handle handle, unsigned char y[],  
                     unsigned char cr[], unsigned char cb[],  
                     unsigned char prevY[], unsigned char prevCr[],  
                     unsigned char prevCb[], Int lumaSize, Int chromaSize, 
                     Int yValue, Int crValue, Int cbValue, Int procWidth) 
{     
//	DIFF_TI_Obj *diff = (DIFF_TI_Obj *)handle; 
	 
	Int i; 
	Int diffCount; 
	Int CrCbIdx; 
	 
	diffCount = 0; 
		 
	for (i = 0; i < lumaSize; i++) 
	{ 
		if (abs((y[i] - prevY[i])) >= YTHRESHOLD) 
		{ 
			diffCount++; 
		} 
	} 
	 
	if (diffCount >= DIFFTHRESHOLD) 
	{ 
		for (i = 0; i < lumaSize; i++)	//Only need to go through unequal pixels 
		{ 
			Int offset; 
			 
			if (abs((y[i] - prevY[i])) >= YTHRESHOLD) 
			{ 
				y[i] = yValue; 
 
				//Find the (Cr,Cb) pair that corresponds to the Y value 
				//Compute first line, then do middle block in groups of 2. 
				//Finally, compute last line.  This is based on the assumption 
				//that we are processing 8 lines at a time.  For more lines 
				//simple extend the number of 'else if' statements 
								 
				offset = i; 
			 
				if ((i >= procWidth) && (i < 3*procWidth))		//Lines 1-2 
				{ 
					offset = i-procWidth; 
				} 
				else if ((i >= 3*procWidth) && (i < 5*procWidth)) 	//Lines 3-4 
				{ 
					offset = i-2*procWidth; 
				} 
				else if ((i >= 5*procWidth) && (i < 7*procWidth)) 	//Lines 5-6 
				{ 
					offset = i-3*procWidth; 
				} 
				else if (i >= 7*procWidth)							//Line 7 
				{ 
					offset = i-4*procWidth; 
				} 
				 
				//Assign CrCbIdx based on even or odd 
				if ((offset % 2) == 0) 
					CrCbIdx = offset >> 1; 
				else 
					CrCbIdx = (offset-1) >> 1; 
				 
				//Check (Cr,Cb) values and change if appropriate 
				if (abs(cr[CrCbIdx] - prevCr[CrCbIdx]) >= CRCBTHRESHOLD) 
				{ 
					cr[CrCbIdx] = crValue; 
				} 
				 
				if (abs(cr[CrCbIdx] - prevCr[CrCbIdx]) >= CRCBTHRESHOLD) 
				{ 
					cb[CrCbIdx] = cbValue; 
				} 
			} 
		} 
	} 
	 
}