现在的位置: 首页 > 移动开发 > 正文

Android开发之Camera分析(一)

2019年09月04日 移动开发 ⁄ 共 5396字 ⁄ 字号 评论关闭

Android之Camera服务分析

 Android系统中Camera是作为mediaservice服务中的一项,在开机过程中启动的。

/frameworsk/base/media/mediaserver/main_mediaserver.cpp:

int main(int argc, char** argv)
{
    sp<ProcessState> proc(ProcessState::self());
    sp<IServiceManager> sm = defaultServiceManager();
    LOGI("ServiceManager: %p", sm.get());
    AudioFlinger::instantiate();
    MediaPlayerService::instantiate();
    CameraService::instantiate();
    AudioPolicyService::instantiate();
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
}

 

/frameworks/base/services/camera/libcameraservice/CameraService.cpp:
我们在CameraSerivce.cpp文件中并没找到CameraService::instantiate(),但是我们在CameraService.h文件中发现:CameraService同时继承于两个类:BinderService<CameaService> 和 BnCameraSerivce。

/frameworks/base/services/camera/libcameraservice/CameraSerivce.h:

 

class MemoryHeapBase;
class MediaPlayer;
class CameraHardwareInterface;

class CameraService :
    public BinderService<CameraService>,
    public BnCameraService
{
    class Client;
    friend class BinderService<CameraService>;
public:
    static char const* getServiceName() { return "media.camera"; }

                        CameraService();
    virtual             ~CameraService();
    .............
};

 

       我们找到CameraService的父类:BinderService<SERVICE>它是一个模板类,替换之后就是:

class BinderService<CameraService>

{

public:

       static status_t publish() {

            sp<IServiceManager> sm(defaultServiceManager());

            return sm->addService(String(CameraService::getServiceName()),
new CameraServiec());

       } 

        static void instantiate() { publish(); }

}

所以CameraService::instantiate();最后调用的还是:sm->addService("media.camera", new CameraService());将自己加入到ServiceManager的服务链表中。

 

CameraService作为BnCameraService的实现类,在Binder通信机制中是最终调用到的函数的类。

class BnCameraService: public BnInterface<ICameraService>
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};

主要提供onTransact函数,作为Binder通信的服务端,处理来自BpCameraService发来的命令。

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 CONNECT: {
            CHECK_INTERFACE(ICameraService, data, reply);
            sp<ICameraClient> cameraClient = interface_cast<ICameraClient>(data.readStrongBinder());
            sp<ICamera> camera = connect(cameraClient, data.readInt32());
            reply->writeStrongBinder(camera->asBinder());
            return NO_ERROR;
        } break;
        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
}

注意onTransact()函数中调用的一些函数如:getNumOfCameras(), getCameraInfo(),  connect()等,我们在BpCameraService和BnCameraService的父类ICameraService中声明为纯虚函数,在BpCameraService和CameraService中分别给出了实现,BpCameraService作为代理类,提供接口给客户端,真正实现在BnCameraService的子类CameraService中。

class ICameraService : public IInterface
{
public:
    enum {
        GET_NUMBER_OF_CAMERAS = IBinder::FIRST_CALL_TRANSACTION,
        GET_CAMERA_INFO,
        CONNECT
    };

public:
    DECLARE_META_INTERFACE(CameraService);

    virtual int32_t         getNumberOfCameras() = 0;
    virtual status_t        getCameraInfo(int cameraId,
                                          struct CameraInfo* cameraInfo) = 0;
    virtual sp<ICamera>     connect(const sp<ICameraClient>& cameraClient,
                                    int cameraId) = 0;
};

宏声明:DECLARE_META_INTERFACE(CameraService)替换之后就是声明一些函数:

static const android::Strin16 descriptor;
static android::sp<ICameraService> asInterface(const android::sp<android::IBinder>& obj);
virtual const android::String16& getInterfaceDescriptor() const;
ICameraService();
virtual ICameraService();

宏实现:IMPLEMENT_META_INTERFACE(CameraService, "android.hardware.ICameraService")

static const android::Strin16 ICameraService::descriptor("android.hadrware.ICameraService");
static android::sp<ICameraService> ICameraServiec::asInterface(const android::sp<android::IBinder>& obj)
{
	android::sp<ICameraService> intr;
	if ( obj != NULL) {
		intr = static_cast<ICameraService*>(obj->queryLocalInterface(ICameraService::descriptor).get());
		if (intr == NULL){
			intr = new BpCameraService(obj);
		}
	}
	return intr;
}
virtual const android::String16& ICameraService::getInterfaceDescriptor() const
{
	return ICameraService::descriptor();
}
ICameraService() {}
virtual ICameraService() {}

 

BpCameraService 提供接口给客户端:

class BpCameraService: public BpInterface<ICameraService>
{
public:
    BpCameraService(const sp<IBinder>& impl)
        : BpInterface<ICameraService>(impl)
    {
    }

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

    // connect to camera service
    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());
    }
};

 

到此现在我们已经在Binder服务中注册了我们的CameraService服务,并提供了给客户端的代理类BpCameraService。

 

抱歉!评论已关闭.