1) 안드로이드 카메라 출력 매커니즘
안드로이드에서 카메라에 입력되는 영상을 처리하는 것은 다음과 같은 방식을 따릅니다. 애플리케이션에서 surfaceView를 통해 surface를 생성하여 화면에 영상을 출력할 영역을 설정합니다. 그리고 카메라 서비스에서 카메라로부터 영상 프레임 데이터를 받아와 SurfaceFlinger를 통해 화면에 출력을 합니다. 이때 하드웨어에서 Overlay 기능을 지원하면 해당 영역에 Overlay를 통해 화면에 직접 출력이 됩니다.
-애플리케이션 계층
사용자가 직접 해당 어플을 만드는 계층입니다. 흔히들 많이 쓰는 캔디카메라나 스노우와 같은것들이 작동하는 계층입니다.
해당 계층의 CameraView는 안드로이드에서 제공하는 예제 애플리케이션으로, 카메라 영상을 화면에 출력한다. com.android.camera(Camera.apk)는 기본으로 제공되는 카메라 애플리케이션으로, 카메라와 관련된 여러 기능이 구현되어 있다.
- 애플리케이션 프레임워크 계층
해당 계층의 android.hardware.Camera는 Java로 구현된 서비스와 C++로 구현된 JNI가 존재하며 애플리케이션과 Native Service 간의 중간 계층으로 애플리케이션이 Native Service에 접근하기 위한 징검다리 역할을 수행한다. JNI의 경우 Java와 C++간의 연결통로로, 주로 Java와 C++간의 데이터 변환을 처리한다.
-라이브러리 계층
해당계층의 libcamera_client는 카메라 서비스의 클라이언트의 역할을 하며 Binder를 통해 카메라 서비스와 연결되어 상위 응용 계층에서 내려오는 제어요청을 카메라 서비스에 전달하고 결과를 받아 상위 계층으로 전달한다. 카메라 서비스는 카메라에 대한 전반적인 제어를 담당하며 libcamera_client를 통해 내려오는 요청에 대한 처리 및 카메라 장치를 관리한다.
-HAL 계층
해당 계층의 libcamera는 카메라 장치에 대한 인터페이스이다.
이 인터페이스는 두가지로 구분이 되는데,
카메라 관련 정보를 제공하고 카메라 관련 설정 및 카메라 장치를 관리하는 인터페이스 영역과 각 카메라 장치별로 카메라 드라이버를 통해 제어를 수행하는 HAL로 구분된다.
-커널
사용자 영역에서 카메라에 접근하기 위하여 사용하는 API인 V4L2를 제공하고,
V4L2는 각 SoC의 카메라 인터페이스와 연결된다. 이후 카메라 인터페이스 드라이버에서 카메라 장치 드라이버를 제어하여 카메라 서비스를 제공한다.
'CS > 안드로이드' 카테고리의 다른 글
[안드로이드] 카메라 #3_Callback (0) | 2016.10.24 |
---|---|
[안드로이드] 카메라 #2_카메라 애플리케이션 (0) | 2016.10.24 |