미디어 개선 API는 하드웨어 가속을 활용하여 APK 블로트 없이 고품질 미디어 개선사항을 제공하는 지연 시간이 짧고 개인 정보 보호를 준수하는 온디바이스 AI 솔루션을 제공합니다. 자세한 내용은 미디어 개선 기능 이해를 참고하세요.
다음 아키텍처 다이어그램은 미디어 개선 API의 비동기 표시 영역 모드 실행 수명 주기를 보여줍니다. 이 모드는 하드웨어 버퍼를 직접 연결하여 CPU와 GPU 메모리 버퍼 간에 압축되지 않은 프레임을 앞뒤로 복사하는 성능 병목 현상을 없앱니다.
개선 파이프라인은 다음 단계를 통해 구현됩니다.
1단계. 개선 세션 설정
1. 입력 표시 영역 제공: 앱은 처리할 프레임에 액세스하기 위해 개선 프레임워크에 입력 표시 영역 핸들을 제공합니다.
2. 출력 표시 영역 설정: 앱은 렌더링 대상(
SurfaceView 또는 TextureView과 같은)을 프레임워크에 직접 프로비저닝하고 바인딩합니다.
2단계. 입력 프레임 생성
3. 기본 미디어 준비: 앱은 압축되지 않은 기본 미디어를 가져옵니다. 예를 들어 로컬 디스크에서 파일을 읽습니다.
4. 프레임 데이터 삽입: 앱은 바인딩된 입력 표시 영역 파이프라인에 원시 이미지 페이로드를 직접 씁니다.
3단계. 처리 및 개선
5. AI 처리 실행: 프레임워크는 기기의 GPU 또는 NPU에서 프레임을 처리하고 톤 매핑, 선명하게 하기 또는 업스케일링과 같은 머신러닝 개선사항을 적용합니다.
6. 개선된 프레임 제공: 엔진은 개선된 전체 해상도 프레임을 바인딩된 출력 표시 영역에 직접 출력합니다.
4단계. 결과 표시 또는 저장
7. 출력 마무리: 앱은 처리된 하드웨어 스트림 버퍼 를 수신하여 UI에서 렌더링하거나 스토리지에 다시 저장합니다.
EnhancementSession은 영구 GPU 또는 NPU 메모리 파이프라인을 유지하는 헤비급 컨텍스트 객체입니다. 전용 비디오 RAM (VRAM) 및 네이티브 시스템 핸들을 할당합니다. 심각한 메모리 누수 및 잠재적인 OutOfMemoryError 비정상 종료를 방지하려면 다음 수명 주기 원칙을 준수하세요.
- 지연 인스턴스화: 사용자가 개선 작업을 시작할 때까지 세션을 만들지 마세요.
- 전략적 재사용: 동일한 구성 (크기 및 전환된 옵션)으로 스트림 또는 프레임을 처리할 때 단일 세션 인스턴스를 유지하고 재사용합니다.
- 즉시 삭제: 시각적 작업이 종료되면 즉시
session.release()를 호출하여 공유 하드웨어 리소스를 확보합니다.
개선 엔진 초기화
이 메서드는 2단계 검사를 오케스트레이션합니다. 기기의 하드웨어가 가속을 지원하는지 확인한 다음 필요한 머신러닝 모듈이 있는지 확인합니다.
이를 필수 단계로 실행하면 앱이 미디어를 처리하기 전에 기능을 검증하여 런타임 초기화 실패를 방지할 수 있습니다.
class MediaSetupViewModel(application: Application) : AndroidViewModel(application) {
private val enhancementClient = Enhancement.getClient(application)
fun initializeEnhancementEngine() {
viewModelScope.launch {
try {
// 1. Verify hardware capability
val isSupported = enhancementClient.isDeviceSupportedAsync()
if (!isSupported) {
notifyUiDeviceIncompatible()
return@launch
}
// 2. Verify and download the Google Play services ML modules
val isInstalled = enhancementClient.isModuleInstalledAsync()
if (!isInstalled) {
notifyUiDownloadingModels()
enhancementClient.installModule().await()
}
notifyUiEngineReady()
} catch (e: Exception) {
// Handle potential errors during session creation or image
// processing.
handleInitializationError(e)
}
}
}
}
구현: 표시 영역 모드 (표시 영역 입력, 표시 영역 출력)
표시 영역 실행 모드 (EnhancementMode.SURFACE)는 CPU와 GPU 메모리 버퍼 간에 프레임을 이동하는 성능 오버헤드를 방지합니다. 대신 개선 라이브러리는 원시 하드웨어 버퍼를 직접 매핑하고, 입력 표시 영역에서 프레임을 읽고, 네이티브로 처리하고, 출력 표시 영역으로 직접 파이핑합니다.
단일 프레임 표시 영역 스냅샷
이 메서드는 단일 하드웨어 디코딩된 이미지 프레임에 효과를 효율적으로 적용하는 데 사용됩니다.
// Provisions input Surface (for example, ImageReader) and output Surface (for
// example, SurfaceView)
val inputSurface: Surface = imageReader.surface
val outputSurface: Surface = surfaceView.holder.surface
// 1. Configure parameters for SURFACE mode
val surfaceOptions = EnhancementOptions(
imageReader.width,
imageReader.height,
EnhancementMode.SURFACE,
enableTonemap = true,
enableDeblurDenoise = true,
enableFaceDetection = false
).also {
// 2. Bind hardware surfaces
it.setInputSurface(inputSurface)
it.setOutputSurface(outputSurface)
}
// 3. Create the session to process the hardware frame
val singleFrameSession = enhancementClient.createSessionAsync(surfaceOptions, executor)
// The API processes the single frame. Upon completion, release the session.
singleFrameSession.release()