硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1290|回复: 17
收起左侧

[JPEG] STM32H7B0JPEG解码显示数据空间共用

  [复制链接]

11

主题

28

回帖

61

积分

初级会员

积分
61
发表于 2022-5-2 08:35:36 | 显示全部楼层 |阅读模式
1、设置JPEG解码YCbCr数据区起点为0X24000000;  屏幕(800*600*2)显示区起点为0X42010000;
2、整幅JPEG图片硬件解码,数据放在0X24000000
3、从下边开始,每32行作一次转换写显示,这样不会破坏待转换的数据。
//余数行转换显示
   ss01= JPEG_Info.ImageHeight/32;
if (JPEG_Info.ImageHeight%32 !=0)         
     {HAL_DMA2D_Start(&hdma2d,                  // 启动DMA2D转换
                         (uint32_t)pSrc+ JPEG_Info.ImageWidth*48*ss01,          //源地址
                                                                         (uint32_t)pDst+ 800*32*2*ss01,  //写显示起点
                                                                         JPEG_Info.ImageWidth,     //宽度
                                                                         JPEG_Info.ImageHeight%32);  //高度
      HAL_DMA2D_PollForTransfer(&hdma2d, 25); // 查询并等待结束         
     }

//正常行转换显示
   ss01= JPEG_Info.ImageHeight/32;
while (ss01--)         
     {HAL_DMA2D_Start(&hdma2d,                  // 启动DMA2D转换
                         (uint32_t)pSrc+ JPEG_Info.ImageWidth*48*ss01,          //源地址
                                                                         (uint32_t)pDst+ 800*32*2*ss01,  //写显示起点
                                                                         JPEG_Info.ImageWidth,     //宽度
                                                                         32);  //高度
      HAL_DMA2D_PollForTransfer(&hdma2d, 25); // 查询并等待结束         
     }

这种方案的好处是共用空间,能够在7B0VB上实现800*600*16位显示,整幅解码速度或可快点。
不足是如果图片不足800宽,会有色块(实际YCbCr数据)显示出来,不影响正常图片,当然你可以把它擦除。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2022-5-3 08:11:58 | 显示全部楼层
不错不错,终于把你的软件实现修改了。
回复

使用道具 举报

11

主题

28

回帖

61

积分

初级会员

积分
61
 楼主| 发表于 2022-5-3 10:36:17 | 显示全部楼层
上边的程序段有点问题,如果图片宽度不能被16整除,就乱了,需要补齐。
   (uint32_t)pSrc+ (JPEG_Info.ImageWidth+ inputLineOffset)*48*ss01,         //源地址
回复

使用道具 举报

11

主题

28

回帖

61

积分

初级会员

积分
61
 楼主| 发表于 2022-5-4 18:50:53 | 显示全部楼层
微信图片_20220504184917.jpg
回复

使用道具 举报

18

主题

216

回帖

270

积分

高级会员

积分
270
发表于 2022-5-8 12:40:48 | 显示全部楼层
HI 2013大佬,

這個可以用在V7板上嗎?? 謝謝.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106731
QQ
发表于 2022-5-8 14:43:38 | 显示全部楼层
inceboy 发表于 2022-5-8 12:40
HI 2013大佬,

這個可以用在V7板上嗎?? 謝謝.

可以,这个很好实现,后面整理个例子给大家分享下。
回复

使用道具 举报

18

主题

216

回帖

270

积分

高级会员

积分
270
发表于 2022-5-10 14:37:34 | 显示全部楼层
HI 2013大佬

剛K了下TRM 0X24000000是AXI SRAM沒錯
0X42010000 SPEC寫是在界面區???

這個是....??
回复

使用道具 举报

11

主题

28

回帖

61

积分

初级会员

积分
61
 楼主| 发表于 2022-5-11 12:21:17 | 显示全部楼层
   ss01= JPEG_Info.ImageHeight/32;
         if(ss01>18) ss01=18;

if (JPEG_Info.ImageHeight%32 !=0)         
     {HAL_DMA2D_Start(&hdma2d,                  // 启动DMA2D转换
                         (uint32_t)pSrc+  (JPEG_Info.ImageWidth+ inputLineOffset)*s42x*ss01,          //源地址
                                        //48=  32/2 *3  YCbCr 4:2:0数据量为每行点数*1.5
                                                                         //(uint32_t)pDst+ 800*2*32*ss01+ss02,  //写显示起点
                                     (uint32_t)pDst+ 51200*ss01,  //+ss02,  //写显示起点  
                                                                         JPEG_Info.ImageWidth,     //宽度
                                                                         JPEG_Info.ImageHeight%32);  //高度
      HAL_DMA2D_PollForTransfer(&hdma2d, 25); // 查询并等待结束         
     }

//正常行转换显示
  // ss01= JPEG_Info.ImageHeight/32;
        //printf ("ss01= %d \r\n",ss01);               

while (ss01--)         
     {HAL_DMA2D_Start(&hdma2d,                  // 启动DMA2D转换
                         (uint32_t)pSrc+ (JPEG_Info.ImageWidth+ inputLineOffset)*s42x*ss01,         //源地址
                                                                         //(uint32_t)pDst+ 800*2*32*ss01+ss02,  //写显示起点
                                     (uint32_t)pDst+ 51200*ss01,   //+ss02,  //写显示起点
                                                                         JPEG_Info.ImageWidth,     //宽度
                                                                         32);  //高度
      HAL_DMA2D_PollForTransfer(&hdma2d, 25); // 查询并等待结束                 
     }


回复

使用道具 举报

18

主题

216

回帖

270

积分

高级会员

积分
270
发表于 2022-5-11 17:47:07 | 显示全部楼层
新洲罗远 发表于 2022-5-11 12:21
ss01= JPEG_Info.ImageHeight/32;
         if(ss01>18) ss01=18;

HI 新洲大大

想請教一下
(uint32_t)pSrc
(uint32_t)pDst  這兩個是自己找一個解碼完存放和顯存的位址嗎???

s42x這個又是???

謝謝.
回复

使用道具 举报

11

主题

28

回帖

61

积分

初级会员

积分
61
 楼主| 发表于 2022-5-11 20:32:25 | 显示全部楼层
(uint32_t)pSrc=JPEG解码YCbCr数据区起点为0X24000000;
(uint32_t)pDst =屏幕(800*600*2)显示区起点为0X24010000;
s42x是我设置的一个变量,当YCbCr 4:2:0 时 =48
这些实际是计算原地址和目标地址的偏移值。
上次没有说清楚,对不起了!
回复

使用道具 举报

11

主题

28

回帖

61

积分

初级会员

积分
61
 楼主| 发表于 2022-5-11 20:35:47 | 显示全部楼层
这个方案还有点问题,转换同时,屏幕也在刷新,有点闪烁,如果图片从屏幕左下角显示起,就好多了
回复

使用道具 举报

18

主题

216

回帖

270

积分

高级会员

积分
270
发表于 2022-5-16 09:51:05 | 显示全部楼层
新洲罗远 发表于 2022-5-11 20:35
这个方案还有点问题,转换同时,屏幕也在刷新,有点闪烁,如果图片从屏幕左下角显示起,就好多了

新洲大大

謝謝回覆.
回复

使用道具 举报

18

主题

216

回帖

270

积分

高级会员

积分
270
发表于 2022-5-23 15:37:25 | 显示全部楼层
新洲罗远 发表于 2022-5-11 20:35
这个方案还有点问题,转换同时,屏幕也在刷新,有点闪烁,如果图片从屏幕左下角显示起,就好多了

HI 新洲大大
可否請教一下.

我試起來不行噯,就用原本的那張480X272都秀不出來.

"1、设置JPEG解码YCbCr数据区起点为0X24000000;  屏幕(800*600*2)显示区起点为0X42010000;
2、整幅JPEG图片硬件解码,数据放在0X24000000"

是少做這兩件事嗎?

解碼是用您的LoadJpegFile還是V7板原本的??
"JPEG_Decode_DMA(&JPEG_Handle, (uint32_t)_ac1, sizeof(_ac1), SDRAM_APP_BUF);"


謝謝.
回复

使用道具 举报

11

主题

28

回帖

61

积分

初级会员

积分
61
 楼主| 发表于 2022-5-25 20:10:36 | 显示全部楼层
解碼是用V7板原本的,
设置JPEG解码YCbCr数据区起点为0X24000000;  屏幕(800*600*2)显示区起点为0X42010000;

#define        LCD_FRAME_BUFFER     0x24010000       // 屏幕的显存地址

#define        JPEG_OUTPUT_DATA_BUFFER    0x24000000  //(LCD_MemoryAdd +0x50000)    // PEG解码输出地址
回复

使用道具 举报

5

主题

24

回帖

39

积分

新手上路

积分
39
发表于 2023-6-13 09:29:57 | 显示全部楼层
新洲罗远 发表于 2022-5-25 20:10
解碼是用V7板原本的,
设置JPEG解码YCbCr数据区起点为0X24000000;  屏幕(800*600*2)显示区起点为0X420100 ...

大佬你好,ST7789v2 SPI通信的屏幕可以这样弄吗
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2023-6-13 16:19:25 | 显示全部楼层

新洲罗远 发表于 2022-5-25 20:10
解碼是用V7板原本的,
设置JPEG解码YCbCr数据区起点为0X24000000;  屏幕(800*600*2)显示区起点为0X420100 ...

大佬你好
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2023-6-13 16:19:48 | 显示全部楼层
我不可以发布?
回复

使用道具 举报

11

主题

28

回帖

61

积分

初级会员

积分
61
 楼主| 发表于 2023-6-25 21:25:15 | 显示全部楼层

可以发布!
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 18:42 , Processed in 0.227771 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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