# BaseGlShaderProgram

Artifact: [androidx.media3:media3-effect](https://developer.android.com/jetpack/androidx/releases/media3) [View Source](https://cs.android.com/search?q=file:androidx/media3/effect/BaseGlShaderProgram.java+class:androidx.media3.effect.BaseGlShaderProgram)

*** ** * ** ***


```
@UnstableApi
public abstract class BaseGlShaderProgram implements GlShaderProgram
```

<br />

*** ** * ** ***

A base implementation of `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram`.

`BaseGlShaderProgram` manages an output texture pool, whose size is configurable on construction. An implementation should manage a GLSL shader program for processing frames. Override `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#drawFrame(int,long)` to customize drawing. Implementations generally copy input pixels into an output frame, with changes to pixels specific to the implementation.

`BaseShaderProgram` implementations can produce any number of output frames per input frame with the same presentation timestamp.

All methods in this class must be called on the thread that owns the OpenGL context.

## Summary

| ### Protected fields |
|---|---|
| `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.InputListener` | `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#inputListener()` |
| `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.OutputListener` | `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#outputListener()` |

| ### Public constructors |
|---|
| `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#BaseGlShaderProgram(boolean,int)( boolean useHighPrecisionColorComponents, int texturePoolCapacity )` Creates a `BaseGlShaderProgram` instance. |

| ### Public methods |
|---|---|
| `abstract https://developer.android.com/reference/androidx/media3/common/util/Size` | `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#configure(int,int)(int inputWidth, int inputHeight)` Configures the instance based on the input dimensions. |
| `abstract void` | `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#drawFrame(int,long)(int inputTexId, long presentationTimeUs)` Draws one frame. |
| `void` | `@https://developer.android.com/reference/androidx/annotation/CallSuper https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#flush()()` Flushes the `GlShaderProgram`. |
| `void` | `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#queueInputFrame(androidx.media3.common.GlObjectsProvider,androidx.media3.common.GlTextureInfo,long)( https://developer.android.com/reference/androidx/media3/common/GlObjectsProvider glObjectsProvider, https://developer.android.com/reference/androidx/media3/common/GlTextureInfo inputTexture, long presentationTimeUs )` Processes an input frame if possible. |
| `void` | `@https://developer.android.com/reference/androidx/annotation/CallSuper https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#release()()` Releases all resources. |
| `void` | `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#releaseOutputFrame(androidx.media3.common.GlTextureInfo)(https://developer.android.com/reference/androidx/media3/common/GlTextureInfo outputTexture)` Notifies the `GlShaderProgram` that the frame on the given output texture is no longer used and can be overwritten. |
| `void` | `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#setErrorListener(java.util.concurrent.Executor,androidx.media3.effect.GlShaderProgram.ErrorListener)( https://developer.android.com/reference/java/util/concurrent/Executor.html errorListenerExecutor, https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.ErrorListener errorListener )` Sets the `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.ErrorListener`. |
| `void` | `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#setInputListener(androidx.media3.effect.GlShaderProgram.InputListener)(https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.InputListener inputListener)` Sets the `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.InputListener`. |
| `void` | `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#setOutputListener(androidx.media3.effect.GlShaderProgram.OutputListener)(https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.OutputListener outputListener)` Sets the `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.OutputListener`. |
| `boolean` | `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#shouldClearTextureBuffer()()` Returns `true` if the texture buffer should be cleared before calling `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#drawFrame(int,long)` or `false` if it should retain the content of the last drawn frame. |
| `void` | `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#signalEndOfCurrentInputStream()()` Notifies the `GlShaderProgram` that no further input frames belonging to the current input stream will be queued. |

| ### Protected methods |
|---|---|
| `final https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.InputListener` | `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#getInputListener()()` |
| `final https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.OutputListener` | `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#getOutputListener()()` |
| `final void` | `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#onError(java.lang.Exception)(https://developer.android.com/reference/java/lang/Exception.html e)` |

## Protected fields

### inputListener

```
protected GlShaderProgram.InputListener inputListener
```

### outputListener

```
protected GlShaderProgram.OutputListener outputListener
```

## Public constructors

### BaseGlShaderProgram

```
public BaseGlShaderProgram(
    boolean useHighPrecisionColorComponents,
    int texturePoolCapacity
)
```

Creates a `BaseGlShaderProgram` instance.

| Parameters |
|---|---|
| `boolean useHighPrecisionColorComponents` | If `false`, uses colors with 8-bit unsigned bytes. If `true`, use 16-bit (half-precision) floating-point. |
| `int texturePoolCapacity` | The capacity of the texture pool. For example, if implementing a texture cache, the size should be the number of textures to cache. |

## Public methods

### configure

```
public abstract Size configure(int inputWidth, int inputHeight)
```

Configures the instance based on the input dimensions.

This method must be called before `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#drawFrame(int,long)` the first frame and before drawing subsequent frames with different input dimensions.

| Parameters |
|---|---|
| `int inputWidth` | The input width, in pixels. |
| `int inputHeight` | The input height, in pixels. |

| Returns |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/util/Size` | The output width and height of frames processed through `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#drawFrame(int,long)`. |

| Throws |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/VideoFrameProcessingException` | If an error occurs while configuring. |

### drawFrame

```
public abstract void drawFrame(int inputTexId, long presentationTimeUs)
```

Draws one frame.

This method may only be called after the shader program has been `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#configure(int,int)`. The caller is responsible for focussing the correct render target before calling this method.

A minimal implementation should tell OpenGL to use its shader program, bind the shader program's vertex attributes and uniforms, and issue a drawing command.

| Parameters |
|---|---|
| `int inputTexId` | Identifier of a 2D OpenGL texture containing the input frame. |
| `long presentationTimeUs` | The presentation timestamp of the current frame, in microseconds. |

| Throws |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/VideoFrameProcessingException` | If an error occurs while processing or drawing the frame. |

### flush

```
@CallSuper
public void flush()
```

Flushes the `GlShaderProgram`.

The `GlShaderProgram` should reclaim the ownership of its allocated textures, `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.InputListener#onFlush()` its `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.InputListener` about the flush event, and `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.InputListener#onReadyToAcceptInputFrame()` if necessary.

The implementation must not `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.OutputListener#onOutputFrameAvailable(androidx.media3.common.GlTextureInfo,long)` until after this method returns.

### queueInputFrame

```
public void queueInputFrame(
    GlObjectsProvider glObjectsProvider,
    GlTextureInfo inputTexture,
    long presentationTimeUs
)
```

Processes an input frame if possible.

The `GlShaderProgram` owns the accepted frame until it calls `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.InputListener#onInputFrameProcessed(androidx.media3.common.GlTextureInfo)`. The caller should not overwrite or release the texture before the `GlShaderProgram` has finished processing it.

This method must only be called when the `GlShaderProgram` can `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.InputListener#onReadyToAcceptInputFrame()`.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/GlObjectsProvider glObjectsProvider` | The `https://developer.android.com/reference/androidx/media3/common/GlObjectsProvider` for using EGL and GLES. |
| `https://developer.android.com/reference/androidx/media3/common/GlTextureInfo inputTexture` | A `https://developer.android.com/reference/androidx/media3/common/GlTextureInfo` describing the texture containing the input frame. |
| `long presentationTimeUs` | The presentation timestamp of the input frame, in microseconds. |

### release

```
@CallSuper
public void release()
```

Releases all resources.

| Throws |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/VideoFrameProcessingException` | If an error occurs while releasing resources. |

### releaseOutputFrame

```
public void releaseOutputFrame(GlTextureInfo outputTexture)
```

Notifies the `GlShaderProgram` that the frame on the given output texture is no longer used and can be overwritten.

### setErrorListener

```
public void setErrorListener(
    Executor errorListenerExecutor,
    GlShaderProgram.ErrorListener errorListener
)
```

Sets the `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.ErrorListener`.

The `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.ErrorListener` is invoked on the provided `https://developer.android.com/reference/java/util/concurrent/Executor.html`.

### setInputListener

```
public void setInputListener(GlShaderProgram.InputListener inputListener)
```

Sets the `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.InputListener`.

The `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.InputListener` should be invoked on the thread that owns the parent OpenGL context. For example, `https://developer.android.com/reference/androidx/media3/effect/DefaultVideoFrameProcessor` invokes the `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.InputListener` methods on its internal thread.

### setOutputListener

```
public void setOutputListener(GlShaderProgram.OutputListener outputListener)
```

Sets the `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.OutputListener`.

The `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.OutputListener` should be invoked on the thread that owns the parent OpenGL context. For example, `https://developer.android.com/reference/androidx/media3/effect/DefaultVideoFrameProcessor` invokes the `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram.OutputListener` methods on its internal thread.

### shouldClearTextureBuffer

```
public boolean shouldClearTextureBuffer()
```

Returns `true` if the texture buffer should be cleared before calling `https://developer.android.com/reference/androidx/media3/effect/BaseGlShaderProgram#drawFrame(int,long)` or `false` if it should retain the content of the last drawn frame.

When returning `false`, the shader program must clear the texture before first drawing to it, because textures are not zero-initialized when created. This can be done by calling `https://developer.android.com/reference/androidx/media3/common/util/GlUtil#clearFocusedBuffers()`.

### signalEndOfCurrentInputStream

```
public void signalEndOfCurrentInputStream()
```

Notifies the `GlShaderProgram` that no further input frames belonging to the current input stream will be queued.

Input frames that are queued after this method is called belong to a different input stream.

## Protected methods

### getInputListener

```
protected final GlShaderProgram.InputListener getInputListener()
```

### getOutputListener

```
protected final GlShaderProgram.OutputListener getOutputListener()
```

### onError

```
protected final void onError(Exception e)
```