硬汉嵌入式论坛

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

[JPEG] 测试STM32H7硬解JPEG解码800*480图片性能,全部通过SDRAM缓存数据,解码10ms,显示9ms

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106566
QQ
发表于 2019-5-7 01:26:16 | 显示全部楼层 |阅读模式
硬件JPEG解码不同图片,解码速度略有不同。

整体来说这个速度还是可以的。
1、将Flash存储的JPG图片通过硬件JPEG解码到SDRAM,测试速度是10ms左右
2、然后将SDRAM中的YCbCr格式图片转换为RGB格式并显示到LCD显存上,显存也是用的SDRAM,速度是9ms

整体来说这个性能还是不错的。
1.jpg

测试图片:
Wallpaper-Mac-OS-X-Snow-Leopard-HD-480x800.jpg

评分

参与人数 1金币 +20 收起 理由
oldBrother + 20 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106566
QQ
 楼主| 发表于 2019-5-7 01:32:06 | 显示全部楼层
再换一个图片。测试速度如下:
QQ截图20190507013046.jpg

测试的图片:
1.jpg
回复

使用道具 举报

23

主题

1403

回帖

1472

积分

至尊会员

积分
1472
发表于 2019-5-7 11:39:59 | 显示全部楼层
能给emWin配上不
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-5-7 12:08:30 | 显示全部楼层

配上emWin估计比这个速度要慢点,因为emWin有个专门的底层处理xxxxDrawBitmap,要多执行一层。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106566
QQ
 楼主| 发表于 2019-5-7 13:03:12 | 显示全部楼层
回复

使用道具 举报

0

主题

84

回帖

84

积分

初级会员

积分
84
发表于 2020-11-18 14:22:53 | 显示全部楼层
eric2013 发表于 2019-5-7 01:32
再换一个图片。测试速度如下:

能否解码1080或者2K,4K这类JPEG图片,然后再用800*480屏幕显示啊?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106566
QQ
 楼主| 发表于 2020-11-19 09:05:16 | 显示全部楼层
xk2yx 发表于 2020-11-18 14:22
能否解码1080或者2K,4K这类JPEG图片,然后再用800*480屏幕显示啊?

可以的,你试试。
注意配置下那个JPEG文件。



回复

使用道具 举报

2

主题

38

回帖

44

积分

新手上路

积分
44
发表于 2021-3-11 18:24:30 | 显示全部楼层
有工程吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106566
QQ
 楼主| 发表于 2021-3-12 08:40:25 | 显示全部楼层
回复

使用道具 举报

9

主题

31

回帖

58

积分

初级会员

积分
58
发表于 2023-5-23 19:12:22 | 显示全部楼层
为啥我用的v7的例程移植硬件解码需要23ms呢,dma2d花了12ms,因为是400Mhz,所以dma2d是差不多的,怎么硬件解码器差这么多
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2023-5-23 21:30:33 | 显示全部楼层
云安 发表于 2023-5-23 19:12
为啥我用的v7的例程移植硬件解码需要23ms呢,dma2d花了12ms,因为是400Mhz,所以dma2d是差不多的,怎 ...

我这边主频480MHz,也是同样的移植过来解码需要70ms.不知道为啥
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106566
QQ
 楼主| 发表于 2023-5-24 00:31:11 | 显示全部楼层
云安 发表于 2023-5-23 19:12
为啥我用的v7的例程移植硬件解码需要23ms呢,dma2d花了12ms,因为是400Mhz,所以dma2d是差不多的,怎 ...

不出意外你的SDRAM是16bit的。我们V7的是32biit的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106566
QQ
 楼主| 发表于 2023-5-24 00:32:00 | 显示全部楼层
2246606206 发表于 2023-5-23 21:30
我这边主频480MHz,也是同样的移植过来解码需要70ms.不知道为啥

你这个不正常,太慢了。楼上那个坛友的估计是16bit SDRAM
回复

使用道具 举报

9

主题

31

回帖

58

积分

初级会员

积分
58
发表于 2023-5-24 09:27:02 | 显示全部楼层
eric2013 发表于 2023-5-24 00:31
不出意外你的SDRAM是16bit的。我们V7的是32biit的。

32位的sdram啊,我们用的32M32bitSDRAM核心板,是因为sdram带宽不够吗?那我试试降低ltdc的速度提高sdram的时钟。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106566
QQ
 楼主| 发表于 2023-5-24 09:29:48 | 显示全部楼层
云安 发表于 2023-5-24 09:27
32位的sdram啊,我们用的32M32bitSDRAM核心板,是因为sdram带宽不够吗?那我试试降低ltdc的速度提高sdram ...

是单芯片的32bit SDRAM吗,还是两个16bit组合。

另外解码是用的我楼主位的图片解码的吗,不同的图片解码时间是不同的,这点你一定要清楚。JPEG的解码时间不是固定的。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2023-5-24 11:11:58 | 显示全部楼层
eric2013 发表于 2023-5-24 09:29
是单芯片的32bit SDRAM吗,还是两个16bit组合。

另外解码是用的我楼主位的图片解码的吗,不同的图片解 ...

用的两块16bit的SDRAM组合的。使用的也是楼主位的图片进行解码的
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2023-5-24 11:31:46 | 显示全部楼层
eric2013 发表于 2023-5-24 09:29
是单芯片的32bit SDRAM吗,还是两个16bit组合。

另外解码是用的我楼主位的图片解码的吗,不同的图片解 ...

我现在使用的是两块16bit的SDRAM,使用显示屏是1280*800的RGB屏。解码1280*800的RAGB格式的JPEG图片需要591ms左右,时间很长;这是我修改过后的,V7-530的JPEG解码程序如果用于RGB888或者ARGB8888的时候需要修改JPEG_X_Draw函数下的_DrawBitmap函数的int BytesPerLine,和int BitsPerPixel参数为RGB888、ARGB8888的对应数据才行。再修改完成测试1280*800的ARGB8888格式解码为891ms后发现时间太长就恢复emwin的显示格式为RGB565,JPEG解码格式为RGB565后使用楼主位的图片使用V7-530的JPEG解码格式进行解码就是88ms.再修改HAL_JPEG_MspInit函数下的JPEG输入、输出DMA通道配置,修改目标地址、源地址为WORD格式后,解码时间下降到77ms。这是我这边测试后出来的数据。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2023-5-24 15:00:18 | 显示全部楼层
2246606206 发表于 2023-5-24 11:31
我现在使用的是两块16bit的SDRAM,使用显示屏是1280*800的RGB屏。解码1280*800的RAGB格式的JPEG图片需要5 ...

经过优化,使用楼主位图片采用RGB565格式解码达到了26ms,采用ARGB8888格式解码达到43ms。主要是调整了SDRAM的时钟源,采用HCLK3和不采用HCLK3作为FMC总线时钟有一定细微差别。调整了MPU的配置,给解码缓存使用的SDRAM区域需要配置为TEX:C:B:S 0:1:0:0 模式。进行上述两部后接上“云安”网友的测试速度,但是还是离楼主测试的数据有一定距离,楼主帮分析一下
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2023-5-24 15:14:24 | 显示全部楼层
2246606206 发表于 2023-5-24 11:31
我现在使用的是两块16bit的SDRAM,使用显示屏是1280*800的RGB屏。解码1280*800的RAGB格式的JPEG图片需要5 ...

如果楼主测试的数据是对的,再修改这几个位置的操作速度应该会更快
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106566
QQ
 楼主| 发表于 2023-5-24 17:18:37 | 显示全部楼层
2246606206 发表于 2023-5-24 15:14
如果楼主测试的数据是对的,再修改这几个位置的操作速度应该会更快

26ms,时间还是太长,Cache什么都开了吗,都开了的话,然后IDE优化等级开到最高

剩下唯一区别就是我们用的独立的32bit SDRAM,你的是双16bit组合。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2023-5-24 18:30:49 | 显示全部楼层
eric2013 发表于 2023-5-24 17:18
26ms,时间还是太长,Cache什么都开了吗,都开了的话,然后IDE优化等级开到最高

剩下唯一区别就是我们 ...

剩下的能优化的我都优化过了,可能就是32bitSDRAM和16bit双片SDRAM组合的问题了。
int JPEG_X_Draw(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0) ;这个函数的下面这里进行调整;
/* 绘制JPEG图片 */
        if(PicPixelFormat==LTDC_PIXEL_FORMAT_ARGB8888)
                _DrawBitmap(_Context.xPos, _Context.yPos, (void const *)_Context.pOutBuffer , JPEG_Info.ImageWidth, JPEG_Info.ImageHeight, JPEG_Info.ImageWidth*4, 32);
        else if(PicPixelFormat==LTDC_PIXEL_FORMAT_RGB888)
                _DrawBitmap(_Context.xPos, _Context.yPos, (void const *)_Context.pOutBuffer , JPEG_Info.ImageWidth, JPEG_Info.ImageHeight, JPEG_Info.ImageWidth*3, 24);
        else
                _DrawBitmap(_Context.xPos, _Context.yPos, (void const *)_Context.pOutBuffer , JPEG_Info.ImageWidth, JPEG_Info.ImageHeight, JPEG_Info.ImageWidth*2, 16);

/*
*********************************************************************************************************
*        函 数 名: HAL_JPEG_MspInit
*        功能说明: 初始化JEPG所需要的底层
*        形    参: JPEG_HandleTypeDef句柄指针
*        返 回 值: 无
*********************************************************************************************************
*/
void HAL_JPEG_MspInit(JPEG_HandleTypeDef *hjpeg)
{
        /* 这两个变量务必设置为静态局部变量或者全局变量,因为退出后,JPEG句柄还要使用 */
        static MDMA_HandleTypeDef   hmdmaIn;
        static MDMA_HandleTypeDef   hmdmaOut;  

        /* 使能JPEG时钟 */
        __HAL_RCC_JPGDECEN_CLK_ENABLE();

        /* 使能MDMA时钟 */
        __HAL_RCC_MDMA_CLK_ENABLE();

        /* 使能JPEG中断并配置优先级 */
        HAL_NVIC_SetPriority(JPEG_IRQn, 0x03, 0x00);
        HAL_NVIC_EnableIRQ(JPEG_IRQn);  
       
        /* JPEG输入的MDMA配置 ###########################################*/
        hmdmaIn.Instance                = MDMA_Channel7;                   /* 使用MDMA通道7 */
        hmdmaIn.Init.Priority           = MDMA_PRIORITY_HIGH;              /* 优先级高 */
        hmdmaIn.Init.Endianness         = MDMA_LITTLE_ENDIANNESS_PRESERVE; /* 小端格式 */
        hmdmaIn.Init.SourceInc          = MDMA_SRC_INC_WORD;               /* 源地址字节递增 */
        hmdmaIn.Init.DestinationInc     = MDMA_DEST_INC_DISABLE;           /* 目的地址无自增 */
        hmdmaIn.Init.SourceDataSize     = MDMA_SRC_DATASIZE_WORD;          /* 源地址数据宽度字节 */
        hmdmaIn.Init.DestDataSize       = MDMA_DEST_DATASIZE_WORD;         /* 目的地址数据宽度字节 */
        hmdmaIn.Init.DataAlignment      = MDMA_DATAALIGN_PACKENABLE;       /* 小端,右对齐 */
        hmdmaIn.Init.SourceBurst        = MDMA_SOURCE_BURST_32BEATS;       /* 源数据突发传输,32次 */
        hmdmaIn.Init.DestBurst          = MDMA_DEST_BURST_32BEATS;         /* 目的数据突发传输,16次 */
       
        hmdmaIn.Init.SourceBlockAddressOffset = 0;  /* 用于block传输,buffer传输用不到 */
        hmdmaIn.Init.DestBlockAddressOffset   = 0;  /* 用于block传输,buffer传输用不到 */
  
        hmdmaIn.Init.Request = MDMA_REQUEST_JPEG_INFIFO_TH;           /* JPEG的FIFO阀值触发中断 */
        hmdmaIn.Init.TransferTriggerMode = MDMA_BUFFER_TRANSFER; /* 使用MDMA的buffer传输 */
        hmdmaIn.Init.BufferTransferLength = 32;                  /* 每次传输32个字节,JPEG的FIFO阀值是32字节 */

        /* 关联MDMA的句柄到JPEG */
        __HAL_LINKDMA(hjpeg, hdmain, hmdmaIn);

        /* 先复位,然后配置MDMA */
        HAL_MDMA_DeInit(&hmdmaIn);
        HAL_MDMA_Init(&hmdmaIn);

        /* JPEG输出的MDMA配置 ###########################################*/
        hmdmaOut.Instance             = MDMA_Channel6;                   /* 使用MDMA通道6 */
        hmdmaOut.Init.Priority        = MDMA_PRIORITY_VERY_HIGH;         /* 优先级最高 */
        hmdmaOut.Init.Endianness      = MDMA_LITTLE_ENDIANNESS_PRESERVE; /* 小端格式 */
        hmdmaOut.Init.SourceInc       = MDMA_SRC_INC_DISABLE;            /* 源数据地址禁止自增 */
        hmdmaOut.Init.DestinationInc  = MDMA_DEST_INC_WORD;              /* 目的数据地址字节自增 */
        hmdmaOut.Init.SourceDataSize  = MDMA_SRC_DATASIZE_WORD;          /* 源地址数据宽度字 */
        hmdmaOut.Init.DestDataSize    = MDMA_DEST_DATASIZE_WORD;         /* 目的地址数据宽度字节 */
        hmdmaOut.Init.DataAlignment   = MDMA_DATAALIGN_PACKENABLE;       /* 小端,右对齐 */  
        hmdmaOut.Init.SourceBurst     = MDMA_SOURCE_BURST_32BEATS;       /* 源数据突发传输,32次 */
        hmdmaOut.Init.DestBurst       = MDMA_DEST_BURST_32BEATS;         /* 目的数据突发传输,16次 */
       
        hmdmaOut.Init.SourceBlockAddressOffset = 0;  /* 用于block传输,buffer传输用不到 */
        hmdmaOut.Init.DestBlockAddressOffset   = 0;  /* 用于block传输,buffer传输用不到 */

        hmdmaOut.Init.Request              = MDMA_REQUEST_JPEG_OUTFIFO_TH;  /* JPEG的FIFO阀值触发中断 */
        hmdmaOut.Init.TransferTriggerMode  = MDMA_BUFFER_TRANSFER;          /* 使用MDMA的buffer传输 */
        hmdmaOut.Init.BufferTransferLength = 32;                            /* 每次传输32个字节,JPEG的FIFO阀值是32字节 */

        /* 先复位,然后配置MDMA */
        HAL_MDMA_DeInit(&hmdmaOut);  
        HAL_MDMA_Init(&hmdmaOut);

        /* 关联MDMA的句柄到JPEG */
        __HAL_LINKDMA(hjpeg, hdmaout, hmdmaOut);

        /* 使能MDMA中断并配置优先级 */
        HAL_NVIC_SetPriority(MDMA_IRQn, 0x04, 0x00);
        HAL_NVIC_EnableIRQ(MDMA_IRQn);
}
这个函数进行优化应该还能提升一点速度。

我这边已经测试过是可行的,解码速度有一定提升。
回复

使用道具 举报

9

主题

31

回帖

58

积分

初级会员

积分
58
发表于 2023-5-26 17:16:26 | 显示全部楼层
eric2013 发表于 2023-5-24 09:29
是单芯片的32bit SDRAM吗,还是两个16bit组合。

另外解码是用的我楼主位的图片解码的吗,不同的图片解 ...

用的一块32bitSDRAM,图片不是同一张,主频400M,0优化等级.
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-8-16 11:33:22 来自手机 | 显示全部楼层
楼主您好, 请问您设置的像素格式是ARGB8888吗
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106566
QQ
 楼主| 发表于 2023-8-16 16:04:38 | 显示全部楼层
xyq 发表于 2023-8-16 11:33
楼主您好, 请问您设置的像素格式是ARGB8888吗

记不太清了, LCD颜色格式好像是选择565格式测试的。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-8-16 22:55:24 来自手机 | 显示全部楼层
eric2013 发表于 2023-8-16 16:04
记不太清了, LCD颜色格式好像是选择565格式测试的。

奇怪了, 使用 SDRAM 做显存, 开启双图层, 像素格式均为 ARGB8888, 用您的 JPEG 图片进行解码, 从开始解码到完成显示, 只耗了 8.5MS. 如图所示, 重复进行 JPEG 解码, 每解码完成一次翻转一下 GPIO, 逻辑分析仪测到的 GPIO 翻转间隔为 8.5 MS 左右, 这有点超乎想象了
IMG_20230816_224647.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106566
QQ
 楼主| 发表于 2023-8-17 08:15:41 | 显示全部楼层
xyq 发表于 2023-8-16 22:55
奇怪了, 使用 SDRAM 做显存, 开启双图层, 像素格式均为 ARGB8888, 用您的 JPEG 图片进行解码, 从开始解码 ...

这个不对。你可以分别求出解码时间和刷新时间,然后根据刷新时间,换算SDRAM的速度高达多少了。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-8-17 10:10:16 来自手机 | 显示全部楼层
eric2013 发表于 2023-8-17 08:15
这个不对。你可以分别求出解码时间和刷新时间,然后根据刷新时间,换算SDRAM的速度高达多少了。

反复测试了好多次, 确实是这样, 我的配置中 SDRAM 的时钟频率是 135MHz
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106566
QQ
 楼主| 发表于 2023-8-17 10:25:42 | 显示全部楼层
xyq 发表于 2023-8-17 10:10
反复测试了好多次, 确实是这样, 我的配置中 SDRAM 的时钟频率是 135MHz

那差不多,我这个是400MHz主频,100M SDRAM测试。

如果你是480M/550M主频,135MHz,然后再配合编译器优化,有希望低不少。回头不忙了,按照你这个速度测试下。
回复

使用道具 举报

24

主题

119

回帖

191

积分

初级会员

积分
191
发表于 2023-8-19 12:50:32 来自手机 | 显示全部楼层
华芯微特m33的硬jpg解码是15ms(800480),输出24位16位一样,因为16位反而会多点计算。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-8-19 19:04:31 来自手机 | 显示全部楼层
yxydoctor 发表于 2023-8-19 12:50
华芯微特m33的硬jpg解码是15ms(800480),输出24位16位一样,因为16位反而会多点计算。

请问一下它支持硬件 YCbCr 转 RGB 吗, 如果支持, 那么 16 位色和 32 位色的转换周期应该是一样的, 而 16 位色的数据量更少, 应该是更快才对, 当然要以实际测试为准, 可能跟 FIFO 以及 SDRAM 有关
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 08:58 , Processed in 0.323457 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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