OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3268|回复: 3

STM32F7 JPEG解码问题,如何将RAM区的JPEG图片数据,通过JPEG硬解码,然后显示

[复制链接]

1

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-6-2
在线时间
12 小时
发表于 2020-8-16 00:08:08 | 显示全部楼层 |阅读模式
15金钱
大佬们,刚入手阿波罗STM32F7这个板,最近在学习JPEG解码那块,想把图片从U盘读出然后存到SPI flash中,再显示到LCD屏,但是由于SPI  flash写入的速度太慢(5s左右),我想,先把U盘的图片文件的数据读取到RAM中,先再LCD显示出来,然后再通过RAM写入到SPI Flash中,这样,占用U盘的时间就大大缩减。可是原子哥的历程中JPEG硬解码是读取文件然后解码,怎么将RAM中的图片数据硬解码显示?不知哪位大佬给些建议。非常感谢。下面是我更改的代码,但是每次执行的时候都会卡死在 SCB_CleanlnvakidateDCache.
u8 hjpgd_decode1(u8* pname,u32 lenth )
{
        FIL* ftemp;
        u16* rgb565buf,count=0,readsize=0,fileout=0;
        vu32 timecnt=0;
        u8 fileover=0;
        u8 i=0;
        u8 res;
        u32 mcublkindex=0;  
        res=JPEG_Core_Init(&hjpgd);                                                //初始化JPEG内核
        if(res)return 1;
        ftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL));                //申请内存  

        rgb565buf=mymalloc(SRAMEX,1024*600*2);                        //申请整帧内存
        JPEG_Decode_Init(&hjpgd);                                                //初始化硬件JPEG解码器
        for(i=0;i<JPEG_DMA_INBUF_NB;i++)
        {
                mymemcpy( hjpgd.inbuf[i].buf,&pname[i*JPEG_DMA_INBUF_LEN],JPEG_DMA_INBUF_LEN);
                hjpgd.inbuf[i].size=JPEG_DMA_INBUF_LEN;                                        //读取
                hjpgd.inbuf[i].sta=1;                                        //标记buf满
                fileout = 0;
                count = 2;
        }
        JPEG_IN_OUT_DMA_Init((u32)hjpgd.inbuf[0].buf,(u32)hjpgd.outbuf[0].buf,hjpgd.inbuf[0].size,JPEG_DMA_OUTBUF_LEN);//配置DMA
        jpeg_in_callback=jpeg_dma_in_callback;                        //JPEG DMA读取数据回调函数
        jpeg_out_callback=jpeg_dma_out_callback;                 //JPEG DMA输出数据回调函数
        jpeg_eoc_callback=jpeg_endofcovert_callback;        //JPEG 解码结束回调函数
        jpeg_hdp_callback=jpeg_hdrover_callback;                 //JPEG Header解码完成回调函数
        JPEG_DMA_Start();                                                                //启动DMA传输
        while(1)
        {
        SCB_CleanInvalidateDCache();                                //清空D catch
                if(hjpgd.inbuf[hjpgd.inbuf_write_ptr].sta==0&&fileover==0)        //有buf为空
                {
                        if(fileout == 0)
                        {
                                 if((count+1)*JPEG_DMA_INBUF_LEN > lenth)
                                 {
                                         readsize = lenth - count*JPEG_DMA_INBUF_LEN;
                                         fileout=1;                                         
                                 }
                                 else
                                 {
                                        readsize = JPEG_DMA_INBUF_LEN;
                                       
                                        hjpgd.inbuf[hjpgd.inbuf_write_ptr].sta=1;        //buf满
                                 }
                                 
                                        mymemcpy( hjpgd.inbuf[i].buf,&pname[count*JPEG_DMA_INBUF_LEN],readsize);//填满一个缓冲区
                                 count++;
                                 hjpgd.inbuf[hjpgd.inbuf_write_ptr].size=readsize;        //读取
         
                                if(hjpgd.indma_pause==1&&hjpgd.inbuf[hjpgd.inbuf_read_ptr].sta==1)//之前是暂停的了,继续传输
                                {
                                        JPEG_IN_DMA_Resume((u32)hjpgd.inbuf[hjpgd.inbuf_read_ptr].buf,hjpgd.inbuf[hjpgd.inbuf_read_ptr].size);        //继续下一次DMA传输
                                        hjpgd.indma_pause=0;
                                }
                                hjpgd.inbuf_write_ptr++;
                                if(hjpgd.inbuf_write_ptr>=JPEG_DMA_INBUF_NB)hjpgd.inbuf_write_ptr=0;
                        }
                        else
                        {
                                timecnt=0;        //清零计时器
                                fileover=1;        //文件结束了...
                        }
                }
                if(hjpgd.outbuf[hjpgd.outbuf_read_ptr].sta==1)        //buf里面有数据要处理
                {
                        mcublkindex+=hjpgd.ycbcr2rgb(hjpgd.outbuf[hjpgd.outbuf_read_ptr].buf,(u8*)rgb565buf,mcublkindex,hjpgd.outbuf[hjpgd.outbuf_read_ptr].size);
                        hjpgd.outbuf[hjpgd.outbuf_read_ptr].sta=0;        //标记buf为空
                        hjpgd.outbuf[hjpgd.outbuf_read_ptr].size=0;        //数据量清空
                        hjpgd.outbuf_read_ptr++;
                        if(hjpgd.outbuf_read_ptr>=JPEG_DMA_OUTBUF_NB)hjpgd.outbuf_read_ptr=0;//限制范围
                        if(mcublkindex==hjpgd.total_blks)
                        {
                                break;
                        }
                }else if(hjpgd.outdma_pause==1&&hjpgd.outbuf[hjpgd.outbuf_write_ptr].sta==0)                //out暂停,且当前writebuf已经为空了,则恢复out输出
                {
                        JPEG_OUT_DMA_Resume((u32)hjpgd.outbuf[hjpgd.outbuf_write_ptr].buf,JPEG_DMA_OUTBUF_LEN);//继续下一次DMA传输
                        hjpgd.outdma_pause=0;
                }
                timecnt++;
                if(fileover)//文件结束后,及时退出,防止死循环
                {
                        if(hjpgd.state==JPEG_STATE_NOHEADER)break;        //解码失败了
                        if(timecnt>0X3FFF)break;                                        //超时退出
                }
        }   
        if(hjpgd.state==JPEG_STATE_FINISHED)        //解码完成了
        {
                piclib_fill_color(picinfo.S_XOFF,picinfo.S_YOFF,hjpgd.Conf.ImageWidth,hjpgd.Conf.ImageHeight,rgb565buf);  
        }
        myfree(SRAMIN,ftemp);
        myfree(SRAMEX,rgb565buf);       
        JPEG_Core_Destroy(&hjpgd);
        return 0;
}

最佳答案

查看完整内容[请看2#楼]

我们的视频播放实验,就是先把图片缓存到一个buf里面,然后解码这个buf,参考下那个
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2020-8-16 00:08:09 | 显示全部楼层
我们的视频播放实验,就是先把图片缓存到一个buf里面,然后解码这个buf,参考下那个
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-6-2
在线时间
12 小时
 楼主| 发表于 2020-8-17 17:03:55 | 显示全部楼层
有没大佬帮忙解答下,谢谢
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2020-6-2
在线时间
12 小时
 楼主| 发表于 2020-9-27 11:35:50 | 显示全部楼层
正点原子 发表于 2020-8-16 00:08
我们的视频播放实验,就是先把图片缓存到一个buf里面,然后解码这个buf,参考下那个

谢谢大佬
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-17 04:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表