카메라 HAL

Android의 카메라 하드웨어 추상화 계층(HAL)은 android.hardware.camera2의 상위 수준의 카메라 프레임워크 API를 기본 카메라 드라이버 및 하드웨어에 연결합니다. Android 13부터 카메라 HAL 인터페이스 개발은 AIDL을 사용합니다. Android 8.0은 트레블을 도입하여 카메라 HAL API를 HAL 인터페이스 설명 언어(HIDL)로 정의된 안정적인 인터페이스로 전환합니다. 이전에 Android 7.0 및 이전 버전에 맞는 카메라 HAL 모듈과 드라이버를 개발한 경우 카메라 파이프라인의 중요한 변경사항을 확인하세요.

AIDL 카메라 HAL

Android 13 이상을 실행하는 기기의 경우 카메라 프레임워크에 AIDL 카메라 HAL 지원이 포함됩니다. 카메라 프레임워크는 HIDL 카메라 HAL도 지원하지만, Android 13 이상에 추가된 카메라 기능은 AIDL 카메라 HAL 인터페이스를 통해서만 사용할 수 있습니다. Android 13 이상으로 업그레이드하는 기기에서 이러한 기능을 구현하려면 기기 제조업체가 HIDL 카메라 인터페이스를 사용하던 것을 AIDL 카메라 인터페이스를 사용하도록 HAL 프로세스를 이전해야 합니다.

AIDL의 장점을 알아보려면 HAL용 AIDL을 참고하세요.

AIDL 카메라 HAL 구현

AIDL 카메라 HAL의 참조 구현은 hardware/google/camera/common/hal/aidl_service/를 참고하세요.

AIDL 카메라 HAL 사양은 다음 위치에서 찾을 수 있습니다.

AIDL로 이전하는 기기의 경우 기기 제조업체가 코드 구조에 따라 Android SELinux 정책(sepolicy)과 RC 파일을 수정해야 할 수도 있습니다.

AIDL 카메라 HAL 검증

AIDL 카메라 HAL 구현을 테스트하려면 기기가 모든 CTS 및 VTS 테스트를 통과하는지 확인합니다. Android 13에는 AIDL VTS 테스트 VtsAidlHalCameraProvider_TargetTest.cpp가 도입되었습니다.

카메라 HAL3 기능

Android Camera API 재설계의 목표는 Android 기기에서 카메라 하위 시스템을 제어하는 앱 기능을 대폭 향상하면서 API를 재구성하여 API의 효율성을 높이고 유지관리를 더 용이하게 하는 것입니다. 추가 컨트롤을 사용하면 여러 제품에서 안정적으로 작동할 수 있는 Android 기기의 고품질 카메라 앱을 더 쉽게 빌드할 수 있습니다. 이와 동시에 기기별 알고리즘을 가능할 때마다 사용해 품질과 성능을 극대화할 수 있습니다.

카메라 하위 시스템의 버전 3은 작동 모드를 이전 모드 및 기타 모드(예: 버스트 모드) 구현에 사용할 수 있는 단일 통합 뷰로 구성합니다. 이를 통해 사용자는 초점, 노출뿐 아니라 노이즈 감소, 대비, 선명도 향상 등의 더 많은 후처리를 더 잘 제어할 수 있습니다. 이처럼 뷰를 단순화하면 애플리케이션 개발자가 카메라의 다양한 기능을 사용하기가 더 쉬워집니다.

API는 카메라 하위 시스템을 파이프라인으로 모델링합니다. 파이프라인은 1:1 비율로 프레임 캡처 수신 요청을 프레임으로 변환합니다. 요청은 프레임 캡처 및 처리에 관한 모든 구성 정보를 캡슐화합니다. 여기에는 해상도 및 픽셀 형식, 수동 센서/렌즈/플래시 제어, 3A 작동 모드, RAW를 YUV로 변환하는 처리 제어, 통계 생성 등이 포함됩니다.

간단히 말해 애플리케이션 프레임워크는 카메라 하위 시스템으로부터 프레임을 요청하고 카메라 하위 시스템은 결과를 출력 스트림에 반환합니다. 또한 색상 공간 및 렌즈 음영과 같은 정보가 포함된 메타데이터가 결과 세트마다 생성됩니다. 카메라 버전 3은 카메라 버전 1의 단방향 스트림에 관한 파이프라인이라고 볼 수 있습니다. 각 캡처 요청은 센서에서 캡처된 하나의 이미지로 변환되며 다음과 같이 처리됩니다.

  • 캡처에 관한 메타데이터가 포함된 Result 객체입니다.
  • 이미지 데이터의 1~N개의 버퍼이며 버퍼 각각은 고유의 대상인 Surface가 있습니다.

가능한 출력 Surface 세트는 다음과 같이 사전 구성됩니다.

  • 각 Surface는 고정 해상도 이미지 버퍼 스트림의 대상입니다.
  • Surface는 소수일 때만 한 번에 출력으로 구성될 수 있습니다(최대 3개).

요청에는 원하는 모든 캡처 설정과 이 요청으로 이미지 버퍼를 푸시할 출력 Surface의 목록(구성된 세트 전체 중 일부)이 포함됩니다. 요청은 1회(capture()로) 발생하거나 무한 반복(setRepeatingRequest()로)될 수 있습니다. 캡처는 반복 요청보다 우선순위가 높습니다.

카메라 데이터 모델

그림 1. 카메라 핵심 작동 모델

카메라 HAL1 개요

카메라 하위 시스템의 버전 1은 높은 수준의 컨트롤과 다음 세 가지 작동 모드가 있는 블랙박스로 설계되었습니다.

  • 미리보기
  • 동영상 녹화
  • 스틸 캡처

각 모드에는 약간의 차이가 있지만 중복되는 기능이 있습니다. 그렇기 때문에 두 작동 모드 어디에도 해당하지 않는 버스트 모드와 같은 새로운 기능을 구현하기가 어려웠습니다.

카메라 블록 다이어그램

그림 2. 카메라 구성요소

많은 기기가 여전히 카메라 HAL1에 의존하기 때문에 Android 7.0은 카메라 HAL1을 계속 지원합니다. 또한 Android 카메라 서비스는 HAL1과 HAL3 구현을 모두 지원하므로, 카메라 HAL1을 사용하는 저성능 전면 카메라와 카메라 HAL3을 사용하는 고급 후면 카메라를 지원하고자 할 때 유용합니다.

단일 카메라 HAL 모듈(자체 버전 번호가 있음)은 각각 자체 버전 번호가 있는 다수의 개별 카메라 기기를 나열합니다. 카메라 모듈 2 이상은 기기 2 이상을 지원해야 하며 이러한 카메라 모듈에는 혼합된 카메라 기기 버전이 있을 수 있습니다. 따라서 Android에서 HAL1 및 HAL3 구현을 모두 지원한다고 할 수 있습니다.