jpegcomm.c

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

C
969
字号
//===========================================================================
//	JPEGCOMM.C
//	This file contains JPEG functons used by the JPEG library but not exposed
//	to the outside world.
//---------------------------------------------------------------------------
//  Copyright (c) 2003 Epson Research and Development, Inc.
//  All Rights Reserved.
//===========================================================================

//------------------------------------------------------------------------------
// Include Files
//------------------------------------------------------------------------------
#include "multiframe.h"
#include "chiplib.h"
#include "Hal.h"
#include "JPEG.h"
#include "JPEGComm.h"

//------------------------------------------------------------------------------
// Local Definitions
//------------------------------------------------------------------------------

//------------------------------------------------------------------------------
// Local Function Prototypes
//------------------------------------------------------------------------------
static void prvLoadTable( UInt16 index, UInt8* pTable, int size );

//------------------------------------------------------------------------------
// Local Data
//------------------------------------------------------------------------------
static jpegError gJpegComLastError;			// Jdecode last error code

#ifdef JPEGUSEFILESYS
//-----------------------------------------------------------------------------
//	jpegCreateFileName - create appropriate filename
//
//	Input:	pJpegInfo	pointer to JPEGINFO object
//			pszName		pointer to user's string name
//
//	Output:	n/a
//
//-----------------------------------------------------------------------------
void jpegCreateFileName( JPEGINFO* pJpegInfo, const char* pszName )
{
	char* pszExt = pJpegInfo->m_fMulFrm ? "mf" : "jpg";

	// Write JPEG image to JFIF file
	piCreateFileName( pJpegInfo->m_pszFile, pszName, pszExt ); 
}
#endif

//---------------------------------------------------------------------------
//  jpegGetLastError() - Get last error code.
//---------------------------------------------------------------------------
jpegError jpegGetLastError( void )
{
	return gJpegComLastError;
}

//------------------------------------------------------------------------------
//	jpegHasEndOfImage - Determines if given image has JPEG end-of-image marker
//
//	Input:	pJpegInfo	pointer to JPEGINFO structure
//
//	Return:	TRUE means image has end-of-image marker
//			FALSE means that cannot locate end-of-image marker
//
//------------------------------------------------------------------------------
Boolean jpegHasEndOfImage( JPEGINFO* pJpegInfo )
{
	UInt32 i;

	for ( i=2; i<=5; i++ )
		if ( prvIsEndOfImage(pJpegInfo,i*sizeof(UInt8)) )
			return TRUE;

	jpegSetLastError( JPEG_ERR_NO_ENDOFIMAGE );
	return FALSE;
}

//------------------------------------------------------------------------------
//	jpegHasImageMarkers - Determines if given image has JPEG image markers
//
//	Input:	pJpegInfo	pointer to JPEGINFO structure
//
//	Return:	TRUE means image has image markers
//			FALSE means that cannot locate image markers
//
//------------------------------------------------------------------------------
Boolean jpegHasImageMarkers( JPEGINFO* pJpegInfo )
{
	Boolean fSuccess = jpegHasStartOfImage( pJpegInfo );
	if ( fSuccess )
	{
		fSuccess = jpegHasEndOfImage( pJpegInfo );
	}
	return ( fSuccess );
}

//------------------------------------------------------------------------------
//	jpegHasStartOfImage - determines if given offset into JPEG image has 
//							start-of-image marker
//
//	Input:	pJpegInfo	pointer to JPEGINFO structure
//
//	Return:	TRUE means image has end-of-image marker at given offset
//			FALSE means that image does not have end-of-image marker at given offset
//
//------------------------------------------------------------------------------
Boolean jpegHasStartOfImage( JPEGINFO* pJpegInfo )
{
	// Verify that end-of-image marker is present
	UInt8*	pEOI		= pJpegInfo->m_pBuf;
	UInt16	marker		= *(pEOI + 1) | (*(pEOI + 0) << 8);
	Boolean fSuccess	= (marker == 0xFFD8) ? TRUE : FALSE;
	if ( !fSuccess )
	{
		jpegSetLastError( JPEG_ERR_NO_STARTOFIMAGE );
	}
	return ( fSuccess );
}

//---------------------------------------------------------------------------
// jpegInit() - initialize JPEG encode library
//
//	Input:	pJpegInfo	pointer to JPEGINFO structure
//
// Function: Prepare for encode.
// Return:	TRUE successful, FALSE if error.
//---------------------------------------------------------------------------
Boolean	jpegInit( JPEGINFO* pJpegInfo )
{
	InitChipLib();

	// Initialize JEncodeInfo structure with default values
	prvGetResizeRect( &pJpegInfo->m_XStart, &pJpegInfo->m_YStart, &pJpegInfo->m_XEnd, &pJpegInfo->m_YEnd );
	pJpegInfo->m_RWidth			= 0;
	pJpegInfo->m_RHeight		= 0;
	pJpegInfo->m_Width			= pJpegInfo->m_XEnd - pJpegInfo->m_XStart + 1;
	pJpegInfo->m_Height			= pJpegInfo->m_YEnd - pJpegInfo->m_YStart + 1;

	pJpegInfo->m_BufSize		= 0;
	//pJpegInfo->m_CapAddr		= 0;
	pJpegInfo->m_Delay			= 30000;
	//pJpegInfo->m_fDumpOnly		= FALSE;
	pJpegInfo->m_EncSize		= 0;
	//pJpegInfo->m_fFixBug		= FALSE;
	pJpegInfo->m_pszFile		= NULL; 
	pJpegInfo->m_fFastCpu		= FALSE;
	pJpegInfo->m_FrameCount		= 1;
	pJpegInfo->m_HScaleRate		= prvGetResizeHScaleRate();
	pJpegInfo->m_fIndScale		= prvGetResizeIndScaleRate();
	pJpegInfo->m_fInfLoop		= FALSE;
	//pJpegInfo->m_fInit			= TRUE;
	//pJpegInfo->m_fInterpret		= FALSE;
	//pJpegInfo->m_LoopCount		= 1;
	//pJpegInfo->m_MinDelay		= 1000;
	pJpegInfo->m_fMulFrm		= FALSE;
	//pJpegInfo->m_fMultiLoc		= FALSE;
	pJpegInfo->m_fPause			= FALSE;
	pJpegInfo->m_pBuf			= NULL;
	//pJpegInfo->m_QTable			= -1; // Which means use auto selection
	pJpegInfo->m_ScaleMode		= prvGetResizeScaleMode();
	pJpegInfo->m_fSOE			= FALSE;
	pJpegInfo->m_TimeOutMS		= 0; // Default is no time out
	//pJpegInfo->m_TruncAt		= 20;
	//pJpegInfo->m_fVerbose		= FALSE;
	//pJpegInfo->m_fVideoOnly		= FALSE;
	//pJpegInfo->m_fViewImage		= FALSE;
	pJpegInfo->m_VScaleRate		= prvGetResizeVScaleRate();
	pJpegInfo->m_fWrAlways		= FALSE;
	pJpegInfo->m_YUVFmt			= YUVFmt422;
	pJpegInfo->m_fAFAP			= FALSE;
	pJpegInfo->m_IsYUVfile		= FALSE;
	pJpegInfo->m_MemEnc			= FALSE;
	//pJpegInfo->m_MemSize		= 0;
	jpegSetLastError( JPEG_ERR_NONE );
	return ( TRUE );
}

//-----------------------------------------------------------------------------
//	jpegInitVideo - performs minimal steps to enable viewing of camera
//
//	Input:	pJpegInfo		pointer to JPEGINFO object
//
//	Output:	TRUE means camera enabled
//			FALSE means camera not enabled
//
//-----------------------------------------------------------------------------
Boolean jpegInitVideo( JPEGINFO* pJpegInfo )
{
	// Enable camera clock
	halWriteReg8( REG0108_CMCONTROL, 0x01 );
	halWriteReg8( REG0108_CMCONTROL, 0x00 );
	
	halWriteReg8( REG0104_CMMODE0, (UInt8)(halReadReg8(REG0104_CMMODE0)|0x01) );

	// Delay 750 milliseconds to stablize camera output.
	halDelayUS( 750 * 1000 );

	// Start capture
	halWriteReg8( REG0108_CMCONTROL, 0x16 );

	// Enable View Encode (simultaneous display)
	halWriteReg8( REG0202_RESIZE, (UInt8)(halReadReg8(REG0202_RESIZE)|0x08));

	// Enable and reset resizer [norman delete]
	//prvSetResize( TRUE, pJpegInfo );
	// Enable and Reset Resizer [norman add]
	prvSetResize( TRUE, pJpegInfo );
	prvResetResize( TRUE, pJpegInfo );
	prvResetResize( FALSE, pJpegInfo );
	
	// LCD Interface Auto Transfer Enable
	halWriteReg8( REG003C_LCDXFER, 0x01 );

// The following test is invalid, because REG[010Ah-b0] keeps changing from 1 to 0 over time. Jiliang knows why, but I have no clue. [Roc 2003-AUG-4]
//	value	= halReadReg8( REG010A_CMSTATUS );
//	fCamera = (Boolean)(value & 0x01) ? TRUE : FALSE;
//	return ( fCamera );
	return TRUE;
}

//---------------------------------------------------------------------------
//  jpegSetLastError() - Set last error code.
//---------------------------------------------------------------------------
void jpegSetLastError( jpegError error )
{
	gJpegComLastError = error;
}

//-----------------------------------------------------------------------------
//	jpegValidateBuf - validates input parameters
//
//	Input:	pJpegInfo	pointer to JPEGINFO object
//
//	Output:	TRUE means success
//			FALSE means NOT success
//
//-----------------------------------------------------------------------------
Boolean jpegValidateBuf( JPEGINFO* pJpegInfo )
{
	Boolean fSuccess = (pJpegInfo->m_pBuf != NULL) ? TRUE : FALSE;
	if ( !fSuccess )
	{
		jpegSetLastError( JPEG_ERR_NULL_BUFFER );
	}
	else
	{
		fSuccess = ( pJpegInfo->m_BufSize != 0) ? TRUE : FALSE;
		if ( !fSuccess )
		{
			jpegSetLastError( JPEG_ERR_ZERO_BUFFER_SIZE );
		}
	}
	return ( fSuccess );
}

//-----------------------------------------------------------------------------
//	jpegWaitTillLCDNotBusy - waits till LCD is not busy or time out
//
//	Input:	pJpegInfo	pointer to JPEG decode info object
//
//	Output:	TRUE means LCD not busy (and no time out)
//			FALSE means time out
//
//-----------------------------------------------------------------------------
Boolean jpegWaitLCDNotBusy( JPEGINFO* pJpegInfo )
{
	Boolean fSuccess = TRUE;
	Boolean fBusy;

	do
	{
		fBusy = (halReadReg8( REG0038_LCDSTATUS ) & 0x01 ) ? TRUE : FALSE;
#ifndef MV850E
		if ( fBusy )
		{
			//fSuccess = jpegNoTimeOut( pJpegInfo );
		}
#endif
	}
	while ( fBusy && fSuccess );
	return ( fSuccess );
}

#ifdef JPEGUSEFILESYS
//-----------------------------------------------------------------------------
//	jpegWriteImage - writes memory image as single or multiple files
//
//	Input:	pszName			pointer to name prefix for file
//			pJpegInfo	pointer to JPEG Encode Info object
//
//	Output:	write output file result
//
//-----------------------------------------------------------------------------
Boolean jpegWriteImage( const char* pszName, JPEGINFO* pJpegInfo )
{
	Boolean fSuccess = TRUE;

	if ( pJpegInfo->m_fMulFrm || (pJpegInfo->m_FrameCount == 1) )
	{
		jpegCreateFileName( pJpegInfo, pszName );
		fSuccess = jpegWriteFile( pJpegInfo );
	}
	else
	{
		// Save original settings
		UInt32 count;
		UInt8* pBuf		= pJpegInfo->m_pBuf;
		UInt32 encSize	= pJpegInfo->m_EncSize;

		for ( count = 1; (count <= pJpegInfo->m_FrameCount) && fSuccess; ++count )
		{
			char szFile[ 256 ];
			JPEGMULTIFRAME* pJpegMultiFrame = (JPEGMULTIFRAME*)pJpegInfo->m_pBuf;
			pJpegInfo->m_pBuf				+= sizeof( JPEGMULTIFRAME );
			pJpegInfo->m_EncSize = pJpegMultiFrame->ResultSize;
			//sprintf( szFile, "%s%04d", pszName, count ); 
			jpegCreateFileName( pJpegInfo, szFile );
			fSuccess			= jpegWriteFile( pJpegInfo );
			pJpegInfo->m_pBuf	+= pJpegMultiFrame->PaddedSize;
		}

⌨️ 快捷键说明

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