ISP是Image Signal Processor的缩写,用于对image sensor采样来的原始图像数据(又叫RAW数据)做进一步处理,比如降噪、色域转换等操作,最终生成RGB格式的图像数据。
ISP是按照pipeline理念来组织上面提到的那些处理模块的,每个模块之间通过若干根信号线相连。这些信号线大部分用于传像素的每个bit,一小部分用于传控制信号,其中控制信号主要是帧开始
、行开始
、行数据开始
之类的同步信号。
为了方便定位pipeline的问题,ISP厂商通常会在某些模块之间接入一个DMA模块,用于将pipeline上的数据流写入到DDR内存。
这里有个问题,pipeline上的像素数据流,每个像素不一定是8bit,有可能是10bit或12bit甚至14bit,而且像素之间是紧挨着的,即没有为8bit对齐而填充0,因此DMA写到DDR里的像素数据无法用常规的16进制编辑器查看,必须转换成8bit对齐的格式才行。
要想正确转换,先要弄清楚ISP DMA的工作原理
ISP DMA跟系统DMA的区别:
行数据结束
信号),但系统总线的当前burst传输
还未填满时,DMA要自动填充数据,以保证系统总线的数据对齐。假设pipeline的图像宽度是8像素,每个像素的位宽是12bit,系统总线位宽是64bit,则ISP DMA按下图进行内存访问
行数据开始
信号后,将pipeline上的像素数据依次写入内部shift register之类的寄存器,凑够一个beat
(即一次burst传输)后写入DDR行数据开始
信号后,重复上述过程。帧结束
信号后,发送中断,通知软件填写下一帧的DDR地址。弄清楚了ISP DMA的压缩写入过程,那转换就是个解压缩读取过程
图像宽度
、像素位宽
、总线位宽
算出line_stride_width
,并换算成对应的字节数
nunsigned short
型中,这样就自动加上了气泡,实现8bit对齐。beat
,则要小心处理,后续补充这块的细节。跨beat
的处理很麻烦,最好用numpy
或opencv
等库,我们给它们传参即可,关键是弄明白参数的含义。