Kotlin

Creación de un renderizador personalizado (MyRenderer)

Ahora crearás un renderizador personalizado que realmente cargará los datos del fotograma y los pasará a las texturas OpenGL. Se utilizará para aplicar el sombreador de fragmentos de color invertido.

A continuación se muestra un esquema; más adelante se adaptará el código del sombreador.

  1. Crear una clase kotlin MyRenderer (puede ser interno de InvertedColorsVideoRenderer)
static class MyRenderer implements GLSurfaceView.Renderer {

    private int viewportWidth;
    private int viewportHeight;

    ReentrantLock frameLock = new ReentrantLock();
    Frame currentFrame;

    public void displayFrame(Frame frame) {
        frameLock.lock();

        if (currentFrame != null) {
            currentFrame.destroy(); // Disposes previous frame
        }

        currentFrame = frame;
        frameLock.unlock();
    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // Initialize shaders, textures, etc.
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
        viewportWidth = width;
        viewportHeight = height;
    }

    @Override
    public void onDrawFrame(GL10 gl) {
        // Upload YUV frame → textures
        // Draw using shaders
        // Implementation of YUV → RGB shader pipeline
        // using inverted color math
    }
}
  1. Examinemos la displayFrame método. Es importante tener en cuenta que la trama que el sdk envía al método Renderer en el onFrame es ahora propiedad del método Renderer. Corresponde a esta clase destruir el marco cuando ya no es necesario. Por eso destruimos el marco anterior cuando llega uno nuevo a la clase Renderer