Loading services/camera/libcameraservice/Android.mk +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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 \ Loading services/camera/libcameraservice/device3/Camera3Device.cpp +13 −1 Original line number Original line Diff line number Diff line Loading @@ -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()); Loading Loading @@ -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(); } } Loading Loading @@ -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() { Loading Loading @@ -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(); Loading services/camera/libcameraservice/device3/Camera3Device.h +9 −0 Original line number Original line Diff line number Diff line Loading @@ -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> /** /** Loading Loading @@ -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(); Loading Loading @@ -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; Loading services/camera/libcameraservice/device3/Camera3IOStreamBase.cpp +2 −0 Original line number Original line Diff line number Diff line Loading @@ -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() { Loading services/camera/libcameraservice/device3/Camera3OutputStream.cpp +18 −4 Original line number Original line Diff line number Diff line Loading @@ -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__); Loading @@ -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__, Loading Loading @@ -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!", Loading Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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)", Loading Loading @@ -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 Loading
services/camera/libcameraservice/Android.mk +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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 \ Loading
services/camera/libcameraservice/device3/Camera3Device.cpp +13 −1 Original line number Original line Diff line number Diff line Loading @@ -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()); Loading Loading @@ -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(); } } Loading Loading @@ -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() { Loading Loading @@ -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(); Loading
services/camera/libcameraservice/device3/Camera3Device.h +9 −0 Original line number Original line Diff line number Diff line Loading @@ -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> /** /** Loading Loading @@ -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(); Loading Loading @@ -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; Loading
services/camera/libcameraservice/device3/Camera3IOStreamBase.cpp +2 −0 Original line number Original line Diff line number Diff line Loading @@ -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() { Loading
services/camera/libcameraservice/device3/Camera3OutputStream.cpp +18 −4 Original line number Original line Diff line number Diff line Loading @@ -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__); Loading @@ -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__, Loading Loading @@ -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!", Loading Loading @@ -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); Loading Loading @@ -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) { Loading Loading @@ -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)", Loading Loading @@ -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