Сбой Nexus 5: FinalizerWatchdogDaemon — SurfaceTexture.finalize()

Мы наблюдаем специфическую проблему при попытке перекодировать видео, и кажется, что это происходит только на Nexus 5. Мы используем MediaCodec для сжатия и перекодирования видео на стороне клиента, и иногда, когда задача выполняется на Nexus 5, мы получить следующий сбой:

05-15 16:25:15.023 E/AndroidRuntime( 4716): FATAL EXCEPTION: FinalizerWatchdogDaemon
05-15 16:25:15.023 E/AndroidRuntime( 4716): java.util.concurrent.TimeoutException: android.graphics.SurfaceTexture.finalize() timed out after 10 seconds
05-15 16:25:15.023 E/AndroidRuntime( 4716):     at android.graphics.SurfaceTexture.nativeFinalize(Native Method)
05-15 16:25:15.023 E/AndroidRuntime( 4716):     at android.graphics.SurfaceTexture.finalize(SurfaceTexture.java:353)
05-15 16:25:15.023 E/AndroidRuntime( 4716):     at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:190)
05-15 16:25:15.023 E/AndroidRuntime( 4716):     at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:173)
05-15 16:25:15.023 E/AndroidRuntime( 4716):     at java.lang.Thread.run(Thread.java:818)    

Наш код относительно похож на код DecodeEditEncodeTest от bigflake (https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts)./DecodeEditEncodeTest.java), и мы также используем их классы InputSurface, OutputSurface и TextureRender (https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests)./media/src/android/media/cts/). Я предполагаю, что проблема возникает где-то в OutputSurface или TextureRender, поскольку это классы, которые на самом деле манипулируют текстурой поверхности.

Единственные надежные шаги воспроизведения, которые мы можем придумать, заключаются в том, что это происходит несколько случайным образом, когда несколько видео ставятся в очередь для перекодирования, даже если кодировщик обрабатывает только одно видео за раз.

Любая помощь приветствуется.


person gcgrant    schedule 15.05.2015    source источник


Ответы (1)


Финализатор SurfaceTexture почему-то зависает. Виртуальная машина обнаруживает зависший поток и выдает исключение.

Финализатор SurfaceTexture: здесь, хотя он просто вызывает nativeFinalize(), что вы можете увидеть здесь. Происходит не так много всего — просто обнуление полей и корректировка счетчиков ссылок — поэтому из источников «Lollipop» неясно, почему это зависает. «КитКат» и «Лоллипоп-мр1» выглядят примерно одинаково.

Какая версия Android работает на этом устройстве?

person fadden    schedule 18.05.2015
comment
Оба устройства, на которых мы это видим, работают под управлением 5.0, оба Nexus 5s. Я считаю, что нашел потенциальное решение; в вызове OutputSurface release() строка mSurfaceTexture.release() была закомментирована. Раскомментирование, кажется, решило проблему, и имеет смысл выпустить здесь SurfaceTexture. Теперь мне просто любопытно/осторожно, почему это было закомментировано в первую очередь. - person gcgrant; 19.05.2015
comment
Может быть связано с stackoverflow.com /questions/30172529/, хотя принятый ответ касается именно камеры. Что-то не так в платформе, если нужен явный релиз SurfaceTexture. - person fadden; 19.05.2015
comment
Есть идеи, почему мы наблюдали это только на N5, а не на других устройствах с Lollipop? - person gcgrant; 19.05.2015
comment
Я предполагаю, что это гонка, которая проигрывает на N5. Я действительно не понимаю, почему он застревает, поэтому мне нечего продолжать. Следующим шагом будет получение собственной трассировки стека, чтобы увидеть, где именно он находится; Раньше это автоматически испускалось Dalvik, когда финализаторы зависали, но я думаю, что эта функция была удалена (ворчание ворчание). Возможно, вы сможете получить это, если приложение перехватит исключение с помощью глобального обработчика по умолчанию, а затем отправит себе пару SIGTERM, чтобы получить дамп в logcat. (Я этого не делал, но думаю, что это сработает.) - person fadden; 20.05.2015