主题 : tiny6410 JPEG硬编码出错 问题(已解决) 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 74945
精华: 0
发帖: 50
金钱: 250 两
威望: 50 点
贡献值: 0 点
综合积分: 100 分
注册时间: 2012-07-31
最后登录: 2018-05-03
楼主  发表于: 2012-12-29 11:37

 tiny6410 JPEG硬编码出错 问题(已解决)

其实也是粗心造成的,解决方法见第6篇帖子

tiny6410板子
256 ram
2g nand


void PhotoEncoder::init()
{
    int inBufferSize = 0;
    memset(&ExifInfo, 0x00, sizeof(ExifFileInfo));
    makeExifParam(&ExifInfo);
    ExifInfo.Width          = width;
    ExifInfo.Height         = height;

    jpegEncodeHandle = SsbSipJPEGEncodeInit();//
    if(jpegEncodeHandle < 0)
    {
        qDebug() << "SsbSipJPEGDecodeInit failed";
        return;
    }
    //设置模式
    if(SsbSipJPEGSetConfig(JPEG_SET_SAMPING_MODE, JPG_422) != JPEG_OK)
    {
        qDebug() << "SsbSipJPEGSetConfig JPEG_SET_SAMPING_MODE failed";
        return;
    }
    //宽度
    if (SsbSipJPEGSetConfig(JPEG_SET_ENCODE_WIDTH, width) != JPEG_OK)
    {
        qDebug() << "SsbSipJPEGSetConfig JPEG_SET_ENCODE_WIDTH failed";
        return;
    }
    //高度
    if (SsbSipJPEGSetConfig(JPEG_SET_ENCODE_HEIGHT, height) != JPEG_OK)
    {
        qDebug() << "SsbSipJPEGSetConfig JPEG_SET_ENCODE_HEIGHT failed";
        return;
    }
    //质量等级
    if (SsbSipJPEGSetConfig(JPEG_SET_ENCODE_QUALITY, JPG_QUALITY_LEVEL_1) != JPEG_OK)
    {
        qDebug() << "SsbSipJPEGSetConfig JPEG_SET_ENCODE_QUALITY failed";
        return;
    }

    inBufferSize = width*height*2;//width*height*bpp / 8

    inBuf = SsbSipJPEGGetEncodeInBuf(jpegEncodeHandle, inBufferSize);

    if(inBuf == NULL)
    {
        qDebug() << "SsbSipJPEGGetEncodeInBuf failed";
        return;
    }
}

使用jpeg硬编码出现问题 ,提示:
[JPEG_DRV: ERROR] s3c_jpeg_ioctl: DD::JPG Invalid ioctl : 0x5

问题定位在 SsbSipJPEGGetEncodeInBuf 这个函数内,
查看这个函数
void *SsbSipJPEGGetEncodeInBuf(int dev_fd, long size)
{
    if(size < 0 || size > MAX_YUV_SIZE){
        LOG_MSG(LOG_ERROR, "SsbSipJPEGGetEncodeInBuf", "Invalid Encoder input buffer size(%ld)\n", size);
        return NULL;
    }

    jCtx->encParam->dataSize = size;

    jCtx->InBuf = (char *)ioctl(dev_fd, IOCTL_JPG_GET_FRMBUF, jCtx->mappedAddr);

    LOG_MSG(LOG_TRACE, "SsbSipJPEGEncodeInBuf", "EncodeInBuf : 0x%x  size :%d\n", jCtx->InBuf, jCtx->encParam->dataSize);
    return (jCtx->InBuf);
}

应该是jCtx->InBuf = (char *)ioctl(dev_fd, IOCTL_JPG_GET_FRMBUF, jCtx->mappedAddr);这句出错了

这个是不是跟硬件有关系了

程序在别家6410板子上运行没有这个问题

忘各位大神赐教。。。。
[ 此帖被leavor在2013-01-05 13:18重新编辑 ]
级别: 侠客
UID: 74945
精华: 0
发帖: 50
金钱: 250 两
威望: 50 点
贡献值: 0 点
综合积分: 100 分
注册时间: 2012-07-31
最后登录: 2018-05-03
1楼  发表于: 2013-01-04 10:01
求解啊,没有人遇到问题吗?
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
贡献值: 27 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
2楼  发表于: 2013-01-04 10:24
内核不同,可能也会出现不同的问题

另外,我们提供了jpeg编码和解吗的例子和文档
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.
级别: 侠客
UID: 74945
精华: 0
发帖: 50
金钱: 250 两
威望: 50 点
贡献值: 0 点
综合积分: 100 分
注册时间: 2012-07-31
最后登录: 2018-05-03
3楼  发表于: 2013-01-04 16:17
这个真有问题

SsbSipJPEGGetEncodeInBuf(jpegEncodeHandle, inBufferSize);

在论坛里面下面的帖子中也有这样的问题

http://www.aiothome.net/read.php?tid-12738-fpage-0-toread--page-13.html
120楼
http://www.aiothome.net/read.php?tid-12738-fpage-0-toread--page-17.html
163楼

还有那个jpeg硬编码的例子,问题一样, 也要用这个SsbSipJPEGGetEncodeInBuf函数,用这个函数就出问题
级别: 侠客
UID: 74945
精华: 0
发帖: 50
金钱: 250 两
威望: 50 点
贡献值: 0 点
综合积分: 100 分
注册时间: 2012-07-31
最后登录: 2018-05-03
4楼  发表于: 2013-01-04 17:46
http://www.aiothome.net/read.php?tid-12652.html

在这帖子中 6、7、8楼也遇到同样的问题
级别: 侠客
UID: 74945
精华: 0
发帖: 50
金钱: 250 两
威望: 50 点
贡献值: 0 点
综合积分: 100 分
注册时间: 2012-07-31
最后登录: 2018-05-03
5楼  发表于: 2013-01-05 10:52
下面是JPEG驱动中的一部分,在网上找的,在友善的内核文件中就没有这个s3c-jpeg.c和s3c-jpeg.h文件,估计又是在那个prebuild.fo里面

static int s3c_jpeg_ioctl(struct inode *inode, struct file *file, unsigned  
        int cmd, unsigned long arg)  
{  
    static S3C6400_JPG_CTX      *JPGRegCtx;  
    JPG_DEC_PROC_PARAM  DecReturn;  
    JPG_ENC_PROC_PARAM  EncParam;  
    BOOL                result = TRUE;  
    DWORD               ret;  
      
  
    JPGRegCtx = (S3C6400_JPG_CTX *)file->private_data;  
    if(!JPGRegCtx){  
        LOG_MSG(LOG_ERROR, "s3c_jpeg_ioctl", "DD::JPG Invalid Input Handle\r\n");  
        return FALSE;  
    }  
  
    ret = LockJPGMutex();  
    if(!ret){  
        LOG_MSG(LOG_ERROR, "s3c_jpeg_ioctl", "DD::JPG Mutex Lock Fail\r\n");  
        return FALSE;  
    }  
  
    switch (cmd)    
    {  
        case IOCTL_JPG_DECODE:  
              
            LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPEG_DECODE\n");  
  
            Copy_From_User(&DecReturn, (JPG_DEC_PROC_PARAM *)arg, sizeof(JPG_DEC_PROC_PARAM));  
            result = decodeJPG(JPGRegCtx, &DecReturn);  
  
            LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "width : %d hegiht : %d size : %d\n",    
                    DecReturn.width, DecReturn.height, DecReturn.dataSize);  
  
            Copy_To_User((void *)arg, (void *)&DecReturn, sizeof(JPG_DEC_PROC_PARAM));  
            break;  
  
        case IOCTL_JPG_ENCODE:  
          
            LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPEG_ENCODE\n");  
  
            Copy_From_User(&EncParam, (JPG_ENC_PROC_PARAM *)arg, sizeof(JPG_ENC_PROC_PARAM));  
  
            LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "width : %d hegiht : %d\n",    
                    EncParam.width, EncParam.height);  
  
            result = encodeJPG(JPGRegCtx, &EncParam);  
  
            LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "encoded file size : %d\n", EncParam.fileSize);  
  
            Copy_To_User((void *)arg, (void *)&EncParam,  sizeof(JPG_ENC_PROC_PARAM));  
  
            break;  
  
        case IOCTL_JPG_GET_STRBUF:  
            LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPG_GET_STRBUF\n");  
            UnlockJPGMutex();  
            return arg;        
  
        case IOCTL_JPG_GET_THUMB_STRBUF:  
            LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPG_GET_THUMB_STRBUF\n");  
            UnlockJPGMutex();  
            return arg + JPG_STREAM_BUF_SIZE;  
  
        case IOCTL_JPG_GET_FRMBUF:  
            LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPG_GET_FRMBUF\n");  
            UnlockJPGMutex();  
            return arg + JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE;  
  
        case IOCTL_JPG_GET_THUMB_FRMBUF:  
            LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPG_GET_THUMB_FRMBUF\n");  
            UnlockJPGMutex();  
            return arg + JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE + JPG_FRAME_BUF_SIZE;  
  
        case IOCTL_JPG_GET_PHY_FRMBUF:  
            LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPG_GET_PHY_FRMBUF\n");  
            UnlockJPGMutex();  
            return JPG_DATA_BASE_ADDR + JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE;  
  
        case IOCTL_JPG_GET_PHY_THUMB_FRMBUF:  
            LOG_MSG(LOG_TRACE, "s3c_jpeg_ioctl", "IOCTL_JPG_GET_PHY_THUMB_FRMBUF\n");  
            UnlockJPGMutex();  
            return JPG_DATA_BASE_ADDR + JPG_STREAM_BUF_SIZE + JPG_STREAM_THUMB_BUF_SIZE + JPG_FRAME_BUF_SIZE;  
  
        default :    
            LOG_MSG(LOG_ERROR, "s3c_jpeg_ioctl", "DD::JPG Invalid ioctl : 0x%X\r\n", cmd);  
    }  
  
    UnlockJPGMutex();  
  
    return result;  
}  


default :    
            LOG_MSG(LOG_ERROR, "s3c_jpeg_ioctl", "DD::JPG Invalid ioctl : 0x%X\r\n", cmd);  
最后执行了上面这一句,打印出:

[JPEG_DRV: ERROR] s3c_jpeg_ioctl: DD::JPG Invalid ioctl : 0x5

cmd值是5

在s3c-jpeg.h(网上找的)里面有:
#ifndef __JPEG_DRIVER_H__
#define __JPEG_DRIVER_H__


#define MAX_INSTANCE_NUM    1
#define MAX_PROCESSING_THRESHOLD 1000    // 1Sec

#define IOCTL_JPG_DECODE            0x00000002
#define IOCTL_JPG_ENCODE            0x00000003
#define IOCTL_JPG_GET_STRBUF            0x00000004
#define IOCTL_JPG_GET_FRMBUF            0x00000005
#define IOCTL_JPG_GET_THUMB_STRBUF        0x0000000A
#define IOCTL_JPG_GET_THUMB_FRMBUF        0x0000000B
#define IOCTL_JPG_GET_PHY_FRMBUF        0x0000000C
#define IOCTL_JPG_GET_PHY_THUMB_FRMBUF    0x0000000D
#define JPG_CLOCK_DIVIDER_RATIO_QUARTER    4

#endif /*__JPEG_DRIVER_H__*/

可能是驱动里面定义的这些宏的数值不对,或者是cmd的值不对
cmd的值是jpeg这些接口函数赋值的,也不用程序员进行赋值

所以现在就怀疑是这些宏的数值不对,现在这怎么解决啊,改也没法改。。。。
[ 此帖被leavor在2013-01-05 11:01重新编辑 ]
级别: 侠客
UID: 74945
精华: 0
发帖: 50
金钱: 250 两
威望: 50 点
贡献值: 0 点
综合积分: 100 分
注册时间: 2012-07-31
最后登录: 2018-05-03
6楼  发表于: 2013-01-05 11:27
看了下友善的jpeg硬编解码文件(screen-shot里面的JPGApi.c)里面的宏定义发现
#define IOCTL_JPG_DECODE                0xFA000002

#define IOCTL_JPG_ENCODE                0xFA000003

#define IOCTL_JPG_GET_STRBUF            0xFA000004

#define IOCTL_JPG_GET_FRMBUF            0xFA000005

#define IOCTL_JPG_GET_THUMB_STRBUF      0xFA00000A

#define IOCTL_JPG_GET_THUMB_FRMBUF      0xFA00000B

#define IOCTL_JPG_GET_PHY_FRMBUF        0xFA00000C

#define IOCTL_JPG_GET_PHY_THUMB_FRMBUF  0xFA00000D

与我自己用的这个不一样,看来是这里出现问题

换了友善的JPGApi.c,问题解决。

我之前的用的JPGApi.c在linux2.6.28其他厂家的板子能运行
看来是在linux2.6.38里面这些宏定义做了修改