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

Commit 82db9e61 authored by Igor Murashkin's avatar Igor Murashkin Committed by Android (Google) Code Review
Browse files

camera3: Fix recording failure when switching resolutions while preview on

Bug: 9069574
Change-Id: Ife2ae5467f799dbe37e66714b3a6c9a51e1fe328
parent f21daf47
Loading
Loading
Loading
Loading
+17 −3
Original line number Original line Diff line number Diff line
@@ -889,7 +889,10 @@ status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
        }
        }
    }
    }


    res = mStreamingProcessor->updateRecordingStream(params);
    res = updateProcessorStream<
            StreamingProcessor,
            &StreamingProcessor::updateRecordingStream>(mStreamingProcessor,
                                                        params);
    if (res != OK) {
    if (res != OK) {
        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
                __FUNCTION__, mCameraId, strerror(-res), res);
                __FUNCTION__, mCameraId, strerror(-res), res);
@@ -1608,9 +1611,20 @@ status_t Camera2Client::syncWithDevice() {
template <typename ProcessorT>
template <typename ProcessorT>
status_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
status_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
                                              camera2::Parameters params) {
                                              camera2::Parameters params) {
    // No default template arguments until C++11, so we need this overload
    return updateProcessorStream<ProcessorT, &ProcessorT::updateStream>(
            processor, params);
}

template <typename ProcessorT,
          status_t (ProcessorT::*updateStreamF)(const Parameters &)>
status_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
                                              Parameters params) {
    status_t res;
    status_t res;


    res = processor->updateStream(params);
    // Get raw pointer since sp<T> doesn't have operator->*
    ProcessorT *processorPtr = processor.get();
    res = (processorPtr->*updateStreamF)(params);


    /**
    /**
     * Can't update the stream if it's busy?
     * Can't update the stream if it's busy?
@@ -1631,7 +1645,7 @@ status_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
                    __FUNCTION__, mCameraId, strerror(-res), res);
                    __FUNCTION__, mCameraId, strerror(-res), res);
        }
        }


        res = processor->updateStream(params);
        res = (processorPtr->*updateStreamF)(params);
        if (res != OK) {
        if (res != OK) {
            ALOGE("%s: Camera %d: Failed to update processing stream "
            ALOGE("%s: Camera %d: Failed to update processing stream "
                  " despite having halted streaming first: %s (%d)",
                  " despite having halted streaming first: %s (%d)",
+3 −0
Original line number Original line Diff line number Diff line
@@ -161,6 +161,9 @@ private:


    template <typename ProcessorT>
    template <typename ProcessorT>
    status_t updateProcessorStream(sp<ProcessorT> processor, Parameters params);
    status_t updateProcessorStream(sp<ProcessorT> processor, Parameters params);
    template <typename ProcessorT,
              status_t (ProcessorT::*updateStreamF)(const Parameters &)>
    status_t updateProcessorStream(sp<ProcessorT> processor, Parameters params);


    sp<camera2::FrameProcessor> mFrameProcessor;
    sp<camera2::FrameProcessor> mFrameProcessor;


+7 −1
Original line number Original line Diff line number Diff line
@@ -316,7 +316,13 @@ status_t StreamingProcessor::updateRecordingStream(const Parameters &params) {
                currentHeight != (uint32_t)params.videoHeight) {
                currentHeight != (uint32_t)params.videoHeight) {
            // TODO: Should wait to be sure previous recording has finished
            // TODO: Should wait to be sure previous recording has finished
            res = device->deleteStream(mRecordingStreamId);
            res = device->deleteStream(mRecordingStreamId);
            if (res != OK) {

            if (res == -EBUSY) {
                ALOGV("%s: Camera %d: Device is busy, call "
                      "updateRecordingStream after it becomes idle",
                      __FUNCTION__, mId);
                return res;
            } else if (res != OK) {
                ALOGE("%s: Camera %d: Unable to delete old output stream "
                ALOGE("%s: Camera %d: Unable to delete old output stream "
                        "for recording: %s (%d)", __FUNCTION__,
                        "for recording: %s (%d)", __FUNCTION__,
                        mId, strerror(-res), res);
                        mId, strerror(-res), res);