采用Linux V4L2抓取Image Sensor图形数据时,有时会发现图像所占空间并不符合图像分辨率及bytes_per_pixel所定义的空间,如图像分辨率为400*400,10 bit color depth实际抓取图像却是332800 bytes,理论上图像占用空间为:400*400*2 bytes =320000 bytes,多余的12800 bytes是怎么来的呢?这里就涉及到preferred_stride了。
preferred_stride指一行图像数据需要的内存大小。以Jetson平台为例,它的图像数据是unpacked存储的,即10bit depth和12 bit depth的数据格式下,一个像素占用两个字节。
1.普通情况下,buffer需要64字节对齐。
preferred_stride= ALIGN_UP(width*bytes_per_pixel,64)
比如宽度为3088时:
8bit depth,preferred_stride=3136。
3088/64=48.25,向上取64的整数倍为:49*64=3136
10bit depth,preferred_stride=6208。
3088*2/64=96.5,向上取64的整数倍为:97*64=6208
12bit depth,preferred_stride=6208。
同上
2.如果使用VIC buffer,则需要256字节对齐。
preferred_stride= ALIGN_UP(width*bytes_per_pixel,256)
所以,回到原来的问题上,400*400,10 bit color depth
400*2/64=12.5,向上取64的整数倍为:13*64=832
占用空间为:832*400 bytes=332800 bytes,所以共占用332800 bytes,而非400*400*2 bytes=320000 bytes。