⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pjpegdec.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 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 + -