# PassthroughShaderProgram

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/PassthroughShaderProgram.java+class:androidx.media3.effect.PassthroughShaderProgram)

*** ** * ** ***


```
@UnstableApi
public class PassthroughShaderProgram implements GlShaderProgram
```

<br />

*** ** * ** ***

A `https://developer.android.com/reference/androidx/media3/effect/GlShaderProgram` that passes a frame from the input to the output listener without copying.

This shader program can only process one input frame at a time.

## Summary

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

| ### Public constructors |
|---|
| `https://developer.android.com/reference/androidx/media3/effect/PassthroughShaderProgram#PassthroughShaderProgram()()` |

| ### Public methods |
|---|---|
| `void` | `https://developer.android.com/reference/androidx/media3/effect/PassthroughShaderProgram#flush()()` Flushes the `GlShaderProgram`. |
| `void` | `https://developer.android.com/reference/androidx/media3/effect/PassthroughShaderProgram#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/media3/effect/PassthroughShaderProgram#release()()` Releases all resources. |
| `void` | `https://developer.android.com/reference/androidx/media3/effect/PassthroughShaderProgram#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/PassthroughShaderProgram#setErrorListener(java.util.concurrent.Executor,androidx.media3.effect.GlShaderProgram.ErrorListener)( https://developer.android.com/reference/java/util/concurrent/Executor.html executor, 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/PassthroughShaderProgram#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/PassthroughShaderProgram#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`. |
| `void` | `https://developer.android.com/reference/androidx/media3/effect/PassthroughShaderProgram#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/PassthroughShaderProgram#getInputListener()()` |
| `final void` | `https://developer.android.com/reference/androidx/media3/effect/PassthroughShaderProgram#onError(java.lang.Exception)(https://developer.android.com/reference/java/lang/Exception.html e)` |

## Protected fields

### inputListener

```
protected GlShaderProgram.InputListener inputListener
```

## Public constructors

### PassthroughShaderProgram

```
public PassthroughShaderProgram()
```

## Public methods

### flush

```
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

```
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 executor,
    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.

### 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()
```

### onError

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