Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 89691b94 authored by Shuzhen Wang's avatar Shuzhen Wang Committed by android-build-merger
Browse files

Merge "Camera: Add debug messages for camera latency" into oc-dev am: b4bec13d

am: db7b0a5e

Change-Id: Ida5afe110c4b53679e1a3e66649bbf8bdfe190a9
parents 8c851dee db7b0a5e
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -54,7 +54,8 @@ LOCAL_SRC_FILES := \
    gui/RingBufferConsumer.cpp \
    gui/RingBufferConsumer.cpp \
    utils/CameraTraces.cpp \
    utils/CameraTraces.cpp \
    utils/AutoConditionLock.cpp \
    utils/AutoConditionLock.cpp \
    utils/TagMonitor.cpp
    utils/TagMonitor.cpp \
    utils/LatencyHistogram.cpp


LOCAL_SHARED_LIBRARIES:= \
LOCAL_SHARED_LIBRARIES:= \
    libui \
    libui \
+13 −1
Original line number Original line Diff line number Diff line
@@ -613,6 +613,11 @@ status_t Camera3Device::dump(int fd, const Vector<String16> &args) {
    }
    }
    write(fd, lines.string(), lines.size());
    write(fd, lines.string(), lines.size());


    if (mRequestThread != NULL) {
        mRequestThread->dumpCaptureRequestLatency(fd,
                "    ProcessCaptureRequest latency histogram:");
    }

    {
    {
        lines = String8("    Last request sent:\n");
        lines = String8("    Last request sent:\n");
        write(fd, lines.string(), lines.size());
        write(fd, lines.string(), lines.size());
@@ -3426,7 +3431,8 @@ Camera3Device::RequestThread::RequestThread(wp<Camera3Device> parent,
        mCurrentPreCaptureTriggerId(0),
        mCurrentPreCaptureTriggerId(0),
        mRepeatingLastFrameNumber(
        mRepeatingLastFrameNumber(
            hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES),
            hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES),
        mPrepareVideoStream(false) {
        mPrepareVideoStream(false),
        mRequestLatency(kRequestLatencyBinSize) {
    mStatusId = statusTracker->addComponent();
    mStatusId = statusTracker->addComponent();
}
}


@@ -3651,6 +3657,9 @@ void Camera3Device::RequestThread::requestExit() {
    // The exit from any possible waits
    // The exit from any possible waits
    mDoPauseSignal.signal();
    mDoPauseSignal.signal();
    mRequestSignal.signal();
    mRequestSignal.signal();

    mRequestLatency.log("ProcessCaptureRequest latency histogram");
    mRequestLatency.reset();
}
}


void Camera3Device::RequestThread::checkAndStopRepeatingRequest() {
void Camera3Device::RequestThread::checkAndStopRepeatingRequest() {
@@ -3867,11 +3876,14 @@ bool Camera3Device::RequestThread::threadLoop() {
            mNextRequests.size());
            mNextRequests.size());


    bool submitRequestSuccess = false;
    bool submitRequestSuccess = false;
    nsecs_t tRequestStart = systemTime(SYSTEM_TIME_MONOTONIC);
    if (mInterface->supportBatchRequest()) {
    if (mInterface->supportBatchRequest()) {
        submitRequestSuccess = sendRequestsBatch();
        submitRequestSuccess = sendRequestsBatch();
    } else {
    } else {
        submitRequestSuccess = sendRequestsOneByOne();
        submitRequestSuccess = sendRequestsOneByOne();
    }
    }
    nsecs_t tRequestEnd = systemTime(SYSTEM_TIME_MONOTONIC);
    mRequestLatency.add(tRequestStart, tRequestEnd);


    if (useFlushLock) {
    if (useFlushLock) {
        mFlushLock.unlock();
        mFlushLock.unlock();
+9 −0
Original line number Original line Diff line number Diff line
@@ -40,6 +40,7 @@
#include "device3/StatusTracker.h"
#include "device3/StatusTracker.h"
#include "device3/Camera3BufferManager.h"
#include "device3/Camera3BufferManager.h"
#include "utils/TagMonitor.h"
#include "utils/TagMonitor.h"
#include "utils/LatencyHistogram.h"
#include <camera_metadata_hidden.h>
#include <camera_metadata_hidden.h>


/**
/**
@@ -699,6 +700,11 @@ class Camera3Device :
         */
         */
        bool isStreamPending(sp<camera3::Camera3StreamInterface>& stream);
        bool isStreamPending(sp<camera3::Camera3StreamInterface>& stream);


        // dump processCaptureRequest latency
        void dumpCaptureRequestLatency(int fd, const char* name) {
            mRequestLatency.dump(fd, name);
        }

      protected:
      protected:


        virtual bool threadLoop();
        virtual bool threadLoop();
@@ -820,6 +826,9 @@ class Camera3Device :


        // Flag indicating if we should prepare video stream for video requests.
        // Flag indicating if we should prepare video stream for video requests.
        bool               mPrepareVideoStream;
        bool               mPrepareVideoStream;

        static const int32_t kRequestLatencyBinSize = 40; // in ms
        CameraLatencyHistogram mRequestLatency;
    };
    };
    sp<RequestThread> mRequestThread;
    sp<RequestThread> mRequestThread;


+2 −0
Original line number Original line Diff line number Diff line
@@ -85,6 +85,8 @@ void Camera3IOStreamBase::dump(int fd, const Vector<String16> &args) const {
    lines.appendFormat("      Total buffers: %zu, currently dequeued: %zu\n",
    lines.appendFormat("      Total buffers: %zu, currently dequeued: %zu\n",
            mTotalBufferCount, mHandoutTotalBufferCount);
            mTotalBufferCount, mHandoutTotalBufferCount);
    write(fd, lines.string(), lines.size());
    write(fd, lines.string(), lines.size());

    Camera3Stream::dump(fd, args);
}
}


status_t Camera3IOStreamBase::configureQueueLocked() {
status_t Camera3IOStreamBase::configureQueueLocked() {
+18 −4
Original line number Original line Diff line number Diff line
@@ -43,7 +43,8 @@ Camera3OutputStream::Camera3OutputStream(int id,
        mTraceFirstBuffer(true),
        mTraceFirstBuffer(true),
        mUseBufferManager(false),
        mUseBufferManager(false),
        mTimestampOffset(timestampOffset),
        mTimestampOffset(timestampOffset),
        mConsumerUsage(0) {
        mConsumerUsage(0),
        mDequeueBufferLatency(kDequeueLatencyBinSize) {


    if (mConsumer == NULL) {
    if (mConsumer == NULL) {
        ALOGE("%s: Consumer is NULL!", __FUNCTION__);
        ALOGE("%s: Consumer is NULL!", __FUNCTION__);
@@ -68,7 +69,8 @@ Camera3OutputStream::Camera3OutputStream(int id,
        mUseMonoTimestamp(false),
        mUseMonoTimestamp(false),
        mUseBufferManager(false),
        mUseBufferManager(false),
        mTimestampOffset(timestampOffset),
        mTimestampOffset(timestampOffset),
        mConsumerUsage(0) {
        mConsumerUsage(0),
        mDequeueBufferLatency(kDequeueLatencyBinSize) {


    if (format != HAL_PIXEL_FORMAT_BLOB && format != HAL_PIXEL_FORMAT_RAW_OPAQUE) {
    if (format != HAL_PIXEL_FORMAT_BLOB && format != HAL_PIXEL_FORMAT_RAW_OPAQUE) {
        ALOGE("%s: Bad format for size-only stream: %d", __FUNCTION__,
        ALOGE("%s: Bad format for size-only stream: %d", __FUNCTION__,
@@ -97,7 +99,8 @@ Camera3OutputStream::Camera3OutputStream(int id,
        mTraceFirstBuffer(true),
        mTraceFirstBuffer(true),
        mUseBufferManager(false),
        mUseBufferManager(false),
        mTimestampOffset(timestampOffset),
        mTimestampOffset(timestampOffset),
        mConsumerUsage(consumerUsage) {
        mConsumerUsage(consumerUsage),
        mDequeueBufferLatency(kDequeueLatencyBinSize) {
    // Deferred consumer only support preview surface format now.
    // Deferred consumer only support preview surface format now.
    if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
    if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
        ALOGE("%s: Deferred consumer only supports IMPLEMENTATION_DEFINED format now!",
        ALOGE("%s: Deferred consumer only supports IMPLEMENTATION_DEFINED format now!",
@@ -134,7 +137,8 @@ Camera3OutputStream::Camera3OutputStream(int id, camera3_stream_type_t type,
        mUseMonoTimestamp(false),
        mUseMonoTimestamp(false),
        mUseBufferManager(false),
        mUseBufferManager(false),
        mTimestampOffset(timestampOffset),
        mTimestampOffset(timestampOffset),
        mConsumerUsage(consumerUsage) {
        mConsumerUsage(consumerUsage),
        mDequeueBufferLatency(kDequeueLatencyBinSize) {


    if (setId > CAMERA3_STREAM_SET_ID_INVALID) {
    if (setId > CAMERA3_STREAM_SET_ID_INVALID) {
        mBufferReleasedListener = new BufferReleasedListener(this);
        mBufferReleasedListener = new BufferReleasedListener(this);
@@ -290,6 +294,9 @@ void Camera3OutputStream::dump(int fd, const Vector<String16> &args) const {
    write(fd, lines.string(), lines.size());
    write(fd, lines.string(), lines.size());


    Camera3IOStreamBase::dump(fd, args);
    Camera3IOStreamBase::dump(fd, args);

    mDequeueBufferLatency.dump(fd,
        "      DequeueBuffer latency histogram:");
}
}


status_t Camera3OutputStream::setTransform(int transform) {
status_t Camera3OutputStream::setTransform(int transform) {
@@ -529,7 +536,11 @@ status_t Camera3OutputStream::getBufferLockedCommon(ANativeWindowBuffer** anb, i
        sp<ANativeWindow> currentConsumer = mConsumer;
        sp<ANativeWindow> currentConsumer = mConsumer;
        mLock.unlock();
        mLock.unlock();


        nsecs_t dequeueStart = systemTime(SYSTEM_TIME_MONOTONIC);
        res = currentConsumer->dequeueBuffer(currentConsumer.get(), anb, fenceFd);
        res = currentConsumer->dequeueBuffer(currentConsumer.get(), anb, fenceFd);
        nsecs_t dequeueEnd = systemTime(SYSTEM_TIME_MONOTONIC);
        mDequeueBufferLatency.add(dequeueStart, dequeueEnd);

        mLock.lock();
        mLock.lock();
        if (res != OK) {
        if (res != OK) {
            ALOGE("%s: Stream %d: Can't dequeue next output buffer: %s (%d)",
            ALOGE("%s: Stream %d: Can't dequeue next output buffer: %s (%d)",
@@ -611,6 +622,9 @@ status_t Camera3OutputStream::disconnectLocked() {


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

    mDequeueBufferLatency.log("Stream %d dequeueBuffer latency histogram", mId);
    mDequeueBufferLatency.reset();
    return OK;
    return OK;
}
}


Loading