这是我这两天刚做完成了,你参照下吧,应该对你会有帮助的!!使用的数据时yuv422的
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <errno.h>
#include <sys/mman.h>
#include "test_jpeg.h"
#include "s3c-jpeg.h"
#define CTRL_FILE_NAME "./640_480.yuv422"
#define JESULT_NG 0
#define JESULT_OK 1
int main_dnc(void)
{
int jpeg_fd,fileSize=0;
int ret = 0,result;
char *InBuf,*OutBuf;
FILE * inbuf_fp,*outdnc_fp;
int addr_base;
int addr_offer;
int i;
int tmp_addr;
struct jpg_args param_dnc;
struct jpg_dec_proc_param *my_dnc_param;
// 打开jpeg 设备
printf("@@@@@APP@@@@@open start \n");
jpeg_fd = open("/dev/s3c-jpg", O_RDWR);
if (jpeg_fd < 0) {
perror("open device jpeg");
}
addr_base = mmap(NULL,1024*1024*8,PROT_READ|PROT_WRITE,MAP_PRIVATE,jpeg_fd,0);
if(addr_base == MAP_FAILED){
printf(" mmap InBuf failed\n");
goto ERR1;
}
addr_offer = ioctl(jpeg_fd, IOCTL_JPG_GET_FRMBUF, 0);
if(!addr_offer){
printf("s3c_jpeg_ioctl OutBuf NG \n");
goto ERR2;
}
#if 0
tmp_addr = ioctl(jpeg_fd, IOCTL_JPG_GET_STRBUF,addr_base);
printf("####tmp_addr = 0x%08x\n",tmp_addr);
#endif
#if 0
addr_phy_offer = ioctl(jpeg_fd, IOCTL_JPG_GET_PHY_FRMBUF);
if(!addr_phy_offer){
printf("s3c_jpeg_ioctl addr_phy_offer NG \n");
goto ERR2;
}
#endif
printf("@@@@@APP@@@@@ addr_base = 0x%x ,addr_offer +addr_base= 0x%x \n",addr_base ,addr_offer +addr_base);
my_dnc_param = (struct jpg_dec_proc_param *)malloc(sizeof(struct jpg_dec_proc_param));
if(NULL == my_dnc_param){
printf("malloc my_dnc_param failed\n");
goto ERR2;
}
memset(my_dnc_param, 0, sizeof(struct jpg_dec_proc_param));
InBuf = (char *)addr_base;
OutBuf = (char *)(addr_base+addr_offer);
if (addr_offer % 16 !=0)
{
printf("addr_offer is not 16 bit addr\n");
goto ERR2;
}
printf("is good\n");
// 打开图像文件
inbuf_fp = fopen("./640_480.jpg","rb");
if(inbuf_fp == NULL)
{
perror("./JPEG_data.jpg\n");
goto ERR3;
}
// 在这里用于计算打开的JTAG图像文件的大小(byte)
fseek(inbuf_fp, 0, SEEK_END);
fileSize = ftell(inbuf_fp);
fseek(inbuf_fp, 0, SEEK_SET);
printf("@@@filesize =%d\n",fileSize);
ret = fread(OutBuf, 1, fileSize, inbuf_fp);
for(i=0;i<5;i++){
printf("@@@@@OutBuf = 0x%08x\n",OutBuf);
}
fclose (inbuf_fp);
printf("@@@@@APP@@@@@file Inbuf file open ok ret =%d\n\n",ret);
param_dnc.in_buf = InBuf;
param_dnc.out_buf = OutBuf;
param_dnc.dec_param = my_dnc_param;
my_dnc_param->out_format=YCBCR_422;
#if 0
my_dnc_param->width =640;
my_dnc_param->height = 480;
my_dnc_param->sample_mode = JPG_422;
#endif
// ioctl 开始进行编解码处理
printf("@@@@@APP@@@@@ioctl start \n");
result = ioctl(jpeg_fd, IOCTL_JPG_DECODE, ¶m_dnc);
if(!result){
printf("s3c_jpeg_ioctl:decode NG \n");
goto ERR4;
}
printf("end decode my_dnc_param->data_size = %d\n",my_dnc_param->data_size);
outdnc_fp= fopen("./JPEG_data_dnc","wb");
if(outdnc_fp < 0)
{
printf("file open ./JPEG_data error \n");
goto ERR4;
}
ret = fwrite(OutBuf, 1,20 , outdnc_fp);
ret = fwrite(InBuf, 1,my_dnc_param->data_size , outdnc_fp);
if(ret < 0){
printf("fwrite failed ret = %d",ret);
goto ERR5;
}
printf("@@@@@APP@@@@@JPG_DECODE END ret = %d!\n ",ret);
fclose(outdnc_fp);
free(my_dnc_param);
munmap(addr_base,1024*1024*8);
close(jpeg_fd);
return JESULT_OK;
ERR5:
fclose(outdnc_fp);
ERR4:
fclose(inbuf_fp);
ERR3:
free(my_dnc_param);
ERR2:
munmap(addr_base,1024*1024*8);
ERR1:
close(jpeg_fd);
return JESULT_NG;
}
/*********************************** 编码测试 yuv422 *********************/
int main(void)
{
int fileSize = 0,jpeg_fd;
int ret = 0,result,timecount=0;
FILE * inbuf_fp,*outbuf_fp,*outdnc_fp;
char *InBuf,*OutBuf;
int cnt;
struct jpg_args param , param_dnc;
struct jpg_enc_proc_param *my_enc_param;
struct jpg_dec_proc_param *my_dnc_param;
struct timeval cur_time,pre_time;
int addr_base;
int addr_offer;
// 打开jpeg 设备
printf("@@@@@APP@@@@@open start \n");
jpeg_fd = open("/dev/s3c-jpg", O_RDWR);
if (jpeg_fd < 0) {
perror("open device jpeg");
//goto ERR1;
}
addr_base = mmap(NULL,1024*1024*8,PROT_READ|PROT_WRITE,MAP_PRIVATE,jpeg_fd,0);
if(addr_base == MAP_FAILED){
printf(" mmap InBuf failed\n");
goto ERR1;
}
addr_offer = ioctl(jpeg_fd, IOCTL_JPG_GET_FRMBUF, 0);
if(!addr_offer){
printf("s3c_jpeg_ioctl OutBuf NG \n");
goto ERR2;
}
printf("@@@@@APP@@@@@ addr_base = 0x%x ,addr_offer +addr_base = 0x%x \n",addr_base ,addr_offer+addr_base);
my_enc_param = (struct jpg_enc_proc_param *)malloc(sizeof(struct jpg_enc_proc_param));
if(NULL == my_enc_param){
printf("malloc my_enc_param failed\n");
goto ERR2;
}
memset(my_enc_param, 0, sizeof(struct jpg_enc_proc_param));
InBuf = (char *)addr_base;
OutBuf = (char *)(addr_base+addr_offer);
// 开始对一桢数据进行编码
param.in_buf = InBuf;
param.in_buf_size = 1024*1024*2;
param.out_buf = OutBuf;
param.out_buf_size =800*600*2;
param.enc_param = my_enc_param;
my_enc_param->sample_mode = JPG_422;
my_enc_param->enc_type = JPG_MAIN;
my_enc_param->in_format = JPG_MODESEL_YCBCR;
my_enc_param->width = 640;
my_enc_param->height =480;
my_enc_param->quality = JPG_QUALITY_LEVEL_1;
//my_enc_param->data_size = 640*480*2;
//my_enc_param->file_size = 640*480*2;
// 打开图像文件
inbuf_fp = fopen("./640_480.yuv422","rb");
if(inbuf_fp == NULL)
{
perror("./640_480.yuv422");
goto ERR3;
}
// 在这里用于计算打开的JTAG图像文件的大小(byte)
fseek(inbuf_fp, 0, SEEK_END);
fileSize = ftell(inbuf_fp);
fseek(inbuf_fp, 0, SEEK_SET);
ret = fread(InBuf, 1, fileSize, inbuf_fp);
fclose (inbuf_fp);
printf("@@@@@APP@@@@@file Inbuf file open ok ret =%d\n\n",ret);
// ioctl 开始进行编解码处理
printf("@@@@@APP@@@@@ioctl start \n");
param.in_buf_size = fileSize;
gettimeofday(&pre_time,NULL);
result = ioctl(jpeg_fd, IOCTL_JPG_ENCODE, ¶m);
if(!result){
printf("s3c_jpeg_ioctl NG \n");
goto ERR4;
}
gettimeofday(&cur_time,NULL);
if(pre_time.tv_sec == cur_time.tv_sec)
timecount = cur_time.tv_usec - pre_time.tv_usec;
else
timecount = (cur_time.tv_usec - pre_time.tv_usec)/1000+1;
printf("~@@@@~~~~~~~timecount=%d\n",timecount);
//printf("my_enc_param->data_size = %d\n",my_enc_param->data_size);
printf("@@@@@APP@@@@@my_enc_param->file_size = %d\n",my_enc_param->file_size);
//编解码完成后,图像进行写处理
//write(jpeg_fd,(char*)OutBuf,file_size);
outbuf_fp= fopen("./JPEG_data","wb");
if(outbuf_fp < 0)
{
printf("file open ./JPEG_data error \n");
goto ERR5;
}
ret = fwrite(OutBuf, 1,my_enc_param->file_size , outbuf_fp);
if(ret < 0){
printf("fwrite failed ret = %d",ret);
goto ERR5;
}
fclose (outbuf_fp);
#if 0
// 开始解码
printf("**********************DECODE START*************************************\n\n");
memset(InBuf,0,fileSize);
outdnc_fp = fopen("./JPEG_dnc","wb");
if(outdnc_fp < 0)
{
printf("file open ./JPEG_dnc error \n");
goto ERR5;
}
my_dnc_param = (struct jpg_dec_proc_param *)malloc(sizeof(struct jpg_dec_proc_param));
if(NULL == my_dnc_param){
printf("malloc my_enc_param failed\n");
goto ERR6;
}
memset(my_dnc_param, 0, sizeof(struct jpg_dec_proc_param));
#if 0
addr_offer = ioctl(jpeg_fd, IOCTL_JPG_GET_FRMBUF, 0);
if(!addr_offer){
printf("s3c_jpeg_ioctl OutBuf NG \n");
goto ERR7;
}
printf("@@@@@APP@@@@@IOCTL_JPG_GET_FRMBUF OK!\n ");
#endif
param_dnc.in_buf = InBuf;
param_dnc.out_buf = OutBuf;
param_dnc.dec_param = my_dnc_param;
my_dnc_param->out_format=YCBCR_422;
printf("start decode my_dnc_param->data_size = %d\n",my_dnc_param->data_size);
result = ioctl(jpeg_fd, IOCTL_JPG_DECODE, ¶m_dnc);
if(!result){
printf("s3c_jpeg_ioctl:decode NG \n");
goto ERR7;
}
printf("end decode my_dnc_param->data_size = %d\n",my_dnc_param->data_size);
printf("InBuf[0]= 0x%08x, InBuf[1]=0x%08x,InBuf[2]=0x%08x\n ",InBuf[0],InBuf[1],InBuf[2]);
ret = fwrite(InBuf, 1,my_dnc_param->data_size , outdnc_fp);
if(ret < 0){
printf("fwrite failed ret = %d",ret);
goto ERR7;
}
printf("@@@@@APP@@@@@JPG_DECODE END!\n ");
/***************************************************************************************************/
free(my_dnc_param);
fclose(outdnc_fp);
#endif
free(my_enc_param);
munmap(InBuf,1024*1024*8);
close(jpeg_fd);
return JESULT_OK;
#if 0
ERR7:
free(my_dnc_param);
ERR6:
fclose(outdnc_fp);
#endif
ERR5:
fclose(outbuf_fp);
ERR4:
fclose (inbuf_fp);
ERR3:
free(my_enc_param);
ERR2:
munmap(InBuf,1024*1024*8);
ERR1:
close(jpeg_fd);
return JESULT_NG;
}