簡介 Android Camera 三大功能區塊

jollen 發表於 November 25, 2010 8:41 PM

近期為客戶進行 Android Camera 的顧問服務,主要的任務是改善 Android 在拍照方面的效能,撰寫了一些相當基本的觀念介紹,在此與大家分享。Android 的 Camera 系統大概念上可分成三大區塊:

1. android.hardware.Camera
2. Camera Service
3. Camera HAL + videodev

其中最核心的 Camera Service 預設是實作在 SystemServer 裡。控制 Camera 硬體的 HAL 部份,目前大多採用 Linux 的 videodev 介面來擷取視訊。以下簡介 Android Camera 的三大功能區塊。

1. android.hardware.Camera

屬於 Java 層,Camera 應用程式可透過 Camera.open() 來取得 android.hardware.Camera 的實例化 (instance),並且可實作 Camera.PictureCallback 介面來取得「照片影像」。Camera.PictureCallback 提供二種照片資料:JPEG Data 與 Raw Data。這部份的細節可參考 Camera.takePicture()。

2. Camera Service

Android 的 Camera Service 重要程式碼實作於 libcameraservice.so,對於 Android 平臺的移植者來說,可忽略 Camera Service 的內部細節,直接實作 Camera HAL 即可驅動 Camera 硬體。但對於 Camera Service 的設計,以及實作細節進行一些研究,對於改善現有 reference code 的效率會有一些幫助。關於 Camera Service 的設計細節,留待後續做說明。

3. Camera HAL

驅動 Camera 硬體最關鍵的部份。在 Google 官方的 Android Platform Developer's Guide 文件裡指出,平臺移植者可實作 CameraHardwareInterface 來驅動 Camera 硬體。CameraHardwareInterface 是 Android 的 Camera HAL 設計,開發者可參考 Android 裡的 CameraHardwareStub.c 範例,以了解 CameraHardwareInterface 的實作原理。

Camera HAL 裡設計了二個 thread,分別是:preview thread 與 picture thread。Picture thread 在取得影像資料後,以 callback 方式將 JPEG data 或 raw data 往 Java 層傳遞。如上述,Camera 應用程式透過實作 Camera.PictureCallback 取得影像資料。

Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue

您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw