ngswfx

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx  发布于  2016-05-18 02:56:22
采纳率 0%
55个问答
5080

雄迈3535板子,2片256M内存MMZ设置,折腾的我不轻

 
本帖最后由 ngswfx 于 2016-5-19 03:15 编辑

雄迈的这个3535板子,2片256M内存。

最开始,我以为3535和3531类似,既然是2片DDR,应该,分片,MMZ配置中,一个是默认NULL ,另外一个名字是DDR1

于是在load3535.sh中配置MMZ,让DDR1的开始值为0xC0000000 ,因为从0x80000000到0xC0000000 正好是1G内存,这样3535就最大支持2G了,好像是对的,启动中,执行到MMZ内存部分,也没发现什么异常,可怎么修改程序的HI_MPI_SYS_SetMemConf,

只要将名字改为ddr1,程序就崩溃,后来考虑这个板子是不是仅仅支持最大1G,于是修改ddr1从0xA0000000,还是不行,再次测试,直接搞到0x90000000,都这样了,内存就连续了。最后想想,干脆别分片了。

直接0x84000000 后面448M内存,程序竟然正常了。 已经使用了237兆内存了,加上系统的64M,已经超过了第一片DDR的256,这意味着,已经正常了。

////////////////////////////不确切知道这个板子DDR到底怎么连接的,不管了,反正这么设置,正常了。

再看文档“Hi3535与Hi3531开发包差异说明”中,有一句话让人郁闷呀:funk: :

3535:
DDR 接口 1 个 32bit DDR3 SDRAM 最大容量支持 2GB
3531:
接口 2 个 32bit DDR2/3 SDRAM 接口 每个接口最大容量支持 1GB

看来这就是原因了,3535只有一个DDR接口,:lol 。没看文档,累死个人呀。





还有那个内存池分配,由于demo代码和3520D有些差异,需要重新摸索,尤其这个stModVbConf.astCommPool[0].u32BlkCnt,很费解,我是16路D1解码,不做其他事情,V0 HD0输出而已,这个值按照我的理解应该是16就可以了,怎么弄都不行,

只能解几路,其他的通道,发送流HI_MPI_VDEC_SendStream失败,设置成u32BlkCnt=64,16路解码就正常了,费解呀。难道是VPSS那几个处理过程(Crop NR DIE SCALE 等等),一个过程用一个? 可是我全都配置的是HI_FALSE呀。(也不排除这种可能,内部的确会缩放合成会折腾好几次)
//////////////////////////////目前还有一个地方没搞懂,如果设置成u32BlkCnt=64,第一次连接16个D1正常,占用内存约130M左右,如果断开所有图像,再次连接,有些又失败了。暂没找到原因,估计有些东西没释放掉,临时做法,是把u32BlkCnt=80,这里想到网站上曾经不少人说3535解码多路图像卡(当然也可能是网络传输方面的问题),呵呵,如果这个内存池子分配的不够,各个通道在抢内存,图像的确会卡:lol,这个也能解释的通 。


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
代码VB_PIC_BLK_SIZE(stSize.u32Width, stSize.u32Height, PT_H264, PicSize);   里面
把   size = ( (u32AlignWidth * u32AlignHeight + u32HeadSize) * 3) >> 1;\
改为 size = ( (u32AlignWidth * u32AlignHeight + u32HeadSize) * 3) >> 2;\

能节省一半内存。这个倒是符合文档描述。最小缓冲:w*h*3/4
////////////////////////////////////////////////////////////////////////////////////////////后来经过大侠指点,这里不能动,必须是w*h*3/2(估计是YUV420),之所以我测试没发现问题,是因为我的W=1920 H-1080,测试的图像是D1的,所以一切正常,但如果导入1080P图像,这里会引起失败。


//////////////////////////demo中的这句,估计也浪费不少内存,为了支持旋转,如果1920*1080 ,VPSS缓冲按照1920*1920计算的,浪费了不少内存。
stRotateSize.u32Width = stRotateSize.u32Height = MAX2(stSize.u32Width, stSize.u32Height);
///////////////////////////////
stVpssGrpAttr.u32MaxW   =stSize.u32Width;// ALIGN_UP(stRotateSize.u32Width,  16);
stVpssGrpAttr.u32MaxH   =stSize.u32Height;// ALIGN_UP(stRotateSize.u32Height, 16);



////////////////////////////////////////2016_5_18  有了高手的解惑,又查看了文档,在 MPI2.0 里面HI_MPI_VDEC_CreateChn有相关描述。更清楚了些。
创建解码通道之前要先创建专属于 VDEC 的模块 VB 池,且要保证 VB 块的大小
和个数满足当前解码通道所需图像 Buffer 的大小和个数。H264 和 JPEG 解码每个
解码通道所需 VB 个数至少为参考帧+显示帧+1;MPEG4 解码每个解码通道所需
VB 个数至少为参考帧+显示帧+2。不同协议解码所需的图像 VB 块大小不同,具
体计算方法可参见下面的 VB_PIC_BLK_SIZE 定义。
z 当前创建的 H.264 解码通道如果设置支持 B 帧解码,则还需要为其分配输出每一
帧 Pmv 信息的 VB 块,该 VB 块的大小比图像 VB 块小很多,所需个数与图像 VB
个数保持一致,具体大小计算可参见下面的 VB_PMV_BLK_SIZE 定义。
z 如果 H.264 解码不需要解码 B 帧,则创建通道时可设置此通道不支持 B 帧解码,
此种情况不输出 Pmv 信息,可以不用创建 Pmv VB 池,节省 MMZ 内存。
z 如果解码帧存分配方式使用的是解码私有 VB 池,则不需要创建解码模块 VB
池。
z 如果设置了旋转,则两种帧存分配方式都需要为每个解码通道多分 3 块 VB。

//////////////////////////////////////2016_5_19 SAMPLE_COMM_VDEC_InitModCommVb用起来真不方便,这个公共缓冲池子用起来真不方便,最起码我的应用环境是这样
MPI2.0有一句:
VDEC 模块公共池仅在解码帧存分配方式使用模块公共 VB 池时才需要创建,即
VDEC 的模块参数 VBSource 配置为 0 时。如果 VDEC 的模块参数 VBSource 配置
为 1,则不需要创建 VDEC 模块公共 VB 池。
//如果使用公共缓冲池,在KO加载驱动时,VBSource=0,而且SDK默认就是这么用的,我的应用环境是16路D1解码,偶尔会某个通道解高清。
//如果配置这个公共缓冲池方式的话,由于是静态变量,系统初始化的时候就启动,配置小了的话,高清解不了,配置大了,内存又不够,真是左右为难。
//幸亏MPI可以关闭,不使用这个公共缓冲池,改由内部自动分配,哎,天下太平了,内存占用区别巨大,目前16路D1解码占用约100M,如果再让其中一个通道解400万像素高清
,再增加约30M,总共约130M,这种内存使用就比较完美了,如果用公共池自己分配的方式,完成这些任务,如果程序启动就分配到位的话,1G的内存配置就必须满足了,因为16路高清(2480*1536)解码VB就估计占用了400多M了。



////////////////////////////////到这里,基本和3520D差不多内存占用了,比较完美。结贴。
我来回答
回答5个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-05-18 08:31:29
认可0
"雄迈的这个3535板子,2片256M内存"
3535接DDR的情况很多, XM还有接768M的版本

关于3535DDR分两块的情况是指两个DDR接口都使用的情况

一般来说做NVR时用到的MMZ比AHR/DVR要少,留给系统才64M,通常是不够的(来点美丽的GUI,多搞点功能等等),大胆地把内存分给系统

"还有那个内存池分配,由于demo代码和3520D有些差异,需要重新摸索,尤其这个stModVbConf.astCommPool[0].u32BlkCnt,很费解,我是16路D1解码,不做其他事情,V0 HD0输出而已,这个值按照我的理解应该是16就可以了,怎么弄都不行,"
这个是解码专用VB, 要看每个VDEC创建时设的是几个VB,(private mode缺省是5个),最少要3个, 一般NVR,ref为2的情况,可以考虑设为4
那么每个VDEC要4个VB, 所以16路解码要开4*16 = 64个
从H.264解码的要求来看,要保留所有的ref图像,加上正在解码和送到后续处理的两个buffer,一般要求 ref + 2个图像buffer,才能保证解码正常工作,不然就会停下来等VB

"代码VB_PIC_BLK_SIZE(stSize.u32Width, stSize.u32Height, PT_H264, PicSize);   里面
把   size = ( (u32AlignWidth * u32AlignHeight + u32HeadSize) * 3) >> 1;\
改为 size = ( (u32AlignWidth * u32AlignHeight + u32HeadSize) * 3) >> 2;\
能节省一半内存。这个倒是符合文档描述。最小缓冲:w*h*3/4 "

楼主把VB的大小和码流buffer的大小搞混了,VB的大小是不能改小的,这个*3/2是指YUV420格式的图用到的内存, *3/4是指解码的码流buffer最小可以是这么大(当然海思已经允许更小的码流buffer了)

“//////////////////////////demo中的这句,估计也浪费不少内存,为了支持旋转,如果1920*1080 ,VPSS缓冲按照1920*1920计算的,浪费了不少内存。”
如果VPSS没有开NR, 那么每个VPSS使用的内存是极少的(不到100K,不管是多大的尺寸,当然是和VB的大小比)



ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-05-18 12:02:35
认可0
本帖最后由 ngswfx 于 2016-5-18 13:55 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=30157&ptid=11343]zhuangweiye 发表于 2016-5-18 08:31[/url]
"雄迈的这个3535板子,2片256M内存"
3535接DDR的情况很多, XM还有接768M的版本

[/quote]

谢谢解答,这一点,我也觉得异常的很,因为3520中,VPSS的确用的内存非常少,3535里面,使用cat /proc/media-mem看MMZ,有个名字为VB的缓冲,大的不得了,3520中,这部分好像是分别显示的,比较详细,看看基本知道是给各个通道的YUV缓冲,或者编码缓冲,基本能看出来,随着一些参数的调整,MMZ相关值会有变化,3535中,都揉到一块了,只知道很大,想弄小点,但弄小了,解码就会失败,所以,我开始以为是不是3535为了支持新功能,结构有了大的变化,随意摸索这调整使用。
/////////我能想到的这个YUV buffer必须要用的地方是,解码出数据用一个,然后缩放到分割画面需要的小窗体用一个。如果ref为2,则解码出YUV用2个,缩放用一个,最后VPSS合成后,由于是针对VO的,就一个和输出分辨率相关的1-2个左右的YUV缓冲,这个缓冲仅仅和显示输出个数相关,虽然也很大,但也就几兆。

我程序中,我一般把那个u32RefFrameNum弄成2,有时为了节约内存,我会设置成1测试(图像好像会稍卡),目前用的2。


///////////////////////////
VB_PIC_BLK_SIZE(stSize.u32Width, stSize.u32Height, PT_H264, PicSize);   问题,我再细研究一下。这么说来,我的VB buff还是开的太小。目前16路D1解码,u32RefFrameNum=2,最大的那个VB,用了156M左右。

///////////////////呵呵,终于发现这里隐含的BUG了,我按照1080P去设置的静态变量,输入的图像是D1的,所以暂时解码没问题,可要是输入1080P图像解码,就解不出来了。


/////////////高手就是高手,随便几句,让我茅塞顿开,让我解惑不少,呵呵:lol

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-05-18 12:33:58
认可0
3535使用的是MPP2.0  
3520DV100/V200使用的是MPP1.0
是有些差别(但基本概念没变), 最主要的差别在vo channel在MPP1.0时是归属vo dev, 到MPP2.0后归属vo layer了(MPP3.0也是这样的)

如果有一套老的代码要移植到新的SDK上跑(比如原来在3520D上的代码要在3535上跑)这些变化还是比较好解决的毕竟编译不过去自然而然就会去改,
但是MPP版本的升高还有一些隐性变化,就是一些结构里面加了新成员,这个有时就会让人吐血,编译OK,运行时会出现不同的不正常现象,基本都是这些新成员没赋值的结果

关于VB的问题,海思的解决方案个人看来还是不错的,其实就分两种放图像的和放码流的,只要分清这两个,VB大小就好办了

goo635

0个粉丝

17

问答

0

专栏

2

资料

goo635 2016-05-26 09:13:14
认可0
老兄,雄迈的板卡,你用的UBoot kernel 和fs都是雄迈的吗?还是自己定制的?AD芯片是NVP6124吗?是自己编译的吗?我曾经尝试在雄迈3531上使用官方的SDK定制uboot/kernel 遇到一对问题,AD芯片也运行不正常。。。最后宣告失败。。。呵呵

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-05-26 13:19:35
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=30638&ptid=11343]goo635 发表于 2016-5-26 09:13[/url]
老兄,雄迈的板卡,你用的UBoot kernel 和fs都是雄迈的吗?还是自己定制的?AD芯片是NVP6124吗?是自己编译 ...[/quote]

我用的这个是NVR主板,我这里除了用3535芯片解码的,没有其他芯片了。

全部都是自己编译的。
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区