📄 pjpegdec.c
字号:
/******************************************************
Copyright(C)2007,Rockchip Co., Ltd. All Rights Reserved.
File:pJPEGDEC.c
Desc:JPEG Decoder.
Note:
Author:evan wu
$Log:
Revision 1.0 2007/09/01 evan wu
*******************************************************/
/******************************************************
* INCLUDE
******************************************************/
#if ((defined(BOARD)) || defined(ROCK_FS))
#ifndef JPG_DEC
#define JPG_DEC
#include "pJPEGDEC.h"
#ifdef DebugJpeg
#include "JpgDecFillBuf.h"
#include "JpegBitstreamProcess.h"
#include "../../ImageWin/ImageDSPLoader/DSPLoader.h"
#endif
/****************************************************************************
* EXTERN VARIABLE
*****************************************************************************/
//extern LCD_RGBDATA gGuiDspLcdLogic[];
extern int RK27_JPEGDEC_Init(void *datasource,
int lcd_width,
int lcd_height,
JD_SRC_FMT * image_info,
JD_CALLBACKS callbacks);
extern int RK27_JPEGDEC_Decode(JD_CUSTOM_OUTPUT custom_output);
#ifdef DebugJpeg
extern long RK27_JPEGDEC_FillBuf(void);
#endif
/***************************************************************************
* GLOBAL VARIABLE
****************************************************************************/
unsigned int gTotalJpegDecodingCount;
JD_SRC_FMT src_fmt_info;
JD_CUSTOM_OUTPUT out_callback;
tJPEG * pJPEG;
ALIGN(32) unsigned char IMG_HEAP[IMG_HEAP_SIZE]; //080520,huangsl,FOR PC 仿真.
/**********************************************************************
* LOCAL FUNCTION
***********************************************************************/
/******************************************************
Name: JPGFILE_Read
Desc: 读文件,从nHandle读入size*cnt个字节的数据,存到pBuff指向的地址
Param:pBuff:存储读入数据的Buffer的指针 size:一次读入的字节数 cnt:读n次 nHandle:文件句柄
Return:读入的字节数
Global:无
Note:
Author:evan wu
Log:
******************************************************/
int FCAPI_JPGRead(void * pBuff, int size, int cnt, void *nHandle)
{
return (unsigned int)(FSFileRead(pBuff, size*cnt, nHandle));
}
static JD_CALLBACKS callbacks =
{
(unsigned short(*)(void *, unsigned int, unsigned int, void *))FCAPI_JPGRead
};
/******************************************************
Name: JPGFunction
Desc: 将输入图像文件,解码并输出到ImageBufAddr为首地址的Buffer中
Param: 无
Return: 解文件头成功返回TRUE,解头失败则返回FALSE
Global: gGuiDspLcdLogic
Note:
Author: evan wu
Log:
******************************************************/
unsigned long JPGFunction(unsigned long ulSubFn, unsigned long ulParam1, unsigned long ulParam2,
unsigned long ulParam3, unsigned long ulParam4)
{
int ret_val, width, height;
switch (ulSubFn)
{
float TmpScale;
// Decode a frame of data.
case IMAGE_CODEC_DECODE:
{
#ifdef DebugJpeg
if (DSPLoader(DSP_JPG) != 0)
{
return 0; // Load 失败
}
// ARM 只负责填数据,解码由DSP 来做
FSFileSeek(pImageFile, Jpg_gThumbnailImageInf.cbOffset, SEEK_SET); // seek 到JPEG 文件开始
ret_val = RK27_JPEGDEC_FillBuf();
return ret_val;
#else
// The first parameter is a pointer to the JPEG persistent state.
if (gTotalJpegDecodingCount == -1)
return 0;
ret_val = RK27_JPEGDEC_Decode(out_callback);
if (ret_val <= ERROR_NONE)
{
gTotalJpegDecodingCount = -1;
return 1;
}
gTotalJpegDecodingCount++;
if (gTotalJpegDecodingCount > 10)
{
gTotalJpegDecodingCount = 0;
}
return (1);
#endif
}
//initialize the decoder
case IMAGE_CODEC_OPEN_DEC:
{
#ifndef DebugJpeg
memset(&src_fmt_info, 0, sizeof(JD_SRC_FMT));
gTotalJpegDecodingCount = 0;
FSFileSeek(pImageFile, 0, 0);
memset(ImageBufAddr, 0, (sizeof(LCD_RGBDATA)*BUFFER_WIDTH*BUFFER_HEIGHT));
ret_val = RK27_JPEGDEC_Init((void*)pImageFile, LCD_WIDTH, LCD_HEIGHT, &src_fmt_info, callbacks);
if (src_fmt_info.JD_Calc_Buf_Size > IMG_HEAP_SIZE)
{
ret_val = ERROR_MEMORY;
return 0;
}
if (src_fmt_info.JD_Image_Width > BUFFER_WIDTH || src_fmt_info.JD_Image_Height > BUFFER_HEIGHT)
{
TmpScale = MAX((float)src_fmt_info.JD_Image_Width / BUFFER_WIDTH, (float)src_fmt_info.JD_Image_Height / BUFFER_HEIGHT);
g_bufferwidth = (unsigned long)(src_fmt_info.JD_Image_Width / TmpScale);
g_bufferheight = (unsigned long)(src_fmt_info.JD_Image_Height / TmpScale);
}
else
{
g_bufferwidth = src_fmt_info.JD_Image_Width;
g_bufferheight = src_fmt_info.JD_Image_Height;
}
memset(&src_fmt_info, 0, sizeof(JD_SRC_FMT));
gTotalJpegDecodingCount = 0;
FSFileSeek(pImageFile, 0, 0);
memset(ImageBufAddr, 0, sizeof(unsigned char)*(4*g_bufferwidth*g_bufferheight));
ret_val = RK27_JPEGDEC_Init((void*)pImageFile, g_bufferwidth, g_bufferheight, &src_fmt_info, callbacks);
//解码控制信息
{
memset(IMG_HEAP, 0, IMG_HEAP_SIZE);
out_callback.Calc_Buf = (unsigned short *)IMG_HEAP;
out_callback.write_func = (void (*)(IM_PIX_INFO))RK_CustomOutput_RGB888;
out_callback.LCD_OUTPUT_BUFFER = (unsigned char *) ImageBufAddr;
IM_LCD_Addr = (unsigned int) out_callback.LCD_OUTPUT_BUFFER;
}
//获得文件信息
pJPEG->usImageWidth = src_fmt_info.JD_Image_Width;//该变量表示图像高度
pJPEG->usImageHeight = src_fmt_info.JD_Image_Height;//该变量表示图像宽度
pJPEG->ucImageBitDepth = src_fmt_info.JD_Color_Space;//该变量表示图像位深度
pJPEG->ulImageFrameNum = 0;//该变量表示图像帧数
pJPEG->usImageHoriResolu = 0;//该变量表示图像水平分辨率
pJPEG->usImageVertResolu = 0;//该变量表示图象垂直分辨率
return 1;
#else
int r;
// seek 到JPEG 文件开始
FSFileSeek(pImageFile, Jpg_gThumbnailImageInf.cbOffset, SEEK_SET);
// 找到JPG 码流开始处
r = JpgDecFindImageDataBeginOffset(&Jpg_gcbHeader);
if (r == JPG_FAIL)
return 0;
return 1;
#endif
}
// Cleanup after the codec.
case IMAGE_CODEC_ZOOM:
{
rgbrotatescale original;
tRGBPicRotateZoomInOut RGBRotSca_gFactor;
tRGBPicRotateZoomInOut* factor = (tRGBPicRotateZoomInOut*)ulParam1;
original.width = g_bufferwidth;
original.height = g_bufferheight;
original.size = ((original.width * sizeof(targbmodel) + 3) & ~3) * original.height;
original.data = (unsigned char*)ImageBufAddr;
//初始化相关控制参数
RGBRotSca_gFactor = RGBRotScaInitial(&original, factor);
//根据初始化的控制参数,做旋转缩放操作
if (!(RGBRotScaTransform(&original, &RGBRotSca_gFactor, ImageLCDLogicBuf, LCD_W, LCD_H)))
return FALSE;
else
return TRUE;
}
default:
{
// Return a failure,just in case;
return(0);
}
}
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -