/*
* Project Name JPEG DRIVER IN Linux
* Copyright 2007 Samsung Electronics Co, Ltd. All Rights Reserved.
*
* This software is the confidential and proprietary information
* of Samsung Electronics ("Confidential Information").
* you shall not disclose such Confidential Information and shall use
* it only in accordance with the terms of the license agreement
* you entered into with Samsung Electronics
*
* This file implements JPEG driver.
*
* @name JPEG DRIVER MODULE Module (JPGOpr.c)
* @author Jiun Yu (jiun.yu@samsung.com)
* @date 28-07-07
*/
#include "JPGMem.h"
#include "JPGMisc.h"
#include "JPGOpr.h"
#include "JPGConf.h"
#include "LogMsg.h"
extern int jpg_irq_reason;
enum{
UNKNOWN,
BASELINE = 0xC0,
EXTENDED_SEQ = 0xC1,
PROGRESSIVE = 0xC2
}JPG_SOF_MARKER;
/*----------------------------------------------------------------------------
*Function: decodeJPG
*Parameters: jCTX:
input_buff:
input_size:
output_buff:
output_size
*Return Value:
*Implementation Notes:
-----------------------------------------------------------------------------*/
JPG_RETURN_STATUS decodeJPG(S3C6400_JPG_CTX *jCTX,
JPG_DEC_PROC_PARAM *decParam)
{
volatile int ret;
SAMPLE_MODE_T sampleMode;
UINT32 width, height, orgwidth, orgheight;
BOOL headerFixed = FALSE;
LOG_MSG(LOG_TRACE, "decodeJPG", "decodeJPG function\n");
resetJPG(jCTX);
/////////////////////////////////////////////////////////
// Header Parsing //
/////////////////////////////////////////////////////////
decodeHeader(jCTX);
WaitForInterrupt();
ret = jpg_irq_reason;
if(ret != OK_HD_PARSING){
LOG_MSG(LOG_ERROR, "\ndecodeJPG", "DD::JPG Header Parsing Error(%d)\r\n", ret);
return JPG_FAIL;
}
sampleMode = getSampleType(jCTX);
LOG_MSG(LOG_TRACE, "decodeJPG", "sampleMode : %d\n", sampleMode);
if(sampleMode == JPG_SAMPLE_UNKNOWN){
LOG_MSG(LOG_ERROR, "decodeJPG", "DD::JPG has invalid sampleMode\r\n");
return JPG_FAIL;
}
decParam->sampleMode = sampleMode;
getXY(jCTX, &width, &height);
LOG_MSG(LOG_TRACE, "decodeJPG", "DD:: width : 0x%x height : 0x%x\n", width, height);
if(width <= 0 || width > MAX_JPG_WIDTH || height <= 0 || height > MAX_JPG_HEIGHT){
LOG_MSG(LOG_ERROR, "decodeJPG", "DD::JPG has invalid width/height\n");
return JPG_FAIL;
}
/////////////////////////////////////////////////////////
// Header Correction //
/////////////////////////////////////////////////////////
orgwidth = width;
orgheight = height;
if(!isCorrectHeader(sampleMode, &width, &height)){
rewriteHeader(jCTX, decParam->fileSize, width, height);
headerFixed = TRUE;
}
/////////////////////////////////////////////////////////
// Body Decoding //
/////////////////////////////////////////////////////////
if(headerFixed){
resetJPG(jCTX);
decodeHeader(jCTX);
WaitForInterrupt();
ret = jpg_irq_reason;
if(ret != OK_HD_PARSING){
LOG_MSG(LOG_ERROR, "decodeJPG", "JPG Header Parsing Error(%d)\r\n", ret);
return JPG_FAIL;
}
decodeBody(jCTX);
WaitForInterrupt();
ret = jpg_irq_reason;
if(ret != OK_ENC_OR_DEC){
LOG_MSG(LOG_ERROR, "decodeJPG", "JPG Body Decoding Error(%d)\n", ret);
return JPG_FAIL;
}
// for post processor, discard pixel
if(orgwidth % 4 != 0)
orgwidth = (orgwidth/4)*4;
LOG_MSG(LOG_TRACE, "decodeJPG", "orgwidth : %d orgheight : %d\n", orgwidth, orgheight);
rewriteYUV(jCTX, width, orgwidth, height, orgheight);
// JPEG H/W IP always return YUV422
decParam->dataSize = getYUVSize(JPG_422, orgwidth, orgheight);
decParam->width = orgwidth;
decParam->height = orgheight;
}
else{
decodeBody(jCTX);
WaitForInterrupt();
ret = jpg_irq_reason;
if(ret != OK_ENC_OR_DEC){
LOG_MSG(LOG_ERROR, "decodeJPG", "DD::JPG Body Decoding Error(%d)\n", ret);
return JPG_FAIL;
}
// JPEG H/W IP always return YUV422
decParam->dataSize = getYUVSize(JPG_422, width, height);
decParam->width = width;
decParam->height = height;
}
return JPG_SUCCESS;
}
/*----------------------------------------------------------------------------
*Function: isCorrectHeader
*Parameters: sampleMode:
width:
height:
*Return Value:
*Implementation Notes:
-----------------------------------------------------------------------------*/
BOOL isCorrectHeader(SAMPLE_MODE_T sampleMode, UINT32 *width, UINT32 *height)
{
BOOL result = FALSE;
LOG_MSG(LOG_TRACE, "isCorrectHeader", "Header is not multiple of MCU\n");
switch(sampleMode){
case JPG_400 :
case JPG_444 : if((*width % 8 == 0) && (*height % 8 == 0))
result = TRUE;
if(*width % 8 != 0)
*width += 8 - (*width % 8);
if(*height % 8 != 0)
*height += 8 - (*height % 8);
break;
case JPG_422 : if((*width % 16 == 0) && (*height % 8 == 0))
result = TRUE;
if(*width % 16 != 0)
*width += 16 - (*width % 16);
if(*height % 8 != 0)
*height += 8 - (*height % 8);
break;
case JPG_420 :
case JPG_411 : if((*width % 16 == 0) && (*height % 16 == 0))
result = TRUE;
if(*width % 16 != 0)
*width += 16 - (*width % 16);
if(*height % 16 != 0)
*height += 16 - (*height % 16);
break;
default : break;
}
LOG_MSG(LOG_TRACE, "isCorrectHeader", "after error correction : width(%x) height(%x)\n", *width, *height);
return(result);
}
/*----------------------------------------------------------------------------
*Function: rewriteHeader
*Parameters: jCTX:
file_size:
width:
height:
*Return Value:
*Implementation Notes:
-----------------------------------------------------------------------------*/
void rewriteHeader(S3C6400_JPG_CTX *jCTX, UINT32 file_size, UINT32 width, UINT32 height)
{
UINT32 i;
UINT8 *ptr = (UINT8 *)jCTX->v_pJPGData_Buff;
UINT8 *SOF1 = NULL, *SOF2 = NULL;
UINT8 *header = NULL;
LOG_MSG(LOG_TRACE, "rewriteHeader", "file size : %d, v_pJPGData_Buff : 0x%X\n", file_size, ptr);
for(i=0; i < file_size; i++){
if(*ptr++ == 0xFF){
if((*ptr == BASELINE) || (*ptr == EXTENDED_SEQ) || (*ptr == PROGRESSIVE)){
LOG_MSG(LOG_TRACE, "rewriteHeader", "match FFC0(i : %d)\n", i);
if(SOF1 == NULL)
SOF1 = ++ptr;
else{
SOF2 = ++ptr;
break;
}
}
}
}
LOG_MSG(LOG_TRACE, "rewriteHeader", "start header correction\n");
if(i <= file_size){
header = (SOF2 == NULL) ? (SOF1) : (SOF2);
header += 3; //length(2) + sampling bit(1)
*header = (height>>8) & 0xFF;
header++;
*header = height & 0xFF;
header++;
*header = (width>>8) & 0xFF;
header++;
*header = (width & 0xFF);
}
}
/*----------------------------------------------------------------------------
*Function: resetJPG
*Parameters: jCTX:
*Return Value:
*Implementation Notes:
-----------------------------------------------------------------------------*/
void resetJPG(S3C6400_JPG_CTX *jCTX)
{
LOG_MSG(LOG_TRACE, "resetJPG", "resetJPG function\n");
jCTX->v_pJPG_REG->JPGSoftReset = 0; //ENABLE
}
/*----------------------------------------------------------------------------
*Function: decodeHeader
*Parameters: jCTX:
*Return Value:
*Implementation Notes:
-----------------------------------------------------------------------------*/
void decodeHeader(S3C6400_JPG_CTX *jCTX)
{
LOG_MSG(LOG_TRACE, "decodeHeader", "decodeHeader function\n");
jCTX->v_pJPG_REG->JPGFileAddr0 = JPG_DATA_BASE_ADDR;
jCTX->v_pJPG_REG->JPGFileAddr1 = JPG_DATA_BASE_ADDR;
jCTX->v_pJPG_REG->JPGMod = 0x08; //decoding mode
jCTX->v_pJPG_REG->JPGIRQ = ENABLE_IRQ;
jCTX->v_pJPG_REG->JPGCntl = DISABLE_HW_DEC;
jCTX->v_pJPG_REG->JPGMISC = (NORMAL_DEC | YCBCR_MEMORY);
jCTX->v_pJPG_REG->JPGStart = 1;
}
/*-----
jpeg_drv.rar_jpeg_jpeg s3c6410_jpeg s3c6410 lin_s3c6410_s3c6410
版权申诉
4 浏览量
2022-09-21
04:58:51
上传
评论
收藏 16KB RAR 举报
周楷雯
- 粉丝: 80
- 资源: 1万+
最新资源
- 大学生方程式赛车设计(总体设计)
- 【哈工大计算机系统】CSAPP计统大作业
- 音视频对齐python脚本
- Tkinter简易版学生信息管理系统源码+数据库配置文件
- Advanced Sniper Starter kit v4.3.unitypackage
- tensorflow-gpu-2.8.3-cp37-cp37m-win-amd64.whl
- Android SMS 短信内容显示在一个 泡泡 形状的窗口中.7z
- 哈尔滨工业大学计算机组成原理2024春大作业 ICS PA
- tensorflow-2.8.4-cp37-cp37m-win-amd64.whl
- tensorflow-2.8.3-cp37-cp37m-win-amd64.whl
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈