第29讲 优化Camera LatencyHistogram

本讲是Android Camera性能分析专题的第29讲,我们来优化Camera LatencyHistogram,包括如下内容:

  1. 直方图统计时添加平均值、最大值、最小值、Camera ID
  2. 为Stream直方图添加Size和Name
资源 描述
在线课程 极客笔记在线课程
知识星球 星球名称:深入浅出Android Camera
星球ID: 17296815
Wechat 极客笔记圈

直方图统计时添加平均值、最大值、最小值、Camera ID

代码见视频讲解,运行结果如下:

为Stream直方图添加Size和Name

代码见视频讲解,运行结果如下:

代码修改点

diff --git a/services/camera/libcameraservice/Android.bp b/services/camera/libcameraservice/Android.bp
index 981c569..dc02162 100644
--- a/services/camera/libcameraservice/Android.bp
+++ b/services/camera/libcameraservice/Android.bp
@@ -196,6 +196,7 @@ cc_library_shared {
         "-Wextra",
         "-Werror",
         "-Wno-ignored-qualifiers",
+        "-DDeepinout",
     ],

}
diff --git a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
index 5e91501…554e267 100644
— a/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
+++ b/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
@@ -958,12 +958,14 @@ binder::Status CameraDeviceClient::createStream(
static_cast<camera_stream_rotation_t>(outputConfiguration.getRotation()),
&streamId, physicalCameraId, streamInfo.sensorPixelModesUsed, &surfaceIds,
outputConfiguration.getSurfaceSetID(), isShared, isMultiResolution);
+
if (err == OK) {
Mutex::Autolock l(mCompositeLock);
mCompositeStreamMap.add(IInterface::asBinder(surfaces[0]->getIGraphicBufferProducer()),
compositeStream);
}
} else {
+
err = mDevice->createStream(surfaces, deferredConsumer, streamInfo.width,
streamInfo.height, streamInfo.format, streamInfo.dataSpace,
static_cast<camera_stream_rotation_t>(outputConfiguration.getRotation()),
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index 7c2f34f…e4361ac 100644
— a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -1139,6 +1139,9 @@ status_t Camera3Device::createStream(const std::vector<sp<Surface>>& consumers,
isMultiResolution, dynamicRangeProfile, streamUseCase, mDeviceTimeBaseIsRealtime,
timestampBase, mirrorMode);
}
+#ifdef Deepinout

  •    newStream-&gt;mLogicalCameraId = mId;
    

+#endif

 size_t consumerCount = consumers.size();
 for (size_t i = 0; i &lt; consumerCount; i++) {

diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
index 1e20ee0…204947c 100644
— a/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
+++ b/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
@@ -71,6 +71,9 @@ Camera3OutputStream::Camera3OutputStream(int id,
mDropBuffers(false),
mMirrorMode(mirrorMode),
mDequeueBufferLatency(kDequeueLatencyBinSize),
+#ifdef Deepinout

  •    mQueueBufferIntervalHistogram(kQueueBufferIntervalBinSize),
    

+#endif
mIPCTransport(transport) {

 if (mConsumer == NULL) {

@@ -104,6 +107,9 @@ Camera3OutputStream::Camera3OutputStream(int id,
mDropBuffers(false),
mMirrorMode(mirrorMode),
mDequeueBufferLatency(kDequeueLatencyBinSize),
+#ifdef Deepinout

  •    mQueueBufferIntervalHistogram(kQueueBufferIntervalBinSize),
    

+#endif
mIPCTransport(transport) {

 if (format != HAL_PIXEL_FORMAT_BLOB &amp;&amp; format != HAL_PIXEL_FORMAT_RAW_OPAQUE) {

@@ -144,6 +150,9 @@ Camera3OutputStream::Camera3OutputStream(int id,
mDropBuffers(false),
mMirrorMode(mirrorMode),
mDequeueBufferLatency(kDequeueLatencyBinSize),
+#ifdef Deepinout

  •    mQueueBufferIntervalHistogram(kQueueBufferIntervalBinSize),
    

+#endif
mIPCTransport(transport) {
// Deferred consumer only support preview surface format now.
if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
@@ -192,6 +201,9 @@ Camera3OutputStream::Camera3OutputStream(int id, camera_stream_type_t type,
mDropBuffers(false),
mMirrorMode(mirrorMode),
mDequeueBufferLatency(kDequeueLatencyBinSize),
+#ifdef Deepinout

  •    mQueueBufferIntervalHistogram(kQueueBufferIntervalBinSize),
    

+#endif
mIPCTransport(transport) {

 bool needsReleaseNotify = setId &gt; CAMERA3_STREAM_SET_ID_INVALID;

@@ -312,6 +324,17 @@ status_t Camera3OutputStream::returnBufferLocked(

 mLastTimestamp = timestamp;
 mFrameCount++;

+#ifdef Deepinout

  • nsecs_t currentQueueBufferTime = systemTime(SYSTEM_TIME_MONOTONIC);

  • if (mLastQueueBufferTime > 0) {

  •    mQueueBufferIntervalHistogram.add(mLastQueueBufferTime, currentQueueBufferTime);
    
  •    char traceLog[48];
    
  •    snprintf(traceLog, sizeof(traceLog), &quot;queueBufferInterval-%d&quot;, mId);
    
  •    ATRACE_ASYNC_BEGIN(traceLog, mId);
    
  •    ATRACE_ASYNC_END(traceLog, mId);
    
  • }

  • mLastQueueBufferTime = currentQueueBufferTime;
    +#endif

    return OK;
    }
    @@ -521,6 +544,10 @@ void Camera3OutputStream::dump(int fd, const Vector<String16> &args) const {

    mDequeueBufferLatency.dump(fd,
    " DequeueBuffer latency histogram:");
    +#ifdef Deepinout

  • mQueueBufferIntervalHistogram.dump(fd,

  •    &quot;      QueueBufferInterval histogram:&quot;);
    

+#endif
}

status_t Camera3OutputStream::setTransform(int transform, bool mayChangeMirror) {
@@ -1015,8 +1042,25 @@ status_t Camera3OutputStream::disconnectLocked() {

 mState = (mState == STATE_IN_RECONFIG) ? STATE_IN_CONFIG
                                        : STATE_CONSTRUCTED;

+#ifndef Deepinout
mDequeueBufferLatency.log("Stream %d dequeueBuffer latency histogram", mId);
+#else

  • mDequeueBufferLatency.log("CamId(L:P):(%s:%s) Stream %d-%s-%dx%d dequeueBuffer latency histogram",

  • mLogicalCameraId.string(),

  • getPhysicalCameraId().string(),

  • mId,

  • mConsumerName.string(),

  • camera_stream::width,

  • camera_stream::height);

  • mQueueBufferIntervalHistogram.log("CamId(L:P):(%s:%s) Stream %d-%s-%dx%d queueBuffer interval histogram",

  • mLogicalCameraId.string(),

  • getPhysicalCameraId().string(),

  • mId,

  • mConsumerName.string(),

  • camera_stream::width,

  • camera_stream::height);

  • mQueueBufferIntervalHistogram.reset();
    +#endif
    mDequeueBufferLatency.reset();
    return OK;
    }
    diff --git a/services/camera/libcameraservice/device3/Camera3OutputStream.h b/services/camera/libcameraservice/device3/Camera3OutputStream.h
    index e8065ce…05831ec 100644
    — a/services/camera/libcameraservice/device3/Camera3OutputStream.h
    +++ b/services/camera/libcameraservice/device3/Camera3OutputStream.h
    @@ -408,6 +408,11 @@ class Camera3OutputStream :

    static const int32_t kDequeueLatencyBinSize = 5; // in ms
    CameraLatencyHistogram mDequeueBufferLatency;
    +#ifdef Deepinout

  • nsecs_t mLastQueueBufferTime = 0;

  • static const int32_t kQueueBufferIntervalBinSize = 35; // in ms

  • CameraLatencyHistogram mQueueBufferIntervalHistogram;
    +#endif
    IPCTransport mIPCTransport = IPCTransport::INVALID;

    int mImageDumpMask = 0;
    diff --git a/services/camera/libcameraservice/device3/Camera3Stream.h b/services/camera/libcameraservice/device3/Camera3Stream.h
    index d429e6c…f7784bd 100644
    — a/services/camera/libcameraservice/device3/Camera3Stream.h
    +++ b/services/camera/libcameraservice/device3/Camera3Stream.h
    @@ -469,6 +469,10 @@ class Camera3Stream :
    void fireBufferRequestForFrameNumber(uint64_t frameNumber,
    const CameraMetadata& settings) override;

+#ifdef Deepinout

  • String8 mLogicalCameraId;
    +#endif
  • protected:
    const int mId;
    /**
    diff --git a/services/camera/libcameraservice/utils/LatencyHistogram.cpp b/services/camera/libcameraservice/utils/LatencyHistogram.cpp
    index e2bdc43…a48ada7 100644
    — a/services/camera/libcameraservice/utils/LatencyHistogram.cpp
    +++ b/services/camera/libcameraservice/utils/LatencyHistogram.cpp
    @@ -27,7 +27,14 @@ CameraLatencyHistogram::CameraLatencyHistogram(int32_t binSizeMs, int32_t binCou
    mBinSizeMs(binSizeMs),
    mBinCount(binCount),
    mBins(binCount),
    +#ifndef Deepinout
    mTotalCount(0) {
    +#else
  •    mTotoalDuration(0),
    
  •    mMaxDuration(0),
    
  •    mMinDuration(0),
    
  •    mTotalCount(0) {
    

+#endif
}

void CameraLatencyHistogram::add(nsecs_t start, nsecs_t end) {
@@ -43,6 +50,15 @@ void CameraLatencyHistogram::add(nsecs_t start, nsecs_t end) {

 mBins[binIndex]++;
 mTotalCount++;

+#ifdef Deepinout

  • mTotoalDuration += duration;
  • if (mMaxDuration == 0 || mMaxDuration < duration) {
  •    mMaxDuration = duration;
    
  • }
  • if (mMinDuration ==0 || mMinDuration > duration) {
  •    mMinDuration = duration;
    
  • }
    +#endif
    }

void CameraLatencyHistogram::reset() {
@@ -56,7 +72,16 @@ void CameraLatencyHistogram::dump(int fd, const char* name) const {
}

 String8 lines;

+#ifndef Deepinout
lines.appendFormat("%s (%" PRId64 ") samples\n", name, mTotalCount);
+#else

  • lines.appendFormat("%s (%" PRId64 ") samples , avg:max:min(%.2f ms:%.2f ms:%.2f):\n",
  •    name,
    
  •    mTotalCount,
    
  •    (float)(mTotoalDuration / 1e6) / mTotalCount,
    
  •    (float)(mMaxDuration / 1e6),
    
  •    (float)(mMinDuration / 1e6));
    

+#endif

 String8 lineBins, lineBinCounts;
 formatHistogramText(lineBins, lineBinCounts);

@@ -77,7 +102,16 @@ void CameraLatencyHistogram::log(const char* fmt, …) {
va_list args;
va_start(args, fmt);
String8 histogramName = String8::formatV(fmt, args);
+#ifndef Deepinout
ALOGI("%s (%" PRId64 ") samples:", histogramName.string(), mTotalCount);
+#else

  • ALOGI("%s (%" PRId64 ") samples, avg:max:min(%.2f ms:%.2f ms:%.2f):",

  • histogramName.string(),

  • mTotalCount,

  • (float)(mTotoalDuration / 1e6) / mTotalCount,

  • (float)(mMaxDuration / 1e6),

  • (float)(mMinDuration / 1e6));
    +#endif
    va_end(args);

    String8 lineBins, lineBinCounts;
    diff --git a/services/camera/libcameraservice/utils/LatencyHistogram.h b/services/camera/libcameraservice/utils/LatencyHistogram.h
    index bfd9b1b…d0dcbf7 100644
    — a/services/camera/libcameraservice/utils/LatencyHistogram.h
    +++ b/services/camera/libcameraservice/utils/LatencyHistogram.h
    @@ -38,6 +38,11 @@ private:
    int32_t mBinSizeMs;
    int32_t mBinCount;
    std::vector<int64_t> mBins;
    +#ifdef Deepinout

  • nsecs_t mTotoalDuration;

  • nsecs_t mMaxDuration;

  • nsecs_t mMinDuration;
    +#endif
    uint64_t mTotalCount;

    void formatHistogramText(String8& lineBins, String8& lineBinCounts) const;