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

Commit 25d729c3 authored by Eino-Ville Talvala's avatar Eino-Ville Talvala
Browse files

resolved conflicts for merge of 364a2677 to master

Change-Id: I21f23c1c5e4408c24c359bef6270dffce47a988d
parents 7919fa2c 364a2677
Loading
Loading
Loading
Loading
+67 −29
Original line number Diff line number Diff line
@@ -595,6 +595,21 @@ void Camera2Client::setPreviewCallbackFlag(int flag) {

void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {
    status_t res = OK;

    switch(params.state) {
        case Parameters::STOPPED:
        case Parameters::WAITING_FOR_PREVIEW_WINDOW:
        case Parameters::PREVIEW:
            // OK
            break;
        default:
            if (flag & CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) {
                ALOGE("%s: Camera %d: Can't use preview callbacks "
                        "in state %d", __FUNCTION__, mCameraId, params.state);
                return;
            }
    }

    if (flag & CAMERA_FRAME_CALLBACK_FLAG_ONE_SHOT_MASK) {
        ALOGV("%s: setting oneshot", __FUNCTION__);
        params.previewCallbackOneShot = true;
@@ -615,24 +630,15 @@ void Camera2Client::setPreviewCallbackFlagL(Parameters &params, int flag) {

        params.previewCallbackFlags = flag;

        switch(params.state) {
            case Parameters::PREVIEW:
        if (params.state == Parameters::PREVIEW) {
            res = startPreviewL(params, true);
                break;
            case Parameters::RECORD:
            case Parameters::VIDEO_SNAPSHOT:
                res = startRecordingL(params, true);
                break;
            default:
                break;
        }
            if (res != OK) {
                ALOGE("%s: Camera %d: Unable to refresh request in state %s",
                        __FUNCTION__, mCameraId,
                        Parameters::getStateName(params.state));
            }
        }

    }
}

status_t Camera2Client::setPreviewCallbackTarget(
@@ -755,6 +761,26 @@ status_t Camera2Client::startPreviewL(Parameters &params, bool restart) {
            params.previewCallbackSurface;

    if (callbacksEnabled) {
        // Can't have recording stream hanging around when enabling callbacks,
        // since it exceeds the max stream count on some devices.
        if (mStreamingProcessor->getRecordingStreamId() != NO_STREAM) {
            ALOGV("%s: Camera %d: Clearing out recording stream before "
                    "creating callback stream", __FUNCTION__, mCameraId);
            res = mStreamingProcessor->stopStream();
            if (res != OK) {
                ALOGE("%s: Camera %d: Can't stop streaming to delete "
                        "recording stream", __FUNCTION__, mCameraId);
                return res;
            }
            res = mStreamingProcessor->deleteRecordingStream();
            if (res != OK) {
                ALOGE("%s: Camera %d: Unable to delete recording stream before "
                        "enabling callbacks: %s (%d)", __FUNCTION__, mCameraId,
                        strerror(-res), res);
                return res;
            }
        }

        res = mCallbackProcessor->updateStream(params);
        if (res != OK) {
            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
@@ -951,6 +977,29 @@ status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
        }
    }

    // Not all devices can support a preview callback stream and a recording
    // stream at the same time, so assume none of them can.
    if (mCallbackProcessor->getStreamId() != NO_STREAM) {
        ALOGV("%s: Camera %d: Clearing out callback stream before "
                "creating recording stream", __FUNCTION__, mCameraId);
        res = mStreamingProcessor->stopStream();
        if (res != OK) {
            ALOGE("%s: Camera %d: Can't stop streaming to delete callback stream",
                    __FUNCTION__, mCameraId);
            return res;
        }
        res = mCallbackProcessor->deleteStream();
        if (res != OK) {
            ALOGE("%s: Camera %d: Unable to delete callback stream before "
                    "record: %s (%d)", __FUNCTION__, mCameraId,
                    strerror(-res), res);
            return res;
        }
    }
    // Disable callbacks if they're enabled; can't record and use callbacks,
    // and we can't fail record start without stagefright asserting.
    params.previewCallbackFlags = 0;

    res = updateProcessorStream<
            StreamingProcessor,
            &StreamingProcessor::updateRecordingStream>(mStreamingProcessor,
@@ -962,19 +1011,6 @@ status_t Camera2Client::startRecordingL(Parameters &params, bool restart) {
    }

    Vector<uint8_t> outputStreams;
    bool callbacksEnabled = (params.previewCallbackFlags &
            CAMERA_FRAME_CALLBACK_FLAG_ENABLE_MASK) ||
            params.previewCallbackSurface;

    if (callbacksEnabled) {
        res = mCallbackProcessor->updateStream(params);
        if (res != OK) {
            ALOGE("%s: Camera %d: Unable to update callback stream: %s (%d)",
                    __FUNCTION__, mCameraId, strerror(-res), res);
            return res;
        }
        outputStreams.push(getCallbackStreamId());
    }
    outputStreams.push(getPreviewStreamId());
    outputStreams.push(getRecordingStreamId());

@@ -1706,6 +1742,8 @@ status_t Camera2Client::updateProcessorStream(sp<ProcessorT> processor,
     * queue) and then try again. Resume streaming once we're done.
     */
    if (res == -EBUSY) {
        ALOGV("%s: Camera %d: Pausing to update stream", __FUNCTION__,
                mCameraId);
        res = mStreamingProcessor->togglePauseStream(/*pause*/true);
        if (res != OK) {
            ALOGE("%s: Camera %d: Can't pause streaming: %s (%d)",
+17 −3
Original line number Diff line number Diff line
@@ -109,7 +109,9 @@ status_t CallbackProcessor::updateStream(const Parameters &params) {

    if (!mCallbackToApp && mCallbackConsumer == 0) {
        // Create CPU buffer queue endpoint, since app hasn't given us one
        mCallbackConsumer = new CpuConsumer(kCallbackHeapCount);
        // Make it async to avoid disconnect deadlocks
        mCallbackConsumer = new CpuConsumer(kCallbackHeapCount,
                /*synchronized*/ false);
        mCallbackConsumer->setFrameAvailableListener(this);
        mCallbackConsumer->setName(String8("Camera2Client::CallbackConsumer"));
        mCallbackWindow = new Surface(
@@ -167,7 +169,7 @@ status_t CallbackProcessor::updateStream(const Parameters &params) {
status_t CallbackProcessor::deleteStream() {
    ATRACE_CALL();
    sp<CameraDeviceBase> device;

    status_t res;
    {
        Mutex::Autolock l(mInputMutex);

@@ -180,7 +182,19 @@ status_t CallbackProcessor::deleteStream() {
            return INVALID_OPERATION;
        }
    }
    device->deleteStream(mCallbackStreamId);
    res = device->waitUntilDrained();
    if (res != OK) {
        ALOGE("%s: Error waiting for HAL to drain: %s (%d)",
                __FUNCTION__, strerror(-res), res);
        return res;
    }

    res = device->deleteStream(mCallbackStreamId);
    if (res != OK) {
        ALOGE("%s: Unable to delete callback stream: %s (%d)",
                __FUNCTION__, strerror(-res), res);
        return res;
    }

    {
        Mutex::Autolock l(mInputMutex);