Android Camera 模塊分析(四)

 3.3 Camera本地庫libui.so

       frameworks/base/libs/ui/中的Camera.cpp文件用於實現Camera.h提供的接口,其中一個重要的片斷以下所示:java

const sp<ICameraService>& Camera::getCameraService() 
{ 
Mutex::Autolock _l(mLock); 
if (mCameraService.get() == 0) { 
sp<IServiceManager> sm = defaultServiceManager(); 
sp<IBinder> binder; 
do { 
binder = sm->getService(String16("media.camera")); 
if (binder != 0) 
break; 
LOGW("CameraService not published, waiting..."); 
usleep(500000); // 0.5 s 
} while(true); 
if (mDeathNotifier == NULL) { 
mDeathNotifier = new DeathNotifier(); 
} 
binder->linkToDeath(mDeathNotifier); 
mCameraService = interface_cast<ICameraService>(binder); 
} 
LOGE_IF(mCameraService==0, "no CameraService!?"); 
return mCameraService; 
}
其中最重要的一點是binder = sm->getService(String16("media.camera"));;這個調用用來獲得一個名稱爲"media.camera" 的服務,這個調用返回值的類型爲IBinder,根據實現將其轉換成類型ICameraService使用。

       一個函數 connect的實現 以下所示:函數

sp<Camera> Camera::connect() 
{ 
sp<Camera> c = new Camera(); 
const sp<ICameraService>& cs = getCameraService(); 
if (cs != 0) { 
c->mCamera = cs->connect(c); 
} 
if (c->mCamera != 0) { 
c->mCamera->asBinder()->linkToDeath(c); 
c->mStatus = NO_ERROR; 
} 
return c; 
}
 connect經過調用getCameraService獲得一個 ICameraService,再經過 ICameraService的cs->connect(c)獲得一個 ICamera類型的指針。 調用connect將獲得一個 Camera的指針,正常狀況下Camera的成員 mCamera已經初始化完成。

  一個具體的函數startPreview 以下所示:ui

status_t Camera::startPreview() 
{ 
return mCamera->startPreview(); 
}
這些操做能夠直接對 mCamera來進行,它是ICamera類型的指針。
  其餘一些函數的實現也與setDataSource相似。

  libmedia。so中的其餘一些文件與頭文件的名稱相同,它們是:spa

frameworks/base/libs/ui/ICameraClient.cpp
frameworks/base/libs/ui/ICamera.cpp
frameworks/base/libs/ui/ICameraService.cpp
在此處,BnCameraClient和BnCameraService類雖然實現了onTransact()函數,可是因爲還有純虛函數沒有實現,所以這個類都是不能實例化的。

  ICameraClient。cpp中的BnCameraClient在別的地方也沒有實現;而ICameraService。cpp中的BnCameraService類在別的地方被繼承並實現,繼承者實現了Camera服務的具體功能。

        3。4 Camera服務libcameraservice。so
  frameworks/base/camera/libcameraservice/ 用於實現一個Camera的服務,這個服務是繼承ICameraService的具體實現。

  在這裏的Android。mk文件中,使用宏USE_CAMERA_STUB決定是否使用真的Camera,若是宏爲真,則使用 CameraHardwareStub。cpp和FakeCamera。cpp構造一個假的Camera,若是爲假則使用 CameraService。cpp構造一個實際上的Camera服務。

  CameraService。cpp是繼承BnCameraService 的實現,在這個類的內部又定義了類Client,CameraService::Client繼承了BnCamera。在運做的過程當中 CameraService::connect()函數用於獲得一個CameraService::Client,在使用過程當中,主要是經過調用這個類的接口來實現完成Camera的功能,因爲CameraService::Client自己繼承了BnCamera類,而BnCamera類是繼承了 ICamera,所以這個類是能夠被當成ICamera來使用的。

  CameraService和CameraService::Client兩個類的結果以下所示:指針

class CameraService : public BnCameraService 
{ 
class Client : public BnCamera {};
wp<Client> mClient;
}

在CameraService中的一個靜態函數instantiate()用於初始化一個Camera服務,寒暑以下所示:code

void CameraService::instantiate() { 
defaultServiceManager()->addService( String16("media.camera"), new CameraService()); 
}
事實上,CameraService:instantiate()這個函數註冊了一個名稱爲"media。camera"的服務,這個服務和Camera。cpp中調用的名稱相對應。

  Camera整個運做機制是:在Camera。cpp中能夠調用ICameraService的接口,這時實際上調用的是 BpCameraService,而BpCameraService又經過Binder機制和BnCameraService實現兩個進程的通信。而 BpCameraService的實現就是這裏的CameraService。所以,Camera。cpp雖然是在另一個進程中運行,可是調用 ICameraService的接口就像直接調用同樣,從connect()中能夠獲得一個ICamera類型的指針,真個指針的實現其實是 CameraService:Client。

  而這些Camera功能的具體實現,就是CameraService::Client所實現的了,其構造函數以下所示:繼承

CameraService::Client::Client(const sp<CameraService>& cameraService, 
const sp<ICameraClient>& cameraClient) : 
mCameraService(cameraService), mCameraClient(cameraClient), mHardware(0) 
{ 
mHardware = openCameraHardware(); 
mHasFrameCallback = false; 
}
構造函數中,調用openCameraHardware()獲得一個CameraHardwareInterface類型的指針,並做爲其成員mHardware。之後對實際的Camera的操做都經過對這個指針進行。這是一個簡單的直接調用關係。
  事實上,真正的Camera功能己經過實現CameraHardwareInterface類來完成。在這個庫當中 CameraHardwareStub。h和CameraHardwareStub。cpp兩個文件定義了一個樁模塊的接口,在沒有Camera硬件的狀況下使用,例如在仿真器的狀況下使用的文件就是CameraHardwareStub。cpp和它依賴的文件FakeCamera。cpp。

  CameraHardwareStub類的結構以下所示:接口

class CameraHardwareStub : public CameraHardwareInterface {
class PreviewThread : public Thread {
};
};
相關文章
相關標籤/搜索