2014-11-15 10 views
5

Siamo un gruppo di sviluppatori che stanno lavorando su un'app di elaborazione video in tempo reale per Android. Recentemente, un client ha segnalato un blocco nella nostra app che si verifica solo sul dispositivo Nexus 10. Abbiamo comprato il dispositivo di noi stessi e testati:Nexus 10 camera.release si blocca per 30 secondi

dispositivo
  • fornito con Android 4.2 preinstallato - non c'erano blocca né blocca nel nostro app
  • dopo l'aggiornamento di Android alla 4.3, la nostra app congelato in chiusura della fotocamera (vedi sotto per la spiegazione)
  • eseguendo l'aggiornamento a 4.4, la nostra app tenuto congelamento
  • facendo lampeggiare l'ultima immagine Android 5.0 Nexus 10 in fabbrica, la nostra applicazione conserva ancora il congelamento
  • (edit) - il problema è stato risolto con l'aggiornamento Nexus 10 per Android 5.1

Maggiori informazioni sul congelamento:

La nostra applicazione si apre la fotocamera in modalità onResume di attività, installa l'anteprima di richiamata, imposta la dimensione di anteprima per migliore possibile per le nostre esigenze di elaborazione (il Nexus 10 è 1920x1080) e avvia l'anteprima (se riprende dallo stato di sospensione) o delega lo stesso al metodo surfaceCreated del callback di SurfaceView. Nel metodo onPause la nostra app rimuove la richiamata dell'anteprima, ferma l'anteprima della fotocamera e rilascia la fotocamera. Tuttavia, la nostra indagine ha dimostrato che il metodo camera.release richiede talvolta 30 secondi per essere completato. In 30 secondi la nostra app è stata bloccata perché eravamo soliti controllare la telecamera dal thread dell'interfaccia utente. Successivamente abbiamo spostato il controllo della telecamera per separare il thread del gestore eventi e ora camera.release si blocca su quel thread. Sebbene questo sia invisibile all'utente (l'interfaccia utente non è bloccata), l'utente non può utilizzare la fotocamera da nessuna app finché il thread in background non riesce a rilasciare la fotocamera (ovvero 30 secondi dopo che è stato chiamato camera.release).

Durante il periodo di blocco abbiamo osservato le seguenti uscite di registro dal servizio fotocamera:

10-21 16:08:54.193: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight 
10-21 16:08:54.193: E/Camera2Client(122): stopPreviewL: Camera 0: Waiting to stop streaming failed: Connection timed out (-110) 
10-21 16:09:04.293: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight 
10-21 16:09:04.293: E/Camera2Client(122): stopPreviewL: Camera 0: Waiting to stop streaming failed: Connection timed out (-110) 
10-21 16:09:14.453: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight 
10-21 16:09:14.453: E/Camera2-StreamingProcessor(122): deletePreviewStream: Error waiting for preview to drain: Connection timed out (-110) 
10-21 16:09:24.573: E/Camera2-Device(122): waitUntilDrained: Waited 10050000 us, 2 requests still in flight 
10-21 16:09:24.573: E/Camera2-CallbackProcessor(122): deleteStream: Error waiting for HAL to drain: Connection timed out (-110) 
10-21 16:09:24.578: E/libexynosv4l2(122): failed to ioctl: VIDIOC_REQBUFS (-1 - Invalid argument) 
10-21 16:09:24.578: E/ExynosCameraHAL2(122): cam_int_reqbufs: VIDIOC_REQBUFS (fd:35) failed (-1) 
10-21 16:09:24.843: E/Camera2-CallbackProcessor(122): deleteStream: Camera 0: Device does not exist 
10-21 16:09:24.853: E/Camera2-StreamingProcessor(122): deletePreviewStream: Camera 0: Device does not exist 

è possibile vedere l'esempio minima che attiva questo comportamento here - attività della fotocamera deve essere riavviato rapidamente paio di volte per aumentare le possibilità di entrare in questo stato. Abbiamo notato che si verifica molto più spesso nella nostra app rispetto all'app di esempio. La nostra app esegue un'elaborazione a frame pesante, utilizza anche la GPU per l'elaborazione delle immagini e inoltre la fotocamera utilizza anche l'accelerometro e il sensore di orientamento, tutti quelli non inclusi nell'app di esempio.

Abbiamo anche ricevuto un paio di domande StackOverflow senza risposta sullo stesso problema (question 1 e question 2). Potresti per favore spiegare cosa codepath porterà alle citate uscite di log e come evitare di entrare in quello stato?

Non abbiamo riscontrato il congelamento della telecamera menzionato su nessun altro dispositivo finora.

risposta

2

Sfortunatamente, stai incontrando un bug non deterministico nella fotocamera HAL del Nexus 10.

Mentre abbiamo cercato di rintracciare questo problema ripetutamente, ovviamente non abbiamo trovato tutte le istanze di problemi qui.

In termini di soluzioni alternative, è possibile provare semplicemente a chiudere il dispositivo della fotocamera, senza rimuovere la richiamata e interrompere l'anteprima; non dovrebbe essere necessario effettuare lo spegnimento per fasi.

+0

Ho provato semplicemente a rilasciare il dispositivo della fotocamera, senza rimuovere la richiamata e l'anteprima di arresto, tuttavia ci sono voluti 30 secondi per rilasciare la fotocamera. Ora proveremo ad implementare il nostro codice di gestione delle telecamere con Camera2 API, speriamo che questo non causi blocchi ... – DoDo

+0

Abbiamo risolto alcuni problemi su questo N10 nella versione L, quindi spero che vedrai che sarà meglio sia in L o uno degli aggiornamenti di follow-up. –

+0

Ieri il nostro N10 ha ricevuto l'aggiornamento Android 5.0.2, tuttavia il problema non è ancora stato risolto. Qualche idea su quale versione dovrebbe arrivare quella correzione? – DoDo