DSP

安霸(ambarella) s2lm视频处理流程

2019-07-13 16:58发布

摘自 http://blog.csdn.net/ostc184/article/details/51984071 对原作者表示感谢!
注:以下是基于ambarella s2lm sdk2.5,不保证后续的sdk是否会有改变。部分相关概念是本人直接从文档翻译而得,难免有不恰当之处,欢迎提出。
1.软件整体架构:

2.整体流程
 初始化--->VIN---->source buffer--->stream config---->encoding
 初始化就是加载sensor和系统所需的相关驱动。
3. Source buffer(源缓冲区)
s2l 可以同时集成4个独立的H.264或MJPEG流,有四个sourcbuffer可以用来编码或预览。理论上这个流可以由四个source buffer中任意一个编码得到。 但是推荐不同的码流由不同的source buffer编码得到来获得不同的视场(FOV)。
视频帧由RGB类型的sensor或YUV的设备采集得之后被S2L的编码器处理,换句话说source buffer就是存放将要编码的YUV数据,编码器连续不断的从 source buffer中取数据进行编码。这样设计之后,码流就会同时有不同的视场。
source buffer就是提供原始的视频数据来编码或视频输出。S2L上四个source buffer 依次为 Main,second,third和fourth source buffer。

main :  不能超过vin size ,16的倍数 second: 最大720x720 ,宽是16的倍数,高是8的倍数 third:     最大1920x1920, 宽是16的倍数,高是8的倍数 fourth:  最大1280x1280, 宽是16的倍数,高是8的倍数
4.stream configuration(码流配置)  四个码流同事编码时,各个码流配置会有所不同。比如,分辨率、码率、帧率、GOP值等。每个码流都可以独立的开启和停止。
1). 帧率: 编码帧率计算公式:   Encoding Frame Rate = VIN Frame Rate * Frame Factor  (0 < Frame Factor <= 1)
     编码帧率既不能大于VIN的采集帧率,也不能小于1fps。      如果码流的帧率被帧率因子按比例缩小,两个连续帧之间的间隔将不会是一个常量值。      举个例子,假设VIN是30fps,码流A是20fps,用帧率因子为20/30来按比例缩小VIN帧率。两个输出编码帧之间的时间间隔将会是33MS或者66MS,然而一秒内将是20帧。如果想在每一帧之间都获得相同的时间间隔,可以设置码率的帧率和VIN的帧率一样大。       2). 码率: 编码码率计算公式:   Encoding Bit Rate = Target Bit Rate * Frame Factor (0 < Frame Factor  ≤ 1)      
  •  如果码流的帧率动态改变,从30fps降到其他更小的帧率,实际编码比特率将随帧率因子按比例减小。
  •  如果应用程序想一直保持恒定比特率,即使帧率改变了,也应该随同帧率因子以帧率因子相反的倍数去配置比特率。DSP将会使帧率的码流输出恒定比特率。
  •  平均码率在DSP内计算,是基于GOP的长度,但不是一秒内,也就是说如果GOP的长度大于一秒,平均码流在一秒内的计算将会在每一个GOP值之间波动,
     由于第一个I帧的值比较大,平均码流在第一秒内计算得到的值将会比后面几秒大。
3). Maximum GOP M      最大GOP M的值给DSP以及怎样给H264编码的参考帧分配DRAM提供信息。      在H264编码中,他的范围值是1~3。值越大DSP会给编码分配更多的参考帧,也就是说DSP会给H264编码保留更多的DRAM。如果应用程序没有用到多参考帧,强烈建议始终设置值为1来节省DSP DRAM内存占用。当值大于1时,DSP也需要分配额外的内部资源。为了防止DSP由于内部资源不足而挂掉,默认的配置是 码流 A/B可以设置为max_gop_M > 1, 而码流C/D则不能。      对于MJPEG编码,可以设置为0来节省更多的DRAM,特别是大分辨率比如6MP或者是系统DRAM很小的情况。
4). GOP N      GOP N给DSP提供了信息,有多少个IDR/I帧,这是H264编码中的一个可变参数。GOP N最长是1800,对于一个30fps的码流大约是60秒(1800 = 30 * 60),  当应用程序动态改变GOP N,将会使当前的GOP立即生效,且如果当前GOP内的帧数已经超出新的GOP值将会立即产生IDR帧。这个特性叫作“及时GOP值改变”而不是“运行时GOP值改变”。
补充: GOP是画面组,一个GOP是一组连续的画面。GOP结构一般两个数字,如M=3,N=12。M指定I帧和P帧之间的距离,N指定两个I帧之间的距离。上面的M=3,N=12,GOP结构为:IBBPBBPBBPBBI。在一个GOP内I frame解码不依赖任何的其它帧,p frame解码则依赖前面的I frame或P frame,B frame解码依赖前最近的一个I frame或P frame 及其后最近的一个P frame。
IDR frame:I和IDR帧都使用帧内预测,在编码解码中为了方便,首个I帧要和其他I帧区别开,把第一个I帧叫IDR,这样方便控制编码和解码流程,所以IDR帧一定是I帧,但I帧不一定是IDR帧;IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始算新的序列开始编码。I帧有被跨帧参考的可能,IDR不会。
5.video ouput(视频输出)
S2L有两个VOUT单元,这两个VOUT单元支持不同的视频输出。
VOUT A:    LCD display    Digital video
VOUT B:   CVBS(480i/576i)   HDMI   Digital video
VOUT A: Fourth source buffer preview VOUT B: third source buffer preview
VOUT A指定第四码流,VOUT B指定第三码流。这两个都是模拟输出,没有经过编码。
6.encoding mode
 S2L有几种编码模式,每种编码模式下性能差异有所不同,视具体产品规格来定。每种产品规格只是一种或者多种编码模式。目前,有些模式已经在最新的sdk中支持,有些还在开发中。 
主要有以下几种编码模式: Normal ISO ,Multi Dewarp,ISO+,Advanced ISO, Advanced HDR 编码模式之间的差异: 1).“Normal ISO”, “ISO+” 和“Advanced ISO”目前已经做好完整的功能。他们都可以同时支持2X HDR而不需要模式开关。新特性将会在新版本sdk中实现。 2). 相比于“Normal ISO”模式,“ISO+ / Advanced ISO”模式将会使用更多的系统资源来提高图像质量,这样就将会降低最大编码性能。因此必须在码流的图像质量和最大编码性能之间作一个权衡。 3).“ISO+ / Advanced ISO”模式支持LDC,而“Normal ISO”模式不支持LDC。 4).“Advanced ISO”模式支持亮度锐化和 {MOD}度噪声滤波器, 但是“ISO+” 和 “Normal  ISO”模式不支持。 5). 虽然“ISO+”和 “Advanced ISO”模式都是用同样的编码模式mode 4,但是这在S2L和S2LM两个芯片上是有区别的。模式的选择自动在IAV驱动中决定,如下: