Loading services/camera/libcameraservice/device3/Camera3Device.cpp +34 −23 Original line number Diff line number Diff line Loading @@ -2452,13 +2452,14 @@ void Camera3Device::setErrorStateLockedV(const char *fmt, va_list args) { status_t Camera3Device::registerInFlight(uint32_t frameNumber, int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput, const AeTriggerCancelOverride_t &aeTriggerCancelOverride) { const AeTriggerCancelOverride_t &aeTriggerCancelOverride, bool hasAppCallback) { ATRACE_CALL(); Mutex::Autolock l(mInFlightLock); ssize_t res; res = mInFlightMap.add(frameNumber, InFlightRequest(numBuffers, resultExtras, hasInput, aeTriggerCancelOverride)); aeTriggerCancelOverride, hasAppCallback)); if (res < 0) return res; if (mInFlightMap.size() == 1) { Loading Loading @@ -2702,10 +2703,10 @@ void Camera3Device::processCaptureResult(const camera3_capture_result *result) { InFlightRequest &request = mInFlightMap.editValueAt(idx); ALOGVV("%s: got InFlightRequest requestId = %" PRId32 ", frameNumber = %" PRId64 ", burstId = %" PRId32 ", partialResultCount = %d", ", partialResultCount = %d, hasCallback = %d", __FUNCTION__, request.resultExtras.requestId, request.resultExtras.frameNumber, request.resultExtras.burstId, result->partial_result); result->partial_result, request.hasCallback); // Always update the partial count to the latest one if it's not 0 // (buffers only). When framework aggregates adjacent partial results // into one, the latest partial count will be used. Loading Loading @@ -2743,7 +2744,7 @@ void Camera3Device::processCaptureResult(const camera3_capture_result *result) { } } if (isPartialResult) { if (isPartialResult && request.hasCallback) { // Send partial capture result sendPartialCaptureResult(result->result, request.resultExtras, frameNumber, request.aeTriggerCancelOverride); Loading Loading @@ -2807,7 +2808,7 @@ void Camera3Device::processCaptureResult(const camera3_capture_result *result) { if (shutterTimestamp == 0) { request.pendingMetadata = result->result; request.collectedPartialResult = collectedPartialResult; } else { } else if (request.hasCallback) { CameraMetadata metadata; metadata = result->result; sendCaptureResult(metadata, request.resultExtras, Loading Loading @@ -2973,6 +2974,8 @@ void Camera3Device::notifyShutter(const camera3_shutter_msg_t &msg, } } r.shutterTimestamp = msg.timestamp; if (r.hasCallback) { ALOGVV("Camera %s: %s: Shutter fired for frame %d (id %d) at %" PRId64, mId.string(), __FUNCTION__, msg.frame_number, r.resultExtras.requestId, msg.timestamp); Loading @@ -2980,13 +2983,11 @@ void Camera3Device::notifyShutter(const camera3_shutter_msg_t &msg, if (listener != NULL) { listener->notifyShutter(r.resultExtras, msg.timestamp); } r.shutterTimestamp = msg.timestamp; // send pending result and buffers sendCaptureResult(r.pendingMetadata, r.resultExtras, r.collectedPartialResult, msg.frame_number, r.hasInputBuffer, r.aeTriggerCancelOverride); } returnOutputBuffers(r.pendingOutputBuffers.array(), r.pendingOutputBuffers.size(), r.shutterTimestamp); r.pendingOutputBuffers.clear(); Loading Loading @@ -3887,7 +3888,8 @@ bool Camera3Device::RequestThread::threadLoop() { status_t Camera3Device::RequestThread::prepareHalRequests() { ATRACE_CALL(); for (auto& nextRequest : mNextRequests) { for (size_t i = 0; i < mNextRequests.size(); i++) { auto& nextRequest = mNextRequests.editItemAt(i); sp<CaptureRequest> captureRequest = nextRequest.captureRequest; camera3_capture_request_t* halRequest = &nextRequest.halRequest; Vector<camera3_stream_buffer_t>* outputBuffers = &nextRequest.outputBuffers; Loading Loading @@ -3964,8 +3966,8 @@ status_t Camera3Device::RequestThread::prepareHalRequests() { outputBuffers->insertAt(camera3_stream_buffer_t(), 0, captureRequest->mOutputStreams.size()); halRequest->output_buffers = outputBuffers->array(); for (size_t i = 0; i < captureRequest->mOutputStreams.size(); i++) { sp<Camera3OutputStreamInterface> outputStream = captureRequest->mOutputStreams.editItemAt(i); for (size_t j = 0; j < captureRequest->mOutputStreams.size(); j++) { sp<Camera3OutputStreamInterface> outputStream = captureRequest->mOutputStreams.editItemAt(j); // Prepare video buffers for high speed recording on the first video request. if (mPrepareVideoStream && outputStream->isVideoStream()) { Loading @@ -3983,8 +3985,8 @@ status_t Camera3Device::RequestThread::prepareHalRequests() { } } res = outputStream->getBuffer(&outputBuffers->editItemAt(i), captureRequest->mOutputSurfaces[i]); res = outputStream->getBuffer(&outputBuffers->editItemAt(j), captureRequest->mOutputSurfaces[j]); if (res != OK) { // Can't get output buffer from gralloc queue - this could be due to // abandoned queue or other consumer misbehavior, so not a fatal Loading @@ -4006,10 +4008,19 @@ status_t Camera3Device::RequestThread::prepareHalRequests() { CLOGE("RequestThread: Parent is gone"); return INVALID_OPERATION; } // If this request list is for constrained high speed recording (not // preview), and the current request is not the last one in the batch, // do not send callback to the app. bool hasCallback = true; if (mNextRequests[0].captureRequest->mBatchSize > 1 && i != mNextRequests.size()-1) { hasCallback = false; } res = parent->registerInFlight(halRequest->frame_number, totalNumBuffers, captureRequest->mResultExtras, /*hasInput*/halRequest->input_buffer != NULL, captureRequest->mAeTriggerCancelOverride); captureRequest->mAeTriggerCancelOverride, hasCallback); ALOGVV("%s: registered in flight requestId = %" PRId32 ", frameNumber = %" PRId64 ", burstId = %" PRId32 ".", __FUNCTION__, Loading services/camera/libcameraservice/device3/Camera3Device.h +12 −4 Original line number Diff line number Diff line Loading @@ -859,6 +859,12 @@ class Camera3Device : // CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL AeTriggerCancelOverride_t aeTriggerCancelOverride; // Whether this inflight request's shutter and result callback are to be // called. The policy is that if the request is the last one in the constrained // high speed recording request list, this flag will be true. If the request list // is not for constrained high speed recording, this flag will also be true. bool hasCallback; // Default constructor needed by KeyedVector InFlightRequest() : shutterTimestamp(0), Loading @@ -867,11 +873,12 @@ class Camera3Device : haveResultMetadata(false), numBuffersLeft(0), hasInputBuffer(false), aeTriggerCancelOverride({false, 0, false, 0}){ aeTriggerCancelOverride({false, 0, false, 0}), hasCallback(true) { } InFlightRequest(int numBuffers, CaptureResultExtras extras, bool hasInput, AeTriggerCancelOverride aeTriggerCancelOverride) : AeTriggerCancelOverride aeTriggerCancelOverride, bool hasAppCallback) : shutterTimestamp(0), sensorTimestamp(0), requestStatus(OK), Loading @@ -879,7 +886,8 @@ class Camera3Device : numBuffersLeft(numBuffers), resultExtras(extras), hasInputBuffer(hasInput), aeTriggerCancelOverride(aeTriggerCancelOverride){ aeTriggerCancelOverride(aeTriggerCancelOverride), hasCallback(hasAppCallback) { } }; Loading @@ -892,7 +900,7 @@ class Camera3Device : status_t registerInFlight(uint32_t frameNumber, int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput, const AeTriggerCancelOverride_t &aeTriggerCancelOverride); const AeTriggerCancelOverride_t &aeTriggerCancelOverride, bool callback); /** * Override result metadata for cancelling AE precapture trigger applied in Loading Loading
services/camera/libcameraservice/device3/Camera3Device.cpp +34 −23 Original line number Diff line number Diff line Loading @@ -2452,13 +2452,14 @@ void Camera3Device::setErrorStateLockedV(const char *fmt, va_list args) { status_t Camera3Device::registerInFlight(uint32_t frameNumber, int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput, const AeTriggerCancelOverride_t &aeTriggerCancelOverride) { const AeTriggerCancelOverride_t &aeTriggerCancelOverride, bool hasAppCallback) { ATRACE_CALL(); Mutex::Autolock l(mInFlightLock); ssize_t res; res = mInFlightMap.add(frameNumber, InFlightRequest(numBuffers, resultExtras, hasInput, aeTriggerCancelOverride)); aeTriggerCancelOverride, hasAppCallback)); if (res < 0) return res; if (mInFlightMap.size() == 1) { Loading Loading @@ -2702,10 +2703,10 @@ void Camera3Device::processCaptureResult(const camera3_capture_result *result) { InFlightRequest &request = mInFlightMap.editValueAt(idx); ALOGVV("%s: got InFlightRequest requestId = %" PRId32 ", frameNumber = %" PRId64 ", burstId = %" PRId32 ", partialResultCount = %d", ", partialResultCount = %d, hasCallback = %d", __FUNCTION__, request.resultExtras.requestId, request.resultExtras.frameNumber, request.resultExtras.burstId, result->partial_result); result->partial_result, request.hasCallback); // Always update the partial count to the latest one if it's not 0 // (buffers only). When framework aggregates adjacent partial results // into one, the latest partial count will be used. Loading Loading @@ -2743,7 +2744,7 @@ void Camera3Device::processCaptureResult(const camera3_capture_result *result) { } } if (isPartialResult) { if (isPartialResult && request.hasCallback) { // Send partial capture result sendPartialCaptureResult(result->result, request.resultExtras, frameNumber, request.aeTriggerCancelOverride); Loading Loading @@ -2807,7 +2808,7 @@ void Camera3Device::processCaptureResult(const camera3_capture_result *result) { if (shutterTimestamp == 0) { request.pendingMetadata = result->result; request.collectedPartialResult = collectedPartialResult; } else { } else if (request.hasCallback) { CameraMetadata metadata; metadata = result->result; sendCaptureResult(metadata, request.resultExtras, Loading Loading @@ -2973,6 +2974,8 @@ void Camera3Device::notifyShutter(const camera3_shutter_msg_t &msg, } } r.shutterTimestamp = msg.timestamp; if (r.hasCallback) { ALOGVV("Camera %s: %s: Shutter fired for frame %d (id %d) at %" PRId64, mId.string(), __FUNCTION__, msg.frame_number, r.resultExtras.requestId, msg.timestamp); Loading @@ -2980,13 +2983,11 @@ void Camera3Device::notifyShutter(const camera3_shutter_msg_t &msg, if (listener != NULL) { listener->notifyShutter(r.resultExtras, msg.timestamp); } r.shutterTimestamp = msg.timestamp; // send pending result and buffers sendCaptureResult(r.pendingMetadata, r.resultExtras, r.collectedPartialResult, msg.frame_number, r.hasInputBuffer, r.aeTriggerCancelOverride); } returnOutputBuffers(r.pendingOutputBuffers.array(), r.pendingOutputBuffers.size(), r.shutterTimestamp); r.pendingOutputBuffers.clear(); Loading Loading @@ -3887,7 +3888,8 @@ bool Camera3Device::RequestThread::threadLoop() { status_t Camera3Device::RequestThread::prepareHalRequests() { ATRACE_CALL(); for (auto& nextRequest : mNextRequests) { for (size_t i = 0; i < mNextRequests.size(); i++) { auto& nextRequest = mNextRequests.editItemAt(i); sp<CaptureRequest> captureRequest = nextRequest.captureRequest; camera3_capture_request_t* halRequest = &nextRequest.halRequest; Vector<camera3_stream_buffer_t>* outputBuffers = &nextRequest.outputBuffers; Loading Loading @@ -3964,8 +3966,8 @@ status_t Camera3Device::RequestThread::prepareHalRequests() { outputBuffers->insertAt(camera3_stream_buffer_t(), 0, captureRequest->mOutputStreams.size()); halRequest->output_buffers = outputBuffers->array(); for (size_t i = 0; i < captureRequest->mOutputStreams.size(); i++) { sp<Camera3OutputStreamInterface> outputStream = captureRequest->mOutputStreams.editItemAt(i); for (size_t j = 0; j < captureRequest->mOutputStreams.size(); j++) { sp<Camera3OutputStreamInterface> outputStream = captureRequest->mOutputStreams.editItemAt(j); // Prepare video buffers for high speed recording on the first video request. if (mPrepareVideoStream && outputStream->isVideoStream()) { Loading @@ -3983,8 +3985,8 @@ status_t Camera3Device::RequestThread::prepareHalRequests() { } } res = outputStream->getBuffer(&outputBuffers->editItemAt(i), captureRequest->mOutputSurfaces[i]); res = outputStream->getBuffer(&outputBuffers->editItemAt(j), captureRequest->mOutputSurfaces[j]); if (res != OK) { // Can't get output buffer from gralloc queue - this could be due to // abandoned queue or other consumer misbehavior, so not a fatal Loading @@ -4006,10 +4008,19 @@ status_t Camera3Device::RequestThread::prepareHalRequests() { CLOGE("RequestThread: Parent is gone"); return INVALID_OPERATION; } // If this request list is for constrained high speed recording (not // preview), and the current request is not the last one in the batch, // do not send callback to the app. bool hasCallback = true; if (mNextRequests[0].captureRequest->mBatchSize > 1 && i != mNextRequests.size()-1) { hasCallback = false; } res = parent->registerInFlight(halRequest->frame_number, totalNumBuffers, captureRequest->mResultExtras, /*hasInput*/halRequest->input_buffer != NULL, captureRequest->mAeTriggerCancelOverride); captureRequest->mAeTriggerCancelOverride, hasCallback); ALOGVV("%s: registered in flight requestId = %" PRId32 ", frameNumber = %" PRId64 ", burstId = %" PRId32 ".", __FUNCTION__, Loading
services/camera/libcameraservice/device3/Camera3Device.h +12 −4 Original line number Diff line number Diff line Loading @@ -859,6 +859,12 @@ class Camera3Device : // CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL AeTriggerCancelOverride_t aeTriggerCancelOverride; // Whether this inflight request's shutter and result callback are to be // called. The policy is that if the request is the last one in the constrained // high speed recording request list, this flag will be true. If the request list // is not for constrained high speed recording, this flag will also be true. bool hasCallback; // Default constructor needed by KeyedVector InFlightRequest() : shutterTimestamp(0), Loading @@ -867,11 +873,12 @@ class Camera3Device : haveResultMetadata(false), numBuffersLeft(0), hasInputBuffer(false), aeTriggerCancelOverride({false, 0, false, 0}){ aeTriggerCancelOverride({false, 0, false, 0}), hasCallback(true) { } InFlightRequest(int numBuffers, CaptureResultExtras extras, bool hasInput, AeTriggerCancelOverride aeTriggerCancelOverride) : AeTriggerCancelOverride aeTriggerCancelOverride, bool hasAppCallback) : shutterTimestamp(0), sensorTimestamp(0), requestStatus(OK), Loading @@ -879,7 +886,8 @@ class Camera3Device : numBuffersLeft(numBuffers), resultExtras(extras), hasInputBuffer(hasInput), aeTriggerCancelOverride(aeTriggerCancelOverride){ aeTriggerCancelOverride(aeTriggerCancelOverride), hasCallback(hasAppCallback) { } }; Loading @@ -892,7 +900,7 @@ class Camera3Device : status_t registerInFlight(uint32_t frameNumber, int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput, const AeTriggerCancelOverride_t &aeTriggerCancelOverride); const AeTriggerCancelOverride_t &aeTriggerCancelOverride, bool callback); /** * Override result metadata for cancelling AE precapture trigger applied in Loading