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

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

Merge "camera3: Fix recording failure when switching resolutions while preview on" into jb-mr2-dev

parents c2c874d8 82db9e61
Loading
Loading
Loading
Loading
+17 −3
Original line number 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) {
        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
                __FUNCTION__, mCameraId, strerror(-res), res);
@@ -1608,9 +1611,20 @@ status_t Camera2Client::syncWithDevice() {
template <typename ProcessorT>
status_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
                                              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;

    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?
@@ -1631,7 +1645,7 @@ status_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
                    __FUNCTION__, mCameraId, strerror(-res), res);
        }

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

    template <typename ProcessorT>
    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;

+7 −1
Original line number Diff line number Diff line
@@ -316,7 +316,13 @@ status_t StreamingProcessor::updateRecordingStream(const Parameters &params) {
                currentHeight != (uint32_t)params.videoHeight) {
            // TODO: Should wait to be sure previous recording has finished
            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 "
                        "for recording: %s (%d)", __FUNCTION__,
                        mId, strerror(-res), res);