Android Camera性能分析 第28讲 Buffer Limit Latency

本讲是​ Android Camera性能分析专题 ​的第28讲,我们介绍CameraServer Buffer Limit Latency,包括如下内容:

  1. Buffer Limit Latency是什么
  2. Buffer Limit Latency配置
  3. Buffer Limit Latency实战

视频在线观看:

加入知识星球与更多Camera同学交流
– 星球名称:深入浅出Android Camera
– 星球ID: 17296815
– Wechat: 极客笔记圈

Buffer Limit Latency是什么

Buffer Limit Latency用于衡量当某路Stream dequeue buffer数量达到producer的最大值后,等待HAL处理的耗时。

什么是numOutstandingBuffers

  • 已经送给HAL,HAL正在处理,未返回的Buffer数量

  • 视频讲解演示如何查看每路stream的numOutstandingBuffers

什么是camera_stream::max_buffers

  • Camera HAL配置的,在未返回buffer的情况下,最多dequeueBuffer的数量

  • 视频讲解演示如何查看每路stream HAL配置的最大max_buffers

Buffer Limit Latency配置

Buffer Limit Latency直方图配置

  • 分成10份(默认值), 间隔为33ms

    • static const int32_t kBufferLimitLatencyBinSize = 33; //in ms

    • Latency histogram of the wait time for handout buffer count to drop below max_buffers.

添加Sample的时机

  • 当numOutstandingBuffers等于camera_stream::max_buffers时,会等待新的Buffer返回,该Latency衡量的是这个等待时间

Buffer Limit Latency实战

// Wait for new buffer returned back if we are running into the limit.
size_t numOutstandingBuffers = getHandoutOutputBufferCountLocked();
if (numOutstandingBuffers == camera_stream::max_buffers) {
    ALOGV("%s: Already dequeued max output buffers (%d), wait for next returned one.",
                    __FUNCTION__, camera_stream::max_buffers);
    nsecs_t waitStart = systemTime(SYSTEM_TIME_MONOTONIC);
    if (waitBufferTimeout < kWaitForBufferDuration) {
        waitBufferTimeout = kWaitForBufferDuration;
    }
    res = mOutputBufferReturnedSignal.waitRelative(mLock, waitBufferTimeout);
    nsecs_t waitEnd = systemTime(SYSTEM_TIME_MONOTONIC);
    mBufferLimitLatency.add(waitStart, waitEnd);
    if (res != OK) {
        if (res == TIMED_OUT) {
            ALOGE("%s: wait for output buffer return timed out after %lldms (max_buffers %d)",
                    __FUNCTION__, waitBufferTimeout / 1000000LL,
                    camera_stream::max_buffers);
        }
        return res;
    }

    size_t updatedNumOutstandingBuffers = getHandoutOutputBufferCountLocked();
    if (updatedNumOutstandingBuffers >= numOutstandingBuffers) {
        ALOGE("%s: outsanding buffer count goes from %zu to %zu, "
                "getBuffer(s) call must not run in parallel!", __FUNCTION__,
                numOutstandingBuffers, updatedNumOutstandingBuffers);
        return INVALID_OPERATION;
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

deepinout_camera

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值