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

Commit c44111b2 authored by Eino-Ville Talvala's avatar Eino-Ville Talvala Committed by Android (Google) Code Review
Browse files

Merge "Camera2: Add prepare for output streams"

parents a5bf4e03 4d44cad2
Loading
Loading
Loading
Loading
+21 −1
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ enum {
    CAMERA_IDLE,
    CAPTURE_STARTED,
    RESULT_RECEIVED,
    PREPARED
};

class BpCameraDeviceCallbacks: public BpInterface<ICameraDeviceCallbacks>
@@ -80,7 +81,6 @@ public:
        data.writeNoException();
    }


    void onResultReceived(const CameraMetadata& metadata,
            const CaptureResultExtras& resultExtras) {
        ALOGV("onResultReceived");
@@ -93,6 +93,17 @@ public:
        remote()->transact(RESULT_RECEIVED, data, &reply, IBinder::FLAG_ONEWAY);
        data.writeNoException();
    }

    void onPrepared(int streamId)
    {
        ALOGV("onPrepared");
        Parcel data, reply;
        data.writeInterfaceToken(ICameraDeviceCallbacks::getInterfaceDescriptor());
        data.writeInt32(streamId);
        remote()->transact(PREPARED, data, &reply, IBinder::FLAG_ONEWAY);
        data.writeNoException();
    }

};

IMPLEMENT_META_INTERFACE(CameraDeviceCallbacks,
@@ -160,6 +171,15 @@ status_t BnCameraDeviceCallbacks::onTransact(
            data.readExceptionCode();
            return NO_ERROR;
        } break;
        case PREPARED: {
            ALOGV("onPrepared");
            CHECK_INTERFACE(ICameraDeviceCallbacks, data, reply);
            CaptureResultExtras result;
            int streamId = data.readInt32();
            onPrepared(streamId);
            data.readExceptionCode();
            return NO_ERROR;
        } break;
        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
+24 −1
Original line number Diff line number Diff line
@@ -47,7 +47,8 @@ enum {
    CREATE_DEFAULT_REQUEST,
    GET_CAMERA_INFO,
    WAIT_UNTIL_IDLE,
    FLUSH
    FLUSH,
    PREPARE
};

namespace {
@@ -348,6 +349,20 @@ public:
        return res;
    }

    virtual status_t prepare(int streamId)
    {
        ALOGV("prepare");
        Parcel data, reply;

        data.writeInterfaceToken(ICameraDeviceUser::getInterfaceDescriptor());
        data.writeInt32(streamId);

        remote()->transact(PREPARE, data, &reply);

        reply.readExceptionCode();
        return reply.readInt32();
    }

private:


@@ -545,6 +560,14 @@ status_t BnCameraDeviceUser::onTransact(
            reply->writeInt32(endConfigure());
            return NO_ERROR;
        } break;
        case PREPARE: {
            CHECK_INTERFACE(ICameraDeviceUser, data, reply);
            int streamId = data.readInt32();
            reply->writeNoException();
            reply->writeInt32(prepare(streamId));
            return NO_ERROR;
        } break;

        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
+3 −0
Original line number Diff line number Diff line
@@ -65,6 +65,9 @@ public:
    // One way
    virtual void            onResultReceived(const CameraMetadata& metadata,
                                             const CaptureResultExtras& resultExtras) = 0;

    // One way
    virtual void            onPrepared(int streamId) = 0;
};

// ----------------------------------------------------------------------------
+5 −0
Original line number Diff line number Diff line
@@ -133,6 +133,11 @@ public:
     */
    virtual status_t        flush(/*out*/
                                  int64_t* lastFrameNumber = NULL) = 0;

    /**
     * Preallocate buffers for a given output stream asynchronously.
     */
    virtual status_t        prepare(int streamId) = 0;
};

// ----------------------------------------------------------------------------
+44 −0
Original line number Diff line number Diff line
@@ -671,6 +671,42 @@ status_t CameraDeviceClient::flush(int64_t* lastFrameNumber) {
    return mDevice->flush(lastFrameNumber);
}

status_t CameraDeviceClient::prepare(int streamId) {
    ATRACE_CALL();
    ALOGV("%s", __FUNCTION__);

    status_t res = OK;
    if ( (res = checkPid(__FUNCTION__) ) != OK) return res;

    Mutex::Autolock icl(mBinderSerializationLock);

    // Guard against trying to prepare non-created streams
    ssize_t index = NAME_NOT_FOUND;
    for (size_t i = 0; i < mStreamMap.size(); ++i) {
        if (streamId == mStreamMap.valueAt(i)) {
            index = i;
            break;
        }
    }

    if (index == NAME_NOT_FOUND) {
        ALOGW("%s: Camera %d: Invalid stream ID (%d) specified, no stream "
              "created yet", __FUNCTION__, mCameraId, streamId);
        return BAD_VALUE;
    }

    // Also returns BAD_VALUE if stream ID was not valid
    res = mDevice->prepare(streamId);

    if (res == BAD_VALUE) {
        ALOGE("%s: Camera %d: Unexpected BAD_VALUE when preparing stream, but we"
              " already checked and the stream ID (%d) should be valid.",
              __FUNCTION__, mCameraId, streamId);
    }

    return res;
}

status_t CameraDeviceClient::dump(int fd, const Vector<String16>& args) {
    String8 result;
    result.appendFormat("CameraDeviceClient[%d] (%p) dump:\n",
@@ -730,6 +766,14 @@ void CameraDeviceClient::notifyShutter(const CaptureResultExtras& resultExtras,
    }
}

void CameraDeviceClient::notifyPrepared(int streamId) {
    // Thread safe. Don't bother locking.
    sp<ICameraDeviceCallbacks> remoteCb = getRemoteCallback();
    if (remoteCb != 0) {
        remoteCb->onPrepared(streamId);
    }
}

void CameraDeviceClient::detachDevice() {
    if (mDevice == 0) return;

Loading