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

Commit 0302b6d1 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes I7362942f,I946fb95d

* changes:
  Camera: rework API1 shim takePicture retry logic
  Camera: bug fixes for HAL buffer manager
parents d97b1b39 7e5a2042
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -1773,6 +1773,8 @@ void Camera2Client::notifyError(int32_t errorCode,
            break;
    }

    mCaptureSequencer->notifyError(errorCode, resultExtras);

    ALOGE("%s: Error condition %d reported by HAL, requestId %" PRId32, __FUNCTION__, errorCode,
              resultExtras.requestId);

@@ -1927,9 +1929,6 @@ void Camera2Client::notifyAutoExposure(uint8_t newState, int triggerId) {

void Camera2Client::notifyShutter(const CaptureResultExtras& resultExtras,
                                  nsecs_t timestamp) {
    (void)resultExtras;
    (void)timestamp;

    ALOGV("%s: Shutter notification for request id %" PRId32 " at time %" PRId64,
            __FUNCTION__, resultExtras.requestId, timestamp);
    mCaptureSequencer->notifyShutter(resultExtras, timestamp);
+25 −0
Original line number Diff line number Diff line
@@ -117,6 +117,31 @@ void CaptureSequencer::notifyShutter(const CaptureResultExtras& resultExtras,
    }
}

void CaptureSequencer::notifyError(int32_t errorCode, const CaptureResultExtras& resultExtras) {
    ATRACE_CALL();
    bool jpegBufferLost = false;
    if (errorCode == hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER) {
        sp<Camera2Client> client = mClient.promote();
        if (client == nullptr) {
            return;
        }
        int captureStreamId = client->getCaptureStreamId();
        if (captureStreamId == resultExtras.errorStreamId) {
            jpegBufferLost = true;
        }
    } else if (errorCode ==
            hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST) {
        if (resultExtras.requestId == mShutterCaptureId) {
            jpegBufferLost = true;
        }
    }

    if (jpegBufferLost) {
        sp<MemoryBase> emptyBuffer;
        onCaptureAvailable(/*timestamp*/0, emptyBuffer, /*captureError*/true);
    }
}

void CaptureSequencer::onResultAvailable(const CaptureResult &result) {
    ATRACE_CALL();
    ALOGV("%s: New result available.", __FUNCTION__);
+3 −0
Original line number Diff line number Diff line
@@ -65,6 +65,9 @@ class CaptureSequencer:
    void notifyShutter(const CaptureResultExtras& resultExtras,
                       nsecs_t timestamp);

    // Notifications about shutter (capture start)
    void notifyError(int32_t errorCode, const CaptureResultExtras& resultExtras);

    // Notification from the frame processor
    virtual void onResultAvailable(const CaptureResult &result);

+0 −32
Original line number Diff line number Diff line
@@ -62,31 +62,6 @@ void JpegProcessor::onFrameAvailable(const BufferItem& /*item*/) {
    }
}

void JpegProcessor::onBufferRequestForFrameNumber(uint64_t /*frameNumber*/,
        int /*streamId*/, const CameraMetadata& /*settings*/) {
    // Intentionally left empty
}

void JpegProcessor::onBufferAcquired(const BufferInfo& /*bufferInfo*/) {
    // Intentionally left empty
}

void JpegProcessor::onBufferReleased(const BufferInfo& bufferInfo) {
    ALOGV("%s", __FUNCTION__);
    if (bufferInfo.mError) {
        // Only lock in case of error, since we get one of these for each
        // onFrameAvailable as well, and scheduling may delay this call late
        // enough to run into later preview restart operations, for non-error
        // cases.
        // b/29524651
        ALOGV("%s: JPEG buffer lost", __FUNCTION__);
        Mutex::Autolock l(mInputMutex);
        mCaptureDone = true;
        mCaptureSuccess = false;
        mCaptureDoneSignal.signal();
    }
}

status_t JpegProcessor::updateStream(const Parameters &params) {
    ATRACE_CALL();
    ALOGV("%s", __FUNCTION__);
@@ -181,13 +156,6 @@ status_t JpegProcessor::updateStream(const Parameters &params) {
                    strerror(-res), res);
            return res;
        }

        res = device->addBufferListenerForStream(mCaptureStreamId, this);
        if (res != OK) {
              ALOGE("%s: Camera %d: Can't add buffer listeneri: %s (%d)",
                    __FUNCTION__, mId, strerror(-res), res);
              return res;
        }
    }
    return OK;
}
+1 −8
Original line number Diff line number Diff line
@@ -42,8 +42,7 @@ struct Parameters;
 * Still image capture output image processing
 */
class JpegProcessor:
            public Thread, public CpuConsumer::FrameAvailableListener,
            public camera3::Camera3StreamBufferListener {
            public Thread, public CpuConsumer::FrameAvailableListener {
  public:
    JpegProcessor(sp<Camera2Client> client, wp<CaptureSequencer> sequencer);
    ~JpegProcessor();
@@ -51,12 +50,6 @@ class JpegProcessor:
    // CpuConsumer listener implementation
    void onFrameAvailable(const BufferItem& item);

    // Camera3StreamBufferListener implementation
    void onBufferAcquired(const BufferInfo& bufferInfo) override;
    void onBufferReleased(const BufferInfo& bufferInfo) override;
    void onBufferRequestForFrameNumber(uint64_t frameNumber, int streamId,
            const CameraMetadata& settings) override;

    status_t updateStream(const Parameters &params);
    status_t deleteStream();
    int getStreamId() const;
Loading