算法node中dump图片信息方式

一 . 对于高通已经有的算法node 如FDHw 高通给了自己定义的dump 方式

1.Dump 图片数据首先要打开dump 图片数据的自动总开关

文件位置amx/src/core/camxsettings.xml

在此文件中我们查找自动dump图片的变量名 autoImageDump 会找到如下setting数据:

<setting>
    <Name>Auto Image Dump</Name>
    <Help>Dumps output images for all enabled nodes. This will run extremely slow</Help>
    <VariableName>autoImageDump</VariableName>
    <VariableType>BOOL</VariableType>
    <SetpropKey>persist.vendor.camera.autoImageDump</SetpropKey>
    <DefaultValue>FALSE</DefaultValue>
    <Dynamic>FALSE</Dynamic>
</setting

通过上面代码可以看到 DefaultValue 默认值是false; 我们需要把其打开 ,设置方式如下:

// 0 代表false  1 代表 true
adb shell setprop  persist.vendor.camera.autoImageDump 1

2. dump 输出的图片数据

dump FDHw Node 输出口图片数据如下:
在camxsettings.xml文件中找到关键字 :Auto Output Image Dump Node/Port Mask 表示输出口 dump 图片数据的定义.

<setting>
    <Name>Auto Output Image Dump Node/Port Mask</Name>
    <Help>
      Will limit dumps to only the specified nodes and ports when autoImageDump is enabled
              Uses ImageDumpType to define the flags
              No dumps                                      = 0x0
              All output ports for IFE                      = 0x1
              All output ports for IPE                      = 0x2
              All output ports for BPS                      = 0x4
              All JPEG output ports for all JPEG nodes      = 0x8
              All output ports for FDHw                     = 0x10
              All output ports for LRME                     = 0x20
              All output ports for RANSAC                   = 0x40
              All output ports for all ChiNodes             = 0x80
              All output ports for CVP                      = 0x100
              All other nodes not explicitly listed above   = 0x40000000
    </Help>
    <VariableName>autoImageDumpMask</VariableName>
    <VariableType>UINT</VariableType>
    <SetpropKey>persist.vendor.camera.autoImageDumpMask</SetpropKey>
    <DefaultValue>0x400001ff</DefaultValue>
    <Dynamic>FALSE</Dynamic>
</setting>

从FDHw Dump 数据所以需要设置为0x10
设置方式如下:

//打开总开关
adb shell setprop  persist.vendor.camera.autoImageDump 1
//设置dump 类型为FDHw 
adb shell setprop   persist.vendor.camera.autoImageDumpMask 0x10

上面两项设置完成后需要杀服务

adb shell ps -A |grep camera
cameraserver  7642     1   53280   3400 binder_ioctl_write_read 0 S cameraserver
cameraserver  7643     1  499652  13100 binder_ioctl_write_read 0 S android.hardware.camera.provider@2.4-service_64
adb shell killall android.hardware.camera.provider@2.4-service_64 cameraserver

3. dump 输入的图片数据

dump FDHw Node 输入口图片数据如下:

<setting>
    <Name>Auto Input Image Dump Node/Port Mask</Name>
    <Help>
      Will limit dumps to only the specified nodes when autoInputImageDump is enabled
              Uses ImageDumpType to define the flags
              No dumps                                      = 0x0
              All input ports for IFE                       = 0x1
              All input ports for IPE                       = 0x2
              All input ports for BPS                       = 0x4
              All JPEG input ports for all JPEG nodes       = 0x8
              All input ports for FDHw                      = 0x10
              All input ports for LRME                      = 0x20
              All input ports for RANSAC                    = 0x40
              All input ports for all ChiNodes              = 0x80
              All input ports for CVP                       = 0x100
              All other nodes not explicitly listed above   = 0x40000000
    </Help>
    <VariableName>autoInputImageDumpMask</VariableName>
    <VariableType>UINT</VariableType>
    <SetpropKey>persist.vendor.camera.autoInputImageDumpMask</SetpropKey>
    <DefaultValue>0x400001ff</DefaultValue>
    <Dynamic>FALSE</Dynamic>
</setting>

从FDHw Dump 输入数据所以需要设置为0x10

设置方式如下:

adb shell setprop   persist.vendor.camera.autoInputImageDumpMask 0x10

当dump FDHw 输入口时还需要设置autoImageDumpIPEinputPortMask 的类型此处设置为IPEInputPortFull =0x10

4.高通yuv输出方法如下:

VOID ChiNodeUtils::DumpImage(CHINODEBUFFERHANDLE pNodeBuff, const CHAR* imageNamePrefix)
{
    if (NULL != pNodeBuff)
    {
        // Get format info
        CHIIMAGEFORMAT  imageFormat  = pNodeBuff->format;
        ChiFormat       format       = imageFormat.format;
        CHIIMAGE&       chiImage     = pNodeBuff->pImageList[0];
        UINT8*	        ppu8Plane[ChiNodeFormatsMaxPlanes];
        INT32	        pi32Pitch[ChiNodeFormatsMaxPlanes];

        LOG_INFO(CamxLogGroupChi, "Image format : %d", format);

        for(UINT i = 0; i < pNodeBuff->numberOfPlanes && i < ChiNodeFormatsMaxPlanes; i++)
        {
            ppu8Plane[i] = chiImage.pAddr[i];
            switch(format)
            {
                case ChiFormat::YUV420NV12:
                    pi32Pitch[i] = imageFormat.formatParams.yuvFormat[0].planeStride;
                    break;
                default:
                    pi32Pitch[i] = 0;
                    break;
            }
            LOG_INFO(CamxLogGroupChi, "%s pi32Pitch[i]: %d", imageNamePrefix, pi32Pitch[i]);
        }

        /*  Construct file name */
        char date[64]           = {0};
        char format_string[64]  = {0};
        CHAR filename[512]      = {0};
        CHAR directory[]        = "/data/vendor/camera/";

        // Get current time
        struct timeval now;
        gettimeofday(&now, NULL);
        strftime(date, sizeof(date), "%Y%m%d_%H%M%S", localtime(&now.tv_sec));

        // Fill format string
        switch(format)
        {
            case ChiFormat::YUV420NV12:
                ChiNodeUtils::SNPrintF(format_string, sizeof(format_string), "YUV420NV12");
                break;
            default:
                break;
        }

        ChiNodeUtils::SNPrintF(filename, sizeof(filename), "%s%s_%s_%06ld_%dx%d.%s",
            directory,
            imageNamePrefix != NULL ? imageNamePrefix : "",
            date,
            now.tv_usec,
            imageFormat.width,
            imageFormat.height,
            format_string);

        // Open & write to file
        LOG_INFO(CamxLogGroupChi, "try to open file : %s", filename);

        int file_fd = open(filename,O_RDWR|O_CREAT|O_SYNC, 0777);
        if(file_fd)
        {
            LOG_INFO(CamxLogGroupChi, "File %s open successfully", filename);
            UINT bytes_write;
            switch(format)
            {
                case ChiFormat::YUV420NV12:
                    bytes_write = write(file_fd, ppu8Plane[0], pi32Pitch[0] * imageFormat.height);
                    LOG_INFO(CamxLogGroupChi, "plane[0] bytes_write: %u", bytes_write);
                    bytes_write = write(file_fd,ppu8Plane[1],pi32Pitch[0] * (imageFormat.height >> 1) );
                    LOG_INFO(CamxLogGroupChi, "plane[1] bytes_write: %u", bytes_write);
                    break;
                default:
                    LOG_ERROR(CamxLogGroupChi, "Unsupported DUMP format");
                    break;
            }
            close(file_fd);
        } else {
            LOG_ERROR(CamxLogGroupChi, "Failed to open file: %s", filename);
        }
    }
}

参考链接:https://blog.csdn.net/tunmengsmile/article/details/118355828

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
应对 Node.js 应用程序的内存溢出问题,可以考虑以下几个方面: 1. 内存泄漏:检查代码是否存在内存泄漏的情况,比如未释放的资源、循环引用等。可以使用内存分析工具(如 Node.js 自带的 heapdump 模块或第三方工具)来帮助定位问题。 2. 内存调优:合理配置 Node.js 的内存限制和垃圾回收参数,以充分利用可用内存并降低垃圾回收带来的负担。可以使用 --max-old-space-size 参数来调整 V8 引擎的堆内存大小。 3. 代码优化:检查代码是否存在大量的数据复制、不必要的对象创建、缓存未合理利用等问题。优化算法和数据结构的选择,可以减少内存使用量。 4. 高效管理资源:及时释放不再使用的资源,如数据库连接、文件句柄等。可以使用连接池或资源池来管理这些资源。 5. 使用流式处理数据:对于大量数据处理的场景,使用流式处理可以减少整体内存占用。 6. 分布式部署:如果单个 Node.js 进程无法处理大规模请求和数据,可以考虑采用分布式部署策略,将负载均衡分散到多个进程或服务器上。 7. 监控与调试:实时监控应用程序的内存使用情况,可以使用监控工具(如 PM2、New Relic)来监视内存泄漏和性能问题。同时,利用 Node.js 提供的调试工具(如内置的调试器或第三方模块)对应用程序进行调试和性能分析。 以上是一些常见的处理 Node.js 应用程序内存溢出问题的方法,具体应根据实际情况进行针对性的优化和调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值