2015-10-02 3 views
1

Я продолжаю работу, на которую я ссылался here и ударил несколько коряг. У меня есть VirtualDisplay, у которого есть Surface, что кадры записаны, а затем я использую ту же поверхность, что и вход для MediaCodec, так что кадры из VirtualDisplay закодированы. Все это происходит в некоторых Threads, которые запущены на Android ServiceNOT в Activity.Контекстная потеря OpenGL при обслуживании

Теперь я хочу, чтобы добавить промежуточный Surface в цепочку таким образом, что прогресс будет идти VirtualDisplay -> написать SurfaceA -> некоторые логические/особенности -> Запись в SurfaceB -> закодировать SurfaceB

Я создал, после большой борьбы, SurfaceA, используя только прямые вызовы OpenGL и EGL, не используя GLSurfaceView. Я использую this в качестве примера того, как я должен писать от SurfaceA до SurfaceB. По моему мнению, мне просто нужно два EGLSurfaces в одном EGLContext.

С моей точки зрения, контекст GL может быть потерян в любое время, и мне может понадобиться заново создать текстуру OpenGL (и, возможно, EGLSurfaces тоже?). Обычно это обрабатывается через GLSurfaceView, но поскольку я не использую его, есть ли простой способ узнать, когда контекст потерян? Должен ли я просто использовать GLSurfaceView, хотя ни одна из моих работ не связана с View или отображается для пользователя? Как вы звоните и onResume за GLSurfaceView, если нет Activity?

Спасибо за помощь.

ответ

0

Вы хотите использовать SurfaceTexture (a/k/a GLConsumer), который преобразует кадры, поступающие на поверхность в текстуры GLES. Он не имеет компонента View.

GLSurfaceView - самая худшая возможная вещь для использования, поскольку она создаст и разрушит ее контекст EGL, когда действие приостанавливается и возобновляется. (Контексты EGL не теряются - они исчезают, когда они уничтожаются. Не используйте GLSurfaceView, если вы заботитесь о продолжительности вашего контекста.)

Различные примеры использования SurfaceTexture можно найти в Grafika. Вы можете использовать один контекст EGL с двумя поверхностями EGL или двумя отдельными контекстами EGL с общим состоянием. Первое, вероятно, проще.

См. Также graphics architecture document.

+0

Право. Я использую 'SurfaceTexture' прямо сейчас, у которого нет компонента' View'. У меня все работает до сих пор без проблем. Я считаю, что контексты OpenGL могут быть потеряны при отключении питания/sleep/etc. Вопрос был скорее о том, являются ли потери контекста OpenGL и как их обнаружить, когда они есть? – EncodedNybble

+0

Код AOSP не должен выбрасывать их. Драйвер GLES не должен указывать разницу между приложением переднего плана и фоновым приложением, поэтому я ожидал бы, что приложение переднего плана завершится с ошибкой, если драйвер сделает это. У вас есть воспроизводимый тестовый пример, показывающий, что контексты GLES теряются при отключении питания/сна? Я ожидал бы, что любая операция GLES приведет к ошибке «плохого контекста» от драйвера. – fadden

+0

Я не активно вижу потерю контекста в коде, который у меня есть, я просто помню, что имел дело с потерей контекста OpenGL при работе над предыдущими проектами Android (которые были играми). Я также видел кучу проблем, связанных с потерей контекста, на SO, поэтому я подумал, что спрошу. Мой вопрос был поставлен перед потенциальными проблемами. В настоящее время я проверяю кодировку с ошибкой EGL (одна из которых является потерей контекста) при вызове swapBuffers, и если это не удается, захват ошибки EGL и выполнение поведения потери контекста там, если код ошибки был потеря контекста. – EncodedNybble