Entender o ciclo de vida do aprimoramento de mídia no modo de superfície

A API Media Enhancement oferece uma solução de IA no dispositivo de baixa latência e que preserva a privacidade que aproveita a aceleração de hardware para oferecer melhorias de mídia de alta qualidade sem aumentar o tamanho do APK. Para mais informações, consulte Entenda os recursos de melhoria de mídia.

O diagrama de arquitetura a seguir mostra o ciclo de vida da execução assíncrona no modo de superfície da API Media Enhancement. Esse modo vincula diretamente os buffers de hardware para eliminar o gargalo de desempenho da cópia de frames não compactados entre os buffers de memória da CPU e da GPU.

Diagrama que ilustra o ciclo de vida assíncrono de sete etapas da API Media Enhancement.
Figura 1. Ciclo de vida de execução assíncrona do modo de superfície e as sete etapas práticas do pipeline de melhoria.

O pipeline de melhoria é implementado seguindo estas etapas:

1ª etapa: Configurar a sessão de otimização

1. Fornecer superfície de entrada: seu app fornece ao framework de melhoria um handle de superfície de entrada para acessar frames para processamento.

2. Definir superfície de saída: seu app provisiona e vincula destinos de renderização (como um SurfaceView ou TextureView) diretamente ao framework.

2ª etapa: Produzir um frame de entrada

3. Prepare a mídia de base: seu app recupera a mídia de base não compactada. Por exemplo, lendo um arquivo de um disco local.

4. Inserir dados de frame: seu app grava o payload de imagem bruta diretamente no pipeline de superfície de entrada vinculada.

3ª etapa: Processar e melhorar

5. Executar o processamento de IA: o framework processa o frame na GPU ou NPU do dispositivo, aplicando melhorias de machine learning, como mapeamento de tons, remoção de desfoque ou aumento de resolução.

6. Fornecer frame aprimorado: o mecanismo gera o frame aprimorado e de resolução total diretamente para a superfície de saída vinculada.

Fase 4: Mostrar ou salvar o resultado

7. Finalizar saída: seu app recebe o buffer de stream de hardware processado para renderizar na interface ou salvar de volta no armazenamento.

O EnhancementSession é um objeto de contexto pesado que mantém um pipeline de memória persistente de GPU ou NPU. Ele aloca RAM de vídeo (VRAM) dedicada e processadores de sistema nativos. Para evitar vazamentos de memória graves e possíveis falhas de OutOfMemoryError, siga estes princípios de ciclo de vida:

  • Instanciação lenta: não crie uma sessão até que o usuário inicie uma ação de melhoria.
  • Reutilização estratégica: mantenha e reutilize uma única instância de sessão ao processar fluxos ou frames com configurações idênticas (dimensões e opções ativadas).
  • Desmontagem de comandos: invoque session.release() imediatamente quando as tarefas visuais forem concluídas para liberar recursos de hardware compartilhados.

Inicializar o mecanismo de melhoria

Esse método organiza uma verificação em duas etapas. Ele verifica se o hardware do dispositivo é compatível com a aceleração e garante que os módulos de aprendizado de máquina necessários estejam presentes.

Executar essa etapa como pré-requisito evita falhas de inicialização em tempo de execução ao validar recursos antes que o app tente processar mídia.

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)
            }
        }
    }
}

Implementação: modo de superfície (entrada e saída de superfície)

O modo de execução da superfície (EnhancementMode.SURFACE) evita a sobrecarga de desempenho da movimentação de frames entre buffers de memória da CPU e da GPU. Em vez disso, a biblioteca de melhorias mapeia buffers de hardware brutos diretamente, lendo frames de uma Surface de entrada, processando-os nativamente e transmitindo-os diretamente para uma Surface de saída.

Instantâneos de superfície de frame único

Esse método é usado para aplicar efeitos de maneira eficiente a um único frame de imagem decodificado por hardware.

// 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()