海思3559的stride与TCP的SIGPIPE
目录图像宽度stride的概念3559的stride一些要求配置实践通道创建编码帧创建错误配置图像的扩展VPSS扩展内存拷贝扩展DMA逐行拷贝编码耗时耗时优化总结SIGPIPE图像宽度MIN_ALIGN22222对齐最小为2个字节。在创建VENC通道时宽度为2的倍数即可。那么在采用VENC模块进行编码时是否分辨率的宽度为2的倍数就可以高枕无忧了呢stride的概念理解为硬件每次获取的图像像素数吧类似于人走一步例如上图假设图像宽度是1910而stride 为1920 。通过stride设置为某些数值的倍数例如16、32、64的倍数。至于为啥会设置为16、32、64的倍数那必定和性能、内存访问相关了具体就不展开了。3559的stride一些要求表10-3 Hi3559AV100 VGS 硬件规格输入图像分辨率及对齐要求1、最小支持 32x32。2、最大支持 16384x16384。3、宽度和高度均为 2 像素对齐非压缩 stride 16 对齐压缩stride 32 对齐。注意如果宽度的缩小倍数大于 15 倍时要求输入图像的宽度 4 像素对齐 高度同理。配置实践以分辨率4760x1000为例通道创建这里为了16对齐将最大width配置为4768而实际宽度配置为图像的宽度即4760stVencChnAttr.stVencAttr.enType enType; stVencChnAttr.stVencAttr.u32MaxPicWidth stPicSize.u32Width; 这里是4768 stVencChnAttr.stVencAttr.u32MaxPicHeight stPicSize.u32Height; stVencChnAttr.stVencAttr.u32PicWidth stPicSize.u32Width-8;/*the picture width*/ 这里是4760 stVencChnAttr.stVencAttr.u32PicHeight stPicSize.u32Height;/*the picture height*/ stVencChnAttr.stVencAttr.u32BufSize stPicSize.u32Width * stPicSize.u32Height * 2;/*stream buffer size*/ stVencChnAttr.stVencAttr.u32Profile u32Profile; stVencChnAttr.stVencAttr.bByFrame HI_TRUE;/*get stream mode is slice mode or frame mode?*/编码帧创建stFrmInfo.stVFrame.u32Width g_u32PicWidth-8; //这里配置为4760 stFrmInfo.stVFrame.u32Height g_u32PicHeigh; stFrmInfo.stVFrame.u32Stride[0] g_u32PicWidth; //这里配置为4768通过上述两个配置可以编码生成和原始图像一样的分辨率。错误配置1假如通道创建时设置的width为4768而创建编码帧时width设置了 4760则报如下错误3[ venc] [Func]:VencCheckVideoInfo [Line]:1595 [Info]:Venc 0 :Src pic is small,lost this frame,src(4760,1000),Venc(4768,1000).2假如通道创建时设置的width为4760而创建编码帧时width设置了 4768则报如下错误3[ vb] [Func]:VbSearchCommPoolBySize [Line]:979 [Info]:all blk size of vb pool (owner -1 ) is smaller than the actual size 18211200 required! 1[ venc] [Func]:VencSendPic2Vgs [Line]:2209 [Info]:get VB fail,for Venc 0 Vgs scale 3[ venc] [Func]:VencSendPic [Line]:1285 [Info]:Venc:0 send pic to vgs failed!,u64PTS6076095458通过此处我们可以得知配置的尺寸不匹配时3559 会自动进入vgs scale流程。图像的扩展由于原始进入到3559的图像是4760*1000的为了能正常编码满足编码器的要求需要将stride扩展到4768这就需要在每行扩展出8个字节。VPSS扩展报错3[ vpss] [Func]:VPSS_DRV_CheckImageAttr [Line]:5100 [Info]:[grp0]:pic Stride[0](4760) Stride[1](0) Stride[2](0) should be aligned to 16!!很悲催VPSS输入的stride也需要16字节对齐。内存拷贝扩展将图像内存映射成带cache的然后memcpy耗时15ms。即每帧编码的整个流程增加了15ms。DMA逐行拷贝PCIE 2.0 X1 。整帧拷贝时耗时43ms。而按行拷贝时变为dma time: 54979.000000 us增加了11ms。编码耗时23ms耗时优化PCIE3.0 X2 。 在整帧DMA 时数据带宽大概为理论的78%左右因而整帧耗时大概12ms而按行传输时间大概要23ms上下了不过这个也满足要求。总结在用海思 、RK芯片处理图像时图像的stride 必须考虑清楚否则引入新的操作流程就会带来新的延时。RK芯片这个有介绍嵌入式图像处理中的 Stride 原理与 Rockchip 平台对齐实践-CSDN博客SIGPIPE现象客户要求用TCP推流 在测试用TCP客户端发送推流数据时将TCP服务端关闭客户端程序直接闪退了啥现象也没有。往上同类型案例也比较多例如(98 封私信 / 80 条消息) 我的服务程序被 SIGPIPE 信号给搞崩了 - 知乎深入解析Linux SIGPIPE信号网络编程中的沉默杀手-CSDN博客