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

Commit 35a055b8 authored by Chih-Chung Chang's avatar Chih-Chung Chang
Browse files

Support multiple cameras in framework.

Change-Id: I081f0fbdca4b633715ea7c3b3d42f8662d27598a
parent d8a30349
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -95,13 +95,20 @@ Camera::~Camera()
    disconnect();
}

sp<Camera> Camera::connect()
int32_t Camera::getNumberOfCameras()
{
    const sp<ICameraService>& cs = getCameraService();
    if (cs == 0) return 0;
    return cs->getNumberOfCameras();
}

sp<Camera> Camera::connect(int cameraId)
{
    LOGV("connect");
    sp<Camera> c = new Camera();
    const sp<ICameraService>& cs = getCameraService();
    if (cs != 0) {
        c->mCamera = cs->connect(c);
        c->mCamera = cs->connect(c, cameraId);
    }
    if (c->mCamera != 0) {
        c->mCamera->asBinder()->linkToDeath(c);
+17 −2
Original line number Diff line number Diff line
@@ -34,12 +34,22 @@ public:
    {
    }

    // get number of cameras available
    virtual int32_t getNumberOfCameras()
    {
        Parcel data, reply;
        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
        remote()->transact(BnCameraService::GET_NUMBER_OF_CAMERAS, data, &reply);
        return reply.readInt32();
    }

    // connect to camera service
    virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient)
    virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient, int cameraId)
    {
        Parcel data, reply;
        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
        data.writeStrongBinder(cameraClient->asBinder());
        data.writeInt32(cameraId);
        remote()->transact(BnCameraService::CONNECT, data, &reply);
        return interface_cast<ICamera>(reply.readStrongBinder());
    }
@@ -53,10 +63,15 @@ status_t BnCameraService::onTransact(
    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
    switch(code) {
        case GET_NUMBER_OF_CAMERAS: {
            CHECK_INTERFACE(ICameraService, data, reply);
            reply->writeInt32(getNumberOfCameras());
            return NO_ERROR;
        } break;
        case CONNECT: {
            CHECK_INTERFACE(ICameraService, data, reply);
            sp<ICameraClient> cameraClient = interface_cast<ICameraClient>(data.readStrongBinder());
            sp<ICamera> camera = connect(cameraClient);
            sp<ICamera> camera = connect(cameraClient, data.readInt32());
            reply->writeStrongBinder(camera->asBinder());
            return NO_ERROR;
        } break;
+2 −1
Original line number Diff line number Diff line
@@ -113,7 +113,8 @@ class Camera : public BnCameraClient, public IBinder::DeathRecipient
public:
            // construct a camera client from an existing remote
    static  sp<Camera>  create(const sp<ICamera>& camera);
    static  sp<Camera>  connect();
    static  int32_t     getNumberOfCameras();
    static  sp<Camera>  connect(int cameraId);
                        ~Camera();
            void        init();

+5 −2
Original line number Diff line number Diff line
@@ -30,13 +30,16 @@ class ICameraService : public IInterface
{
public:
    enum {
        CONNECT = IBinder::FIRST_CALL_TRANSACTION,
        GET_NUMBER_OF_CAMERAS = IBinder::FIRST_CALL_TRANSACTION,
        CONNECT
    };

public:
    DECLARE_META_INTERFACE(CameraService);

    virtual sp<ICamera>     connect(const sp<ICameraClient>& cameraClient) = 0;
    virtual int32_t         getNumberOfCameras() = 0;
    virtual sp<ICamera>     connect(const sp<ICameraClient>& cameraClient,
                                    int cameraId) = 0;
};

// ----------------------------------------------------------------------------
+1 −1
Original line number Diff line number Diff line
@@ -106,7 +106,7 @@ void CameraSourceListener::postDataTimestamp(

// static
CameraSource *CameraSource::Create() {
    sp<Camera> camera = Camera::connect();
    sp<Camera> camera = Camera::connect(0);

    if (camera.get() == NULL) {
        return NULL;