LA 4329 Ping pong

本文介绍了一种解决特定计数问题的算法实现,通过计算每个元素左侧和右侧比其大的元素数量,来确定所有可能的组合方式总数。使用线段树和前缀和等数据结构提高效率。

训练指南 P197 例题

    扫描一下所有的i,计算出从1到i-1有多少个数比它大,和从i+1到n有多少个数比它大。

    然后就是交叉相乘算出总的方案数。

#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 120000
using namespace std;
long long a[21000];
long long l[21000],r[21000];
long long bit[120000];
long long lowbit(long long x)
{
    return x&(-x);
}
bool add(long long x,long long v)
{
    while (x <= INF)
    {
        bit[x]+=v;
        x+=lowbit(x);
    }
}
long long sum(long long x)
{
    long long res;
    res=0;
    while (x > 0)
    {
        res+=bit[x];
        x-=lowbit(x);
    }
    return res;
}
int main()
{
    long long prob,i,n,j,ans;
    scanf("%lld",&prob);
    while (prob--)
    {
        scanf("%lld",&n);
        for (i=1; i<=n; i++)
            scanf("%lld",a+i);
        memset(bit,0,sizeof(bit));
        add(a[1],1);
        for (i=2; i<=n; i++)
        {
            l[i]=sum(a[i]);
            add(a[i],1);
        }
        memset(bit,0,sizeof(bit));
        add(a[n],1);
        for (i=n-1; i>=1; i--)
        {
            r[i]=(n-i)-sum(a[i]);
            add(a[i],1);
        }
        ans=0;
        for (i=1; i<=n; i++)
        {
            ans+=(i-1-l[i])*(n-i-r[i])+l[i]*r[i];
        }
        printf("%lld\n",ans);
    }
}


HD_RESULT mem_init(void) { HD_RESULT ret; HD_COMMON_MEM_INIT_CONFIG mem_cfg = {0}; #ifdef DLA_SUPPORT int model_size = 0; #endif #if defined(DLA_SUPPORT) || defined(DUAL_SENSOR) || defined(SENSOR_RESOLUTION_8MP) || defined(SENSOR_RESOLUTION_5MP) \ || defined(AIISP_ENABLED) || defined(SENSOR_RESOLUTION_4MP) || defined(SENSOR_RESOLUTION_12MP) || defined(MEDIA_PIPELINE_BASE_PTZ5425) int index = 0; #endif #ifdef BINOCULOR_AVS int i = 0; int vsp_dev_cnt = MAX_STICHING_CHN_CNT; int vsp_src_cnt = MIN_AVS_SRC_CHAN_NUM; int max_ovlp_width = 0; #endif // config common pool (main) mem_cfg.pool_info[0].type = HD_COMMON_MEM_COMMON_POOL; // 双目拼接机型需要使用左右目YUV420原图做色差校正检验(产测模式)和自动拼接,不压缩 #ifdef BINOCULOR_AVS mem_cfg.pool_info[0].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(ALIGN_CEIL_16(VDO_SIZE_W), ALIGN_CEIL_16(VDO_SIZE_H), HD_VIDEO_PXLFMT_YUV420); // align to 16 for rotate buffer #else if (YUV_COMPRESS_ENABLE == 1) { mem_cfg.pool_info[0].blk_size = DBGINFO_BUFSIZE()+VDO_NVX_BUFSIZE(ALIGN_CEIL_16(VDO_SIZE_W), ALIGN_CEIL_16(VDO_SIZE_H), HD_VIDEO_PXLFMT_YUV420); // align to 16 for rotate buffer } else { mem_cfg.pool_info[0].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(ALIGN_CEIL_16(VDO_SIZE_W), ALIGN_CEIL_16(VDO_SIZE_H), HD_VIDEO_PXLFMT_YUV420); // align to 16 for rotate buffer } #endif #ifdef DUAL_SENSOR mem_cfg.pool_info[0].blk_cnt = 5; #else mem_cfg.pool_info[0].blk_cnt = 1; #endif #ifdef HDR_MODE_SUPPORT if (g_hdr_enabled) { mem_cfg.pool_info[0].blk_cnt += 1; } #endif #ifdef AIISP_ENABLED mem_cfg.pool_info[0].blk_cnt += 2; #endif #ifdef SENSOR_RESOLUTION_8MP mem_cfg.pool_info[0].blk_cnt = 3; #elif defined SENSOR_RESOLUTION_12MP mem_cfg.pool_info[0].blk_cnt = 3; #elif defined SENSOR_RESOLUTION_5MP mem_cfg.pool_info[0].blk_cnt = 2; #elif defined MEDIA_PIPELINE_BASE_PTZ5425 mem_cfg.pool_info[0].blk_cnt = 3; #endif #ifdef BINOCULOR_AVS mem_cfg.pool_info[0].blk_cnt += (3 * vsp_src_cnt); #endif mem_cfg.pool_info[0].ddr_id = DDR_ID0; // config common pool (sub) mem_cfg.pool_info[1].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[1].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(ALIGN_CEIL_16(SUB_VDO_SIZE_W), ALIGN_CEIL_16(SUB_VDO_SIZE_H), HD_VIDEO_PXLFMT_YUV420); // align to 16 for rotate buffer #ifdef DUAL_SENSOR mem_cfg.pool_info[1].blk_cnt = 6; #elif MEDIA_PIPELINE_BASE_PTZ5425 mem_cfg.pool_info[1].blk_cnt = 4; #else mem_cfg.pool_info[1].blk_cnt = 4; #endif mem_cfg.pool_info[1].ddr_id = DDR_ID0; // TODO:if needed // config common pool (jpeg) mem_cfg.pool_info[2].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[2].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(ALIGN_CEIL_16(JPEG_VDO_SIZE_W), ALIGN_CEIL_16(JPEG_VDO_SIZE_H), HD_VIDEO_PXLFMT_YUV420); #if (defined SENSOR_RESOLUTION_4MP || defined SENSOR_RESOLUTION_8MP || defined SENSOR_RESOLUTION_12MP) && (defined HDR_MODE_SUPPORT) if (g_hdr_enabled) { mem_cfg.pool_info[2].blk_cnt = 2; } else { mem_cfg.pool_info[2].blk_cnt = 1; } #else mem_cfg.pool_info[2].blk_cnt = 1; #endif mem_cfg.pool_info[2].ddr_id = DDR_ID0; /* 由于人脸抓拍的处理耗时较久,因此识别流通道及其扩展通道JPEG需要加大一块缓存,防止get blk failed */ if(g_face_enabled) { mem_cfg.pool_info[2].blk_cnt += 1; } // config common pool (divp) mem_cfg.pool_info[3].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[3].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(ISP_FRAME_WIDTH, ISP_FRAME_HEIGHT, HD_VIDEO_PXLFMT_YUV420); #ifdef DUAL_SENSOR mem_cfg.pool_info[3].blk_cnt = 2; #else mem_cfg.pool_info[3].blk_cnt = 1; #endif mem_cfg.pool_info[3].ddr_id = DDR_ID0; // user pool for ao mem_cfg.pool_info[4].type = HD_COMMON_MEM_USER_POOL_BEGIN; mem_cfg.pool_info[4].blk_size = 0x1000; mem_cfg.pool_info[4].blk_cnt = 1; mem_cfg.pool_info[4].ddr_id = DDR_ID0; #ifdef DUAL_SENSOR // config common pool (osg--main-time) mem_cfg.pool_info[5].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[5].blk_size = get_stampsize(STRM_ID_MAIN,1); mem_cfg.pool_info[5].blk_cnt = 2; mem_cfg.pool_info[5].ddr_id = DDR_ID0; // config common pool (osg--main) mem_cfg.pool_info[6].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[6].blk_size = get_stampsize(STRM_ID_MAIN,0); mem_cfg.pool_info[6].blk_cnt = 6; mem_cfg.pool_info[6].ddr_id = DDR_ID0; // config common pool (osg--minor-time) mem_cfg.pool_info[7].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[7].blk_size = get_stampsize(STRM_ID_MINOR,1); mem_cfg.pool_info[7].blk_cnt = 2; mem_cfg.pool_info[7].ddr_id = DDR_ID0; // config common pool (osg--minor) mem_cfg.pool_info[8].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[8].blk_size = get_stampsize(STRM_ID_MINOR,0); mem_cfg.pool_info[8].blk_cnt = 6; mem_cfg.pool_info[8].ddr_id = DDR_ID0; #else mem_cfg.pool_info[5].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[5].blk_size = get_stampsize(STRM_ID_MAIN,1); mem_cfg.pool_info[5].blk_cnt = 1; mem_cfg.pool_info[5].ddr_id = DDR_ID0; // config common pool (osg--main) mem_cfg.pool_info[6].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[6].blk_size = get_stampsize(STRM_ID_MAIN,0); /*OSD PTZ显示需额外占用一个内存块*/ #ifdef SUPPORT_PTZ_OSD mem_cfg.pool_info[6].blk_cnt = 4; #else mem_cfg.pool_info[6].blk_cnt = 3; #endif mem_cfg.pool_info[6].ddr_id = DDR_ID0; // config common pool (osg--minor-time) mem_cfg.pool_info[7].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[7].blk_size = get_stampsize(STRM_ID_MINOR,1); mem_cfg.pool_info[7].blk_cnt = 1; mem_cfg.pool_info[7].ddr_id = DDR_ID0; // config common pool (osg--minor) mem_cfg.pool_info[8].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[8].blk_size = get_stampsize(STRM_ID_MINOR,0); /*OSD PTZ显示需额外占用一个内存块*/ #ifdef SUPPORT_PTZ_OSD mem_cfg.pool_info[8].blk_cnt = 4; #else mem_cfg.pool_info[8].blk_cnt = 3; #endif mem_cfg.pool_info[8].ddr_id = DDR_ID0; #endif // config common pool mem_cfg.pool_info[9].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[9].blk_size = 0x38C0; mem_cfg.pool_info[9].blk_cnt = 4; mem_cfg.pool_info[9].ddr_id = DDR_ID0; #if defined(DUAL_SENSOR) || defined(SENSOR_RESOLUTION_8MP) || defined(SENSOR_RESOLUTION_5MP) \ || defined(AIISP_ENABLED) || defined(SENSOR_RESOLUTION_4MP) || defined(SENSOR_RESOLUTION_12MP) || defined(MEDIA_PIPELINE_BASE_PTZ5425) index = 10; #endif #ifdef DLA_SUPPORT // config common pool (dla) mem_cfg.pool_info[10].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[10].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(DLA_FRAME_WIDTH, DLA_FRAME_HEIGHT, HD_VIDEO_PXLFMT_YUV420); #ifdef DUAL_SENSOR mem_cfg.pool_info[10].blk_cnt = 2; #elif defined SENSOR_RESOLUTION_8MP mem_cfg.pool_info[10].blk_cnt = 2; #elif defined SENSOR_RESOLUTION_12MP mem_cfg.pool_info[10].blk_cnt = 2; #elif defined MEDIA_PIPELINE_BASE_PTZ5425 mem_cfg.pool_info[10].blk_cnt = 1; #else mem_cfg.pool_info[10].blk_cnt = 1; #endif mem_cfg.pool_info[10].ddr_id = DDR_ID0; index = 11; //模型加载 #define UTILS_MAX(a, b) (((a) > (b)) * (a) + ((a) <= (b)) * (b)) int size_0 = _getsize_model(OBJ_DET_MODEL_FILE_NAME); int size_90 = _getsize_model(OBJ_DET_MODEL_FILE_NAME_90); int size_270 = _getsize_model(OBJ_DET_MODEL_FILE_NAME_270); int size_fd_0 = _getsize_model(OBJ_DET_MODEL_FILE_NAME_FD); int size_fd_90 = _getsize_model(OBJ_DET_MODEL_FILE_NAME_FD_90); int size_fd_270 = _getsize_model(OBJ_DET_MODEL_FILE_NAME_FD_270); int max_blk_size = UTILS_MAX(size_0, size_90); max_blk_size = UTILS_MAX(max_blk_size, size_270); max_blk_size = UTILS_MAX(max_blk_size, size_fd_0); max_blk_size = UTILS_MAX(max_blk_size, size_fd_90); max_blk_size = UTILS_MAX(max_blk_size, size_fd_270); printf("**************** max_blk_size:%d *****************", max_blk_size); model_size = max_blk_size; if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } /* 通过宏确定能加载的人头最大模型大小, 按照最大申请 */ int size_head0 = _getsize_model(HEAD_DET_MODEL_FILE_NAME); int size_head90 = _getsize_model(HEAD_DET_MODEL_FILE_NAME_90); int max_head_blk_size = size_head0 > size_head90 ? size_head0 : size_head90; model_size = max_head_blk_size; if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } model_size = _getsize_model(PCLS_MODEL_FILE_NAME); if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } #ifdef DLA_REC_STREAM_SUPPORT if (g_people_enabled) { //PR model_size = _getsize_model(PR_MODEL_FILE_NAME); if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } //PKP model_size = _getsize_model(PKP_MODEL_FILE_NAME); if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } } if (g_vehicle_enabled) { //VTC model_size = _getsize_model(VTC_MODEL_FILE_NAME); if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } } #endif #ifdef DLA_FSS_SUPPORT if (g_face_enabled) { model_size = _getsize_model(FACE_REC_MODEL_FILE_NAME); if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } model_size = _getsize_model(FACE_LANDMARK_MODE_FILE_NAME); if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } } #endif #ifdef VENC_YUV2JPG_SUPPORT if (g_face_enabled || g_people_enabled || g_vehicle_enabled || g_head_detection_enabled) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(VENC_JPEG_MAX_WIDTH, VENC_JPEG_MAX_HEIGHT, HD_VIDEO_PXLFMT_YUV420); mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } #endif #ifdef DLA_REC_STREAM_SUPPORT if (g_face_enabled || g_people_enabled || g_vehicle_enabled) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(DLA_REC_FRAME_WIDTH, DLA_REC_FRAME_HEIGHT, HD_VIDEO_PXLFMT_YUV420); mem_cfg.pool_info[index].blk_cnt = 2;/* 1个block用于识别流,1个block用于jpeg扩展通道, 由于JPEG的实际帧率较低,可以视为基本上不占用 */ mem_cfg.pool_info[index].ddr_id = DDR_ID0; } /* 由于人脸抓拍的处理耗时较久,因此识别流通道及其扩展通道JPEG需要加大一块缓存,防止get blk failed */ if(g_face_enabled) { mem_cfg.pool_info[index].blk_cnt += 1; } index++; #endif #endif #ifdef DUAL_SENSOR // config common pool (cap) mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_RAW_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 2; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #endif #if (defined SENSOR_RESOLUTION_8MP) || (defined SENSOR_RESOLUTION_12MP) // config common pool (cap) mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_RAW_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 3; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_NRX_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 3; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #endif #ifdef SENSOR_RESOLUTION_5MP // config common pool (cap) mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_RAW_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 2; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; if(g_hdr_enabled) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_NRX_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 2; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } #endif #ifdef MEDIA_PIPELINE_BASE_PTZ5425 // config common pool (cap) mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_RAW_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 2; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; if(g_hdr_enabled) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_RAW_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 2; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } #endif #if defined(SENSOR_RESOLUTION_4MP) || defined(BINOCULOR_AVS) /*dram mode*/ mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_RAW_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 0; #ifdef SENSOR_RESOLUTION_4MP // 如果是其他分辨率的拼接情况,此处就不用再加了。 mem_cfg.pool_info[index].blk_cnt = 3; #endif #ifdef BINOCULOR_AVS // vsp in,及双目rawall pipe out(depth=1) mem_cfg.pool_info[index].blk_cnt += (3 * vsp_src_cnt); #endif mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #endif #ifdef BINOCULOR_AVS // vsp out -- 拼接完成的尺寸,vprc、venc mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(ALIGN_CEIL_16(VSP_VPE_OUT_W_0 + VSP_VPE_OUT_W_1 - AVS_OVERLAP_W_0), VDO_SIZE_H, HD_VIDEO_PXLFMT_YUV420); mem_cfg.pool_info[index].blk_cnt = 6; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; // vsp scl out -- 拼接完成后gfx scale的尺寸 mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(ALIGN_CEIL_16(AVS_SCL_OUT_DEF_W), AVS_SCL_OUT_DEF_H, HD_VIDEO_PXLFMT_YUV420); mem_cfg.pool_info[index].blk_cnt = 6; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; // dre fusion buffer for (i = 0; i < vsp_src_cnt; i ++) { if (vsp_ovlp_w[i]) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = 2 * VDO_YUV_BUFSIZE(vsp_ovlp_w[i], AVS_OVERLAP_H, HD_VIDEO_PXLFMT_Y8); mem_cfg.pool_info[index].blk_cnt = vsp_dev_cnt * 6; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } } // DRE working buffer max_ovlp_width = MAX_VAL(MAX_VAL(MAX_VAL(vsp_ovlp_w[0], vsp_ovlp_w[1]),vsp_ovlp_w[2]),vsp_ovlp_w[3]); mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = MAX_AVS_SRC_CHAN_NUM * ALIGN_CEIL_16(max_ovlp_width) * AVS_OVERLAP_H; mem_cfg.pool_info[index].blk_cnt = vsp_dev_cnt; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #endif // config common pool (cap) mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_RAW_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); #ifdef AIISP_ENABLED mem_cfg.pool_info[index].blk_cnt = 6; /*todo: 暂定6块,实际需要根据测试情况减少*/ #else mem_cfg.pool_info[index].blk_cnt = 2; #endif mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; /* BNR */ if (g_is_nt98539a) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = vendor_common_mem_calc_max_buf_size(VDO_SIZE_W, VDO_SIZE_H, BNR_OUT_FMT); // NOTE: dim need align to 16 for rotate buffer mem_cfg.pool_info[index].blk_cnt = 4; /*todo*/ #ifdef BINOCULOR_AVS mem_cfg.pool_info[index].blk_cnt *= 2; #endif mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = vendor_common_mem_calc_max_buf_size(VDO_SIZE_W, VDO_SIZE_H, BNR_REF_FMT); // NOTE: dim need align to 16 for rotate buffer mem_cfg.pool_info[index].blk_cnt = 3; /*todo*/ #ifdef BINOCULOR_AVS mem_cfg.pool_info[index].blk_cnt *= 2; #endif mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #ifdef AIISP_ENABLED mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_AIDED_MAP_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, HD_VIDEO_PXLFMT_RAW12); // NOTE: dim need align to 16 for rotate buffer mem_cfg.pool_info[index].blk_cnt = 2; /*todo*/ mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_AIDED_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, HD_VIDEO_PXLFMT_RAW12); // NOTE: dim need align to 16 for rotate buffer mem_cfg.pool_info[index].blk_cnt = 3; /*todo*/ mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #endif } UINT32 md_buf_size = 0; #if 1 // MD #define MD_HEAD_BUFSIZE() (0x40) // Note , the md info w, h is vprc input w, h not out w, h #define MD_INFO_BUFSIZE(w, h) (ALIGN_CEIL_64((((w + 511) >> 9) << 2) * ((h + 15) >> 4))) md_buf_size = MD_HEAD_BUFSIZE() + MD_INFO_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H); #endif // config common pool (main) mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, HD_VIDEO_PXLFMT_YUV420)+md_buf_size; mem_cfg.pool_info[index].blk_cnt = 3; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #ifdef JPEG_SEPERATE_OSD /*config commom pool osg--peg, jpeg不使用pingpong buffer,所以不单独给时间osd分配两倍内存*/ mem_cfg.pool_info[index].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[index].blk_size = get_stampsize(STRM_ID_JPEG,0); mem_cfg.pool_info[index].blk_cnt = 4; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #endif ret = hd_common_mem_init(&mem_cfg); return ret; }
09-29
// 在 BINOCULOR_AVS 和 AIISP_ENABLED 共存时,修正内存池叠加逻辑 // 修改点1:AIISP_ENABLED的blk_cnt叠加应使用增量方式 // 修改前:mem_cfg.pool_info[index].blk_cnt = 6;(覆盖式赋值) // 修改后: #ifdef AIISP_ENABLED mem_cfg.pool_info[index].blk_cnt = 6; /*基础值*/ // 追加双目模式的叠加 #ifdef BINOCULOR_AVS mem_cfg.pool_info[index].blk_cnt += (3 * vsp_src_cnt); #endif #else // 保留原有非AIISP逻辑 #ifdef BINOCULOR_AVS mem_cfg.pool_info[index].blk_cnt = 3 * vsp_src_cnt; #else mem_cfg.pool_info[index].blk_cnt = 2; #endif #endif // 修改点2:index变量管理优化 // 在 BINOCULOR_AVS 代码块末尾增加防御性判断 #ifdef BINOCULOR_AVS // 原有代码... index++; // 最后一个DRE工作缓冲区分配后的index递增 // 增加防御性判断:确保index不越界 #define MAX_POOL_INFO_CNT 32 if(index >= MAX_POOL_INFO_CNT) { ret = HD_FAILURE; return ret; } #endif // 修改点3:MD缓冲区分配前的index检查 // 原代码直接使用index,增加条件判断 UINT32 md_buf_size = 0; #if 1 // MD相关定义不变... #endif // 修改前:直接使用当前index // 修改后:增加AIISP/BINOCULOR_AVS特判 if (g_motion_detection_enabled) { #ifdef AIISP_ENABLED // AIISP专用MD缓冲区 mem_cfg.pool_info[index].blk_size = CALC_AIISP_MD_SIZE(); #else mem_cfg.pool_info[index].blk_size = MD_HEAD_BUFSIZE() + MD_INFO_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H); #endif #ifdef BINOCULOR_AVS mem_cfg.pool_info[index].blk_cnt = 6; // 双目模式需要更多缓冲 #else mem_cfg.pool_info[index].blk_cnt = 3; #endif index++; } // 修改点4:BNR缓冲区分配时的双目模式适配 #ifdef BINOCULOR_AVS // 修改前:直接乘2 // 修改后:增加条件编译保护 mem_cfg.pool_info[index].blk_cnt = 4; #ifdef BINOCULOR_AVS #ifdef AIISP_ENABLED mem_cfg.pool_info[index].blk_cnt *= 3; // AIISP+双目需要更多缓冲 #else mem_cfg.pool_info[index].blk_cnt *= 2; #endif #endif #endif 具体怎么修改下面的代码啊 HD_RESULT mem_init(void) { HD_RESULT ret; HD_COMMON_MEM_INIT_CONFIG mem_cfg = {0}; #ifdef DLA_SUPPORT int model_size = 0; #endif #if defined(DLA_SUPPORT) || defined(DUAL_SENSOR) || defined(SENSOR_RESOLUTION_8MP) || defined(SENSOR_RESOLUTION_5MP) \ || defined(AIISP_ENABLED) || defined(SENSOR_RESOLUTION_4MP) || defined(SENSOR_RESOLUTION_12MP) || defined(MEDIA_PIPELINE_BASE_PTZ5425) int index = 0; #endif #ifdef BINOCULOR_AVS int i = 0; int vsp_dev_cnt = MAX_STICHING_CHN_CNT; int vsp_src_cnt = MIN_AVS_SRC_CHAN_NUM; int max_ovlp_width = 0; #endif // config common pool (main) mem_cfg.pool_info[0].type = HD_COMMON_MEM_COMMON_POOL; // 双目拼接机型需要使用左右目YUV420原图做色差校正检验(产测模式)和自动拼接,不压缩 #ifdef BINOCULOR_AVS mem_cfg.pool_info[0].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(ALIGN_CEIL_16(VDO_SIZE_W), ALIGN_CEIL_16(VDO_SIZE_H), HD_VIDEO_PXLFMT_YUV420); // align to 16 for rotate buffer #else if (YUV_COMPRESS_ENABLE == 1) { mem_cfg.pool_info[0].blk_size = DBGINFO_BUFSIZE()+VDO_NVX_BUFSIZE(ALIGN_CEIL_16(VDO_SIZE_W), ALIGN_CEIL_16(VDO_SIZE_H), HD_VIDEO_PXLFMT_YUV420); // align to 16 for rotate buffer } else { mem_cfg.pool_info[0].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(ALIGN_CEIL_16(VDO_SIZE_W), ALIGN_CEIL_16(VDO_SIZE_H), HD_VIDEO_PXLFMT_YUV420); // align to 16 for rotate buffer } #endif #ifdef DUAL_SENSOR mem_cfg.pool_info[0].blk_cnt = 5; #else mem_cfg.pool_info[0].blk_cnt = 1; #endif #ifdef HDR_MODE_SUPPORT if (g_hdr_enabled) { mem_cfg.pool_info[0].blk_cnt += 1; } #endif #ifdef AIISP_ENABLED mem_cfg.pool_info[0].blk_cnt += 2; #endif #ifdef SENSOR_RESOLUTION_8MP mem_cfg.pool_info[0].blk_cnt = 3; #elif defined SENSOR_RESOLUTION_12MP mem_cfg.pool_info[0].blk_cnt = 3; #elif defined SENSOR_RESOLUTION_5MP mem_cfg.pool_info[0].blk_cnt = 2; #elif defined MEDIA_PIPELINE_BASE_PTZ5425 mem_cfg.pool_info[0].blk_cnt = 3; #endif #ifdef BINOCULOR_AVS mem_cfg.pool_info[0].blk_cnt += (3 * vsp_src_cnt); #endif mem_cfg.pool_info[0].ddr_id = DDR_ID0; // config common pool (sub) mem_cfg.pool_info[1].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[1].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(ALIGN_CEIL_16(SUB_VDO_SIZE_W), ALIGN_CEIL_16(SUB_VDO_SIZE_H), HD_VIDEO_PXLFMT_YUV420); // align to 16 for rotate buffer #ifdef DUAL_SENSOR mem_cfg.pool_info[1].blk_cnt = 6; #elif MEDIA_PIPELINE_BASE_PTZ5425 mem_cfg.pool_info[1].blk_cnt = 4; #else mem_cfg.pool_info[1].blk_cnt = 4; #endif mem_cfg.pool_info[1].ddr_id = DDR_ID0; // TODO:if needed // config common pool (jpeg) mem_cfg.pool_info[2].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[2].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(ALIGN_CEIL_16(JPEG_VDO_SIZE_W), ALIGN_CEIL_16(JPEG_VDO_SIZE_H), HD_VIDEO_PXLFMT_YUV420); #if (defined SENSOR_RESOLUTION_4MP || defined SENSOR_RESOLUTION_8MP || defined SENSOR_RESOLUTION_12MP) && (defined HDR_MODE_SUPPORT) if (g_hdr_enabled) { mem_cfg.pool_info[2].blk_cnt = 2; } else { mem_cfg.pool_info[2].blk_cnt = 1; } #else mem_cfg.pool_info[2].blk_cnt = 1; #endif mem_cfg.pool_info[2].ddr_id = DDR_ID0; /* 由于人脸抓拍的处理耗时较久,因此识别流通道及其扩展通道JPEG需要加大一块缓存,防止get blk failed */ if(g_face_enabled) { mem_cfg.pool_info[2].blk_cnt += 1; } // config common pool (divp) mem_cfg.pool_info[3].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[3].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(ISP_FRAME_WIDTH, ISP_FRAME_HEIGHT, HD_VIDEO_PXLFMT_YUV420); #ifdef DUAL_SENSOR mem_cfg.pool_info[3].blk_cnt = 2; #else mem_cfg.pool_info[3].blk_cnt = 1; #endif mem_cfg.pool_info[3].ddr_id = DDR_ID0; // user pool for ao mem_cfg.pool_info[4].type = HD_COMMON_MEM_USER_POOL_BEGIN; mem_cfg.pool_info[4].blk_size = 0x1000; mem_cfg.pool_info[4].blk_cnt = 1; mem_cfg.pool_info[4].ddr_id = DDR_ID0; #ifdef DUAL_SENSOR // config common pool (osg--main-time) mem_cfg.pool_info[5].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[5].blk_size = get_stampsize(STRM_ID_MAIN,1); mem_cfg.pool_info[5].blk_cnt = 2; mem_cfg.pool_info[5].ddr_id = DDR_ID0; // config common pool (osg--main) mem_cfg.pool_info[6].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[6].blk_size = get_stampsize(STRM_ID_MAIN,0); mem_cfg.pool_info[6].blk_cnt = 6; mem_cfg.pool_info[6].ddr_id = DDR_ID0; // config common pool (osg--minor-time) mem_cfg.pool_info[7].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[7].blk_size = get_stampsize(STRM_ID_MINOR,1); mem_cfg.pool_info[7].blk_cnt = 2; mem_cfg.pool_info[7].ddr_id = DDR_ID0; // config common pool (osg--minor) mem_cfg.pool_info[8].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[8].blk_size = get_stampsize(STRM_ID_MINOR,0); mem_cfg.pool_info[8].blk_cnt = 6; mem_cfg.pool_info[8].ddr_id = DDR_ID0; #else mem_cfg.pool_info[5].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[5].blk_size = get_stampsize(STRM_ID_MAIN,1); mem_cfg.pool_info[5].blk_cnt = 1; mem_cfg.pool_info[5].ddr_id = DDR_ID0; // config common pool (osg--main) mem_cfg.pool_info[6].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[6].blk_size = get_stampsize(STRM_ID_MAIN,0); /*OSD PTZ显示需额外占用一个内存块*/ #ifdef SUPPORT_PTZ_OSD mem_cfg.pool_info[6].blk_cnt = 4; #else mem_cfg.pool_info[6].blk_cnt = 3; #endif mem_cfg.pool_info[6].ddr_id = DDR_ID0; // config common pool (osg--minor-time) mem_cfg.pool_info[7].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[7].blk_size = get_stampsize(STRM_ID_MINOR,1); mem_cfg.pool_info[7].blk_cnt = 1; mem_cfg.pool_info[7].ddr_id = DDR_ID0; // config common pool (osg--minor) mem_cfg.pool_info[8].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[8].blk_size = get_stampsize(STRM_ID_MINOR,0); /*OSD PTZ显示需额外占用一个内存块*/ #ifdef SUPPORT_PTZ_OSD mem_cfg.pool_info[8].blk_cnt = 4; #else mem_cfg.pool_info[8].blk_cnt = 3; #endif mem_cfg.pool_info[8].ddr_id = DDR_ID0; #endif // config common pool mem_cfg.pool_info[9].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[9].blk_size = 0x38C0; mem_cfg.pool_info[9].blk_cnt = 4; mem_cfg.pool_info[9].ddr_id = DDR_ID0; #if defined(DUAL_SENSOR) || defined(SENSOR_RESOLUTION_8MP) || defined(SENSOR_RESOLUTION_5MP) \ || defined(AIISP_ENABLED) || defined(SENSOR_RESOLUTION_4MP) || defined(SENSOR_RESOLUTION_12MP) || defined(MEDIA_PIPELINE_BASE_PTZ5425) index = 10; #endif #ifdef DLA_SUPPORT // config common pool (dla) mem_cfg.pool_info[10].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[10].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(DLA_FRAME_WIDTH, DLA_FRAME_HEIGHT, HD_VIDEO_PXLFMT_YUV420); #ifdef DUAL_SENSOR mem_cfg.pool_info[10].blk_cnt = 2; #elif defined SENSOR_RESOLUTION_8MP mem_cfg.pool_info[10].blk_cnt = 2; #elif defined SENSOR_RESOLUTION_12MP mem_cfg.pool_info[10].blk_cnt = 2; #elif defined MEDIA_PIPELINE_BASE_PTZ5425 mem_cfg.pool_info[10].blk_cnt = 1; #else mem_cfg.pool_info[10].blk_cnt = 1; #endif mem_cfg.pool_info[10].ddr_id = DDR_ID0; index = 11; //模型加载 #define UTILS_MAX(a, b) (((a) > (b)) * (a) + ((a) <= (b)) * (b)) int size_0 = _getsize_model(OBJ_DET_MODEL_FILE_NAME); int size_90 = _getsize_model(OBJ_DET_MODEL_FILE_NAME_90); int size_270 = _getsize_model(OBJ_DET_MODEL_FILE_NAME_270); int size_fd_0 = _getsize_model(OBJ_DET_MODEL_FILE_NAME_FD); int size_fd_90 = _getsize_model(OBJ_DET_MODEL_FILE_NAME_FD_90); int size_fd_270 = _getsize_model(OBJ_DET_MODEL_FILE_NAME_FD_270); int max_blk_size = UTILS_MAX(size_0, size_90); max_blk_size = UTILS_MAX(max_blk_size, size_270); max_blk_size = UTILS_MAX(max_blk_size, size_fd_0); max_blk_size = UTILS_MAX(max_blk_size, size_fd_90); max_blk_size = UTILS_MAX(max_blk_size, size_fd_270); printf("**************** max_blk_size:%d *****************", max_blk_size); model_size = max_blk_size; if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } /* 通过宏确定能加载的人头最大模型大小, 按照最大申请 */ int size_head0 = _getsize_model(HEAD_DET_MODEL_FILE_NAME); int size_head90 = _getsize_model(HEAD_DET_MODEL_FILE_NAME_90); int max_head_blk_size = size_head0 > size_head90 ? size_head0 : size_head90; model_size = max_head_blk_size; if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } model_size = _getsize_model(PCLS_MODEL_FILE_NAME); if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } #ifdef DLA_REC_STREAM_SUPPORT if (g_people_enabled) { //PR model_size = _getsize_model(PR_MODEL_FILE_NAME); if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } //PKP model_size = _getsize_model(PKP_MODEL_FILE_NAME); if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } } if (g_vehicle_enabled) { //VTC model_size = _getsize_model(VTC_MODEL_FILE_NAME); if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } } #endif #ifdef DLA_FSS_SUPPORT if (g_face_enabled) { model_size = _getsize_model(FACE_REC_MODEL_FILE_NAME); if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } model_size = _getsize_model(FACE_LANDMARK_MODE_FILE_NAME); if (model_size > 0) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = model_size; mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } } #endif #ifdef VENC_YUV2JPG_SUPPORT if (g_face_enabled || g_people_enabled || g_vehicle_enabled || g_head_detection_enabled) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_USER_DEFINIED_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(VENC_JPEG_MAX_WIDTH, VENC_JPEG_MAX_HEIGHT, HD_VIDEO_PXLFMT_YUV420); mem_cfg.pool_info[index].blk_cnt = 1; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } #endif #ifdef DLA_REC_STREAM_SUPPORT if (g_face_enabled || g_people_enabled || g_vehicle_enabled) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(DLA_REC_FRAME_WIDTH, DLA_REC_FRAME_HEIGHT, HD_VIDEO_PXLFMT_YUV420); mem_cfg.pool_info[index].blk_cnt = 2;/* 1个block用于识别流,1个block用于jpeg扩展通道, 由于JPEG的实际帧率较低,可以视为基本上不占用 */ mem_cfg.pool_info[index].ddr_id = DDR_ID0; } /* 由于人脸抓拍的处理耗时较久,因此识别流通道及其扩展通道JPEG需要加大一块缓存,防止get blk failed */ if(g_face_enabled) { mem_cfg.pool_info[index].blk_cnt += 1; } index++; #endif #endif #ifdef DUAL_SENSOR // config common pool (cap) mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_RAW_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 2; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #endif #if (defined SENSOR_RESOLUTION_8MP) || (defined SENSOR_RESOLUTION_12MP) // config common pool (cap) mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_RAW_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 3; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_NRX_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 3; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #endif #ifdef SENSOR_RESOLUTION_5MP // config common pool (cap) mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_RAW_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 2; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; if(g_hdr_enabled) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_NRX_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 2; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } #endif #ifdef MEDIA_PIPELINE_BASE_PTZ5425 // config common pool (cap) mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_RAW_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 2; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; if(g_hdr_enabled) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_RAW_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 2; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } #endif #if defined(SENSOR_RESOLUTION_4MP) || defined(BINOCULOR_AVS) /*dram mode*/ mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_RAW_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); mem_cfg.pool_info[index].blk_cnt = 0; #ifdef SENSOR_RESOLUTION_4MP // 如果是其他分辨率的拼接情况,此处就不用再加了。 mem_cfg.pool_info[index].blk_cnt = 3; #endif #ifdef BINOCULOR_AVS // vsp in,及双目rawall pipe out(depth=1) mem_cfg.pool_info[index].blk_cnt += (3 * vsp_src_cnt); #endif mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #endif #ifdef BINOCULOR_AVS // vsp out -- 拼接完成的尺寸,vprc、venc mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(ALIGN_CEIL_16(VSP_VPE_OUT_W_0 + VSP_VPE_OUT_W_1 - AVS_OVERLAP_W_0), VDO_SIZE_H, HD_VIDEO_PXLFMT_YUV420); mem_cfg.pool_info[index].blk_cnt = 6; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; // vsp scl out -- 拼接完成后gfx scale的尺寸 mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(ALIGN_CEIL_16(AVS_SCL_OUT_DEF_W), AVS_SCL_OUT_DEF_H, HD_VIDEO_PXLFMT_YUV420); mem_cfg.pool_info[index].blk_cnt = 6; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; // dre fusion buffer for (i = 0; i < vsp_src_cnt; i ++) { if (vsp_ovlp_w[i]) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = 2 * VDO_YUV_BUFSIZE(vsp_ovlp_w[i], AVS_OVERLAP_H, HD_VIDEO_PXLFMT_Y8); mem_cfg.pool_info[index].blk_cnt = vsp_dev_cnt * 6; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; } } // DRE working buffer max_ovlp_width = MAX_VAL(MAX_VAL(MAX_VAL(vsp_ovlp_w[0], vsp_ovlp_w[1]),vsp_ovlp_w[2]),vsp_ovlp_w[3]); mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = MAX_AVS_SRC_CHAN_NUM * ALIGN_CEIL_16(max_ovlp_width) * AVS_OVERLAP_H; mem_cfg.pool_info[index].blk_cnt = vsp_dev_cnt; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #endif // config common pool (cap) mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_RAW_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, CAP_OUT_FMT) +VDO_CA_BUF_SIZE(CA_WIN_NUM_W, CA_WIN_NUM_H) +VDO_LA_BUF_SIZE(LA_WIN_NUM_W, LA_WIN_NUM_H); #ifdef AIISP_ENABLED mem_cfg.pool_info[index].blk_cnt = 6; /*todo: 暂定6块,实际需要根据测试情况减少*/ #else mem_cfg.pool_info[index].blk_cnt = 2; #endif mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; /* BNR */ if (g_is_nt98539a) { mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = vendor_common_mem_calc_max_buf_size(VDO_SIZE_W, VDO_SIZE_H, BNR_OUT_FMT); // NOTE: dim need align to 16 for rotate buffer mem_cfg.pool_info[index].blk_cnt = 4; /*todo*/ #ifdef BINOCULOR_AVS mem_cfg.pool_info[index].blk_cnt *= 2; #endif mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = vendor_common_mem_calc_max_buf_size(VDO_SIZE_W, VDO_SIZE_H, BNR_REF_FMT); // NOTE: dim need align to 16 for rotate buffer mem_cfg.pool_info[index].blk_cnt = 3; /*todo*/ #ifdef BINOCULOR_AVS mem_cfg.pool_info[index].blk_cnt *= 2; #endif mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #ifdef AIISP_ENABLED mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_AIDED_MAP_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, HD_VIDEO_PXLFMT_RAW12); // NOTE: dim need align to 16 for rotate buffer mem_cfg.pool_info[index].blk_cnt = 2; /*todo*/ mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_AIDED_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, HD_VIDEO_PXLFMT_RAW12); // NOTE: dim need align to 16 for rotate buffer mem_cfg.pool_info[index].blk_cnt = 3; /*todo*/ mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #endif } UINT32 md_buf_size = 0; #if 1 // MD #define MD_HEAD_BUFSIZE() (0x40) // Note , the md info w, h is vprc input w, h not out w, h #define MD_INFO_BUFSIZE(w, h) (ALIGN_CEIL_64((((w + 511) >> 9) << 2) * ((h + 15) >> 4))) md_buf_size = MD_HEAD_BUFSIZE() + MD_INFO_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H); #endif // config common pool (main) mem_cfg.pool_info[index].type = HD_COMMON_MEM_COMMON_POOL; mem_cfg.pool_info[index].blk_size = DBGINFO_BUFSIZE()+VDO_YUV_BUFSIZE(VDO_SIZE_W, VDO_SIZE_H, HD_VIDEO_PXLFMT_YUV420)+md_buf_size; mem_cfg.pool_info[index].blk_cnt = 3; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #ifdef JPEG_SEPERATE_OSD /*config commom pool osg--peg, jpeg不使用pingpong buffer,所以不单独给时间osd分配两倍内存*/ mem_cfg.pool_info[index].type = HD_COMMON_MEM_OSG_POOL; mem_cfg.pool_info[index].blk_size = get_stampsize(STRM_ID_JPEG,0); mem_cfg.pool_info[index].blk_cnt = 4; mem_cfg.pool_info[index].ddr_id = DDR_ID0; index++; #endif ret = hd_common_mem_init(&mem_cfg); return ret; }
最新发布
09-29
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值