jpeg_fun.c

来自「凌阳SPCE3200 系统开发板随机自带源程序。共安排了32个子目录」· C语言 代码 · 共 118 行

C
118
字号

#include "Jpeg_fun.h"
#include "../SysLib_Extend/mpeg4.h"

U16 g_nJpegWidth;
U16 g_nJpegHeight;

S32 JPEG_Open_File_SDCard(char *pJpegPath, S32 nOpenFlag)
{	
	S32 fp;

	fs_init();
	
	if( fs_mount(0) )
		while(1);

	//change working directory
	if ( chdir(".\\Jpg") == -1 )
		while(1);	//change failed

	fp = open(pJpegPath, nOpenFlag);
	
    return fp;
}

S32 JPEG_Read_File_SDCard(S32 fp, unsigned long nJpgLength)
{
	S32 status;
	
	//set the file pointer to file start address
	lseek(fp, 0, SEEK_SET);
	status = read(fp, (void *)0xa0c00000, (((nJpgLength+255)>>8)<<8));

	return status;
}

void JPEG_Close_File_SDCard(S32 fp)
{
	if( close(fp) == -1)
		while(1);
}

S32 JPEG_GetFileInfo(S32 fp)
{
	U8 buffer[1024];
	U8 *pAddr;
	U16 i;
	S32 status;
	U16 tmp;

	g_nJpegWidth = 320;
	g_nJpegHeight = 240;

	status = read(fp, &buffer[0], 1024);//read 1024 bytes from jpeg file
	pAddr = (U8*)buffer;

	//get image width and height
	for(i = 0; i < 1024; i++)
	{
		if(*pAddr++ != 0xFF)
			continue;
		if(*pAddr++ != 0xC0)
			continue;
		//find the SOF0
		pAddr = (U8*)((U32)pAddr + 3);
		tmp = *pAddr++;
		tmp = (tmp<<8) | (*pAddr++);
		g_nJpegHeight = tmp;
		tmp = *pAddr++;
		tmp = (tmp<<8) | (*pAddr++);
		g_nJpegWidth = tmp;
		break;
	}

	return status;
}
//extern U32 mp4_flag;
void Set_Buffer_MP4_TVE(void)
{
	// MP4 VLC buffer setting
	// Software buffer pointer for MP4 VLC buffer
	*P_MPEG4_VLCBUFFER_SEL = 0x00;
	// Start address of MP4 VLC buffer x. D0-D9 must be zero.
	*P_MPEG4_VLCBUFFER_SA1 = 0xa0000000;
	*P_MPEG4_VLCBUFFER_SA2 = 0xa0000000;
	
	// Buffer control setting
	// Use C2P hardware buffer control for MP4 write buffer and TV encoder
	*P_BUFCTRL_BUFFER_SEL = 0; //0x1040; //CSI_PPU_Hard_TVE | CSI_PPU_Hard_MP4_W;
	// MP4 trigger TVE triple buffer switch; Enable C2P hardware buffer control
	*P_BUFCTRL_MODE_CTRL1 = MP4_W | Buffer_3 | TVE_R | C2P_HW_Buf_En;

	// Set TV encoder frame buffer start address. The D0-D7 must be zero.
	*P_TV_BUFFERA_SA1 = PICTURE_BUFFER_ADDRESS1;
	*P_TV_BUFFERA_SA2 = PICTURE_BUFFER_ADDRESS1;
	*P_TV_BUFFERA_SA3 = PICTURE_BUFFER_ADDRESS1;
	
	*P_LCD_BUFFER_SA1 = PICTURE_BUFFER_ADDRESS1;
	*P_LCD_BUFFER_SA2 = PICTURE_BUFFER_ADDRESS1;
	*P_LCD_BUFFER_SA3 = PICTURE_BUFFER_ADDRESS1;
	
	// Set software buffer pointer of MP4 re-constructed buffer
	*P_MPEG4_WRITEBUFFER_SEL = 0x00;
	// Set MP4 write frame buffer start address.  The D0-D7 must be zero.
	*P_MPEG4_WRITEBUFFER_SA1 = PICTURE_BUFFER_ADDRESS1;  //PICTURE_BUFFER_ADDRESS1 == 0xa040_0000
	*P_MPEG4_WRITEBUFFER_SA2 = PICTURE_BUFFER_ADDRESS1;
	*P_MPEG4_WRITEBUFFER_SA3 = PICTURE_BUFFER_ADDRESS1;
}

void JPEG_Decode(U32 Address, U32 Resolution, U32 InterlaceMode, U32 Device)
{
	if(Device == TV_Out)
		*P_TV_MODE_CTRL = Resolution | InterlaceMode | Y4U4V4 | TVEN;
	
	decompress_picture(Address);
}

⌨️ 快捷键说明

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