Android Camera系統

來源:互聯網
上載者:User

1. Overview

1.1 物理架構

1.2 Android架構

2. CameraService

3. HAL

4. Overlay

5. Video for Linux

1. Overview

 本文以Freescale IMX為例剖析camera網路攝影機的系統架構。

 

1.1 物理架構

 硬體方面,camera系統分為主控制器和網路攝影機裝置,功能上主要有preview預覽,takePicture拍照和recording錄影。

1) IPU - Image Process Unit 影像處理單元,用於控制攝像機和顯示屏。

2)映像採集 - 由camera採集的映像資料資訊通過IPU的CSI介面控制。

3)DMA映射到記憶體 - IPU將採集到得資料通過DMA映射到一段記憶體。

4)隊列機制 - 為了更高效地傳送資料,將記憶體中的資料取出加入一隊列,並傳送到另一隊列。

5)視頻輸出 - 將視頻資料從隊列中取出,通過IPU控制這段獨立顯存,最終將視頻顯示出來。

 

1.2 Android架構

Android的camera系統架構自上而下分別為應用程式層-架構層-硬體抽象層-linux驅動層。

1) APP - Framework

應用程式層與java架構層的間主要由Binder機制進行通訊。

系統初始化時會開啟一個CameraService的守護進程,為上層應用提供camera對的功能介面。

2) Framework - HAL

架構層與硬體抽象層間通過回呼函數傳遞資料。

3) Overlay

Overlay層由ServiceFlinger和OverlayHal組成,實現視頻輸出功能,只有camera架構層或者視頻架構層能調用它,上層無法直接調用。

4) HAL - driver

抽象層位於使用者空間,通過系統調用如open(),read(),ioctl()等與核心空間進行資料傳遞。

 

2 CameraService

 Camera的主要功能有取景Preview,拍照takePicture和攝影Recording,下文以取景為例,剖析camera系統架構。

 

要實現取景Preview功能,主要須調用CameraService::Client::startPreview()和CameraService::Client::setOverlay(),前者通過mHardware->startPreview();調用cameraHal硬體抽象層以實現取景的整個流程,後者通過mSurface->createOverlay();調用surfaceFlinger層建立overlay_object對象。

 

3 HAL

 

startPreview主要完成三項任務,配置圖象,配置記憶體,開啟兩個存取buf隊列的線程。

1) cameraPreviewConfig()配置預覽圖象參數

CameraOpen() - 通過開啟裝置節點/dev/video0得以由系統介面與裝置驅動互動。

S_FMT - ioctl()的指令,設定圖象像素格式,將資料由硬體抽象層傳遞至Linux驅動,這裡也就是v4l2。

G_FMT - 得到圖象像素格式,將資料由底層驅動v4l2返回至硬體抽象層。

S_PARM - 設定模式的指令,這個指令傳到底層後,將會實現對camera硬體的控制。

2) cameraPreviewStart()開啟預覽,實際上配置了記憶體

REQBUFS - 申請記憶體,通過dma_alloc_coherent()為camera申請一端連續的dma記憶體。

QUERYBUF - 詢問記憶體,將申請到記憶體的物理地址,虛擬位址等資料從核心空間傳遞到使用者空間。

QBUF - 排入佇列,將通過詢問得到的buf加入一個隊列。

3) PreviewShowFrameThread()和PreviewShowFrameThread()

PreviewCaptureFrameThread()捕捉一幀資料的線程,通過DQBUF,從隊列中取出一個buf資料,這裡,一個buf即一幀資料即一張圖片。注意,如果camera沒有採集到圖片,這個線程會在DQBUF阻塞。

PreviewShowFrameThread()顯示一幀資料的線程。

mDataCb() - 回呼函數,將採集到的圖象資料傳回CameraService,再由CameraService傳遞給上層應用。

mOverlay->dequeueBuffer() - 調用Overlay層,從Overlay層得到一個閒置overlaybuffer,將圖象資料拷貝到這個buffer裡。至於這個buffer後續的工作,即視頻輸出,則交給了Overlay去完成。

QUERYBUF & QBUF - 由於已經從隊列裡取出了一個buf,需要再詢問並加入另一個buf到隊列裡。

4) Overlay

CameraService::Client::startPreview()完成mHardware->startPreview();後便去執行CameraService::Client::setOverlay(),如果沒有任何overlay,則建立一個新的,通過mHardware->setOverlay(new Overlay(mOverlayRef))調用到SurfaceFlinger層,再由overlay_dev->createOverlay();調用到overlay的硬體抽象層,抽象層建立並初始化overlay對象,與cameraHal類似,通過ioctl()指令與底層v4l2通訊,配置視頻參數和記憶體空間。隨後開啟一個overlay線程,用於存取隊列中的視頻資料。

注意,SurfaceFlinger裡也會開啟一個處理overlay的surfaceFlinger線程,用於等待使用者事件,作相應的overlay控制。

 

5 Video for Linux

 

v4l2 - video for linux 2是linux為視頻驅動抽象出的一層統一的介面,資料結構如下,

v4l2作為master主裝置由(*attach)與camera從裝置進行綁定。

初始化函數probe()如下,

1) init_camera_struct()初始化v4l2主裝置的資料結構,實現open(), read(), ioctl(), mmap()等操作。

2) v4l2_int_device_register(),註冊v4l2主裝置,綁定camera從裝置。

3) video_register_device()註冊linux video裝置,建立/dev/video0裝置節點。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.