前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Qcom Camx 打印实时Camera FPS

Qcom Camx 打印实时Camera FPS

作者头像
小驰行动派
发布于 2025-02-21 07:12:21
发布于 2025-02-21 07:12:21
4400
代码可运行
举报
文章被收录于专栏:Android Camera开发Android Camera开发
运行总次数:0
代码可运行

一、第一种方式(有些低平台可能没有)

adb shell setprop persist.vendor.camera.enableFPSLog TRUE

adb shell setprop persist.vendor.camera.systemLogEnable TRUE

adb shell setprop vendor.debug.camera.overrideLogLevels 0xff

chi-cdk/core/chiframework/chxextensionmodule.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CDKResult ExtensionModule::OverrideProcessRequest(
    const camera3_device_t*     camera3_device,
    camera3_capture_request_t*  pCaptureRequest,
    VOID*                       pPriv)
{
   if (TRUE == EnableFPSLog())
        {
            PrintCameraFPS(logicalCameraId);
        }

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
VOID ExtensionModule::PrintCameraFPS(
    UINT32 logicalCameraId)
{
    m_processCount[logicalCameraId]++;

    if ((m_processCount[logicalCameraId] % GetInstance()->GetUsecaseMaxFPS()) == 0)
    {
        struct timespec TEnd                = {0 , 0};
        FLOAT           cost_time           = 0;
        FLOAT           cost_time_from_prev = 0;

        clock_gettime(CLOCK_REALTIME, &TEnd);

        if (m_CameraWatcher[logicalCameraId].tv_nsec < TEnd.tv_nsec)
        {
            cost_time = (FLOAT)(TEnd.tv_sec - m_CameraWatcher[logicalCameraId].tv_sec - 1) +
                ((FLOAT)(1000000000 + TEnd.tv_nsec - m_CameraWatcher[logicalCameraId].tv_nsec)/1e9);

            cost_time_from_prev = (FLOAT)(TEnd.tv_sec -  m_CameraWatcher_prev[logicalCameraId].tv_sec - 1) +
                ((FLOAT)(1000000000 + TEnd.tv_nsec -  m_CameraWatcher_prev[logicalCameraId].tv_nsec)/1e9);
        }
        else
        {
            cost_time = (FLOAT)(TEnd.tv_sec - m_CameraWatcher[logicalCameraId].tv_sec) +
                ((FLOAT)(TEnd.tv_nsec - m_CameraWatcher[logicalCameraId].tv_nsec)/1e9);

            cost_time_from_prev = (FLOAT)(TEnd.tv_sec -  m_CameraWatcher_prev[logicalCameraId].tv_sec) +
                ((FLOAT)(TEnd.tv_nsec -  m_CameraWatcher_prev[logicalCameraId].tv_nsec)/1e9);
        }

        m_CameraWatcher_prev[logicalCameraId] = TEnd;

        FLOAT fps         = (FLOAT) ((FLOAT) m_processCount[logicalCameraId] / cost_time) * m_usecaseNumBatchedFrames;
        FLOAT current_fps = (FLOAT) ((FLOAT) ExtensionModule::GetInstance()->GetUsecaseMaxFPS() / cost_time_from_prev) * m_usecaseNumBatchedFrames;

        CHX_LOG_INFO("FRAME FPS %1.1f, average FPS %1.1f, frame count %d, time %1.1f, Max:%d, numBatchedFrames: %d",
                    current_fps,
                    fps,
                    m_processCount[logicalCameraId],
                    cost_time,
                    GetInstance()->GetUsecaseMaxFPS(),
                    m_usecaseNumBatchedFrames);
    }
    else if (m_processCount[logicalCameraId] == 1)
    {
        clock_gettime(CLOCK_REALTIME, &m_CameraWatcher[logicalCameraId]);
        m_CameraWatcher_prev[logicalCameraId] = m_CameraWatcher[logicalCameraId];
    }
}

二、第二种方式

adb shell setprop persist.vendor.camera.logPerfInfoMask 0x10000

adb shell setprop persist.vendor.camera.enableFPSLog TRUE

camx/src/core/camxsession.cpp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
VOID Session::AdvanceMinExpectedResult()
{
    if (TRUE == m_pChiContext->GetStaticSettings()->enableFPSLog)
    {
        CalculateResultFPS();
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
VOID Session::CalculateResultFPS()
{
    UINT64 currentTime = OsUtils::GetNanoSeconds();
    UINT64 elapsedTime;

    if (0 == m_lastFPSCountTime)
    {
        m_lastFPSCountTime  = currentTime;
        m_currentFrameCount = 0;
    }
    else
    {
        m_currentFrameCount++;
    }
    elapsedTime = currentTime - m_lastFPSCountTime;

    // Update FPS after 10 secs
    if (elapsedTime > (10 * NanoSecondsPerSecond))
    {
        FLOAT fps = (m_currentFrameCount * NanoSecondsPerSecond / static_cast<FLOAT> (elapsedTime));
        CAMX_LOG_PERF_INFO(CamxLogGroupCore, "FPS: %0.2f", fps);

        m_currentFrameCount = 0;
        m_lastFPSCountTime  = currentTime;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小驰行动派 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
sleep(0) 也能引发的性能问题?
以前我只是知道系统调用开销大,耗时长,但是这个代价有多大一直没量化。前段时间处理一个问题让我对这个有了比较“理性”的认识,也就是说现在可以拿出相对量化的指标。
初代庄主
2023/04/20
8300
sleep(0) 也能引发的性能问题?
Swoole v4.7 版本预览之支持 c-ares
c-ares 是一个异步 DNS 解析库。它适用于需要在不阻塞的情况下执行 DNS 查询或需要并行执行多个 DNS 查询的应用程序。
沈唁
2021/07/23
8110
Camera驱动 | CAMX驱动基本调试手段
高通相关网址:Createpoint: https://createpoint.qti.qualcomm.com(可下载文档,Release Note,Case,文档,工具等等)Chipcode: https://chipcode.qti.qualcomm.com(下载私有代码)开源代码: https://www.codeaurora.org/xwiki/bin/QAEP/release(下载开源代码)Case: https://support-qualcomm.force.com/(高通Case)
Abalone
2023/03/13
2.3K0
高通平台,How To Expose Aux Camera ?
本文主要介绍在高通平台上,当设备枚举的Camera设备数超过2个的时候(我们正常的设备是前后摄2个,不过现在的手机基本都是3、4颗摄像头的了),那如何确保上层应用通过CameraManager的getCameraIdList()接口,能遍历到全部的CameraId呢?
小驰行动派
2021/04/30
1.4K0
如何判断算法是否有可优化空间?
之前一直在写一些算法怎么优化,包括算法逻辑甚至是更加底层一些的文章,但是测试工作都做得比较随意,也就是粗略的比较时间。最近准备学习一下矩阵乘法的优化,觉得这种比较方式实际上是看不出太多信息的,比如不知道当前版本的算法在某块指定硬件上是否还存在优化空间。因此,这篇文章尝试向大家介绍另外一个算法加速的评判标准,即算法的浮点峰值(gflops)。
BBuf
2020/10/30
1.3K0
如何判断算法是否有可优化空间?
精通Linux时间管理,从这7个接口开始
最近的项目开发中,频繁遇到了时间戳相关的问题,如时间回退至1970年、时区错误及时间同步不准确等。鉴于此前仅对时间接口的使用有所了解而未深入探究其原理,本篇文章进行一次系统性整理,以便后续参考。文章若存在一些错误,可在留言区明确指出。
开源519
2025/02/27
1100
精通Linux时间管理,从这7个接口开始
CamX框架学习系列_AF dump pd
相机对焦不清晰,这个是属于AF的问题,那我们如何提供有效的日志给到AF开发的同事进行分析呢?
小驰行动派
2021/04/30
1K0
【Android 逆向】函数拦截实例 ( ③ 刷新 CPU 高速缓存 | ④ 处理拦截函数 | ⑤ 返回特定结果 )
【Android 逆向】函数拦截实例 ( 函数拦截流程 | ① 定位动态库及函数位置 ) 博客中简单介绍了 hook 函数 ( 函数拦截 ) 的流程 , 本系列博客介绍函数拦截实例 ;
韩曙亮
2023/03/29
1.6K0
Linux提供的定时器
定时器在许多场景中非常有用,尤其是在需要精确定时或定时执行某些任务的情况下。而Linux专门为定时器提供了一套定时器接口。
薄荷冰
2024/07/25
2010
普通用户启动 supervisor 报 HTTP 错误(strace)
公司的开发对生产环境都有普通用户 www 的权限,采用堡垒机登录到生产环境的机器。
仁扬
2023/07/04
3120
AudioRecord源码解读(4)
本篇介绍下AudioRecord的线程运行,以及startRecording,stop,pause等流程。
一只小虾米
2022/10/25
1.9K0
面试中关于多线程同步,你必须要思考的问题
ReentrantLock的实现网上有很多文章了,本篇文章会简单介绍下其java层实现,重点放在分析竞争锁失败后如何阻塞线程。 因篇幅有限,synchronized的内容将会放到下篇文章。
李红
2019/07/30
6570
Linux定时器例子
点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,麻烦点个在看或点个赞,感谢~ 文章首发 公众号—— Pou光明
用户5908113
2020/11/17
3.8K0
Linux定时器例子
camera密码错误_camera filter
出现flicker(banding)问题时,从视频上看会发现有规律的明暗相间的条纹,这种现象也叫做牛顿环。如下图所示。
全栈程序员站长
2022/11/19
1.3K0
camera密码错误_camera filter
C11 标准特性研究
C11标准是C语言标准的第三版(2011年由ISO/IEC发布),前一个标准版本是C99标准。
用户7886150
2021/02/17
1.2K0
Camera系统 | HFR Usecase分析
高帧率录像即慢动作拍摄,通常人眼能够接受的最好的视频帧速率是24帧/每秒。如果用120帧/秒拍摄一个动作,再用24帧每秒来播放的话,视频就放慢了5倍。
Abalone
2023/03/14
2.6K0
Camera系统 | HFR Usecase分析
Camera系统 | ConfigureStreams阶段调用
这个调用是app通过createCaptureSession一路下来的(CameraDeviceClient–>Camera3Device–>CameraDeviceSession)
Abalone
2022/10/05
2.3K0
Camera系统 | ConfigureStreams阶段调用
linux时间相关结构体和函数整理
一、时间类型。Linux下常用的时间类型有4个:time_t,struct timeb, struct timeval,struct timespec,clock_t, struct tm. (1) time_t是一个长整型,一般用来表示用1970年以来的秒数. 该类型定义在<sys/time.h>中. 一般通过 time_t time = time(NULL); 获取. (2) struct timeb结构: 主要有两个成员, 一个是秒, 另一个是毫秒, 精确度为毫秒. 1 struct timeb 2
猿人谷
2018/01/17
3K0
Linux内核时钟系统和定时器实现
在上面工作方式下,Linux 2.6.16 之前,内核软件定时器采用timer wheel多级时间轮的实现机制,维护操作系统的所有定时事件。timer wheel的触发是基于系统tick周期性中断。
用户8639654
2021/08/27
3.8K0
浅谈限流组件的应用和设计原则
做业务的同学都知道,在现实情况中,往往会出现流量暴增的情况。这些流量可能来自于黑客的爬虫,也可能来自于节日大促,或者其他一些渠道。当然业界都有对策,比如反爬、熔断、降级、限流等等不一而足。
xiaoxi666
2021/08/10
6440
相关推荐
sleep(0) 也能引发的性能问题?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档