Kotlin

Erstellen eines benutzerdefinierten Renderers (MyRenderer)

Jetzt werden Sie einen benutzerdefinierten Renderer erstellen, der die Rahmendaten lädt und sie an OpenGL-Texturen weitergibt. Er wird verwendet, um den Fragment-Shader mit invertierten Farben anzuwenden.

Nachfolgend finden Sie eine Skizze; den Shader-Code werden Sie später anpassen.

  1. Erstellen einer Kotlin-Klasse MyRenderer (kann intern zu InvertedColorsVideoRenderer sein)
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. Untersuchen wir die displayFrame Methode. Es ist wichtig zu beachten, dass der Frame, den der SDK an die Renderer im onFrame Methode ist jetzt eine Eigenschaft der Renderer. Es ist Aufgabe dieser Klasse, den Rahmen zu zerstören, wenn er nicht mehr benötigt wird. Deshalb zerstören wir den vorherigen Rahmen, wenn ein neuer Rahmen in die Renderer
public void displayFrame(Frame frame) {
    frameLock.lock();

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