diff options
Diffstat (limited to 'services/camera')
| -rw-r--r-- | services/camera/libcameraservice/device3/Camera3Device.cpp | 42 | ||||
| -rw-r--r-- | services/camera/libcameraservice/device3/Camera3Device.h | 4 | 
2 files changed, 36 insertions, 10 deletions
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp index 445c9c2..0bc8ed1 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.cpp +++ b/services/camera/libcameraservice/device3/Camera3Device.cpp @@ -2765,11 +2765,13 @@ bool Camera3Device::RequestThread::threadLoop() {              // error              ALOGE("RequestThread: Can't get input buffer, skipping request:"                      " %s (%d)", strerror(-res), res); -            Mutex::Autolock l(mRequestLock); -            if (mListener != NULL) { -                mListener->notifyError( -                        ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST, -                        nextRequest->mResultExtras); +            { +                Mutex::Autolock l(mRequestLock); +                if (mListener != NULL) { +                    mListener->notifyError( +                            ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST, +                            nextRequest->mResultExtras); +                }              }              cleanUpFailedRequest(request, nextRequest, outputBuffers);              return true; @@ -2792,11 +2794,13 @@ bool Camera3Device::RequestThread::threadLoop() {              // error              ALOGE("RequestThread: Can't get output buffer, skipping request:"                      " %s (%d)", strerror(-res), res); -            Mutex::Autolock l(mRequestLock); -            if (mListener != NULL) { -                mListener->notifyError( -                        ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST, -                        nextRequest->mResultExtras); +            { +                Mutex::Autolock l(mRequestLock); +                if (mListener != NULL) { +                    mListener->notifyError( +                            ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST, +                            nextRequest->mResultExtras); +                }              }              cleanUpFailedRequest(request, nextRequest, outputBuffers);              return true; @@ -2865,6 +2869,12 @@ bool Camera3Device::RequestThread::threadLoop() {          nextRequest->mSettings.unlock(request.settings);      } +    // Unset as current request +    { +        Mutex::Autolock l(mRequestLock); +        mNextRequest.clear(); +    } +      // Remove any previously queued triggers (after unlock)      res = removeTriggers(mPrevRequest);      if (res != OK) { @@ -2890,6 +2900,13 @@ bool Camera3Device::RequestThread::isStreamPending(          sp<Camera3StreamInterface>& stream) {      Mutex::Autolock l(mRequestLock); +    if (mNextRequest != nullptr) { +        for (const auto& s : mNextRequest->mOutputStreams) { +            if (stream == s) return true; +        } +        if (stream == mNextRequest->mInputStream) return true; +    } +      for (const auto& request : mRequestQueue) {          for (const auto& s : request->mOutputStreams) {              if (stream == s) return true; @@ -2924,6 +2941,9 @@ void Camera3Device::RequestThread::cleanUpFailedRequest(          nextRequest->mOutputStreams.editItemAt(i)->returnBuffer(              outputBuffers[i], 0);      } + +    Mutex::Autolock l(mRequestLock); +    mNextRequest.clear();  }  sp<Camera3Device::CaptureRequest> @@ -3007,6 +3027,8 @@ sp<Camera3Device::CaptureRequest>          nextRequest->mResultExtras.afTriggerId = mCurrentAfTriggerId;          nextRequest->mResultExtras.precaptureTriggerId = mCurrentPreCaptureTriggerId;      } +    mNextRequest = nextRequest; +      return nextRequest;  } diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h index 4fbcb2e..fcb5180 100644 --- a/services/camera/libcameraservice/device3/Camera3Device.h +++ b/services/camera/libcameraservice/device3/Camera3Device.h @@ -501,6 +501,10 @@ class Camera3Device :          Condition          mRequestSignal;          RequestList        mRequestQueue;          RequestList        mRepeatingRequests; +        // The next request being prepped for submission to the HAL, no longer +        // on the request queue. Read-only even with mRequestLock held, outside +        // of threadLoop +        sp<const CaptureRequest> mNextRequest;          bool               mReconfigured;  | 
