2018年8月DocID030196

解压程序  时间:2021-02-18  阅读:()

Rev1[EnglishRev1]1/341AN4996应用笔记STM32F76/77xxx和STM32H7x3系列微控制器中的硬件JPEG编解码外设引言本应用笔记描述在STM32F76/77xxx和STM32H7x3系列微控制器中如何对JPEG解码/编码应用使用硬件JPEG编解码外设.
STM32F76/77xxx和STM32H7x3系列微控制器嵌入了专用的硬件JPEG编解码外设,它提供了快速又简单的硬件JPEG图像压缩程序和解压程序,具备:JPEG文件头的全面管理能力,完全可编程的霍夫曼表(两个AC表和两个DC表),多达四个可编程量化表,完全可编程最小编码单元(MCU).
硬件JPEG编解码器支持YCbCr或RGB(3个颜色分量)、灰度(1个颜色分量)和CMYK(4个颜色分量)模式的像素输入/输出格式,每个分量的下采样因子完全可编程.

为了充分利用本应用笔记,用户应熟悉:STM32的JPEG编解码外设,如STM32F76/77xxx参考手册(RM0410)所述,该手册可从意法半导体网站www.
st.
com上获得.
STM32的JPEG编解码外设,如STM32H7x3参考手册(RM0433)所述,该手册可从意法半导体网站www.
st.
com上获得.
JPEG压缩标准(JPEGISO/IEC10918-1ITU-T建议T.
81)和JFIF文件格式标准(JPEG文件交换格式).
参考文档STM32F76xxx和STM32F77xxx基于32位MCU的高级Arm参考手册(RM0410),STM32H7x3基于32位MCU的高级Arm参考手册(RM0433),STM32F7系列(STM32CubeF7)和STM32H7系列(STM32CubeH7)的嵌入式软件.
表1.
适用产品类型产品线和部件号微控制器STM32F777BI、STM32F777II、STM32F777NI、STM32F777VI、STM32F777ZI、STM32F7x8系列、STM32F7x9系列STM32H7x3系列www.
st.
com目录AN49962/34DocID030196Rev1[EnglishRev1]目录1硬件JPEG编解码器概述62不同色彩空间的硬件JPEG编解码器设置72.
1YCbCr色彩空间72.
1.
1YCbCr与RGB之间的相互转换72.
1.
2YCbCr量化表82.
1.
3YCbCr色度下采样和最小编解码单元(MCU)结构112.
1.
4CONFR1寄存器设置132.
1.
5CONFR2寄存器设置142.
1.
6CONFR3寄存器设置152.
1.
7CONFR4-7寄存器设置152.
2灰度色彩空间162.
2.
1RGB至灰度的转换162.
2.
2灰度量化表162.
2.
3CONFR1寄存器设置162.
2.
4CONFR2寄存器设置172.
2.
5CONFR3寄存器设置172.
2.
6CONFR4-7寄存器设置172.
3CMYK色彩空间182.
3.
1CMYK量化表182.
3.
2CONFR1寄存器设置182.
3.
3CONFR2寄存器设置192.
3.
4CONFR3寄存器设置192.
3.
5CONFR4-7寄存器设置193JPEG解码203.
1MCU重排序和转换213.
1.
1在STM32H7x3系列器件上213.
1.
2在STM32F76/77xxx器件上233.
2JPEG解码性能264JPEG编码284.
1JPEG编码性能31DocID030196Rev1[EnglishRev1]3/34AN4996目录35结论326版本历史33表格索引AN49964/34DocID030196Rev1[EnglishRev1]表格索引表1.
适用产品1表2.
JPEGMCU组织20表3.
STM32CubeH7固件包中JPEG解码示例的列表22表4.
STM32CubeF7固件包中JPEG解码示例的列表.
23表5.
MCU至RGB内部转换函数列表25表6.
STM32H7x3JPEG解码性能26表7.
STM32F76/77xxxJPEG解码性能.
26表8.
JPEG解码性能测量条件27表9.
STM32CubeF7/H7固件包中JPEG编码示例的列表.
29表10.
RGB至MCU内部转换函数列表30表11.
STM32H7x3JPEG编码性能31表12.
STM32F76/77xxxJPEG编码性能.
31表13.
JPEG编码性能测量条件31表14.
文档版本历史33表15.
中文文档版本历史33DocID030196Rev1[EnglishRev1]5/34AN4996图片索引5图片索引图1.
YCbCr/RGB颜色转换7图2.
YCbCr亮度量化表8图3.
YCbCr色度量化表8图4.
量化表的Z形排序顺序9图5.
量化表的Z形扫描顺序9图6.
硬件JPEGQMEMRAM10图7.
色度下采样比例.
12图8.
最小编码单元封装13图9.
JPEG解码流20图10.
JPEG编码流28硬件JPEG编解码器概述AN49966/34DocID030196Rev1[EnglishRev1]1硬件JPEG编解码器概述硬件JPEG编解码外设符合JPEG标准(JPEGISO/IEC10918-1ITU-T建议T.
81).
它可以解码/编码JPEG压缩图像,每个样本8位.
硬件JPEG编解码外设为熵编解码段(ECS)编码和解码提供硬件加速.
它支持JPEG文件头生成和解析.
硬件JPEG编解码外设还支持JFIF(JPEG文件交换格式),使用事实标准对JPEG图像进行编码.
但是,在这些数据流中找到的所有应用特定的标记段均被忽略.
JPEG编解码器支持最多四个颜色分量、四个量化表和两组DC和AC霍夫曼表.
硬件JPEG编解码器可以灵活地指定要对每个分量使用的量化表和霍夫曼表.

JPEG标准定义的JPEG编码和解码操作按块执行.
JPEG标准将MCU(最小编解码单元)定义为可以编码或解码的最小块数.
在硬件JPEG编解码外设中,MCU的构成是可编程的.
硬件JPEG编解码器可以定义每个MCU中属于特定颜色分量的块数.
每个块是样本的一个8x8数组,每个样本被定义为8位(1个字节).
因此,每个块均是一个64字节数组(每个样本1个字节).
硬件JPEG编解码器支持YCbCr或RGB(3个颜色分量)、灰度(1个颜色分量)和CMYK(4个颜色分量)模式的像素输入/输出格式,每个分量的下采样因子完全可编程.

使用STM32H7x3系列器件进行JPEG解码操作,当输出颜色格式为YCbCr时,Chrom-ArtAccelerator外设(也称为DMA2D)能够将YCbCr块(JPEG解码器的输出)转换为可直接显示的RGB像素.
使用STM32H7x3系列器件进行编码(所有颜色格式)或非YCbCr(灰度或CMYK颜色格式时)颜色格式的解码时,从/至RGB像素的转换不进行硬件加速且必须通过软件执行.

使用STM32F76/77xxx器件进行解码或编码时,YCbCr至RGB的转换不加速且必须通过软件执行.
STM32CubeF7/H7固件包提供包含必要API的专用JPEG实用工具软件,能够执行JPEGMCU块至/从RGB像素的转换(位于\Firmware\Utilities\JPEG目录下).
STM32CubeF7/H7为JPEG编解码外设提供专用HAL(硬件抽象层)驱动程序:STM32CubeF7:stm32f7xx_hal_jpeg.
c/stm32f7xx_hal_jpeg.
hSTM32CubeH7:stm32h7xx_hal_jpeg.
c/stm32h7xx_hal_jpeg.
h本文档适用于基于Arm的器件.
DocID030196Rev1[EnglishRev1]7/34AN4996不同色彩空间的硬件JPEG编解码器设置332不同色彩空间的硬件JPEG编解码器设置2.
1YCbCr色彩空间2.
1.
1YCbCr与RGB之间的相互转换JPEG文件交换格式(JFIF)标准描述了YCbCr与RGB之间的相互转换和色度采样.
JFIF合规文件通常具有如下扩展名:.
jpg、.
jpeg、.
JPG、.
JPEG.
JPEG标准(JPEGISO/IEC10918-1ITU-T建议T.
81)没有定义要对源行图像使用的色彩空间,而JFIF标准则定义了两个可能的色彩空间:灰度(Y亮度)或彩色(YCbCr亮度和色度).
JFIF标准使用YCbCr颜色而不是原始的RGB色彩空间.
该色彩空间能够从给出像素颜色的2个色度分量Cb和Cr中分离出亮度分量(Y),即像素亮度(本质上是灰度信号).
RGB色彩空间与YCbCr之间相互转换的转换矩阵如下:图1.
YCbCr/RGB颜色转换已知人眼对亮度变化比对颜色变化更敏感,可使用YCbCr对两个独立的量化表进行定义,分别用于亮度和色度(Cb和Cr)分量,以便进一步量化色度(至少对于低频率).

不同色彩空间的硬件JPEG编解码器设置AN49968/34DocID030196Rev1[EnglishRev1]2.
1.
2YCbCr量化表图2和图3所示为JPEG标准提供的样本亮度和色度量化表.
按照标准中的描述,这些表在每个样本8位的亮度和色度图像上给出很好的结果(对于STM32F7/H7硬件JPEG编解码器).
该标准还对这些表格做了如下描述:如果将这些量化值除以2,得到的重构图像与源图像的差异通常难以辨别.
图2.
YCbCr亮度量化表图3.
YCbCr色度量化表请注意,这些表格采用Z形排序.
DocID030196Rev1[EnglishRev1]9/34AN4996不同色彩空间的硬件JPEG编解码器设置33图4和图5提供了Z形排序的顺序.
图4.
量化表的Z形排序顺序图5.
量化表的Z形扫描顺序不同色彩空间的硬件JPEG编解码器设置AN499610/34DocID030196Rev1[EnglishRev1]STM32CubeF7和STM32CubeH7使用这些默认表格,结合用户质量因子进行编码和解码.

进行编码时,STM32CubeF7/H7JPEGHAL驱动程序允许用户定义百分比质量因子(1%至100%).
然后,按如下方式使用质量因子对以上表格进行比例计算:–当质量处于50%至100%范围内时:scaling_factor=200-2x质量.
–当质量低于50%时:scaling_factor=5000/质量.
因此,当质量设置为100%时,比例因子变为0,然后所有表格条目均变为1(因为为零的条目被系统性地替换为1).
这使得量化损失最小化.
然后,在硬件JPEG编解码器中将量化表编程为专用存储表:QMEM0用于亮度(Y),QMEM1用于色度(Cb和Cr).
在解码时,STM32CubeF7/H7JPEGHAL驱动程序能够按如下方式检索质量.
对于量化表的每个值:–读取量化系数并计算该系数对比参考表中相应值的比例因子(百分比值).

比例=(100xquantization_coefficient)/reference_table_value).
–如果quantization_coefficient=1,则质量为100%.
–否则,如果比例低于100:质量=(200-比例)/2.
–否则,质量=5000/比例.
按照量化表每个系数(共64个系数)的计算质量平均值计算编码质量.
只使用亮度表计算平均质量.
硬件JPEG编解码器的QMEMx内存表用于存储/检索比例量化表(对比参考表).
按Z形顺序访问这些表格.
硬件JPEG编解码器提供RAM"QMEM"区,用于存储/检索最多4个量化表(分别对应于4个颜色分量).
QMEMRAM位于偏移地址0x0050至0x014C.
每个表的大小为64字节(即16个32位字).
图6.
硬件JPEGQMEMRAM对于YCbCr色彩空间,STM32CubeF7/H7JPEGHAL驱动程序默认只使用2个量化表:QMEM0:用于亮度(Y)分量.
64字节位于偏移地址0x0050.
QMEM1:用于色度(Cb和Cr)分量.
64字节位于偏移地址0x0090.
请注意,仅当硬件JPEG编解码器停止时,才能读/写QMEMRAM,即没有正在进行的编码/解码操作(JPEG_CONFR0寄存器的位0"START"设置为0).
DocID030196Rev1[EnglishRev1]11/34AN4996不同色彩空间的硬件JPEG编解码器设置33STM32CubeF7/H7JPEGHAL驱动程序默认对(Y)亮度分量使用图2所示表格,并对Cb和Cr色度分量使用图3所示表格.
JPEGHAL驱动程序还为用户按颜色分量定义量化表提供了可能性(本例中为3个量化表).
如需自定义量化表,用户必须提供3个量化表(每个分量一个量化表).
这些表格分别用于(使用质量因子进行比例计算后)硬件JPEG编解码器的QMEM0至QMEM3RAM表的编程(其中,QMEM2表位于偏移地址0x00D0).
HAL函数"HAL_JPEG_SetUserQuantTables"是用于自定义用户量化表的API.
2.
1.
3YCbCr色度下采样和最小编解码单元(MCU)结构在YCbCr色彩空间中,可以对色度分量进行下采样(信息减少)而不会显著降低视觉质量.

硬件JPEG编解码器允许用户使用JPEG_CONFR4至JPEG_CONFR7寄存器定义水平和垂直采样因子以及每个分量(最多4个分量)的8x8块数.
在文件头解析禁用的情况下进行编码或解码时,这些寄存器用于将每个分量的编码参数通知编解码器.
在文件头解析使能的情况下进行解码时,在JPEG文件头解析完成后由硬件编解码器自动填充这些寄存器,即JPEG_SR寄存器的位6(文件头解析完成标记)变为1.
硬件JPEG编解码器为使用JPEGCONFR4-7寄存器定义任何采样因子和每个分量的8x8块数提供了可能性,寄存器的描述如下.
JPEG编解码器配置寄存器4-7(JPEG_CONFR4-7)地址偏移:0x0010+0x4*i,其中"i"为图像分量0至3复位值:0x0000000031302928272625242322212019181716Res.
Res.
Res.
Res.
Res.
Res.
Res.
Res.
Res.
Res.
Res.
Res.
Res.
Res.
Res.
Res.
1514131211109876543210HSF[3:0]VSF[3:0]NB[3:0]QT[1:0]HAHDRWRWRWRWRWRW位31:16Reserved位15:12HSF[3:0]:水平采样因数(HorizontalSamplingFactor)分量i的水平采样因数.
位11:8VSF[3:0]:垂直采样因数(VerticalSamplingFactor)分量i的垂直采样因数.
位7:4NB[3:0]:块数属于MCU中特定颜色的数据单元数减去1.
位3:2QT[1:0]:量化表(QuantizationTable)选择用于分量i的量化表.
位1HA:霍夫曼AC选择用于编码AC系数的霍夫曼表.
位0HD:霍夫曼DC选择用于编码DC系数的霍夫曼表.
不同色彩空间的硬件JPEG编解码器设置AN499612/34DocID030196Rev1[EnglishRev1]STM32CubeF7/H7JPEGHAL驱动程序允许用户选择以下色度下采样比例之一:4:4:4无色度下采样,保留所有分量Y、Cb和Cr的完整信息.
4:2:2以相当于Y分量一半的比例对Cb和Cr进行水平采样(对于两个水平相邻像素,仅保留一个像素的色度信息).
4:2:0以相当于Y分量一半的比例对Cb和Cr进行水平和垂直采样(对于四个相邻像素,仅保留一个像素的色度信息).
图7.
色度下采样比例然后,将下采样YCbCr像素封装到名为MCU(最小编码单元)的8x8块中.
每个MCU包含:4:4:41个8x8Y块+1个8x8Cb块+1个8x8Cr块共192个字节.
4:2:22个8x8Y块+1个8x8Cb块+1个8x8Cr块共256个字节.
4:2:04个8x8Y块+1个8x8Cb块+1个8x8Cr块共384个字节.
DocID030196Rev1[EnglishRev1]13/34AN4996不同色彩空间的硬件JPEG编解码器设置33图8.
最小编码单元封装以下是YCbCr色彩空间中的JPEG编解码器寄存器设置,具体取决于色度采样.

2.
1.
4CONFR1寄存器设置位31:16YSIZE[15:0]:该字段代表编码/解码图像中的行数.
进行解码时,由硬件JPEG编解码器使用JPEG文件头自动填充该寄存器.
位8HDR:文件头处理:这是选填字段,仅用于解码.
用户可以将该位设置为零以禁用JPEG文件头处理.
这种情况下,必须由用户对其他配置寄存器和量化/霍夫曼表进行编程.
如果上一次解码时使能了文件头解析,则还可以通过硬件进行这些寄存器和表格的编程,前提是下一幅图像(将在文件头解析禁用时解码)具有相同的量化表和霍夫曼表以及相同的尺寸、色彩空间和色度下采样.
位7:6NS[1:0]:在文件头标记段中,该字段代表分量的数量减1.
因此,对于YCbCr色彩空间,将其设置为"2".
在使能了文件头解析的情况下进行解码时,该字段由硬件填充.
位5:4COLORSPACE[1:0]:该字段代表量化表的数量减1.
因此,对于YCbCr色彩空间,将其设置为1,因为YCbCr(一个用于Y亮度,一个用于Cb和Cr色度)需要两个量化表.
在使能了文件头解析的情况下进行解码时,该字段由硬件填充.

CrCbY8x8с不同色彩空间的硬件JPEG编解码器设置AN499614/34DocID030196Rev1[EnglishRev1]请注意,如果用户选择自定义量化表(为每个分量提供个性化表格),则将该字段设置为3–1=2.
位3DE:解码时设置为1,编码时设置为0.
该字段必须由用户设置,以便选择编码或解码.
位1:0NF[1:0]:该字段代表颜色分量的数量减1.
因此,对于YCbCr色彩空间,将其设置为2.
在使能了文件头解析的情况下进行解码时,该字段由硬件填充.
2.
1.
5CONFR2寄存器设置在CONFR2寄存器中,仅位25:0有用,即NMCU[25:0]字段.
在JPEG图像中,它代表MCU的数量减1.
在文件头解析禁用的情况下进行编码和解码时,对于YCbCr色彩空间,必须将该字段设置如下:NMCU=(hMCU*vMCU)-1其中:hMCU和vMCU分别是每个水平行和垂直列的MCU数.
4:4:4色度采样:hMCU=scaled_Image_width/8vMCU=scaled_Image_Height/8其中:scaled_Image_width代表舍入到8的下一个倍数的图像宽度,scaled_Image_Height代表舍入到8的下一个倍数的图像高度.
4:2:2采样:hMCU=scaled_Image_width/16vMCU=scaled_Image_Height/8其中:scaled_Image_width代表舍入到16的下一个倍数的图像宽度,scaled_Image_Height代表舍入到8的下一个倍数的图像高度.
4:2:0采样:hMCU=scaled_Image_width/16vMCU=scaled_Image_Height/16其中:scaled_Image_width代表舍入到16的下一个倍数的图像宽度,scaled_Image_Height代表舍入到16的下一个倍数的图像高度.
当在文件头解析使能的情况下进行解码时,由硬件填充该字段.
但是,它给出的是完整MCU的数量,即它不考虑行和列结尾处的不完整MCU.
必须使用以上公式获取MCU的准确数量.

DocID030196Rev1[EnglishRev1]15/34AN4996不同色彩空间的硬件JPEG编解码器设置332.
1.
6CONFR3寄存器设置在该寄存器中,仅位15:0有用,即XSIZE[15:0]字段.
它代表每行的像素数.
2.
1.
7CONFR4-7寄存器设置在YCbCr色彩空间中,使用了三个颜色分量:Y表示亮度,Cb表示蓝色色度,Cr表色红色色度.
因此,只使用CONFR4至CONFR6这三个寄存器.
CONFR4寄存器用于亮度(Y)分量.
CONFR5和CONFR6寄存器分别用于Cb和Cr色度分量.

在文件头解析禁用的情况下进行编码或解码时,这些寄存器的所有字段均由用户设置,而在文件头解析使能的情况下进行解码时,由硬件设置.
位15:12HSF[3:0]:该字段代表每个分量的水平采样因子.
它是8x8水平块的数量.
其设置如下:–对于CONFR5和CONFR6,HSF[3:0]字段总是设置为1,因为Cb和Cr分量总是细分为8x8块:每个MCU1个.
–如下所示,CONFR4HSF[3:0]字段的设置取决于色度采样:4:4:4:设置为1,因为每个MCU有1个8x8(Y)块.
4:2:2:设置为2,因为每个MCU有2个水平相邻的8x8(Y)块.
4:2:0:设置为2,因为本例中每个MCU有2个水平相邻的8x8(Y)块(和2个垂直相邻的块,因此VSF字段也设置为2).
位11:8VSF[3:0]:该字段代表每个分量的垂直采样因子.
它是8x8垂直块的数量.
其设置如下:–对于CONFR5和CONFR6,VSF[3:0]字段总是设置为1,因为Cb和Cr分量总是细分为8x8块:每个MCU1个.
–如下所示,CONFR4VSF[3:0]字段的设置取决于色度采样:4:4:4:设置为1,因为每个MCU有1个8x8(Y)块.
4:2:2:设置为1,因为本例中每个MCU只有1个垂直相邻的8x8(Y)块.
4:2:0:设置为2,因为每个MCU有4个8x8(Y)块(2个水平相邻和2个垂直相邻).
位7:4NB[3:0]:该字段代表每个分量的8x8块数量减1.
因此,在YCbCr色彩空间中,对于CONFR5和CONFR6寄存器,将其设置为1,因为Cb和Cr分量总是细分为8x8块:每个MCU1个.
–如下所示,CONFR4NB[3:0]字段的设置取决于色度采样:4:4:4:设置为0,因为每个MCU有1个8x8(Y)块.
4:2:2:设置为1,因为每个MCU有2个8x8(Y)块.
4:2:0:设置为3,因为每个MCU有4个8x8(Y)块.
不同色彩空间的硬件JPEG编解码器设置AN499616/34DocID030196Rev1[EnglishRev1]位3:2QT[1:0]:该字段代表与给定分量相关的量化表.
–对于CONFR4寄存器,将其设置为0,因为(Y)分量使用QMEM0.
对于CONFR5和CONFR6寄存器,将其设置为1,因为Cb和Cr分量使用相同的QMEM1表.

–请注意,如果用户选择自定义量化表(为每个分量提供一个表),则将CONFR6寄存器的QT[1:0]字段设置为"2",因此Cr分量使用QMEM2量化表.
位1HA[1]和位[2]HD[1]均设置为:–0(对于CONFR4寄存器),因为(Y)分量使用AC霍夫曼表0和DC霍夫曼表0.
–1(对于CONFR5和CONFR6寄存器),因为Cb和Cr分量均使用AC霍夫曼表1和DC霍夫曼表1.

2.
2灰度色彩空间灰度色彩空间只使用一个代表亮度(Y)的颜色分量.
因此,这种情况下色度下采样不适用,MCU总是包含一个8x8(Y)块.
2.
2.
1RGB至灰度的转换可使用以下公式实现从RGB色彩空间至灰度的转换:Y=0.
299xR+0.
587xG+0.
114xB请注意,该公式是图1中(Y)分量的子集.
2.
2.
2灰度量化表由于使用一个分量(即(Y)亮度)代表灰度色彩空间,因此只需要一个量化表.
图3所示表格的使用方式与质量因子和Z形扫描的相同.
然后,使用获得的比例量化表(根据质量因子)填充硬件JPEG编解码器QMEM0表.
以下是灰度色彩空间中的JPEG编解码器寄存器设置.
2.
2.
3CONFR1寄存器设置位7:6NS[1:0]:在JPEG文件头中,该字段代表用于扫描的分量数量减1.
因此,对于灰度色彩空间,将其设置为"0".
在使能了文件头解析的情况下进行解码时,该字段由硬件填充.
位5:4COLORSPACE[1:0]:该字段代表量化表的数量减1.
因此,对于灰度色彩空间,将其设置为"0"(需要1个量化表).
位1:0NF[1:0]:该字段代表颜色分量的数量减1.
因此,对于灰度色彩空间,将其设置为"0".
在使能了文件头解析的情况下进行解码时,该字段由硬件填充.
对于该寄存器的所有其他字段,YCbCr部分所述规则同样适用(YSIZE、HDR和DE字段).

DocID030196Rev1[EnglishRev1]17/34AN4996不同色彩空间的硬件JPEG编解码器设置332.
2.
4CONFR2寄存器设置由于在灰度色彩空间中MCU总是包含8x8(Y)块,因此将NMCU字段设置如下:NMCU=(hMCU*vMCU)-1其中:hMCU和vMCU分别是每个水平行和垂直列的MCU数.
hMCU=scaled_Image_width/8vMCU=scaled_Image_Height/8其中:scaled_Image_width代表舍入到8的下一个倍数的图像宽度,scaled_Image_Height代表舍入到8的下一个倍数的图像高度.
2.
2.
5CONFR3寄存器设置在该寄存器中,仅位15:0有用,即XSIZE[15:0]字段.
它代表每行的像素数.
2.
2.
6CONFR4-7寄存器设置在灰度色彩空间中,仅CONFR4寄存器有用,它代表唯一的(Y)分量的设置.
在灰度色彩空间中,该寄存器的设置与YCbCr4:4:4的情况类似.
即:–HSF[3:0]和VSF[3:0]:均设置为1.
–NB[3:0]:设置为0.
–QT[1:0]:设置为0.
–HA[1]和HD[1]均设置为0.
不同色彩空间的硬件JPEG编解码器设置AN499618/34DocID030196Rev1[EnglishRev1]2.
3CMYK色彩空间CMYK是用于打印应用的色彩空间.
通过3种颜色(青色、品红色和黄色)和一种定位套版色(即墨水量)表示CMYK图像.
因此,对于JPEG编码/解码,CMYK对应于4个颜色分量.

对于YCbCr,不需要进行分量下采样.
可对全部4个分量使用同一量化表.
对于JPEG编码/解码,CMYKMCU包含4个8x8块,顺序如下:一个8x8青色块、一个8x8品红色块、一个8x8黄色块和最后一个8x8定位套版色块.
因此,MCU的总大小为8x8x4=256字节.
2.
3.
1CMYK量化表可对全部4个分量使用同一量化表.
虽然如此,硬件JPEG编解码器为定义每个分量的单独表格提供了可能性.
STM32CubeF7/H7JPEGHAL驱动程序默认对所有CMYK分量使用图3所示表格.
JPEGHAL驱动程序还为用户按颜色分量定义量化表提供了可能性(本例中为4个量化表).
如需自定义量化表,用户必须提供4个量化表(每个分量一个量化表).
这些表格分别用于对(使用质量因子进行比例计算后)硬件JPEG编解码器的QMEM0至QMEM3RAM表进行编程(其中,QMEM2表位于偏移地址0x00D0,QMEM3表位于偏移地址0x0110).
HAL函数"HAL_JPEG_SetUserQuantTables"是用于自定义用户量化表的API.
质量因子和Z形扫描的方式同样适用.
然后,使用获得的比例量化表(根据质量因子)填充硬件JPEG编解码器QMEM0表(或QMEM0至QMEM3).
以下是CMYK色彩空间中的JPEG编解码器寄存器设置.
2.
3.
2CONFR1寄存器设置位7:6NS[1:0]:在JPEG文件头中,该字段代表用于扫描的分量数量减1.
因此,对于CMYK色彩空间,将其设置为"3".
在使能了文件头解析的情况下进行解码时,该字段由硬件填充.
位5:4COLORSPACE[1:0]:该字段代表量化表的数量减1.
因此,对于CMYK色彩空间,将其设置为默认值"0"(对全部4个分量使用1个量化表).
如果用户选择自定义量化表(为每个分量提供一个表格),则将该字段设置为3(使用4个量化表).
位1:0NF[1:0]:该字段代表颜色分量的数量减1.
对于CMYK色彩空间,将其设置为"3".
在使能了文件头解析的情况下进行解码时,该字段由硬件填充.
对于该寄存器的所有其他字段,YCbCr部分所述规则同样适用(YSIZE、HDR和DE字段).

DocID030196Rev1[EnglishRev1]19/34AN4996不同色彩空间的硬件JPEG编解码器设置332.
3.
3CONFR2寄存器设置在CMYK色彩空间中,NMCU字段设置如下:NMCU=(hMCU*vMCU)-1其中:hMCU和vMCU分别是每个水平行和垂直列的MCU数hMCU=scaled_Image_width/8vMCU=scaled_Image_Height/8其中:scaled_Image_width代表舍入到8的下一个倍数的图像宽度,scaled_Image_Height代表舍入到8的下一个倍数的图像高度.
2.
3.
4CONFR3寄存器设置在该寄存器中,仅位15:0有用,即XSIZE[15:0]字段.
它代表每行的像素数.
2.
3.
5CONFR4-7寄存器设置在CMYK色彩空间中,使用了4个颜色分量.
因此,设置寄存器CONFR4至CONFR7(每个分量一个寄存器).
在文件头解析禁用的情况下进行编码或解码时,这些寄存器的所有字段均由用户设置.
而在文件头解析使能的情况下进行解码时,则由硬件设置.
每个CMYKMCU包含4个8x8块:每个分量1个块:–HSF[3:0]和VSF[3:0]:均设置为1(在CMYK中).
–NB[3:0]:设置为0.
QT[1:0]字段默认设置为0,因此全部4个分量均使用同一量化QMEM0表.
当用户选择每个分量一个表时,分别为寄存器CONFR4至CONFR7将该字段设置为0、1、2和3.
(因此,每个分量将分别使用QMEM0至QMEM3量化表).
HA[1]和HD[1]均设置为0:所有分量均使用相同霍夫曼AC和DC表.
JPEG解码AN499620/34DocID030196Rev1[EnglishRev1]3JPEG解码硬件JPEG编解码器能够按照JPEG标准(ISO/IEC10918-1)中的规定对JPEG压缩图像进行解码.
它可以解析JPEG文件头并更新编解码器寄存器(CONFR1至CONFR7寄存器)、量化表(QMEM)和霍夫曼表.
图9.
JPEG解码流进行解码时,在MCU块中组织JPEG编解码器输出数据.
MCU包含(图像的)许多8x8块,具体取决于色彩空间和色度采样,详情见前文.
然后,应用必须重新组织这些块,移除色度采样并将颜色转换为RGB,以便显示解码图像.

简而言之,必须按以下方式组织MCU:表2.
JPEGMCU组织色彩空间色度采样MCU组织MCU大小(以字节计)YCbCr4:4:4一个Y8x8块+一个Cb8x8块+一个Cr8x8块1924:2:2两个Y8x8块+一个Cb8x8块+一个Cr8x8块2564:2:0四个Y8x8块+一个Cb8x8块+一个Cr8x8块384灰度N.
A一个Y8x8块64CMYKN.
A一个青色8x8块+一个品红色8x8块+一个黄色8x8块+一个8x8定位套版色块256DocID030196Rev1[EnglishRev1]21/34AN4996JPEG解码33应用可以等待硬件JPEG编解码器结束解码操作并输出所有MCU,然后将这些块转换为RGB像素.
或者,它可以在某些MCU可用后开始MCU至RGB的转换.

在STM32CubeF7/H7中,JPEGHAL驱动程序能够从硬件JPEG编解码器按块(具有用户指定大小)获取输出数据.
当应用需要在输出MCU可用后立即转换MCU时,以及应用必须处理不同色彩空间和色度采样时,建议将输出块大小设置为768字节的倍数.
通过从JPEG编解码器输出按块(包含768字节的倍数)获取数据,可使块中包含完整MCU:根据色彩空间和色度采样,768字节相当于:YCbCr4:4:44个MCUYCbCr4:2:2MCUYCbCr4:2:02个MCU灰度12个MCUCMYK:3个MCU请注意,硬件JPEG编解码器总是输出完整的MCU.
如果原始图像宽度和/或高度不是8或16的倍数(取决于色彩空间和色度采样),则行和/或列末尾的MCU将以空数据结尾(通常为之前像素数据的重复).
在将输出MCU转换为RGB像素时,必须删除这些额外数据.

3.
1MCU重排序和转换3.
1.
1在STM32H7x3系列器件上Chrom-ArtAccelerator外设也称为DMA2D,在STM32H7x3系列器件上实现,提供能够将YCbCrMCU(作为硬件JPEG编解码器的输出)转换为RGB像素并重排序的新特性,全部进行色度上采样.
DMA2D支持的色度采样因子为:4:4:4、4:2:2和4:2:0.
DMA2D能够处理最多2个图层,即前景和背景.
只有在STM32H7x3系列器件上,前景图层才能将YCbCrMCU块转换为RGB像素.
为了配置将YCbCrMCU转换为RGB像素的DMA2D,需要以下寄存器设置:FGPFCCR寄存器:位19:18CSS[1:0]:色度下采样选择–00:4:4:4(无色度下采样)–01:4:2:2–10:4:2:0位3:0CM[3:0]:输入颜色模式选择1011:YCbCrJPEG解码AN499622/34DocID030196Rev1[EnglishRev1]FGOR寄存器:该寄存器用于选择DMA2D前景输入行偏移地址.
必须按如下方式编程:色度采样4:4:4–如果图像宽度为8个像素的倍数,将FGOR设置为0–否则,FGOR=scaled_Image_width-Image_widthscaled_Image_width是舍入到8的下一个倍数的图像宽度(以像素计).
色度采样4:2:2或4:2:0–如果图像宽度为16个像素的倍数,将FGOR设置为0否则,FGOR=scaled_Image_width-Image_widthscaled_Image_width是舍入到16的下一个倍数的图像宽度(以像素计).
当图像尺寸不是8或16的倍数时,FGOR寄存器的设置能够删除覆盖行末尾区域的MCU中的额外数据.
为了进行像素格式转换,通常必须完成其他DMA2D寄存器配置.
必须通过软件处理其他颜色空间(灰度和CMYK).
下一段描述如何使用STM32CubeF7/H7中提供的JPEG实用工具来执行MCU至RGB的转换.
它适用于STM32F76/77xxx器件(所有色彩空间)和STM32H7x3系列器件(灰度和CMYK).
STM32CubeH7中提供的多个JPEG解码示例显示了如何使用硬件JPEG编解码外设:–使用硬件JPEG编解码外设解码和显示JPEG压缩文件.
Chrom-ArtAccelerator(DMA2D)用于YCbCr至RGB的转换.
–解码并显示MJPEG视频文件:使用硬件JPEG编解码外设和用于YCbCr至RGB转换的Chrom-ArtAccelerator(DMA2D).
表3汇总了STM32CubeH7固件包中提供的JPEG解码示例:表3.
STM32CubeH7固件包中JPEG解码示例的列表示例说明JPEG_DecodingFromFLASH_DMA为了解码并显示保存在内部闪存中的JPEG压缩图像,可使用硬件JPEG解码器(DMA模式)和用于YCbCr至RGB转换的DMA2D.
JPEG_DecodingUsingFs_DMA为了解码并显示保存在SD卡中的JPEG压缩图像,可使用硬件JPEG解码器(DMA模式)和用于YCbCr至RGB转换的DMA2D.
JPEG_DecodingUsingFs_Interrupt为了解码并显示保存在SD卡中的JPEG压缩图像,可使用硬件JPEG解码器(中断模式)和用于YCbCr至RGB转换的DMA2D.
JPEG_DecodingUsingFs_Polling为了解码并显示保存在SD卡中的JPEG压缩图像,可使用硬件JPEG解码器(轮询模式)和用于YCbCr至RGB转换的DMA2D.
JPEG_MJPEG_VideoDecoding为了解码并显示保存在SD卡中的MJPEG视频文件,可使用硬件JPEG解码器.
使用DMA2D执行YCbCr至RGB的转换.
JPEG_MJPEG_VideoDecodingFromQSPI为了解码并显示保存在外部Quad-SPI闪存中的MJPEG视频文件,可使用硬件JPEG解码器.
使用DMA2D执行YCbCr至RGB的转换.
DocID030196Rev1[EnglishRev1]23/34AN4996JPEG解码333.
1.
2在STM32F76/77xxx器件上使用专用软件层将MCU块转换为可在显示器上显示的RGB像素.
MCU至RGB像素的转换包括色度上采样和YCbCr至RGB的颜色转换.
该软件层可在STM32CubeF7/H7中的\Utilities\JPEG目录下找到.
STM32CubeF7中提供的多个JPEG解码示例显示了如何使用硬件JPEG外设:–使用硬件JPEG编解码外设解码和显示JPEG压缩文件.
通过JPEG实用工具软件执行YCbCr块至RGB像素的转换.
–解码和显示MJPEG视频文件:使用JPEG解码器外设.
通过JPEG实用工具软件执行YCbCr块至RGB像素的转换.
表4汇总了STM32CubeF7固件包中提供的JPEG解码示例:表4.
STM32CubeF7固件包中JPEG解码示例的列表示例说明JPEG_DecodingFromFLASH_DMA为了解码并显示保存在内部闪存中的JPEG压缩图像,可使用硬件JPEG解码器(DMA模式)和用于YCbCr至RGB转换的JPEG实用工具软件JPEG_DecodingUsingFs_DMA为了解码并显示保存在SD卡中的JPEG压缩图像,可使用硬件JPEG解码器(DMA模式)和用于YCbCr至RGB转换的JPEG实用工具软件.
JPEG_DecodingUsingFs_Interrupt为了解码并显示保存在SD卡中的JPEG压缩图像,可使用硬件JPEG解码器(中断模式)和用于YCbCr至RGB转换的JPEG实用工具软件.
JPEG_DecodingUsingFs_Polling为了解码并显示保存在SD卡中的JPEG压缩图像,可使用硬件JPEG解码器(轮询模式)和用于YCbCr至RGB转换的JPEG实用工具软件.
JPEG_MJPEG_VideoDecoding为了解码并显示保存在SD卡中的MJPEG视频文件,可使用硬件JPEG解码器.
通过JPEG实用工具软件执行YCbCr至RGB的转换.
JPEG解码AN499624/34DocID030196Rev1[EnglishRev1]使用该实用工具解码需要执行下述步骤.
复制用户应用文件夹中的jpeg_utils_conf_template.
h文件并进行如下修改:–将其重命名为"jpeg_utils_conf.
h".
–取消注释include行(#include"stm32fXxx_hal.
h"和#include"stm32fXxx_hal_jpeg.
h)并分别修改为(#include"stm32f7xx_hal.
h"和#include"stm32f7xx_hal_jpeg.
h).
–使用#defineJPEG_RGB_FORMAT选择输出RGB格式ARGB8888、RGB888或RBG565.
–或者,可使用#defineJPEG_SWAP_RB选择红蓝调换(设置为1以调换像素的红蓝顺序)在应用中调用函数JPEG_InitColorTables,以便初始化红色、绿色和蓝色查找表.
该函数能够初始化4个查找表(CR_RED_LUT、CB_BLUE_LUT、CR_GREEN_LUT和CB_GREEN_LUT),用于避免YCbCr至RGB颜色转换过程中的乘法和浮点计算(按照图1所示公式).
应用中只能执行一次该步骤,即使必须执行多次YCbCr至RGB的转换和/或必须转换多幅JPEG图像.
下一步是按照色彩空间和色度采样,通过调用函数JPEG_GetDecodeColorConvertFunc选择YCbCr转换函数.
该函数还根据图像设置(尺寸、色彩空间和色度采样)对必要的内部变量进行初始化.
该函数的参数如下:–JPEG_ConfTypeDef*pJpegInfo:指向包含JPEG图像信息(色彩空间、色度下采样、图像高度和宽度)的JPEG_ConfTypeDef结构的指针.
在通过硬件JPEG编解码器完成JPEG文件头解析后,可在HAL驱动程序回调函数HAL_JPEG_InfoReadyCallbackHAL_JPEG_InfoReadyCallback下找到这些信息.
还可以使用函数HAL_JPEG_GetInfo检索这些信息(在文件头解析后或在JPEG解码操作结束时).
–JPEG_YCbCrToRGB_Convert_Function*pFunction:该参数返回指向函数的指针,该函数用于将JPEG编解码器输出MCU转换为目标图像帧缓冲区中的RGB像素.

–uint32_t*ImageNbMCUs:该参数用于根据图像尺寸、色彩空间和色度采样向用户返回MCU总数.
然后,可以调用转换函数将YCbCrMCU转换为目标RGB帧缓冲区中的RGB像素.
转换函数的参数如下:–uint8_t*pInBuffer:包含许多完整MCU的缓冲区(硬件JPEG编解码器的输出)–uint8_t*pOutBuffer:保存RGB图像的RGB目标缓冲区.
–uint32_tBlockIndex:当前输入缓冲区(pInBuffer)中第一个MCU相对于MCU总数的索引.
–uint32_tDataCount:输入缓冲区(pInBuffer)大小,以字节为单位.
DocID030196Rev1[EnglishRev1]25/34AN4996JPEG解码33–uint32_t*ConvertedDataCount:留作将来使用(用于返回从输入缓冲区转换的字节数).
如果按块转换(不是一次性),转换函数将返回从输入缓冲区转换到输出RGB缓冲区的MCU数量,用于下一次调用该函数时的参数BlockIndex.
表5提供了每个色彩空间的转换函数作为参考.
在"jpeg_utils.
c"源文件中,这些函数以静态实现.
应用无需直接调用这些函数,但需要调用"JPEG_GetDecodeColorConvertFunc()",以便检索对应于给定图像色彩空间和色度采样的函数指针.
MCU块至RGB的转换函数作用于整个MCU并假设图像宽度和高度为8或16的倍数(取决于色彩空间和色度采样).
与此同时,硬件JPEG编解码器总是输出完整MCU,并在转换为RGB像素时使图像尺寸(高度和宽度)为8或16的倍数.
在解码尺寸(宽度和高度)不是8或16的倍数的图像时,为了使用JPEG实用工具层,可使用以下技巧:在调用"JPEG_GetDecodeColorConvertFunc()"之前,根据色彩空间和色度采样,按照如下方式更新结构pJpegInfo的ImageWidth和ImageHeight:–YCbCr4:4:4,CMYK的灰度:将ImageWidth和ImageHeight均舍入到8的下一个倍数.
–YCbCr4:2:2:将ImageWidth舍入到16的下一个倍数,并将ImageHeight舍入到8的下一个倍数.
–YCbCr4:2:0,CMYK的灰度:将ImageWidth和ImageHeight均舍入到16的下一个倍数.
先进行MCU转换.
如上文所述,输出RGB图像的高度和宽度将扩展到8或16的下一个倍数.

表5.
MCU至RGB内部转换函数列表色彩空间色度采样MCU至RGB的转换函数YCbCr4:4:4JPEG_MCU_YCbCr444_ARGB_ConvertBlocks()4:2:2JPEG_MCU_YCbCr422_ARGB_ConvertBlocks()4:2:0JPEG_MCU_YCbCr420_ARGB_ConvertBlocks()灰度N.
AJPEG_MCU_Gray_ARGB_ConvertBlocks()CMYKN.
AJPEG_MCU_YCCK_ARGB_ConvertBlocks()JPEG解码AN499626/34DocID030196Rev1[EnglishRev1]使用DMA2D将获得的图像修剪为原始尺寸:按照STM32H743xx转换实例进行DMA2D输入行偏移地址(FGOR寄存器)编程.
即:FGOR寄存器:用于选择DMA2D前景输入行偏移地址.
必须按如下方式编程:–YCbCr4:4:4,CMYK的灰度:-FGOR=scaled_Image_width-Image_widthscaled_Image_width是舍入到8的下一个倍数的图像宽度(以像素计).
–色度采样4:2:2或4:2:0:-FGOR=scaled_Image_width-Image_widthscaled_Image_width是舍入到16的下一个倍数的图像宽度(以像素计).
DMA2DFGOR寄存器的设置能够删除由尺寸(高度和宽度)舍入产生的额外像素.
可将DMA2D配置为存储器至存储器或像素的格式转换(以便更改输出图像颜色格式).

3.
2JPEG解码性能下表提供了产品的解码性能:STM32H7x3系列:使用硬件JPEG外设和用于YCbCr至RGB转换的DMA2D.
STM32F76/77xxx:使用硬件JPEG外设和用于YCbCr至RGB转换的软件实用工具.
请注意,这些性能测量值通过位于外部SDRAM上的JPEG缓冲区(RGB和YCbCr)给出.

表6.
STM32H7x3JPEG解码性能产品图像分辨率解码(ms)硬件解码DMA2DYCbCr至RGB的转换总时间STM32H743IVGA:640x4804610(100fps)QVGA:320x24011.
52.
5(400fps)表7.
STM32F76/77xxxJPEG解码性能产品图像分辨率解码(ms)硬件解码软件YCbCr至RGB的转换总时间STM32F769IVGA:640x48042226(38fps)QVGA:320x240156(166fps)DocID030196Rev1[EnglishRev1]27/34AN4996JPEG解码33以上测量在表8中给出的条件下执行.
表8.
JPEG解码性能测量条件产品STM32F76/77xxxSTM32H7x3板STM32F769I_EVALrev.
BSTM32H743I_EVALrev.
BCPU频率200MHz400MHz硬件JPEG编解码器频率200MHz200MHzIDE/编译器面向Arm(7.
80版本)的IAR嵌入式workbench面向Arm(7.
80版本)的IAR嵌入式workbench编译器优化高速高速SDRAM外部存储器参考:IS42S32800G-6BLI时钟频率:100MHz存取:ROW存取(非文件系统存取)参考:IS42S32800G-6BLI时钟频率:200MHz存取:ROW存取(非文件系统存取)JPEG图像分辨率:640x480颜色格式:YCbCr色度采样:4:2:0分辨率:640x480颜色格式:YCbCr色度采样:4:2:0JPEG编码AN499628/34DocID030196Rev1[EnglishRev1]4JPEG编码硬件JPEG编解码器能够将图像压缩成符合JPEG文件交换格式(JFIF)的JPEG文件,包含必要的文件头和片段.
图10.
JPEG编码流STM32CubeF7/H7中的JPEGHAL驱动程序提供必要的函数用于执行编码操作,包括使用默认的霍夫曼表初始化编解码器.
在编码模式下,预期根据表2中描述的色彩空间和色度采样在MCU块中组织JPEG编解码器输入数据.
应用必须重新组织并将输入RGB像素转换为MCU块.
对于YCbCr色彩空间,还必须进行色度下采样.
硬件JPEG编解码器需要完整的MCU.
如果RGB图像尺寸(高度和宽度)不是8或16的倍数,则必须在行和列的末尾添加额外像素,以便生成由8x8块组成的完整MCU.
然而,在硬件JPEG编解码器寄存器CONFR1和CONFR3中,必须设置原始图像尺寸(在YSIZE和XSIZE字段中).
随STM32CubeF7/H7提供的软件实用工具可用于执行从输入RGB像素至MCU块的必要转换,MCU块可馈给硬件JPEG编解码器.
STM32CubeF7/H7提供的示例显示了如何将RGB图像编码为JPEG压缩文件(使用该软件实用工具进行MCU生成).
示例位于以下目录下:–STM32CubeF7:\Firmware\Projects\STM32F769I_EVAL\Examples\JPEG–STM32CubeH7:\Firmware\Projects\STM32H743I_EVAL\Examples\JPEG表9汇总了可用的编码示例:DocID030196Rev1[EnglishRev1]29/34AN4996JPEG编码33使用JPEG实用工具编码需要执行下述步骤.
复制用户应用文件夹中的jpeg_utils_conf_template.
h文件并进行如下修改:–将其重命名为"jpeg_utils_conf.
h".
–取消注释include行:#include"stm32fXxx_hal.
h"和#include"stm32fXxx_hal_jpeg.
h并分别修改为:-使用STM32CubeF7:#include"stm32f7xx_hal.
h"和#include"stm32f7xx_hal_jpeg.
h.
-使用STM32CubeH7:#include"stm32h7xx_hal.
h"和#include"stm32h7xx_hal_jpeg.
h.
–使用#defineJPEG_RGB_FORMAT选择输出RGB格式ARGB8888、RGB888或RBG565.
–或者,可使用#defineJPEG_SWAP_RB选择红蓝调换(设置为1以调换像素的红蓝顺序)在用户应用中调用函数JPEG_InitColorTables,以便初始化红色、绿色和蓝色查找表.

该函数能够初始化不同的查找表,用于避免颜色转换过程中的乘法和浮点计算(按照图1所示公式).
应用中只能执行一次该步骤,即使必须编码多幅图像.
下一步是按照色彩空间和色度采样选择RGB至YCbCr的转换函数.
这通过调用函数JPEG_GetEncodeColorConvertFunc来完成.
该函数还根据图像设置(尺寸、色彩空间和色度采样)对RGB至YCbCrMCU转换的必要内部变量进行初始化.
该函数的参数如下:–JPEG_ConfTypeDef*pJpegInfo:指向包含图像信息(色彩空间、色度下采样、图像高度和宽度)的JPEG_ConfTypeDef结构的指针.
用户必须填充这些信息用于编码.
–PEG_RGBToYCbCr_Convert_Function*pFunction:该参数返回指向函数的指针,该函数用于将RGB像素转换为MCU.
–uint32_t*ImageNbMCUs:该参数用于根据图像尺寸、色彩空间和色度采样向用户返回MCU总数.
表9.
STM32CubeF7/H7固件包中JPEG编码示例的列表示例说明JPEG_EncodingFromFLASH_DMA为了对保存在内部闪存中的RGB图像进行编码,使用硬件JPEG编解码器(DMA模式)并将得到的JPEG压缩文件保存到SD卡中.
通过JPEG实用工具软件执行RGB至YCbCr的转换(必须在编码之前).
JPEG_EncodingUsingFs_DMA为了对保存在SD中的bmp图像进行编码,使用硬件JPEG编解码器(DMA模式)并将得到的JPEG压缩文件保存到SD卡中.

通过JPEG实用工具软件执行RGB至YCbCr的转换(必须在编码之前).
JPEG编码AN499630/34DocID030196Rev1[EnglishRev1]然后,可以调用转换函数将输入图像RGB像素转换为YCbCrMCU.
转换函数的参数如下:–uint8_t*pInBuffer:包含要转换为MCU的RGB像素的缓冲区.
由于MCU对应于原始图像的8x8块,因此输入缓冲区必须对应于:-输入RGB图像的8的倍数行(对于YCBCR4:4:4、YCbCr4:2:2、灰度或CMYK).
-输入RGB图像的16的倍数行(对于YCbCr4:2:0).
–uint8_t*pOutBuffer:MCU目标缓冲区.
然后,使用该缓冲区馈给硬件JPEG编解码器.
–uint32_tBlockIndex:当前输入缓冲区(pInBuffer)中第一个MCU相对于MCU总数的索引.
–uint32_tDataCount:输入缓冲区(pInBuffer)大小,以字节为单位.
–uint32_t*ConvertedDataCount:返回从输入缓冲区转换的字节数.
如果按块转换(不是一次性),转换函数将返回从输入缓冲区转换到输出MCU缓冲区的MCU数量,用于下一次调用该函数时的参数BlockIndex.
表10提供了每个色彩空间的转换函数作为参考.
在"jpeg_utils.
c"源文件中,这些函数以静态实现.
应用无需直接调用这些函数,但需要调用"JPEG_GetEncodeColorConvertFunc()",以便检索对应于给定图像色彩空间和色度采样的函数指针.
在使用3种可用模式中的一种开始编码操作之前,必须调用HAL驱动程序函数"HAL_JPEG_ConfigEncoding",以便使用要编码的图像的参数填充硬件JPEG编解码器寄存器:轮询模式:使用HAL驱动程序函数HAL_JPEG_Encode中断模式:使用HAL驱动程序函数HAL_JPEG_Encode_ITDMA模式:使用HAL驱动程序函数HAL_JPEG_Encode_DMA然后,必须将使用转换实用工具函数检索到的MCU用作以上HAL转换函数的输入.

表10.
RGB至MCU内部转换函数列表色彩空间色度采样RGB至MCU转换函数YCbCr4:4:4JPEG_ARGB_MCU_YCbCr444_ConvertBlocks()4:2:2JPEG_ARGB_MCU_YCbCr422_ConvertBlocks()4:2:0JPEG_ARGB_MCU_YCbCr420_ConvertBlocks()灰度N.
AJPEG_ARGB_MCU_Gray_ConvertBlocks()CMYKN.
AJPEG_ARGB_MCU_YCCK_ConvertBlocks()DocID030196Rev1[EnglishRev1]31/34AN4996JPEG编码334.
1JPEG编码性能下面的表格提供了STM32H7x3系列和STM32F76/F77xxx的编码性能:使用硬件JPEG外设和用于RGB至YCbCr转换的软件实用工具.
请注意,这些性能测量值通过位于外部SDRAM上的JPEG缓冲区(RGB和YCbCr)给出.

以上测量在表13中给出的条件下执行.
表11.
STM32H7x3JPEG编码性能产品图像分辨率编码(ms)软件RGB到YCbCr的转换硬件编码总时间STM32H743IVGA:640x48058462(16fps)QVGA:320x24014115(66fps)表12.
STM32F76/77xxxJPEG编码性能产品图像分辨率编码(ms)软件RGB到YCbCr的转换硬件编码总时间STM32F769IVGA:640x4801034107(9fps)QVGA:320x24027128(35fps)表13.
JPEG编码性能测量条件产品STM32F76/77xxxSTM32H7x3板STM32F769I_EVALrev.
BSTM32H743I_EVALrev.
BCPU频率200MHz400MHz硬件JPEG编解码器频率200MHz200MHzIDE/编译器面向Arm(7.
80版本)的IAR嵌入式workbench面向Arm(7.
80版本)的IAR嵌入式workbench编译器优化高速高速SDRAM外部存储器参考:IS42S32800G-6BLI时钟频率:100MHz存取:ROW存取(非文件系统存取)参考:IS42S32800G-6BLI时钟频率:200MHz存取:ROW存取(非文件系统存取)JPEG图像分辨率:640x480颜色格式:YCbCr色度采样:4:2:0分辨率:640x480颜色格式:YCbCr色度采样:4:2:0结论AN499632/34DocID030196Rev1[EnglishRev1]5结论STM32F7/H7硬件JPEG编解码外设为JPEG编码/解码操作提供硬件加速,从而显著提高性能.
相比于使用软件进行JPEG编码/解码(libjpeg示例),它还能减少基于JPEG的应用的固件内存占用量(RAM和ROM).
硬件JPEG编解码器符合JPEG标准(JPEGISO/IEC10918-1ITU-T建议T.
81).
随STM32CubeF7/H7固件包提供软件处理,用于处理YCbCrMCU块与RGB像素之间的相互转换,以便符合JPEG文件交换格式(JFIF).
使用STM32H7x3系列器件,当在YCbCr色彩空间中解码图像时,可使用DMA2D外设为MCU至RGB的转换加速.

热网互联33元/月,香港/日本/洛杉矶/韩国CN2高速线路云主机

热网互联怎么样?热网互联(hotiis)是随客云计算(Suike.Cloud)成立于2009年,增值电信业务经营许可证:B1-20203716)旗下平台。热网互联云主机是CN2高速回国线路,香港/日本/洛杉矶/韩国CN2高速线路云主机,最低33元/月;热网互联国内BGP高防服务器,香港服务器,日本服务器全线活动中,大量七五折来袭!点击进入:热网互联官方网站地址热网互联香港/日本/洛杉矶/韩国cn2...

搬瓦工VPS:高端线路,助力企业运营,10Gbps美国 cn2 gia,1Gbps香港cn2 gia,10Gbps日本软银

搬瓦工vps(bandwagonhost)现在面向中国大陆有3条顶级线路:美国 cn2 gia,香港 cn2 gia,日本软银(softbank)。详细带宽是:美国cn2 gia、日本软银,都是2.5Gbps~10Gbps带宽,香港 cn2 gia为1Gbps带宽,搬瓦工是目前为止,全球所有提供这三种带宽的VPS(云服务器)商家里面带宽最大的,成本最高的,没有第二家了! 官方网站:https...

可抵御99%的攻击中国单域版cdn:9元/月7T防御 cloudsecre

官方网站:点击访问CDN客服QQ:123008公司名:贵州青辞赋文化传媒有限公司域名和IP被墙封了怎么办?用cloudsecre.com网站被攻击了怎么办?用cloudsecre.com问:黑客为什么要找网站来攻击?答:黑客需要找肉鸡。问:什么是肉鸡?答:被控的服务器和电脑主机就是肉鸡。问:肉鸡有什么作用?答:肉鸡的作用非常多,可以用来干违法的事情,通常的行为有:VPN拨号,流量P2P,攻击傀儡,...

解压程序为你推荐
免费翻译网推荐一个英文在线翻译不错的网站吧~iphone360手机卫士iphone怎么安装360安全卫士?易pc华硕易PC怎么样?性价比到底怎么样?站长故事爱迪生发明东西的故事中小企业信息化中小企业信息化途径有哪些如何建立一个网站要建立一个网站怎么弄啊?xp系统停止服务xp系统停止服务怎么办?创维云电视功能什么是创维云电视啊?创维云电视是什么意思?免费qq空间装扮有办法免费装扮QQ空间吗??ejb开发什么是EJB?它是干什么的?和JAVA,JSP有关系吗?他们各有什么特点和用途?
中文域名注册查询 香港虚拟主机 网易域名邮箱 购买域名和空间 瓦工 la域名 美国php主机 xfce bgp双线 adroit qq对话框 稳定免费空间 cdn加速是什么 免费phpmysql空间 web服务器安全 路由跟踪 贵阳电信测速 中国域名 免费网络 wordpress中文主题 更多