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 + -
显示快捷键?