helloworld

helloworld

0个粉丝

11

问答

0

专栏

0

资料

helloworld  发布于  2016-06-23 11:31:32
采纳率 0%
11个问答
13288

hi3531解码内存不足

 
解码YUV444的1080P的jpeg图片,创建解码通道时提示如下信息:

vmap allocation for size 41783296 failed: use vmalloc= to increase size.
HI_MPI_VDEC_CreateChn failed errno 0xa005800c

我在创建时,设置的
VDEC_CHN_ATTR_S结构体的u32BufSize = 1920 * 1080 * 3;也就是6220800字节,为什么错误提示的size为41783296,怎么解决?
我来回答
回答37个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-06-23 17:21:13
认可0
给点详细的代码和错误log

不然就成了瞎子摸象了

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-23 20:29:04
认可0
本帖最后由 ngswfx 于 2016-6-23 20:41 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32282&ptid=11713]zhuangweiye 发表于 2016-6-23 17:21[/url]
给点详细的代码和错误log

不然就成了瞎子摸象了[/quote]

好多帖子都是这种情况,想帮忙都帮不上,呵呵。

按照我的理解就是,有成千上万种可能性导致最后的问题发生。

//////////////我感觉是他的内存开得太大了,都40M了,可顶有地方弄错了。

检查:
HI_VOID        SAMPLE_COMM_VDEC_ModCommPoolConf(VB_CONF_S *pstModVbConf, PAYLOAD_TYPE_E enType, SIZE_S *pstSize)
{
    HI_S32 PicSize, PmvSize;
       
        memset(pstModVbConf, 0, sizeof(VB_CONF_S));   
    pstModVbConf->u32MaxPoolCnt = 2;
       
    VB_PIC_BLK_SIZE(pstSize->u32Width, pstSize->u32Height, enType, PicSize);       
    pstModVbConf->astCommPool[0].u32BlkSize = PicSize;
    pstModVbConf->astCommPool[0].u32BlkCnt  = 20;          //20个   41783296=1920*1080*20     

        /* if the VDEC channel of H264 support to decode B frame, then you should  allocate PmvBuffer */
    VB_PMV_BLK_SIZE(pstSize->u32Width, pstSize->u32Height, PmvSize);
    pstModVbConf->astCommPool[1].u32BlkSize = PmvSize;
    pstModVbConf->astCommPool[1].u32BlkCnt  = 0;

}

///////////另外你给MMZ给了多少内存呀,40M都分不出来,是load驱动时,MMZ没弄对吧,检查cat /proc/media-mem,看看MMZ可用总量吧。

helloworld

0个粉丝

11

问答

0

专栏

0

资料

helloworld 2016-06-28 10:45:43
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32293&ptid=11713]ngswfx 发表于 2016-6-23 20:29[/url]
好多帖子都是这种情况,想帮忙都帮不上,呵呵。

按照我的理解就是,有成千上万种可能性导致最后的问 ...[/quote]


---MMZ_USE_INFO:
total size=1829888KB(1787MB),used=1639520KB(1601MB + 96KB),remain=190368KB(185MB + 928KB),zone_number=3,block_number=108

总共2G的内存,os占256M,ddr0占762M,jpeg占5M,ddr1占1020M


代码如下:

static HI_S32 ZK_VDEC_CreateVdecChn(VDEC_CHN vdChn, SIZE_S *pstSize, PAYLOAD_TYPE_E enType, VIDEO_MODE_E enMode, enum AVPixelFormat pixFormat)
{
    HI_S32 s32Ret;
    VDEC_CHN_ATTR_S stAttr;
    VDEC_PRTCL_PARAM_S stPrtclParam;

    memset(&stAttr, 0, sizeof(VDEC_CHN_ATTR_S));

    stAttr.enType = enType;
    stAttr.u32Priority = 1;
    if(pixFormat == AV_PIX_FMT_YUV444P || pixFormat == AV_PIX_FMT_YUVJ444P) {
        stAttr.u32PicWidth = pstSize->u32Width * 2;
        ZK_PRT("pixFormat: %d\n", pixFormat);
    } else {
        stAttr.u32PicWidth = pstSize->u32Width;
    }
    stAttr.u32PicHeight = pstSize->u32Height;
    stAttr.u32BufSize = stAttr.u32PicHeight * stAttr.u32PicWidth * 2;

    switch (enType)
    {
        case PT_H264:
            stAttr.stVdecVideoAttr.u32RefFrameNum = 2;
            stAttr.stVdecVideoAttr.enMode = enMode;
            stAttr.stVdecVideoAttr.s32SupportBFrame = 1;
            break;
        case PT_JPEG:
            stAttr.stVdecJpegAttr.enMode = enMode;
            break;
        case PT_MJPEG:
            stAttr.stVdecJpegAttr.enMode = enMode;
            break;
        default:
            ZK_PRT("err type \n");
            return HI_FAILURE;
    }

    s32Ret = HI_MPI_VDEC_CreateChn(vdChn, &stAttr);
    if (HI_SUCCESS != s32Ret) {
        ZK_PRT("HI_MPI_VDEC_CreateChn failed errno 0x%x \n", s32Ret);
        return s32Ret;
    }

s32Ret = HI_MPI_VDEC_GetPrtclParam(vdChn, &stPrtclParam);
    if (HI_SUCCESS != s32Ret) {
        ZK_PRT("HI_MPI_VDEC_GetPrtclParam failed errno 0x%x \n", s32Ret);
        return s32Ret;
    }

    stPrtclParam.s32MaxSpsNum = 21;
    stPrtclParam.s32MaxPpsNum = 22;
    stPrtclParam.s32MaxSliceNum = 100;
    //stPrtclParam.s32DisplayFrameNum = 4;
    s32Ret = HI_MPI_VDEC_SetPrtclParam(vdChn, &stPrtclParam);
    if (HI_SUCCESS != s32Ret) {
        ZK_PRT("HI_MPI_VDEC_SetPrtclParam failed errno 0x%x \n", s32Ret);
        return s32Ret;
    }

    s32Ret = HI_MPI_VDEC_StartRecvStream(vdChn);
    if (HI_SUCCESS != s32Ret) {
        ZK_PRT("HI_MPI_VDEC_StartRecvStream failed errno 0x%x \n", s32Ret);
        return s32Ret;
    }

    return HI_SUCCESS;
}

helloworld

0个粉丝

11

问答

0

专栏

0

资料

helloworld 2016-06-28 11:03:48
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32293&ptid=11713]ngswfx 发表于 2016-6-23 20:29[/url]
好多帖子都是这种情况,想帮忙都帮不上,呵呵。

按照我的理解就是,有成千上万种可能性导致最后的问 ...[/quote]

我想问您一下,创建vdec chn需要的内存是在os上分配的还是在mmz上?从现象看是用os上分配的,因为如果创建成功的话,我的os内存立马减少了好几十M,解码完通道也确定销毁了,但是内存没有释放,您帮忙看下代码:

#include "zk_vdec.h"

extern VDEC_CHN getTTVdChn(HI_VOID);
extern VPSS_GRP getTTVpssGrp(HI_VOID);
extern VENC_GRP getTTVeGrp(HI_VOID);
extern VENC_CHN getTTVeChn(HI_VOID);
extern VIDEO_NORM_E getVideoNorm(HI_S32 chnId);
extern PIC_SIZE_E getEnSize(HI_S32 chnId, HI_S32 index);
extern HI_U32 getEnRcMode(HI_S32 chnId, HI_S32 index);
extern HI_U32 getEncProfile(HI_S32 chnId, HI_S32 index);
extern HI_U32 getEnFrmRate(HI_S32 chnId, HI_S32 index);
extern HI_U32 getEnBitRate(HI_S32 chnId, HI_S32 index);
extern HI_U32 getIFrameInterval(HI_S32 chnId, HI_S32 index);
extern HI_S32 startGetVideoStream(VENC_CHN venChn);
extern HI_VOID stopGetVideoStream(VENC_CHN venChn);

static VDEC_SEND_PARAM_S stVdecParam;
static VDEC_SEND_PARAM_S *pstVdParam = &stVdecParam;


static HI_S32 initVdecInfo(HI_VOID)
{
        HI_S32 s32Ret;

        pstVdParam->enNorm = getVideoNorm(FILM);
        pstVdParam->enPicSize = getEnSize(FILM, STREAM_MAIN_INDEX);
        pstVdParam->VdChn = getTTVdChn();
        pstVdParam->VpssGrp = getTTVpssGrp();
        pstVdParam->VeGrp = getTTVeGrp();
        pstVdParam->VeChn = getTTVeChn();

        s32Ret = ZK_COMM_VDEC_MemConfig_1(pstVdParam->VdChn);
        if (HI_SUCCESS != s32Ret) {
                ZK_PRT("ZK_COMM_VDEC_MemConfig failed with %d!\n", s32Ret);
                return HI_FAILURE;
        }

        s32Ret = ZK_COMM_VPSS_MemConfig_1(pstVdParam->VpssGrp);
        if (HI_SUCCESS != s32Ret) {
                ZK_PRT("ZK_COMM_VPSS_MemConfig failed with %d!\n", s32Ret);
                return HI_FAILURE;
        }

        s32Ret = ZK_COMM_VENC_MemConfig_1(pstVdParam->VeGrp, pstVdParam->VeChn);
        if (HI_SUCCESS != s32Ret) {
                ZK_PRT("ZK_COMM_VENC_MemConfig failed with %d!\n", s32Ret);
                return HI_FAILURE;
        }

        return HI_SUCCESS;
}

static HI_S32 ZK_VDEC_CreateVdecChn(VDEC_CHN vdChn, SIZE_S *pstSize, PAYLOAD_TYPE_E enType, VIDEO_MODE_E enMode, enum AVPixelFormat pixFormat)
{
        HI_S32 s32Ret;
        VDEC_CHN_ATTR_S stAttr;
        VDEC_PRTCL_PARAM_S stPrtclParam;

        memset(&stAttr, 0, sizeof(VDEC_CHN_ATTR_S));

        stAttr.enType = enType;
        stAttr.u32Priority = 1;
        if(pixFormat == AV_PIX_FMT_YUV444P || pixFormat == AV_PIX_FMT_YUVJ444P) {
                stAttr.u32PicWidth = pstSize->u32Width * 2;
                ZK_PRT("pixFormat: %d\n", pixFormat);
        } else {
                stAttr.u32PicWidth = pstSize->u32Width;
        }
        stAttr.u32PicHeight = pstSize->u32Height;
        stAttr.u32BufSize = stAttr.u32PicHeight * stAttr.u32PicWidth * 2;

        switch (enType)
        {
                case PT_H264:
                        stAttr.stVdecVideoAttr.u32RefFrameNum = 2;
                        stAttr.stVdecVideoAttr.enMode = enMode;
                        stAttr.stVdecVideoAttr.s32SupportBFrame = 1;
                        break;
                case PT_JPEG:
                        stAttr.stVdecJpegAttr.enMode = enMode;
                        break;
                case PT_MJPEG:
                        stAttr.stVdecJpegAttr.enMode = enMode;
                        break;
                default:
                        ZK_PRT("err type \n");
                        return HI_FAILURE;
        }
       
        s32Ret = HI_MPI_VDEC_CreateChn(vdChn, &stAttr);
        if (HI_SUCCESS != s32Ret) {
                ZK_PRT("HI_MPI_VDEC_CreateChn failed errno 0x%x \n", s32Ret);
                return s32Ret;
        }

        s32Ret = HI_MPI_VDEC_GetPrtclParam(vdChn, &stPrtclParam);
        if (HI_SUCCESS != s32Ret) {
                ZK_PRT("HI_MPI_VDEC_GetPrtclParam failed errno 0x%x \n", s32Ret);
                return s32Ret;
        }

        stPrtclParam.s32MaxSpsNum = 21;
        stPrtclParam.s32MaxPpsNum = 22;
        stPrtclParam.s32MaxSliceNum = 100;
        //stPrtclParam.s32DisplayFrameNum = 4;
        s32Ret = HI_MPI_VDEC_SetPrtclParam(vdChn, &stPrtclParam);
        if (HI_SUCCESS != s32Ret) {
                ZK_PRT("HI_MPI_VDEC_SetPrtclParam failed errno 0x%x \n", s32Ret);
                return s32Ret;
        }

        s32Ret = HI_MPI_VDEC_StartRecvStream(vdChn);
        if (HI_SUCCESS != s32Ret) {
                ZK_PRT("HI_MPI_VDEC_StartRecvStream failed errno 0x%x \n", s32Ret);
                return s32Ret;
        }

        return HI_SUCCESS;
}

static HI_S32 ZK_VDEC_WaitDestroyVdecChn(VDEC_CHN vdChn, VIDEO_MODE_E enVdecMode)
{
        HI_S32 s32Ret;
        VDEC_CHN_STAT_S stStat;

        memset(&stStat, 0, sizeof(VDEC_CHN_STAT_S));

        s32Ret = HI_MPI_VDEC_StopRecvStream(vdChn);
        if (s32Ret != HI_SUCCESS) {
                ZK_PRT("HI_MPI_VDEC_StopRecvStream failed errno 0x%x \n", s32Ret);
                return HI_FAILURE;
        }

        if (VIDEO_MODE_FRAME == enVdecMode) {
                while (1)
                {
                        s32Ret = HI_MPI_VDEC_Query(vdChn, &stStat);
                        if (s32Ret != HI_SUCCESS) {
                                ZK_PRT("HI_MPI_VDEC_Query failed errno 0x%x \n", s32Ret);
                                return HI_FAILURE;
                        }
                        if ((stStat.u32LeftPics == 0) && (stStat.u32LeftStreamFrames == 0)) {
                                ZK_PRT("vdec had no stream and pic left\n");
                                break;
                        }
                        usleep(1000);
                }
        }
        s32Ret = HI_MPI_VDEC_DestroyChn(vdChn);
        if (s32Ret != HI_SUCCESS) {
                ZK_PRT("HI_MPI_VDEC_DestroyChn failed errno 0x%x \n", s32Ret);
                return HI_FAILURE;
        }

        return HI_SUCCESS;
}

static HI_S32 ZK_VDEC_WaitDestroyVencChn(VENC_GRP veGrp, VENC_CHN veChn)
{
        HI_S32 s32Ret;
        VENC_CHN_STAT_S stStat;

        memset(&stStat, 0, sizeof(VENC_CHN_STAT_S));

        /******************************************
          step 1:  Stop Recv Pictures
         ******************************************/
        s32Ret = HI_MPI_VENC_StopRecvPic(veChn);
        if (s32Ret != HI_SUCCESS) {
                ZK_PRT("HI_MPI_VENC_StopRecvPic failed errno 0x%x \n", s32Ret);
                return HI_FAILURE;
        }

        while (1)
        {
                s32Ret = HI_MPI_VENC_Query(veChn, &stStat);
                if (s32Ret != HI_SUCCESS) {
                        ZK_PRT("HI_MPI_VENC_Query failed errno 0x%x \n", s32Ret);
                        return HI_FAILURE;
                }
                if ((stStat.u32LeftPics == 0) && (stStat.u32LeftStreamFrames == 0)) {
                        ZK_PRT("venc had no stream and pic left!\n");
                        break;
                }
                usleep(100);
        }

        stopGetVideoStream(veChn);

        /******************************************
          step 2:  UnRegist Venc Channel
         ******************************************/
        s32Ret = HI_MPI_VENC_UnRegisterChn(veChn);
        if (HI_SUCCESS != s32Ret)
        {
                ZK_PRT("HI_MPI_VENC_UnRegisterChn vechn[%d] failed with %#x!\n",\
                                veChn, s32Ret);
                return HI_FAILURE;
        }

        /******************************************
          step 3:  Distroy Venc Channel
         ******************************************/
        s32Ret = HI_MPI_VENC_DestroyChn(veChn);
        if (HI_SUCCESS != s32Ret)
        {
                ZK_PRT("HI_MPI_VENC_DestroyChn vechn[%d] failed with %#x!\n",\
                                veChn, s32Ret);
                return HI_FAILURE;
        }

        /******************************************
          step 4:  Distroy Venc Group
         ******************************************/
        s32Ret = HI_MPI_VENC_DestroyGroup(veGrp);
        if (HI_SUCCESS != s32Ret)
        {
                ZK_PRT("HI_MPI_VENC_DestroyGroup group[%d] failed with %#x!\n",\
                                veGrp, s32Ret);
                return HI_FAILURE;
        }

        return HI_SUCCESS;
}

HI_S32 ZK_VDEC_Process(PAYLOAD_TYPE_E payloadType, enum AVPixelFormat pixFormat)
{
        ZK_PRT("Enter %s\n", __func__);
        HI_S32 s32Ret;
        SIZE_S stEncSize;
        VIDEO_MODE_E enMode = VIDEO_MODE_FRAME;

        s32Ret = initVdecInfo();
        if(s32Ret != HI_SUCCESS) {
                ZK_PRT("initVdecInfo failed!\n");
                return HI_FAILURE;
        }

        s32Ret = ZK_COMM_SYS_GetPicSize(pstVdParam->enNorm, pstVdParam->enPicSize, &stEncSize);
        if(s32Ret != HI_SUCCESS) {
                ZK_PRT("get picture size failed!\n");
                return HI_FAILURE;
        }

        /*** create vdec chn ***/
        s32Ret = ZK_VDEC_CreateVdecChn(pstVdParam->VdChn, &stEncSize, payloadType, enMode, pixFormat);
        if(s32Ret != HI_SUCCESS) {
                ZK_PRT("create vdec chn failed!\n");
                return HI_FAILURE;
        }

        /*** create vpss chn ***/
        s32Ret = ZK_COMM_VPSS_Start_1(pstVdParam->VpssGrp, &stEncSize, VPSS_MAX_CHN_NUM, HI_NULL);
        if(s32Ret != HI_SUCCESS) {
                ZK_PRT("Start Vpss failed!\n");
                return HI_FAILURE;
        }

        /*** bind vdec to vpss ***/
        s32Ret = ZK_COMM_VDEC_BindVpss(pstVdParam->VdChn, pstVdParam->VpssGrp);
        if(s32Ret != HI_SUCCESS) {
                ZK_PRT("vdec(vdch=%d) bind vpss(vpssg=%d) failed!\n", pstVdParam->VdChn, pstVdParam->VpssGrp);
                return HI_FAILURE;
        }

        /*** create venc chn ***/
        s32Ret = ZK_COMM_VENC_Start_1(pstVdParam->VeGrp, pstVdParam->VeChn, \
                        pstVdParam->enNorm, \
                        pstVdParam->enPicSize, \
                        getEnRcMode(FILM, STREAM_MAIN_INDEX), \
                        PT_H264, \
                        getEncProfile(FILM, STREAM_MAIN_INDEX), \
                        getEnFrmRate(FILM, STREAM_MAIN_INDEX), \
                        getEnFrmRate(FILM, STREAM_MAIN_INDEX), \
                        getIFrameInterval(FILM, STREAM_MAIN_INDEX), \
                        getEnBitRate(FILM, STREAM_MAIN_INDEX));
        if(s32Ret != HI_SUCCESS) {
                ZK_PRT("ZK_COMM_VENC_Start_1 failed with %#x!\n", s32Ret);
                return HI_FAILURE;
        }

        /*** bind vpss to venc ***/
        s32Ret = ZK_COMM_VENC_BindVpss(pstVdParam->VeGrp, pstVdParam->VpssGrp, VPSS_LSTR_CHN);
        if(s32Ret != HI_SUCCESS) {
                ZK_PRT("Start Venc failed!\n");
                return HI_FAILURE;
        }
        startGetVideoStream(pstVdParam->VeChn);

        return HI_SUCCESS;
}

HI_S32 ZK_VDEC_ExitProcess(HI_VOID)
{
        HI_S32 s32Ret;
        VIDEO_MODE_E enMode = VIDEO_MODE_FRAME;

        /*** destroy vdec chn ***/
        ZK_VDEC_WaitDestroyVdecChn(pstVdParam->VdChn, enMode);

        /*** destroy venc chn ***/
        ZK_VDEC_WaitDestroyVencChn(pstVdParam->VeGrp, pstVdParam->VeChn);

        s32Ret = ZK_COMM_VDEC_UnBindVpss(pstVdParam->VdChn, pstVdParam->VpssGrp);
        if(s32Ret != HI_SUCCESS) {
                ZK_PRT("vdec(vdch=%d) bind vpss(vpssg=%d) failed!\n", pstVdParam->VdChn, pstVdParam->VpssGrp);
                return HI_FAILURE;
        }

        s32Ret = ZK_COMM_VENC_UnBindVpss(pstVdParam->VeGrp, pstVdParam->VpssGrp, VPSS_LSTR_CHN);
        if (HI_SUCCESS != s32Ret) {
                ZK_PRT("Stop Venc failed!\n");
                return HI_FAILURE;
        }

        s32Ret = ZK_COMM_VPSS_Stop_1(pstVdParam->VpssGrp, VPSS_MAX_CHN_NUM);
        if(s32Ret != HI_SUCCESS) {
                ZK_PRT("Start Vpss failed!\n");
                return HI_FAILURE;
        }

        return HI_SUCCESS;
}

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-28 11:13:13
认可0
本帖最后由 ngswfx 于 2016-6-28 11:25 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32596&ptid=11713]helloworld 发表于 2016-6-28 11:03[/url]
我想问您一下,创建vdec chn需要的内存是在os上分配的还是在mmz上?从现象看是用os上分配的,因为如果创 ...[/quote]


肯定在MMZ上,你的mmz内存可比较紧张了。
/////////////////////////////////////////////////////////////////////////////
把这个代码弄出来
ZK_COMM_VDEC_MemConfig_1

估计就是SAMPLE_COMM_VDEC_ModCommPoolConf改的吧:

////////////你用的这个方法,是预先分配好的内存,只要一创建,就一直占用了。关闭的时候,就是不释放的(最起码 ZK_COMM_VDEC_MemConfig_1分配的那一大块不会释放)。如果想动态节省内存,我只知道,在load VDEC模块驱动时,加载一个参数,然后不用调用SAMPLE_COMM_VDEC_ModCommPoolConf了,看VDEC文档,上面有,比较详细。

///模块会随着VDEC 打开关闭,自己分配内存,而且销毁后,MMZ内存都能释放,海斯底层只不过开得可能会比较大,我感觉这现在用的方法适合完全固定格式的解码,自己也知道能算出来开多大内存。

你把ZK_COMM_VDEC_MemConfig_1的销毁过程做一下,试试,看内存能否释放。

///////////////////我之所以没用ZK_COMM_VDEC_MemConfig_1这种方法,是由于:我专门做解码。

某个通道从D1到2048*1536都有可能,如果用这种方法,我就只能把所有通道都搞成2048*1536的缓冲。太浪费内存了。
如果16个通道,根本就分不出来。如果采用动态的方法,由底层现用,现分配(每次分得可能稍大),应用层顶多开1-2个2048*1536.其他基本都是D1,所以比较适合我,你评估一下你的需求,看用哪种方法合适。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-06-28 11:22:10
认可0
本帖最后由 zhuangweiye 于 2016-6-28 11:24 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32590&ptid=11713]helloworld 发表于 2016-6-28 10:45[/url]
---MMZ_USE_INFO:
total size=1829888KB(1787MB),used=1639520KB(1601MB + 96KB),remain=190368KB(18 ...[/quote]

185M空余是ddr0+ddr1一起, 那么ddr0剩多少呢?

把---MMZ_USE_INFO:上面的东西自己计算一下,看看ddr0剩多少

另外楼主创建的JPEG解码通道分配在ddr0还是ddr1上?

3531是要分ddr0还是ddr1的,如果vdec通道分配在ddr0上而ddr0上MMZ没有剩余空间了,就算ddr1上有1G剩余空间也会创建失败的

顺便说一句,这应用也是够牛的1787M的MMZ用的只剩185M:L

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-28 11:26:28
认可0
本帖最后由 ngswfx 于 2016-6-28 11:28 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32599&ptid=11713]zhuangweiye 发表于 2016-6-28 11:22[/url]
185M空余是ddr0+ddr1一起, 那么ddr0剩多少呢?

把---MMZ_USE_INFO:上面的东西自己计算一下,看看ddr0 ...[/quote]

就等你来确认3531是不是分片了,要是分片算,他这个里面问题可能性又多了去了,他内存的确够费的,也吓了我一跳,估计是那个VENC和VDEC初始化mem pool开得太大了。

helloworld

0个粉丝

11

问答

0

专栏

0

资料

helloworld 2016-06-28 11:28:03
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32597&ptid=11713]ngswfx 发表于 2016-6-28 11:13[/url]
肯定在MMZ上,你的mmz内存可比较紧张了。
/////////////////////////////////////////////////// ...[/quote]


HI_S32 ZK_COMM_VDEC_MemConfig_1(VDEC_CHN vdecChn)
{
    HI_S32 s32Ret = HI_SUCCESS;

    HI_CHAR * pcMmzName;
    MPP_CHN_S stMppChnVDEC;

    stMppChnVDEC.enModId = HI_ID_VDEC;
    stMppChnVDEC.s32DevId = 0;
    stMppChnVDEC.s32ChnId = vdecChn;

    if(0 == (vdecChn%2))
    {
        pcMmzName = NULL;
    }
    else
    {
        pcMmzName = "ddr1";
    }

    s32Ret = HI_MPI_SYS_SetMemConf(&stMppChnVDEC, pcMmzName);
    if (s32Ret)
    {
        ZK_PRT("HI_MPI_SYS_SetMemConf ERR !\n");
        return HI_FAILURE;
    }

    return HI_SUCCESS;
}

其中vdecChn是0
insmod mmz.ko mmz=anonymous,0,0x90000000,762M:jpeg,0,0xBfa00000,5M:ddr1,0,0xC0000000,1020M anony=1 || report_error

如果是在mmz上,那估计ddr0剩余的不够了,多谢您,我再看看

helloworld

0个粉丝

11

问答

0

专栏

0

资料

helloworld 2016-06-28 11:28:39
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32599&ptid=11713]zhuangweiye 发表于 2016-6-28 11:22[/url]
185M空余是ddr0+ddr1一起, 那么ddr0剩多少呢?

把---MMZ_USE_INFO:上面的东西自己计算一下,看看ddr0 ...[/quote]

ddr0上面,我计算一下,谢谢

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-28 11:30:51
认可0
本帖最后由 ngswfx 于 2016-6-28 11:32 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32602&ptid=11713]helloworld 发表于 2016-6-28 11:28[/url]
ddr0上面,我计算一下,谢谢[/quote]

反正这个分片,超级烦人。怎么弄都有内存浪费,我们紧紧抠抠,在os上节省,考虑是64M还是80M,到了这个分片这,一看浪费的不行,受不少刺激。:@

第一片剩余30M,第2片剩余30M,想再分40M还没发弄了。:lol

helloworld

0个粉丝

11

问答

0

专栏

0

资料

helloworld 2016-06-28 11:36:35
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32603&ptid=11713]ngswfx 发表于 2016-6-28 11:30[/url]
反正这个分片,超级烦人。怎么弄都有内存浪费,我们紧紧抠抠,在os上节省,考虑是64M还是80M,到了这 ...[/quote]

我看了下剩余还挺多的

+---ZONE: PHYS(0xBFA00000, 0xBFEFFFFF), GFP=0, nBYTES=5120KB,   NAME="jpeg"
+---ZONE: PHYS(0x90000000, 0xBF9FFFFF), GFP=0, nBYTES=780288KB, NAME="anonymous"
   |-MMB: phys(0x90000000, 0x9000CFFF), kvirt=0x90de0000, flags=0x00000001, length=52KB,        name="higo_log"
   |-MMB: phys(0x9000D000, 0x906DCFFF), kvirt=0x  (null), flags=0x00000000, length=6976KB,      name="User"
   |-MMB: phys(0x906DD000, 0xA957EFFF), kvirt=0x  (null), flags=0x00000000, length=408200KB,    name="vb"
   |-MMB: phys(0xA957F000, 0xAFF28FFF), kvirt=0x  (null), flags=0x00000000, length=108200KB,    name="vb"
   |-MMB: phys(0xAFF29000, 0xAFF2FFFF), kvirt=0x  (null), flags=0x00000000, length=28KB,        name="vb"
   |-MMB: phys(0xAFF30000, 0xAFF36FFF), kvirt=0x  (null), flags=0x00000000, length=28KB,        name="Chnl"
   |-MMB: phys(0xAFF37000, 0xAFF38FFF), kvirt=0x  (null), flags=0x00000000, length=8KB, name="sclcoeffset"
   |-MMB: phys(0xAFF39000, 0xAFF3BFFF), kvirt=0x  (null), flags=0x00000000, length=12KB,        name="Chnl"
   |-MMB: phys(0xAFF3C000, 0xAFF42FFF), kvirt=0x  (null), flags=0x00000000, length=28KB,        name="Chnl"
   |-MMB: phys(0xAFF43000, 0xAFF4BFFF), kvirt=0x  (null), flags=0x00000000, length=36KB,        name="VoCoef"
   |-MMB: phys(0xAFF4C000, 0xAFF53FFF), kvirt=0x  (null), flags=0x00000000, length=32KB,        name="IVE_QUEUE"
   |-MMB: phys(0xAFF54000, 0xAFF5BFFF), kvirt=0x  (null), flags=0x00000000, length=32KB,        name="IVE_QUEUE"
   |-MMB: phys(0xAFF5C000, 0xAFF87FFF), kvirt=0x  (null), flags=0x00000000, length=176KB,       name="Ref&Mad buf"
   |-MMB: phys(0xAFF88000, 0xAFF88FFF), kvirt=0x  (null), flags=0x00000000, length=4KB, name="HistRd buf"
   |-MMB: phys(0xAFF89000, 0xB007EFFF), kvirt=0x  (null), flags=0x00000000, length=984KB,       name="model buf"
   |-MMB: phys(0xB007F000, 0xB00AAFFF), kvirt=0x  (null), flags=0x00000000, length=176KB,       name="Ref&Mad buf"
   |-MMB: phys(0xB00AB000, 0xB00ABFFF), kvirt=0x  (null), flags=0x00000000, length=4KB, name="HistRd buf"
   |-MMB: phys(0xB00AC000, 0xB01A1FFF), kvirt=0x  (null), flags=0x00000000, length=984KB,       name="model buf"
   |-MMB: phys(0xB01A2000, 0xB080FFFF), kvirt=0x  (null), flags=0x00000000, length=6584KB,      name="Ref&Mad buf"
   |-MMB: phys(0xB0810000, 0xB0810FFF), kvirt=0x  (null), flags=0x00000000, length=4KB, name="HistRd buf"
   |-MMB: phys(0xB0811000, 0xB0906FFF), kvirt=0x  (null), flags=0x00000000, length=984KB,       name="model buf"
   |-MMB: phys(0xB0907000, 0xB090CFFF), kvirt=0x  (null), flags=0x00000000, length=24KB,        name="h264e0_Ct"
   |-MMB: phys(0xB090D000, 0xB0F06FFF), kvirt=0x  (null), flags=0x00000000, length=6120KB,      name="vb"
   |-MMB: phys(0xB0F07000, 0xB12FDFFF), kvirt=0x  (null), flags=0x00000000, length=4060KB,      name="h264e0_Str"
   |-MMB: phys(0xB12FE000, 0xB1303FFF), kvirt=0x  (null), flags=0x00000000, length=24KB,        name="h264e2_Ct"
   |-MMB: phys(0xB1304000, 0xB18FDFFF), kvirt=0x  (null), flags=0x00000000, length=6120KB,      name="vb"
   |-MMB: phys(0xB18FE000, 0xB1CF4FFF), kvirt=0x  (null), flags=0x00000000, length=4060KB,      name="h264e2_Str"
   |-MMB: phys(0xB1CF5000, 0xB2362FFF), kvirt=0x  (null), flags=0x00000000, length=6584KB,      name="Ref&Mad buf"
   |-MMB: phys(0xB2363000, 0xB2363FFF), kvirt=0x  (null), flags=0x00000000, length=4KB, name="HistRd buf"
   |-MMB: phys(0xB2364000, 0xB2459FFF), kvirt=0x  (null), flags=0x00000000, length=984KB,       name="model buf"
   |-MMB: phys(0xB245A000, 0xB245FFFF), kvirt=0x  (null), flags=0x00000000, length=24KB,        name="h264e4_Ct"
   |-MMB: phys(0xB2460000, 0xB2A59FFF), kvirt=0x  (null), flags=0x00000000, length=6120KB,      name="vb"
   |-MMB: phys(0xB2A5A000, 0xB2E50FFF), kvirt=0x  (null), flags=0x00000000, length=4060KB,      name="h264e4_Str"
   |-MMB: phys(0xB2E51000, 0xB34BEFFF), kvirt=0x  (null), flags=0x00000000, length=6584KB,      name="Ref&Mad buf"
   |-MMB: phys(0xB34BF000, 0xB34BFFFF), kvirt=0x  (null), flags=0x00000000, length=4KB, name="HistRd buf"
   |-MMB: phys(0xB34C0000, 0xB35B5FFF), kvirt=0x  (null), flags=0x00000000, length=984KB,       name="model buf"
   |-MMB: phys(0xB35B6000, 0xB3C23FFF), kvirt=0x  (null), flags=0x00000000, length=6584KB,      name="Ref&Mad buf"
   |-MMB: phys(0xB3C24000, 0xB3C24FFF), kvirt=0x  (null), flags=0x00000000, length=4KB, name="HistRd buf"
   |-MMB: phys(0xB3C25000, 0xB3D1AFFF), kvirt=0x  (null), flags=0x00000000, length=984KB,       name="model buf"
   |-MMB: phys(0xB3D1B000, 0xB4388FFF), kvirt=0x  (null), flags=0x00000000, length=6584KB,      name="Ref&Mad buf"
   |-MMB: phys(0xB4389000, 0xB4389FFF), kvirt=0x  (null), flags=0x00000000, length=4KB, name="HistRd buf"
   |-MMB: phys(0xB438A000, 0xB447FFFF), kvirt=0x  (null), flags=0x00000000, length=984KB,       name="model buf"
   |-MMB: phys(0xB4480000, 0xB44BFFFF), kvirt=0x  (null), flags=0x00000000, length=256KB,       name="AODMA"
   |-MMB: phys(0xB44C0000, 0xB44C5FFF), kvirt=0x  (null), flags=0x00000000, length=24KB,        name="h264e14_Ct"
   |-MMB: phys(0xB44C6000, 0xB4ABFFFF), kvirt=0x  (null), flags=0x00000000, length=6120KB,      name="vb"
   |-MMB: phys(0xB4AC0000, 0xB4EB6FFF), kvirt=0x  (null), flags=0x00000000, length=4060KB,      name="h264e14_Str"
   |-MMB: phys(0xB4EB7000, 0xB4EBAFFF), kvirt=0x  (null), flags=0x00000000, length=16KB,        name="AIDMA"
   |-MMB: phys(0xB4EBB000, 0xB4F32FFF), kvirt=0x  (null), flags=0x00000000, length=480KB,       name="vb"
   |-MMB: phys(0xB4F33000, 0xB60FFFFF), kvirt=0x  (null), flags=0x00000000, length=18228KB,     name="vb"
   |-MMB: phys(0xB6100000, 0xB618FFFF), kvirt=0x  (null), flags=0x00000000, length=576KB,       name="vfmw_hal_0"
   |-MMB: phys(0xB6190000, 0xB621FFFF), kvirt=0x  (null), flags=0x00000000, length=576KB,       name="vfmw_hal_1"
   |-MMB: phys(0xB6220000, 0xB623FFFF), kvirt=0x  (null), flags=0x00000000, length=128KB,       name="vfmw_scd_msg"
   |-MMB: phys(0xB6240000, 0xB6247FFF), kvirt=0x  (null), flags=0x00000000, length=32KB,        name="vfmw_tracer"


0xBF9FFFFF - 0xB6247FFF 大概150M?

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-28 11:43:00
认可0
本帖最后由 ngswfx 于 2016-6-28 11:49 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32606&ptid=11713]helloworld 发表于 2016-6-28 11:36[/url]
我看了下剩余还挺多的

+---ZONE: PHYS(0xBFA00000, 0xBFEFFFFF), GFP=0, nBYTES=5120KB,   NAME="jpeg ...[/quote]

  |-MMB: phys(0x906DD000, 0xA957EFFF), kvirt=0x  (null), flags=0x00000000, length=408200KB,    name="vb"
   |-MMB: phys(0xA957F000, 0xAFF28FFF), kvirt=0x  (null), flags=0x00000000, length=108200KB,    name="vb"
////////////内存大户呀,看着羡慕。

helloworld

0个粉丝

11

问答

0

专栏

0

资料

helloworld 2016-06-28 11:44:40
认可0
哈哈,内存大都分配给vb了,确实挺费的,分配少了老是报获取vb失败,索性给它分配大一些,反正2G的内存,不用的话放在那里也是浪费

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-28 11:49:33
认可0
本帖最后由 ngswfx 于 2016-6-28 11:56 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32610&ptid=11713]helloworld 发表于 2016-6-28 11:44[/url]
哈哈,内存大都分配给vb了,确实挺费的,分配少了老是报获取vb失败,索性给它分配大一些,反正2G的内存,不 ...[/quote]

你把这个分VB代码弄上来,看看,难道个数不够?

你这个用来做什么呀,怎么又ENC,又VDEC的。VENC多少个通道,什么分辨率,VDEC多少个通道,什么分辨率?

你报错的时候,只分了一个通道就报错了?

helloworld

0个粉丝

11

问答

0

专栏

0

资料

helloworld 2016-06-28 11:58:03
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32609&ptid=11713]ngswfx 发表于 2016-6-28 11:43[/url]
|-MMB: phys(0x906DD000, 0xA957EFFF), kvirt=0x  (null), flags=0x00000000, length=408200KB,    nam ...[/quote]

通道为0啊,就是用的ddr0,还是会报错
[ZK_VDEC_Process]-228: Enter ZK_VDEC_Process
vmap allocation for size 41783296 failed: use vmalloc= to increase size.
[ZK_VDEC_CreateVdecChn]-65: pixFormat: 14
[ZK_VDEC_CreateVdecChn]-92: HI_MPI_VDEC_CreateChn failed errno 0xa005800c
[ZK_VDEC_Process]-248: create vdec chn failed!

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-06-28 12:32:56
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32615&ptid=11713]helloworld 发表于 2016-6-28 11:58[/url]
通道为0啊,就是用的ddr0,还是会报错
[ZK_VDEC_Process]-228: Enter ZK_VDEC_Process
vmap allocation ...[/quote]

好吧,我认输

我的意思是让楼主看一下ddr0和dd1的MMZ的使用情况

举例说明
cat /proc/media-mem可以得到MMZ的信息
看几个点(具体数值和楼主肯定不一样,只是例子而已)
1。+---ZONE: PHYS(0xC0000000, 0xCFFFFFFF), GFP=0, nBYTES=262144KB, NAME="ddr1"
这个是ddr1的总的大小和起始结束地址
2。+---ZONE: PHYS(0x86900000, 0x8FFFFFFF), GFP=0, nBYTES=154624KB, NAME="anonymous"
这个是ddr0的总的大小和起始结束地址
3。2的上面一行
   |-MMB: phys(0xCD0C7000, 0xCD0C8FFF), kvirt=0x  (null), flags=0x00000000, length=8KB, name="Vdec2_UsrBuf"
表示ddr1上最后一块MMZ的信息,也就是说0xCD0C9000- 0xCFFFFFFF是空余的
4。同样可以看到
   |-MMB: phys(0x8C255000, 0x8C268FFF), kvirt=0x  (null), flags=0x00000000, length=80KB,        name="RgnPinPon"
表示ddr0上最后一块MMZ的信息,也就是说0x8C269000- 0x8FFFFFFF是空余的

那么楼主的是多少呢?

helloworld

0个粉丝

11

问答

0

专栏

0

资料

helloworld 2016-06-28 13:25:39
认可0
本帖最后由 helloworld 于 2016-6-28 14:12 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32613&ptid=11713]ngswfx 发表于 2016-6-28 11:49[/url]
你把这个分VB代码弄上来,看看,难道个数不够?

你这个用来做什么呀,怎么又ENC,又VDEC的。V ...[/quote]

做的应用比较复杂,一个芯片上用到了5路1080p+4路960h编码,1路1080p解码,8路图像预览,7路1080p录像,解码是为了给录像文件加入片头片尾。vb的代码:

static HI_VOID varInit(HI_VOID)
{
        HI_S32 blkCnt_ddr0 = 0, blkCnt_ddr1 = 0;

        memset(&pMediaInfo->stVbConf, 0, sizeof(VB_CONF_S));

        pMediaInfo->u32BlkSize = ZK_COMM_SYS_CalcPicVbBlkSize(VIDEO_ENCODING_MODE_PAL, PIC_HD1080, pMediaInfo->enPixelFmt, ZK_SYS_ALIGN_WIDTH);
        HI_U32 u32BlkSize_Minor = ZK_COMM_SYS_CalcPicVbBlkSize(VIDEO_ENCODING_MODE_PAL, PIC_960H, pMediaInfo->enPixelFmt, ZK_SYS_ALIGN_WIDTH);

        pMediaInfo->stVbConf.u32MaxPoolCnt = 128;
        blkCnt_ddr0 = VI_CHN_CNT * 20;   // VI_CHN_CNT 为5
        blkCnt_ddr1 = VI_CHN_CNT * 30;

        /*ddr0 video buffer*/
        pMediaInfo->stVbConf.astCommPool[0].u32BlkSize = pMediaInfo->u32BlkSize;
        pMediaInfo->stVbConf.astCommPool[0].u32BlkCnt = blkCnt_ddr0;
        memset(pMediaInfo->stVbConf.astCommPool[0].acMmzName,0,
                        sizeof(pMediaInfo->stVbConf.astCommPool[0].acMmzName));

        /*ddr0 hist buf*/
        pMediaInfo->stVbConf.astCommPool[1].u32BlkSize = u32BlkSize_Minor;
        pMediaInfo->stVbConf.astCommPool[1].u32BlkCnt = blkCnt_ddr0;
        memset(pMediaInfo->stVbConf.astCommPool[1].acMmzName,0,
                        sizeof(pMediaInfo->stVbConf.astCommPool[1].acMmzName));

        /*ddr0 video buffer*/
        pMediaInfo->stVbConf.astCommPool[2].u32BlkSize = (196*4);
        pMediaInfo->stVbConf.astCommPool[2].u32BlkCnt = 10;
        memset(pMediaInfo->stVbConf.astCommPool[2].acMmzName,0,
                        sizeof(pMediaInfo->stVbConf.astCommPool[2].acMmzName));

        /*ddr1 video buffer*/
        pMediaInfo->stVbConf.astCommPool[3].u32BlkSize = pMediaInfo->u32BlkSize;
        pMediaInfo->stVbConf.astCommPool[3].u32BlkCnt = blkCnt_ddr1;
        strcpy(pMediaInfo->stVbConf.astCommPool[3].acMmzName,"ddr1");

        /*ddr1 hist buf*/
        pMediaInfo->stVbConf.astCommPool[4].u32BlkSize = u32BlkSize_Minor;
        pMediaInfo->stVbConf.astCommPool[4].u32BlkCnt = blkCnt_ddr1;
        strcpy(pMediaInfo->stVbConf.astCommPool[4].acMmzName,"ddr1");

        /*ddr1 video buffer*/
        pMediaInfo->stVbConf.astCommPool[5].u32BlkSize = (196*4);
        pMediaInfo->stVbConf.astCommPool[5].u32BlkCnt = 16;
        strcpy(pMediaInfo->stVbConf.astCommPool[5].acMmzName,"ddr1");

        /*ddr1 video buffer*/
        pMediaInfo->stVbConf.astCommPool[6].u32BlkSize = ZK_PCIV_VENC_STREAM_BUF_LEN;
        pMediaInfo->stVbConf.astCommPool[6].u32BlkCnt = 1;
        strcpy(pMediaInfo->stVbConf.astCommPool[6].acMmzName,"ddr1");
}

helloworld

0个粉丝

11

问答

0

专栏

0

资料

helloworld 2016-06-28 13:31:45
认可0
本帖最后由 helloworld 于 2016-6-28 13:34 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32623&ptid=11713]zhuangweiye 发表于 2016-6-28 12:32[/url]
好吧,我认输

我的意思是让楼主看一下ddr0和dd1的MMZ的使用情况
[/quote]

您好,我12楼算过了啊,ddr0剩余150M,ddr1剩余30M

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-28 13:39:10
认可0
本帖最后由 ngswfx 于 2016-6-28 13:45 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32625&ptid=11713]helloworld 发表于 2016-6-28 13:25[/url]
做的应用比较复杂,是两个芯片级联的,一个芯片上用到了5路1080p+4路960h编码,1路1080p解码,8路图像预 ...[/quote]

VDEC_CHN_ATTR_S结构体的u32BufSize = 1920 * 1080 * 3;也就是6220800字节

一个buff是6M多,vb创建时,一个buff是1920*1080*2。

这2个buff啥关系 ,zhuangweiye解答吧,我也不懂,感觉这里需要明确一下。如果VDEC 在开始没有分配够尺寸的话,应该仅仅解码失败,而不应该报那个错。


//////////////另外
|-MMB: phys(0x906DD000, 0xA957EFFF), kvirt=0x  (null), flags=0x00000000, length=408200KB,    name="vb"感觉没对呀,你的VB[0]个数是100个,每一个如果是1920*1080*2都414M了,看来你的:
pMediaInfo->u32BlkSize = ZK_COMM_SYS_CalcPicVbBlkSize(VIDEO_ENCODING_MODE_PAL, PIC_HD1080, pMediaInfo->enPixelFmt, ZK_SYS_ALIGN_WIDTH);应该是1920*1080*3/2的或者更小的。

////////////////

helloworld

0个粉丝

11

问答

0

专栏

0

资料

helloworld 2016-06-28 13:42:47
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32628&ptid=11713]ngswfx 发表于 2016-6-28 13:39[/url]
VDEC_CHN_ATTR_S结构体的u32BufSize = 1920 * 1080 * 3;也就是6220800字节

一个buff是6M多,vb创建 ...[/quote]

VDEC_CHN_ATTR_S结构体的u32BufSize = 1920 * 1080 * 3; 这里*3改成*2了
加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区