jdecode.c

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

C
911
字号
			if ( pJpegInfo->m_fAFAP )
			{
				for ( ; HeaderSize; --HeaderSize, ++pHeader )
					halWriteReg8( REG081A_JPEGFIFOWRITE, *pHeader );
			}
			else
			{
				for ( ; fifoSize && HeaderSize; --fifoSize, --HeaderSize, ++pHeader )
					halWriteReg8( REG081A_JPEGFIFOWRITE, *pHeader );
				fifoSize = 32 - (halReadReg8(REG0808_JPEGRAWSTATUS1)&0x3F);
			}
		}
		else
		{
			Boolean fFifoFull;

			do
			{
				fFifoFull = prvIsFifoFull();
			}
			while ( fSuccess && (!fFifoFull) );

			if ( fSuccess )
			{
				for ( ; (!fFifoFull) && HeaderSize; ++pHeader, --HeaderSize )
				{
					halWriteReg8( REG081A_JPEGFIFOWRITE, *pHeader );
					fFifoFull = prvIsFifoFull();
				}
			}
		}
	}

	++pData;
	++pData;
	jpegDataSize--;
	jpegDataSize--;	
*/

	while ( fSuccess && jpegDataSize )
	{
		if ( pJpegInfo->m_fFastCpu )
		{
			if ( pJpegInfo->m_fAFAP )
			{
				for ( ; HeaderSize; --HeaderSize, ++pHeader )
				{
					halWriteReg8( REG081A_JPEGFIFOWRITE, *pHeader );
					//*ptmpjpg=*pHeader;
					//ptmpjpg++;
				}
				++pData;
				++pData;
				jpegDataSize--;
				jpegDataSize--;					
				for ( ; jpegDataSize; --jpegDataSize, ++pData )
					halWriteReg8( REG081A_JPEGFIFOWRITE, *pData );
			}
			else
			{
				if(!fLoadHeader)
				{
					for ( ; fifoSize && HeaderSize; --fifoSize, --HeaderSize, ++pHeader )
					{
						halWriteReg8( REG081A_JPEGFIFOWRITE, *pHeader );
						//*ptmpjpg=*pHeader;
						//ptmpjpg++;
					}
					fifoSize = 32 - (halReadReg8(REG0808_JPEGRAWSTATUS1)&0x3F);	
					if(HeaderSize<=0)
					{
						++pData;
						++pData;
						jpegDataSize--;
						jpegDataSize--;					
						fLoadHeader=TRUE;
					}
				}
				else
				{
					for ( ; fifoSize && jpegDataSize; --fifoSize, --jpegDataSize, ++pData )
						{
							halWriteReg8( REG081A_JPEGFIFOWRITE, *pData );
							//*ptmpjpg=*pData;
							//ptmpjpg++;
						}						
						
					fifoSize = 32 - (halReadReg8(REG0808_JPEGRAWSTATUS1)&0x3F);
				}
			}
		}
		else
		{
			Boolean fFifoFull;

			do
			{
				fFifoFull = prvIsFifoFull();
#ifndef MV850E
				if ( !fFifoFull )
				{
					//fSuccess = jpegNoTimeOut( pJpegInfo );
				}
#endif
			}
			while ( fSuccess && (!fFifoFull) );

			if ( fSuccess )
			{
				for ( ; (!fFifoFull) && jpegDataSize; ++pData, --jpegDataSize )
				{
					halWriteReg8( REG081A_JPEGFIFOWRITE, *pData );
					fFifoFull = prvIsFifoFull();
				}
			}
		}

		if ( fSuccess )
		{
			prvJpegFlag jpegStatus = prvGetJpegStatus();

			/*if ( pJpegInfo->m_fVerbose )
			{
				if ( jpegStatus != prevStatus )
				{
					if ( jpegStatus & JpegCodec )
						//printf( "JpegCodec " );
					if ( jpegStatus & LnBufOverflow )
						//printf( "LnBufOverflow " );
					if ( jpegStatus & JpegDecMarkerRd )
						//printf( "DecodeMarkerRead " );
					if ( jpegStatus & JpegDecComplete )
						//printf( "JpegComplete" );
					//printf( "\n" );

					prevStatus = jpegStatus;
				}
			}*/

			// Decode Marker Read
			if ( jpegStatus & JpegDecMarkerRd )
			{
				fSuccess = prvReadMarker( pJpegInfo, jpegStatus );
			}
#ifndef MV850E
			else
			{
				//fSuccess = jpegNoTimeOut( pJpegInfo );
			}
#endif
		}
	}

	if ( pJpegInfo->m_fPause )
	{
		//printf( "Pause right after JPEG decode is complete.  Press any key to continue..." );
		//getch();
		//printf( "\n" );
	}

	if ( !pJpegInfo->m_fFastCpu )
	{
		halWriteReg8( REG0302_IRQENABLE0, irqEnable );
	}

	return ( fSuccess );
}


//------------------------------------------------------------------------------
//	prvLoadYUV - loads YUV data into Line Buffer
//
//	Input:	pJpegInfo		pointer to JPEGINFO object
//
//	Output:	TRUE means success
//			FALSE means NOT success
//
//------------------------------------------------------------------------------
static Boolean prvLoadYUV( JPEGINFO* pJpegInfo )
{
	Boolean fSuccess		= TRUE;
	UInt32	jpegDataSize	= pJpegInfo->m_EncSize;
	UInt8*	pData			= pJpegInfo->m_pBuf;

	halWriteReg8( REG082A_JPEGLINEIRQ,    0x00 );	// Disable all line buffer interrupts
	halWriteReg8( REG0825_JPEGLINESTATUS, 0xFF );	// Reset all line buffer status flags

	if ( pJpegInfo->m_fAFAP )
	{
		for ( ; jpegDataSize; --jpegDataSize, ++pData )
			halWriteReg8( REG0900_JPEGLINEWRITE, *pData );
	}
	else
	{
		halWriteReg8( REG082A_JPEGLINEIRQ,    0x04 );	// Enable the line buffer half full interrupt
		for ( ; jpegDataSize; --jpegDataSize, ++pData )
		{
			// If the Line buffer is full, wait until it's not full.
			while ( halReadReg8(REG0825_JPEGLINESTATUS) & 0x04 )
				halWriteReg8( REG0825_JPEGLINESTATUS, 0x04 );	// Clear flag.
			halWriteReg8( REG0900_JPEGLINEWRITE, *pData );
		}

		halWriteReg8( REG0825_JPEGLINESTATUS, 0xFF );	// Reset all line buffer status flags
		halWriteReg8( REG082A_JPEGLINEIRQ,    0x00 );	// Disable all line buffer interrupts
	}

	return ( fSuccess );
}

//------------------------------------------------------------------------------
//	prvReadMarker - process prvode marker
//
//	Input:	pJpegInfo		pointer to JPEGINFO object
//			jpegStatus		current JPEG status 
//
//	Output:	TRUE means success
//			FALSE means NOT success
//
//------------------------------------------------------------------------------
Boolean prvReadMarker( JPEGINFO* pJpegInfo, prvJpegFlag jpegStatus )
{
	UInt8	scalev,scaleh;
	UInt16	width		= prvHalReadReg16( REG1014_HORZPIXELSIZE1, REG1012_HORZPIXELSIZE0 );
	UInt16	height		= prvHalReadReg16( REG1010_VERTPIXELSIZE1, REG100E_VERTPIXELSIZE0 );
	UInt16	XEnd		= pJpegInfo->m_XStart + width - 1;
	UInt16	YEnd		= pJpegInfo->m_YStart + height - 1;
	Boolean fSuccess	= TRUE; // ROC REMOVED: prvSetResizeRect( pJpegInfo->m_XStart, pJpegInfo->m_YStart, XEnd, YEnd, pJpegInfo );
	
	if(pJpegInfo->m_fScale)
	{
		pJpegInfo->m_Width=width;
		pJpegInfo->m_Height=height;

		if(width<	pJpegInfo->m_DesiredWidth)
			scaleh=1;
		else
			scaleh = (width)/pJpegInfo->m_DesiredWidth;
			
		if(height<pJpegInfo->m_DesiredHeight)
			scalev=1;
		else
			scalev = (height)/pJpegInfo->m_DesiredHeight;

		if(!pJpegInfo->m_fIndScale)
			{
			if(scaleh < scalev)
				scalev=scaleh;
			else
				scaleh=scalev;
			}

		pJpegInfo->m_HScaleRate=scaleh;
		pJpegInfo->m_VScaleRate=scalev;
		pJpegInfo->m_XStart=(width-scaleh*pJpegInfo->m_DesiredWidth)/2;
		pJpegInfo->m_YStart=(height-scalev*pJpegInfo->m_DesiredHeight)/2;
		pJpegInfo->m_XEnd=pJpegInfo->m_XStart+scaleh*pJpegInfo->m_DesiredWidth-1;
		pJpegInfo->m_YEnd=pJpegInfo->m_YStart+scalev*pJpegInfo->m_DesiredHeight-1;
		
		// Set Resizer Dimensions
		prvSetResizeRect( pJpegInfo->m_XStart, pJpegInfo->m_YStart, pJpegInfo->m_XEnd, pJpegInfo->m_YEnd);
		prvSetResizeScaleMode( pJpegInfo->m_ScaleMode, pJpegInfo );
		prvSetResizeIndScaleRate( pJpegInfo->m_fIndScale, pJpegInfo );
		prvSetResizeHScaleRate(scaleh, pJpegInfo );
		prvSetResizeVScaleRate( scalev, pJpegInfo );
	}
	else
	{
		fSuccess	=  prvSetResizeRect( pJpegInfo->m_XStart, pJpegInfo->m_YStart, XEnd, YEnd);
	}
	
	if ( fSuccess )
	{
		// JPEG h/w requires DecodeMarkerRead Interrupt to be disabled, 
		// before clearing the interrupt status bit!!
		// otherwise, it may cause noise in JPEG Decode.
		prvJpegFlag irqControl	= prvGetIrqControl();
		irqControl				&= (~JpegDecMarkerRd);
		prvSetIrqControl( irqControl );
			
		jpegStatus |= JpegDecMarkerRd;
		prvSetJpegStatus( jpegStatus );
	}


	// Enable and Reset Resizer
	prvSetResize( TRUE, pJpegInfo );
	prvResetResize( TRUE, pJpegInfo );
	prvResetResize( FALSE, pJpegInfo );	
	return ( fSuccess );
}

//------------------------------------------------------------------------------
//	prvInitNextDecode - after decoding single image then setup hardware for next decode
//
//	Input:	pJpegInfo		pointer to JPEGINFO object
//			prvode			current status
//
//	Output:	TRUE means success
//			FALSE means NOT success
//
//------------------------------------------------------------------------------
Boolean prvInitNextDecode( JPEGINFO* pJpegInfo, Boolean fSuccess )
{
	// Disable Marker Interrupt
	prvHalReadReg16( REG0806_JPEGRAWSTATUS0, REG0808_JPEGRAWSTATUS1 );
	//FEDBCA9876543210b
	//|||||||||||||||+--Reserved JPEG Line Buffer Interrupt Raw Flag
	//||||||||||||||+---Raw JPEG Code Interrupt Flag
	//|||||||||||||+----Raw Line Buffer Overflow Flag
	//||||||||||||+-----Raw Reserved Size Mismatch Flag
	//|||||||||||+------Raw Decode Marker Read Flag
	//||||||||||+-------Raw JPEG Decode Complete Flag
	//|||||||||+--------n/a
	//||||||||+---------Reserved
	//||++++++----------FIFO Level Status
	//|+----------------Raw JPEG Codec File Out Status
	//+-----------------Raw Encode Size Limit Violation Flag
				
	// Check Codec Status to reset Codec Interrupt
	prvGetOpWork();

	// Reset all status flags
	prvSetJpegStatus( AllStatusClear );
				
	// Reset JPEG
	prvSetJpeg( FALSE, FALSE );
	prvSetJpeg( FALSE, TRUE );

	if ( fSuccess )
	{
		fSuccess = jpegWaitLCDNotBusy( pJpegInfo );
		if ( fSuccess )
			if ( !pJpegInfo->m_MemEnc )
				halWriteReg8( REG003A_LCDFRAMEXFER, 0x01 );
	}

	// If decoding from memory, disable Memory Decode Display
	if ( pJpegInfo->m_MemEnc )
		halWriteReg8( REG004C_DISPSETTING, (UInt8)(halReadReg8(REG004C_DISPSETTING)&0x7F) );

	return ( fSuccess );
}

//------------------------------------------------------------------------------
//	prvInitDecodeCodec - before prvoding single image setup hardware
//
//	Input:	pJpegInfo		pointer to JPEGINFO object
//
//	Output:	TRUE means success
//			FALSE means NOT success
//
//------------------------------------------------------------------------------
Boolean prvInitDecodeCodec( JPEGINFO* pJpegInfo )
{
	// If decoding from memory, enable Memory Decode Display
	if ( pJpegInfo->m_MemEnc )
		halWriteReg8( REG004C_DISPSETTING, (UInt8)(halReadReg8(REG004C_DISPSETTING)|0x80) );

	// Enable JPEG Codec
	prvSetJpeg( TRUE, FALSE );

	prvResetJpegCodec();

	if ( pJpegInfo->m_IsYUVfile )
	{
		// Set YUV Output Data Range.
		UInt8 Value = halReadReg8(REG0800_JPEGCONTROL) | 0x10;

		// Set JPEG Operation to YUV-to-Line-Buffer (and select its YUV format).
		switch ( pJpegInfo->m_YUVFmt )
		{
			case YUVFmt422:	Value = (Value&0xF1) | 0x1;	break;
			case YUVFmt420:	Value = (Value&0xF1) | 0xA;	break;
			default:	return FALSE;	//printf("ERROR: That YUV format isn't supported by the Line Buffer (REG[0800h-b3:1])\n" );
				
		}
		halWriteReg8( REG0800_JPEGCONTROL, (UInt8)(Value|0x12) );

		// Set image dimensions.
		prvHalWriteReg16( REG1010_VERTPIXELSIZE1, REG100E_VERTPIXELSIZE0, pJpegInfo->m_Height );
		prvHalWriteReg16( REG1014_HORZPIXELSIZE1, REG1012_HORZPIXELSIZE0, pJpegInfo->m_Width );
	}
	else
	{
		// Set JPEG Codec Operation to Decode
		halWriteReg8( REG1000_OPMODE, 0x04 );
	}
	
	// Set RST Marker operation
	halWriteReg8( REG101C_RSTOPSETTING, 0x1 );

	// Set Resizer Dimensions
	prvInitDecodeResizer( pJpegInfo );

	// Enable and Reset Resizer
	prvSetResize( TRUE, pJpegInfo );
	prvResetResize( TRUE, pJpegInfo );
	prvResetResize( FALSE, pJpegInfo );

	// Reset JPEG Module
	prvSetJpeg( TRUE, TRUE );

	// Set JPEG File Size
	prvHalWriteReg24( REG0822_JPEGFILESIZE0, pJpegInfo->m_EncSize );

	// Reset all status flags
	prvSetIrqControl( IrqDisable );
	prvSetJpegStatus( AllStatusClear );

	// Enable the appropriate interrupts
	if ( pJpegInfo->m_IsYUVfile )
		prvSetIrqControl( JpegLineBuffer );
	else if ( pJpegInfo->m_MemEnc )
		prvSetIrqControl( JpegCodec|LnBufOverflow|JpegDecComplete );
	else
		prvSetIrqControl( JpegCodec|LnBufOverflow|JpegDecMarkerRd|JpegDecComplete );

	if ( pJpegInfo->m_fPause )
	{
		//printf( "Pause right before JPEG decode is started.  Press any key to continue..." );
		//getch();
		//printf( "\n" );
	}

	if ( !pJpegInfo->m_IsYUVfile )
		prvStartJpeg();

	return TRUE;
}

//------------------------------------------------------------------------------
//	prvInitDecodeResizer - Programs resizer options
//
//	Input:	pJpegInfo		pointer to JPEGINFO object
//
//	Output:	TRUE means success
//			FALSE means NOT success
//
//------------------------------------------------------------------------------
Boolean prvInitDecodeResizer( JPEGINFO* pJpegInfo )
{
	if ( pJpegInfo->m_RWidth > 0 )
		pJpegInfo->m_XEnd = pJpegInfo->m_XStart + pJpegInfo->m_RWidth - 1;
	if ( pJpegInfo->m_RHeight > 0 )
		pJpegInfo->m_YEnd = pJpegInfo->m_YStart + pJpegInfo->m_RHeight - 1;
	prvSetResizeRect( pJpegInfo->m_XStart, pJpegInfo->m_YStart, pJpegInfo->m_XEnd, pJpegInfo->m_YEnd);
	prvSetResizeScaleMode( pJpegInfo->m_ScaleMode, pJpegInfo  );
	prvSetResizeIndScaleRate( pJpegInfo->m_fIndScale, pJpegInfo );
	prvSetResizeHScaleRate( pJpegInfo->m_HScaleRate, pJpegInfo );
	prvSetResizeVScaleRate( pJpegInfo->m_VScaleRate, pJpegInfo );
	return TRUE;
}

⌨️ 快捷键说明

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