jcamencode.c

来自「是一个手机功能的模拟程序」· C语言 代码 · 共 1,071 行 · 第 1/3 页

C
1,071
字号
	//|+----------------Soft nReset for sensor
	//+-----------------Soft nReset

	if ( fSuccess )
	{
		if ( (pJpegInfo->m_QTable >= 0) && (pJpegInfo->m_QTable <= 63) )
		{
			// Using Fixed Q-Tables Page 57 of Agilent ADCM-1650 CIF Reslution CMOS Camera Module
			// Disable Auto Q Adjust
			mainCfg2 &= ~0x0040;
			fSuccess = AgilentProcessorWrite( apr04_CFG_MAIN2, mainCfg2 );
			if ( fSuccess )
			{
				// Select QTable
				fSuccess = AgilentProcessorWrite( apr62_QTABLE_SELECT, pJpegInfo->m_QTable );
				if ( fSuccess )
				{
					// Set ALQ to load JPEG quantization table RAM
					mainCfg2 |= 0x0020;
					fSuccess = AgilentProcessorWrite( apr04_CFG_MAIN2, mainCfg2 );
				}
			}
		}
		else
		{
			// Enable Auto Q Adjust
			mainCfg2 |= 0x0040;
			fSuccess = AgilentProcessorWrite( apr04_CFG_MAIN2, mainCfg2 );
		}
	}	

	if ( !fSuccess )
	{
		jpegSetLastError( JPEG_ERR_AGILENT_ERROR );
	}
	return ( fSuccess );
}

//---------------------------------------------------------------------------
//	prvInitAnyCapture - prepares data structures for next capture
//
//	Input:	pJpegInfo		pointer to JPEGINFO object
//			pCamEncState	pointer to prvCamEncodeState object
//
//	Return:	TRUE successful, FALSE if error.
//---------------------------------------------------------------------------
Boolean prvInitAnyCapture( JPEGINFO* pJpegInfo, prvCamEncodeState* pCamEncState )
{
	Boolean fSuccess = prvValidateParam( pJpegInfo );
	if ( fSuccess )
	{
		UInt32 loop = 0;

		pCamEncState->m_fNoTimeOut	= TRUE;
		pCamEncState->m_fCamClk		= prvGetCamClk();

		// Stop Camera Capture
		pCamEncState->m_CamControl = prvStopCapture();

		// Start Camera Clock if not already started
		if ( !pCamEncState->m_fCamClk )
		{
			prvSetCamClk( TRUE );
			halDelayUS( 200 * 1000 );
		}

		fSuccess = prvAccessAgilent( pJpegInfo, pCamEncState );
		if ( fSuccess )
		{
			pCamEncState->m_AutoFrameXfer = (Boolean)halReadReg8( REG003C_LCDXFER );

			// Turn off auto frame transfer if enabled
			if ( pCamEncState->m_AutoFrameXfer & 1 )
			{
				halWriteReg8( REG003C_LCDXFER, 0 );
			}
		}

	}
	return ( fSuccess );
}

//-----------------------------------------------------------------------------
//	prvRestoreReg - Restore list of previously saved registers
//
//	Input:	pSaveReg	pointer to array of register values to restore
//
//	Output:	n/a
//
//-----------------------------------------------------------------------------
void prvRestoreReg( UInt8* pSaveReg )
{
	UInt8 i;

	for ( i = 0; i < CAMENC_REG_SIZE; ++i, ++pSaveReg )
	{
		halWriteReg8( gCamEncodeRegIndex[ i ], *pSaveReg );
	}
}

//-----------------------------------------------------------------------------
//	prvRestoreState - restore saved world state
//
//	Input:	pJpegInfo		pointer to JPEGINFO object
//			pCamEncState	pointer to prvCamEncodeState object
//			fSuccess		status of encoding
//
//	Output:	n/a
//
//-----------------------------------------------------------------------------
void prvRestoreState( JPEGINFO* pJpegInfo, prvCamEncodeState* pCamEncState, Boolean fSuccess )
{
	// Restore pointers to starting state
	pJpegInfo->m_pBuf		= pCamEncState->m_pStart;
	pJpegInfo->m_BufSize	= pCamEncState->m_BufSize;
	pJpegInfo->m_EncSize	= pCamEncState->m_TotalSize;

	if ( fSuccess  )
	{
		// Restore previous address
		halWriteReg8( REG0102_CMSIGNAL, pCamEncState->m_CamSignal );
		//76543210b
		//|||||||+--Valid Input Clock Edge
		//||||||+---CMVREF Active Select 1=Active Hi 0=Active Lo
		//|||||+----CMHREF Active Select 1=Active Hi 0=Active Lo
		//|||++-----YUV Data Format Select
		//||+-------Clock Mode Select
		//|+--------Reserved
		//+---------n/a

		// Force Capture Frame to start capture (this bit is write only so having
		// saved the original state does not help
		halWriteReg8( REG0108_CMCONTROL, (UInt8)((pCamEncState->m_CamControl & ~0x08) | 0x02));
		//76543210b
		//|||||||+--CMCLK Output Hold Reset
		//||||||+---Capture Frame
		//|||||+----Repeat Capture Frame
		//||||+-----Camera Capture Stop
		//|||+------Camera Data Type 1=YUV 0=JPEG
		//+++-------n/a

		prvSetStartAddrImg( pCamEncState->m_StartAddr.m_Prev );
	}

	if ( pCamEncState->m_fUnWind )
	{
		prvUnWind( pJpegInfo, pCamEncState );
    }

	prvRestoreReg( pCamEncState->m_aSaveReg );
}

//-----------------------------------------------------------------------------
//	prvSaveReg - Saves hardware to array of register values
//
//	Input:	pSaveReg	pointer to array of register values to save
//
//	Output:	n/a
//
//-----------------------------------------------------------------------------
void prvSaveReg( UInt8* pSaveReg )
{
	UInt8 i;

	for ( i = 0; i < CAMENC_REG_SIZE; ++i, ++pSaveReg )
	{
		*pSaveReg = halReadReg8( gCamEncodeRegIndex[ i ] );
	}
}

//------------------------------------------------------------------------------
//	prvAdvanceStartAddr - Advances start address to next location allowing for
//							image wrap
//
//	Input:	pJpegInfo		pointer to JPEGINFO object
//			pStartAddr		pointer to start address object
//
//	Return:	n/a
//
//------------------------------------------------------------------------------
void prvAdvanceStartAddr( JPEGINFO* pJpegInfo, prvStartAddr* pStartAddr )
{
	if ( pJpegInfo->m_fMultiLoc )
	{
		// Advance to next memory location
		pStartAddr->m_Cur += pJpegInfo->m_EncSize + 15;
		pStartAddr->m_Cur &= 0xFFFFFFF0;

		// Check for memory wrap
		if ( pStartAddr->m_Cur > 0x27000L )
		{
			// If wrap reset to "starting" address
			pStartAddr->m_Cur = pStartAddr->m_First;
		}
		prvSetStartAddrImg( pStartAddr->m_Cur );
	}
}

//------------------------------------------------------------------------------
//	prvSetStartAddrImg - writes start address hardware
//
//	Input:	image write start address
//
//	Return:	n/a
//
//------------------------------------------------------------------------------
void prvSetStartAddrImg( UInt32 address )
{
	prvHalWriteReg24( REG0224_YUVWRSTART0, address );
}

//------------------------------------------------------------------------------
//	prvInitStartAddr - initializes start address object & hardware
//
//	Input:	pJpegInfo		pointer to JPEGINFO object
//			pStartAddr		pointer to start address object
//
//	Return:	n/a
//
//------------------------------------------------------------------------------
void prvInitStartAddr( JPEGINFO* pJpegInfo, prvStartAddr* pStartAddr )
{
	UInt32 height	= GetDisplayHeight( cl_MAIN_WINDOW );
	UInt32 stride	= GetStride( cl_MAIN_WINDOW );
	UInt32 start	= GetStartAddress( cl_MAIN_WINDOW );
	UInt32 end		= start + (stride * height);

	pStartAddr->m_Cur = pStartAddr->m_Prev = prvHalReadReg24( REG0224_YUVWRSTART0 );

	if ( pJpegInfo->m_fMultiLoc )
	{
		pStartAddr->m_First = pStartAddr->m_Cur;
	}
	else
	{
		pStartAddr->m_Cur = end;
	}

	prvSetStartAddrImg( pStartAddr->m_Cur );
	pJpegInfo->m_CapAddr = pStartAddr->m_Cur;
}

//-----------------------------------------------------------------------------
//	prvUnWind - Restore previous hardware states
//
//	Input:	pJpegInfo		pointer to JPEGINFO object
//			pCamEncState	pointer to prvCamEncodeState object
//
//	Output:	n/a
//
//-----------------------------------------------------------------------------
void prvUnWind( JPEGINFO* pJpegInfo, prvCamEncodeState* pCamEncState )
{
    if ( pCamEncState->m_fYUV )
	{
		AgilentYUVCIF();
	}

	if ( !pCamEncState->m_fCamClk )
	{
		prvSetCamClk( FALSE );
	}

    // Restore previous auto frame transfer if enabled
	if ( pCamEncState->m_AutoFrameXfer & 0x01 )
	{	
		halWriteReg8( REG003C_LCDXFER, 1 );
    }
}

//-----------------------------------------------------------------------------
//	prvValidateParam - validate JPEGINFO object
//
//	Input:	pJpegInfo	pointer to JPEGINFO object
//
//	Output:	TRUE if valid parameters
//			FALSE if NOT valid paramaters
//
//-----------------------------------------------------------------------------
Boolean prvValidateParam( JPEGINFO* pJpegInfo )
{
	Boolean fSuccess = jpegValidateBuf( pJpegInfo );
	if ( pJpegInfo->m_fFixBug )
	{
		fSuccess = (pJpegInfo->m_XStart & 0x03) ? FALSE : TRUE;
		if ( fSuccess )
		{
			fSuccess = (pJpegInfo->m_YStart & 0x03) ? FALSE : TRUE;
			if ( fSuccess )
			{
				fSuccess = (pJpegInfo->m_Height & 0x03) ? FALSE : TRUE;
				if ( fSuccess )
				{
					fSuccess = (pJpegInfo->m_Width & 0x03) ? FALSE : TRUE;
				}
			}
		}
		if ( !fSuccess )
		{
			jpegSetLastError( JPEG_ERR_DIM_RESTRICT );
		}
	}

	return ( fSuccess );
}

//------------------------------------------------------------------------------
//	prvWaitForCapture - captures image despite truncation
//
//	Input:	pJpegInfo		pointer to JPEGINFO object
//			pCamEncState	pointer to prvCamEncodeState object
//
//	Return:	TRUE means valid image
//			FALSE means NOT valid image
//
//------------------------------------------------------------------------------
Boolean prvWaitForCapture( JPEGINFO* pJpegInfo, prvCamEncodeState* pCamEncState )
{
	Boolean fSuccess;
	Boolean fCompleteImage;
	UInt32	retry = 0;

	do
	{
		fSuccess = prvStartCapture( pJpegInfo, pCamEncState, &fCompleteImage );
		if ( fSuccess )
		{
			if ( !fCompleteImage )
			{
				++retry;
				if ( pJpegInfo->m_fVerbose )
				{
					UInt8 qTable = halReadDisplay8( pCamEncState->m_StartAddr.m_Cur + 3 );
					//printf( "Image %d truncated for QTable %u.  Retry %u\n", pCamEncState->m_Count, qTable, retry );
				}
				fCompleteImage = (pJpegInfo->m_fUseTrunc && pJpegInfo->m_fWrAlways) ? TRUE : FALSE;
				if ( fCompleteImage )
				{
					if ( pJpegInfo->m_fVerbose )
					{
						//printf( "Using truncated image %d\n", pCamEncState->m_Count );
					}
				}

				fSuccess = (retry < pJpegInfo->m_TruncAt) ? TRUE : FALSE;
				if ( !fSuccess )
				{
					jpegSetLastError( JPEG_ERR_TRUNCATED_JPEG_DATA );
				}
			}
		}
	}
	while ( (!fCompleteImage) && fSuccess );

	return ( fSuccess );
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?