Kotlin

Criação de um renderizador personalizado (MyRenderer)

Agora você criará um renderizador personalizado que carregará os dados do quadro e os passará para as texturas do OpenGL. Ele será usado para aplicar o shader de fragmento de cores invertidas.

Abaixo está um esboço; você adaptará o código do shader mais tarde.

  1. Criar uma classe em Kotlin MyRenderer (pode ser interno ao 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. Vamos examinar o displayFrame método. É importante observar que o quadro que o SDK envia para o Renderer no onFrame O método agora é propriedade do Renderer. Cabe a essa classe destruir o quadro quando ele não for mais necessário. É por isso que destruímos o quadro anterior quando um novo é carregado no Renderer
public void displayFrame(Frame frame) {
    frameLock.lock();

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