HPMicro JPEG使用注意事项
采样格式相关
对于HPMicro的jpeg硬件解码,目前支持主流的JPEG格式,包括内部采样格式:
- YUV444(Hy=1,Vy=1,Hc=1,Vc=1)
- YUV422H(Hy=2,Vy=1,Hc=1,Vc=1)
- YUV422V(Hy=1,Vy=2,Hc=1,Vc=1)
- YUV420(Hy=2,Vy=2,Hc=1,Vc=1)
- Y400(Hy=2,Vy=2,Hc=0,Vc=0)
通过FFMPEG无法精确的生成常见的采样格式
ffmpeg常见的jpeg采样格式包括yuvj444p,yuvj422p和yuvj420p,但是只有yuvj420p会生成常见的jpeg采样格式。
- FFMPEG生成的YUV420
Number of Img components = 3
Component[1]: ID=0x01, Samp Fac=0x22 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Lum: Y)
Component[2]: ID=0x02, Samp Fac=0x11 (Subsamp 2 x 2), Quant Tbl Sel=0x00 (Chrom: Cb)
Component[3]: ID=0x03, Samp Fac=0x11 (Subsamp 2 x 2), Quant Tbl Sel=0x00 (Chrom: Cr)
YUV420(Hy=2,Vy=2,Hc=1,Vc=1)
也就是比较常见的2211,这是HPMicro可以兼容的格式
- FFMPEG生成的YUV422
Number of Img components = 3
Component[1]: ID=0x01, Samp Fac=0x22 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Lum: Y)
Component[2]: ID=0x02, Samp Fac=0x12 (Subsamp 2 x 1), Quant Tbl Sel=0x00 (Chrom: Cb)
Component[3]: ID=0x03, Samp Fac=0x12 (Subsamp 2 x 1), Quant Tbl Sel=0x00 (Chrom: Cr)
HPMicro: YUV422V(Hy=1,Vy=2,Hc=1,Vc=1) 这是较常见的
FFMPEG: YUVJ422P(Hy=2,Vy=2,Hc=1,Vc=2) 这是不常见的
虽然采样都是UV垂直采样是Y的1/2,UV水平采样和Y相同,但是生成的MCU大小是不一样的
- FFMPEG生成的YUV444
Number of Img components = 3
Component[1]: ID=0x01, Samp Fac=0x12 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Lum: Y)
Component[2]: ID=0x02, Samp Fac=0x12 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Chrom: Cb)
Component[3]: ID=0x03, Samp Fac=0x12 (Subsamp 1 x 1), Quant Tbl Sel=0x00 (Chrom: Cr)
HPMicro: YUV444(Hy=1,Vy=1,Hc=1,Vc=1) 这是较常见的
FFMPEG: YUVJ444P(Hy=1,Vy=2,Hc=1,Vc=2) 这是不常见的
同样,虽然采样都是UV垂直采样和Y相同,UV水平采样和Y相同,但是生成的MCU大小是不一样的
生成兼容性比较好的JPEG
FFMPEG的MJPEG编码器没有精确控制采样因子的选项,生成的JPEG也就无法控制一些详细JPEG参数,包括采样因子和RESTART等常见参数。
但是FFMPEG虽然不能精确的控制JPEG参数,但是优点是支持的格式多,处理图像更方便。
cjpeg是libjpeg-turbo中的一个工具,可以精确的控制JPEG文件的内部参数,比如编码质量,RESTART参数等,但是对数据图像有要求,只能从BMP或者PPM等简单的图像转换成JPEG。所以让生成的JPEG可以被HPMicro确切的支持,可以采用ffmpeg+cjpeg的方式生成jpeg.
- ffmpeg负责从任意图像或者视频生成BMP格式的图片,这个过程是无损的。
- cjpeg负责从BMP格式的图片生成HPMicro百分百兼容的JPEG
实例
功能:从output.rgb原始数据流生成output_yuv444.jpg
- 转换为BMP
ffmpeg.exe -f rawvideo -pixel_format rgb24 -video_size 384x45 -i output.rgb -c:v bmp -pix_fmt bgr24 -y output_bgr24.bmp
- 转换为JPEG
cjpeg.exe -quality 100 -sample 1x1,1x1,1x1 -baseline -restart 0 -outfile output_yuv444.jpg output_bgr24.bmp
生成的output_yuv444.jpg压缩质量是100,采样格式是YUV444(Hy=1,Vy=1,Hc=1,Vc=1)。cjpeg可以精确的控制采样格式和压缩质量,所以也可以生成其他HPMicro兼容的jpeg
cjpeg
cjpeg可以去https://github.com/libjpeg-turbo/libjpeg-turbo/releases
下载,我测试是libjpeg-turbo-3.1.2-vc-x64.exe工具。
libjpeg-turbo-3.1.2-vc-x64.exe安装后,cjpeg会出现在C:\libjpeg-turbo64\bin
这里面,也有其他工具,可以把libjpeg-turbo64\bin
拷贝到其他目录,类似ffmpeg
RESTART MARK
JPEG 格式中的 RESTART MARKER(重启标记)是一种用于增强压缩数据流鲁棒性和支持并行处理的机制。下面我将为你详细解释它的工作原理和作用。
重启标记是什么
重启标记(Restart Markers)在 JPEG 文件中是一组特殊的标记符,具体包括 RST0 到 RST7(对应的十六进制码为 0xFFD0到 0xFFD7),共 8 个,按顺序循环使用。它们被周期性地插入到熵编码数据段(Entropy-coded data segment)中。插入的周期由 DRI(Define Restart Interval)标记来定义,该标记指定了多少 MCU(Minimum Coded Unit,最小编码单元)之后插入一个重启标记。
主要作用
重启标记主要有两个关键作用:
-
错误恢复(Error Resilience):在传输或解码过程中,如果数据出现错误(例如网络丢包),解码器可以通过查找下一个重启标记来重新同步,将数据损坏的影响限制在相邻两个重启标记之间的区间内,而不是导致整个图像剩余部分全部损坏。没有重启标记时,一个错误就可能让整幅图像无法解码 。
-
并行处理(Parallel Processing):由于两个重启标记之间的数据区间是独立编码的,这些区间可以被并行解码,这有助于提高解码效率,特别是在多核处理器上处理大型图像时 。
工作原理
JPEG 编码器会按照 DRI 标记定义的间隔,在 MCU 流中插入重启标记。当解码器遇到错误时,它可以跳转到下一个重启标记开始的位置,重置解码状态(例如霍夫曼解码器的状态),并从下一个区间开始继续正确解码 。重启标记的序号(RST0-RST7)会按顺序循环出现,这也有助于解码器验证同步状态 。
HPMicro支持情况
目前先楫的硬件JPEG暂不支持RESTART MARK,如果是带有RESTART MARK的场景,需要使用SDK中的软件解码或者使用cjpeg.exe工具-restart 0将带有RESATRT MARK的JPEG转成不带RESART MARK的JPEG,然后在使用硬件解码。