O pipeline de camera do IdentityKit usa AVFoundation para captura de frames em tempo real e Vision framework para deteccao de documentos e analise facial. Todo processamento ocorre em serial queues dedicadas para evitar data races.

Pipeline de Camera

O pipeline segue o modelo producer-consumer: a camera produz frames a 30fps, e o processador consome e analisa cada frame. A chave e nunca bloquear a main thread e usar uma serial queue para configuracao da session.

ComponenteResponsabilidadeThread
AVCaptureSessionCoordena inputs e outputsSerial queue dedicada
AVCaptureDeviceInputConecta a camera fisicaConfigurado na session queue
AVCaptureVideoDataOutputEntrega frames via delegateCallback na queue do delegate
AVCapturePhotoOutputCaptura foto de alta resolucaoCallback na queue do delegate
AVCaptureVideoPreviewLayerExibe preview na telaMain thread (CALayer)

Serial Queue para Session

Regra fundamental: todas as operacoes na AVCaptureSession devem ocorrer em uma serial queue dedicada. Isso inclui beginConfiguration(), adicionar inputs/outputs e startRunning().

// Serial queue dedicada β€” regra fundamental do AVFoundation private let sessionQueue = DispatchQueue( label: "com.identitykit.session", qos: .userInitiated ) private let videoOutputQueue = DispatchQueue( label: "com.identitykit.videoOutput", qos: .userInitiated ) // NUNCA configure a session na main thread func configure() { sessionQueue.async { [self] in session.beginConfiguration() defer { session.commitConfiguration() } // Adicionar input e output aqui } } // NUNCA chame startRunning() na main thread func start() { sessionQueue.async { [self] in if !session.isRunning { session.startRunning() } } }

Fluxo de Dados

  1. Camera captura frame (CMSampleBuffer) a 30fps
  2. AVCaptureVideoDataOutput entrega buffer via delegate
  3. Frame Processor converte para CVPixelBuffer
  4. Vision analisa (deteccao de bordas, face quality)
  5. Resultado e enviado para UI via MainActor
  6. Se qualidade OK, captura foto via AVCapturePhotoOutput
Importante: O delegate de AVCaptureVideoDataOutput recebe frames na queue que voce especificar. Se o processamento demorar mais que 1/30s, frames sao descartados automaticamente (alwaysDiscardsLateVideoFrames = true).