Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .omm/data-flow/description.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,5 @@ CLI는 직접 인자 또는 base64url JSON을 받고 shell UID·허용 설정·
벤치마크 JSON은 기기 안에서만 생성하며, files/benchmarks와 baseline 목록으로 비교합니다. 외부 JSON 가져오기는 0.13.0에서 제거했습니다.

Multi 모드의 ConcurrentSession은 독립 장치마다 출력과 저장을 관리합니다. 사진은 이미지·CaptureResult 센서 시각을 연결한 장치별 JPEG이며 다른 장치 영상을 합성하지 않습니다. ConcurrentPhotoStore는 JPEG를 DCIM/HALCamera에, 공통 촬영 ID·장치 ID·성공 또는 실패를 Download/HALCamera의 JSON에 기록합니다. 두 엔진은 MultiRecording을 공유하며, 하나의 마이크 AAC를 장치별 MP4에 결합한 뒤 공개합니다. 녹음이나 파일 하나라도 실패하면 해당 녹화 묶음의 공개 파일을 회수합니다. Split 배치는 프리뷰만 바꾸며 인코더 크기는 장치 스트림과 회전에서 정합니다. 이 경로는 Benchmark 계산과 분리됩니다.

Portrait는 Depth 메뉴에서 선택하지만 별도 확장 세션의 컬러 미리보기와 OEM JPEG를 받습니다. PortraitCameraEngine은 JPEG를 MediaLibrary로 저장하고 효과·해상도·시각만 촬영 JSON에 남깁니다. 확장 콜백은 벤치마크나 일반 CaptureResult 지표에 섞지 않습니다.
2 changes: 1 addition & 1 deletion .omm/overall-architecture/camera-engines/description.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
camera/는 CameraEngine 인터페이스와 Camera2Engine·CameraXEngine·DepthCameraEngine을 제공합니다. Camera2Engine은 기본 크기 선택 경로와 벤치마크용 명시적 StreamSpec 경로를 구분합니다. 세션별 콜백과 close(done) 완료 통지가 러너에 연결됩니다.
camera/는 CameraEngine 인터페이스와 Camera2Engine·CameraXEngine·DepthCameraEngine·PortraitCameraEngine을 제공합니다. Camera2Engine은 기본 크기 선택 경로와 벤치마크용 명시적 StreamSpec 경로를 구분합니다. Depth는 맵 보기, Portrait는 제조사 Bokeh JPEG 촬영이며 벤치마크 엔진과 구분합니다. 세션별 콜백과 close(done) 완료 통지가 러너에 연결됩니다.
StreamConfiguration은 실제 카메라 출력으로 Callback 목록을 만듭니다. 앱의 YUV JPEG 변환·PIP 합성·GPU 인코더 출력은 Callback에 추가하지 않습니다.
1 change: 1 addition & 0 deletions .omm/overall-architecture/camera-engines/meta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ title: camera-engines
children:
- camera2-engine
- depth-engine
- portrait-engine
- camerax-engine
- endpoint-model
- endpoint-resolver
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
PortraitCameraEngine은 API 31 이상에서 제조사 BOKEH의 CameraExtensionSession을 소유합니다. 공개 카메라의 확장 지원·SurfaceTexture 미리보기 크기·JPEG 크기를 각각 조회하고, 선택한 PortraitConfig의 두 크기로 세션을 구성합니다. 일반 StreamConfigurationMap 크기를 대용으로 쓰거나 실패 때 다른 크기로 재시도하지 않습니다.

Live의 Depth 메뉴는 Off·Portrait (Bokeh)·Depth Map을 구분합니다. Portrait는 컬러 미리보기와 JPEG 촬영이며 센서 Depth 맵을 반환하지 않습니다. 선택하면 Camera2로 전환하고 기존 close(done) 뒤 확장 세션을 엽니다. TextureView의 첫 표시 프레임 뒤 촬영을 허용합니다. 미리보기 15초·JPEG 60초 시간 제한, 실패 후 해제, 늦은 JPEG 차단과 단일 촬영의 한 번뿐인 완료 전달을 둡니다. close(done)는 열기 중인 장치도 닫고 CameraDevice.onClosed 뒤 자원을 회수합니다. 이미 받은 JPEG의 저장 작업은 완료할 수 있습니다.

사진은 OEM JPEG를 그대로 MediaLibrary로 저장하고 JPEG 크기·미리보기 크기·manufacturer_bokeh 효과·시각을 촬영 JSON에 기록합니다. 수동 제어·줌·터치 측광·연사·AEB·RAW·PIP·동영상은 제공하지 않습니다. 일반 Camera2 콜백 지표로 확장 처리를 측정하지 않으며 Benchmark와 별도 경로입니다. Photo·Video·카메라·엔진 전환과 새 CLI 촬영 준비는 Portrait를 종료합니다.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
kind: nested-class
title: portrait-engine
children: []
parentPath:
- camera-engines
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
MainCameraPicker는 Live의 공개 카메라 선택과 공통 CameraLabel·배율 표시를 담당합니다. 녹화·저장·CLI·종료 처리 중 선택을 막고, 카메라가 바뀌면 Depth·Portrait를 종료하며 줌과 렌즈별 제어를 초기화합니다. restartCamera는 기존 엔진의 close(done) 뒤 선택한 카메라를 엽니다. 버튼과 핀치는 applyZoom을 공유하며 Depth·Portrait에서는 배율 변경을 거절합니다.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
kind: nested-class
title: camera-picker
children: []
parentPath:
- screens
- expert-screen
3 changes: 2 additions & 1 deletion .omm/overall-architecture/screens/expert-screen/meta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ update_count: 2
last_field: concern
kind: nested-class
title: expert-screen
children: []
children:
- camera-picker
parentPath:
- screens
1 change: 1 addition & 0 deletions .omm/state-transitions/engine-lifecycle/meta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ kind: nested-class
title: engine-lifecycle
children:
- camerax-lifecycle
- portrait-lifecycle
parentPath: []
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Depth 메뉴의 Off·Portrait (Bokeh)·Depth Map을 구분합니다. Portrait 선택은 기존 close(done) 뒤 CameraExtensionSession을 열며, 첫 표시 프레임 이후 셔터를 허용합니다. JPEG를 받기 전 종료되면 촬영을 실패로 한 번 완료하고, 이미 받은 JPEG의 저장은 마칠 수 있습니다. Photo·Video·카메라·엔진 전환과 새 CLI 촬영은 Portrait를 종료합니다. 실패 뒤에도 Photo 복귀와 다른 해상도 선택을 허용합니다.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
kind: nested-class
title: portrait-lifecycle
children: []
parentPath:
- engine-lifecycle
2 changes: 2 additions & 0 deletions .omm/ui-tool-handoff/description.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ Live Streams는 Lab 또는 Live의 크기 표시에서 열 수 있으며 카메
Multi도 Live의 close(done) 뒤 ConcurrentCameraActivity를 엽니다. Live에서 선택한 엔진을 전달하며 Multi 화면에서도 Camera2와 CameraX를 바꿀 수 있습니다. 이 화면은 모든 카메라의 onClosed를 기다린 뒤 Live로 돌아가며, Live는 기존 엔진 선택으로 프리뷰를 다시 엽니다.

Depth 보기에서도 Lab 진입 전에 close(done)를 기다립니다. 촬영 모드를 바꾸지 않고 Lab에서 돌아오면 선택한 Depth 해상도를 다시 엽니다. Depth 보기 중에는 크기 표시로 Live Streams를 여는 동작을 비활성화합니다.

Portrait에서도 Lab 진입 전에 close(done)를 기다리고 복귀 때 선택 해상도를 다시 엽니다. Portrait의 크기 표시를 누르면 일반 Live Streams 대신 Depth 메뉴를 엽니다. Lab에서 일반 Live Streams 설정을 적용하면 Portrait를 종료하고 해당 설정을 사용합니다.
2 changes: 1 addition & 1 deletion .omm/ui-zoom/description.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Live 프리뷰에서 두 손가락을 벌리거나 모으면 지원 범위 안에서 연속으로 줌을 바꿉니다. 가장 가까운 프리셋의 원에 현재 배율을 소수 첫째 자리까지 표시하며, 펼친 상태에서 그 원을 누르면 해당 프리셋 배율로 돌아갑니다. 화면의 카메라 선택 정보를 갱신해도 중간 배율은 유지합니다.

핀치와 버튼 선택은 같은 MainActivity.applyZoom 경로로 엔진과 표시를 갱신합니다. Depth 보기, 프리뷰 준비 전, 일시정지·종료 처리·CLI 작업·연사 중에는 변경하지 않으며 녹화 중에는 허용합니다. 두 손가락 입력이 시작되면 대기 중인 터치 초점과 길게 누르기 인식을 취소하고, 마지막 손가락을 뗄 때까지 초점 터치로 처리하지 않습니다.
핀치와 버튼 선택은 같은 MainActivity.applyZoom 경로로 엔진과 표시를 갱신합니다. Depth 보기·제조사 Portrait, 프리뷰 준비 전, 일시정지·종료 처리·CLI 작업·연사 중에는 변경하지 않으며 녹화 중에는 허용합니다. 두 손가락 입력이 시작되면 대기 중인 터치 초점과 길게 누르기 인식을 취소하고, 마지막 손가락을 뗄 때까지 초점 터치로 처리하지 않습니다.

| 조건 | 동작 |
| --- | --- |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@ class CliStoreInstrumentation : Instrumentation() {
private var lintChecks = false
private var splitDrag = false
private var depthChecks = false
private var portraitChecks = false
private var portraitMetadata = false
private var portraitUi = false
override fun onCreate(arguments: Bundle?) {
super.onCreate(arguments)
exportReports = arguments?.getString("export_reports") == "true"
Expand All @@ -31,10 +34,26 @@ class CliStoreInstrumentation : Instrumentation() {
lintChecks = arguments?.getString("lint_checks") == "true"
splitDrag = arguments?.getString("split_drag") == "true"
depthChecks = arguments?.getString("depth_checks") == "true"
portraitChecks = arguments?.getString("portrait_checks") == "true"
portraitMetadata = arguments?.getString("portrait_metadata") == "true"
portraitUi = arguments?.getString("portrait_ui") == "true"
start()
}

override fun onStart() {
if (portraitChecks || portraitMetadata || portraitUi) {
try {
val result = when {
portraitMetadata -> dev.halcamera.ui.PortraitChecks.metadata(this)
portraitUi -> dev.halcamera.ui.PortraitChecks.uiChecks(this)
else -> dev.halcamera.ui.PortraitChecks.run(this)
}
finish(Activity.RESULT_OK, Bundle().apply { putString("stream", "$result\n") })
} catch (error: Throwable) {
finish(Activity.RESULT_CANCELED, Bundle().apply { putString("stream", "PORTRAIT_CHECKS_FAILED: ${error.stackTraceToString()}\n") })
}
return
}
if (depthChecks) {
try {
val result = dev.halcamera.ui.DepthMapChecks.run(this)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import android.view.MotionEvent
import android.view.View
import android.widget.Button
import dev.halcamera.MainActivity
import dev.halcamera.updateCameraChoices
import dev.halcamera.camera.zoomRange
import dev.halcamera.telemetry.FlightRecorder
import java.io.File
Expand Down
Loading
Loading