android2.2平台上支持多camera,Android2.2平台上支持多camera(三)

5、ICameraService.h文件

Framework/base/include/camera/ICameraService.h是CameraService对外的接口文件。

首先增加了三个宏定义,如下:

class ICameraService : public IInterface

{

public:

enum {

GET_NUMBER_OF_CAMERAS = IBinder::FIRST_CALL_TRANSACTION,

GET_CAMERA_INFO,

CONNECT,

SET_CAMERA_ID

};

GET_NUMBER_OF_CAMERAS,GET_CAMERA_INFO和SET_CAMERA_ID对应于那三个函数接口。

接下来,定义了三个纯虚函数,CODE如下:public:

DECLARE_META_INTERFACE(CameraService);

virtual int32_t getNumberOfCameras() = 0;

virtual status_t getCameraInfo(int cameraId,

struct CameraInfo* cameraInfo) = 0;

virtual int32_t setCameraId(int cameraId) = 0;

virtual sp connect(const sp& cameraClient) = 0;

};

6、ICameraService.cpp文件

Framework/base/libs/camera/ICameraService.cpp是对ICameraService.h文件的实现。

它对下面三个函数进行了定义:

// 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();

}

// get information about a camera

virtual status_t getCameraInfo(int cameraId,

struct CameraInfo* cameraInfo) {

Parcel data, reply;

data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());

data.writeInt32(cameraId);

remote()->transact(BnCameraService::GET_CAMERA_INFO, data, &reply);

cameraInfo->facing = reply.readInt32();

cameraInfo->orientation = reply.readInt32();

return reply.readInt32();

}

virtual int32_t setCameraId(int cameraId)

{

Parcel data, reply;

data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());

data.writeInt32(cameraId);

remote()->transact(BnCameraService::SET_CAMERA_ID, data, &reply);

return reply.readInt32();

}

然后又在函数BnCameraService::onTransact()中做了修改:

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 GET_CAMERA_INFO: {

CHECK_INTERFACE(ICameraService, data, reply);

CameraInfo cameraInfo;

memset(&cameraInfo, 0, sizeof(cameraInfo));

status_t result = getCameraInfo(data.readInt32(), &cameraInfo);

reply->writeInt32(cameraInfo.facing);

reply->writeInt32(cameraInfo.orientation);

reply->writeInt32(result);

return NO_ERROR;

} break;

case SET_CAMERA_ID: {

CHECK_INTERFACE(ICameraService, data, reply);

reply->writeInt32(setCameraId(data.readInt32()));

return NO_ERROR;

} break;

case CONNECT: {

CHECK_INTERFACE(ICameraService, data, reply);

sp cameraClient = interface_cast(data.readStrongBinder());

sp camera = connect(cameraClient);

reply->writeStrongBinder(camera->asBinder());

return NO_ERROR;

} break;

default:

return BBinder::onTransact(code, data, reply, flags);

}

}

这里通过Binder与CameraService.cpp进行通信。下面介绍CameraService相关的文件。

7、CameraService.h文件

Frameworks/base/camera/libcameraservice/CameraService.h中定义了如下三个接口函数:

virtual int32_tgetNumberOfCameras();

virtual status_tgetCameraInfo(int cameraId,

struct CameraInfo* cameraInfo);

virtual int32_tsetCameraId(int cameraId);

其具体实现在CameraService.cpp中。

8、CameraService.cpp

frameworks/base/camera/libcameraservice/CameraService.cpp调用Camera HAL层的接口,对CameraService.h中的三个新增接口做了实现。其CODE如下:

int32_t CameraService::getNumberOfCameras() {

return HAL_getNumberOfCameras();

}

status_t CameraService::getCameraInfo(int cameraId,

struct CameraInfo* cameraInfo) {

int mNumberOfCameras = HAL_getNumberOfCameras();

if (cameraId < 0 || cameraId >= mNumberOfCameras) {

return BAD_VALUE;

}

HAL_getCameraInfo(cameraId, cameraInfo);

return OK;

}

int32_t CameraService::setCameraId(int cameraId) {

return HAL_setCameraId(cameraId);

}

下面我们将介绍Camera HAL层对多Camera的支持。(待续)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值