Проблемы с работой SurfaceTexture с Android Videoplayer на MALI 400

Я написал приложение, которое преобразует видео в текстуру, в основном используя код, который можно найти во многих публикациях здесь. Я предполагаю, что оригинал взят из некоторых образцов nVidia (VideoSurfaceView), найденных здесь: Использование SurfaceTexture в Android < / а>

Этот пример отлично работает на мобильном устройстве и на планшете - оба основаны на Tegra. Затем я попробовал тот же код в системе Android на базе MALI 400 (Minix Neo5), и я вижу, что видео воспроизводится, но у меня в основном черный экран с каким-то мусором (всего 3 или 4 строки)

Я попытался использовать трассировщик OpenGL ES, чтобы проверить, что копируется из SurfaceTexture обратно в саму текстуру, но похоже, что Tracer не может показать это правильно (ни в системах tegra, ни на устройствах tegra. Обратите внимание, что я не делаю этого) Я не получаю ни одной ошибки OpenGL, ни каких-либо предупреждений. Похоже, все работает нормально.

Есть ли какой-нибудь другой инструмент, который может показать мне, что, если что-то копируется в TEXTURE_EXTERNAL? Все TEXTURE_2D доступны на трассировщике.

Одна странная вещь, которую я заметил в системе MALI, - это то, что она вообще не может воспроизводить видео высокой четкости. И мои видео с разрешением 1280x720 сообщают об отладчике, что они используют SoftwareRenderer. Возможно, поэтому кадры некорректно копируются в OGL_IMAGE, который будет использоваться в качестве текстуры.

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


person Marco    schedule 30.03.2013    source источник
comment
Я сейчас тестировал второй Android на базе графического процессора Mali-400 MP (giadatech Q11), и у меня просто черный экран. Я думал, что все функции должны быть реализованы на устройствах Android !?   -  person Marco    schedule 05.04.2013


Ответы (1)


Спасибо за ваше сообщение! Это именно то, что я наблюдал на двух других устройствах Android (оба Mali-400 MP), и я понятия не имею, почему это происходит. Похоже, что видео воспроизводится в фоновом режиме. Я добавил в конструктор своего класса GLSurfaceView следующие строки:

setEGLConfigChooser(8,8,8,8,0,0);
getHolder().setFormat(PixelFormat.RGBA_8888);

Тогда видео видно "за" моей сценой OpenGL. Оба устройства заявили, что поддерживают расширение «GL_OES_EGL_image_external».

person MatSch3D    schedule 18.04.2013
comment
Как у вас получилось показать видео на заднем плане? Я пытался установить функцию смешивания: 'GLES20.glClearColor (0.0f, 1.0f, 0.0f, 0.5f);' 'GLES20.glClear (GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);' 'GLES20.glBlendFunc (GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);' 'GLES20.glEnable (GLES20.GL_BLEND);' 'GLES20.glDrawArrays (GLES20.GL_TRIANGLE_STRIP, 0, 4);' 'GLES20.glDisable (GLES20.GL_BLEND);' - person Marco; 22.04.2013
comment
В моем случае в смешивании не было необходимости. Просто добавьте две вышеприведенные строки, которые сделали работу за меня. Вы можете использовать ´getHolder().setFormat(PixelFormat.TRANSLUCENT); для прозрачного фона. - person MatSch3D; 25.04.2013
comment
Если вы используете setEGLConfigChooser(8,8,8,8,0,0);, вы запрашиваете конфигурацию без буфера глубины ... поэтому рисунок OpenGL будет скомпонован исключительно на основе порядка рисования. Возможно, это не то, что вы хотели. - person bleater; 28.05.2014