# FrameWriter

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

*** ** * ** ***


```
@ExperimentalApi
public interface FrameWriter extends AutoCloseable
```

<br />

Known direct subclasses [EncoderFrameWriter](https://developer.android.com/reference/androidx/media3/transformer/EncoderFrameWriter), [FakeFrameWriter](https://developer.android.com/reference/androidx/media3/test/utils/FakeFrameWriter), [SurfaceHolderFrameWriter](https://developer.android.com/reference/androidx/media3/common/video/SurfaceHolderFrameWriter)

|---|---|
| `https://developer.android.com/reference/androidx/media3/transformer/EncoderFrameWriter` | An implementation of `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter` that uses an `https://developer.android.com/reference/android/media/ImageWriter.html` to forward frames to a `https://developer.android.com/reference/androidx/media3/transformer/DefaultCodec` via `https://developer.android.com/reference/android/view/Surface.html`. |
| `https://developer.android.com/reference/androidx/media3/test/utils/FakeFrameWriter` | A fake `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter` implementation for testing. |
| `https://developer.android.com/reference/androidx/media3/common/video/SurfaceHolderFrameWriter` | A `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter` that outputs frames to a `https://developer.android.com/reference/android/view/SurfaceHolder.html`. |

*** ** * ** ***

Allocates `https://developer.android.com/reference/androidx/media3/common/video/Frame` instances, allowing callers to dequeue and fill them, before processing the filled frames.

## Summary

| ### Nested types |
|---|
| `public interface https://developer.android.com/reference/androidx/media3/common/video/FrameWriter.Info` Describes the capabilities of a `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter`. |

| ### Public methods |
|---|---|
| `abstract void` | `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter#close()()` Blocks until all resources are released. |
| `abstract void` | `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter#configure(androidx.media3.common.Format,long)(https://developer.android.com/reference/androidx/media3/common/Format format, @https://developer.android.com/reference/androidx/media3/common/video/Frame.Usage long usage)` Format and usage support can be `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter.Info#isSupported(androidx.media3.common.Format,long)` on the `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter.Info` before configuring. |
| `abstract @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/common/video/AsyncFrame` | `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter#dequeueInputFrame(java.util.concurrent.Executor,java.lang.Runnable)(https://developer.android.com/reference/java/util/concurrent/Executor.html wakeupExecutor, https://developer.android.com/reference/java/lang/Runnable.html wakeupListener)` Dequeues an `https://developer.android.com/reference/androidx/media3/common/video/AsyncFrame` storing a `https://developer.android.com/reference/androidx/media3/common/video/Frame` of the `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter#configure(androidx.media3.common.Format,long)` format and usage, and a `https://developer.android.com/reference/androidx/media3/common/video/SyncFenceWrapper` that must be waited on before filling the frame. |
| `abstract https://developer.android.com/reference/androidx/media3/common/video/FrameWriter.Info` | `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter#getInfo()()` Returns the `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter.Info` for this FrameWriter. |
| `abstract void` | `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter#queueInputFrame(androidx.media3.common.video.Frame,androidx.media3.common.video.SyncFenceWrapper)( https://developer.android.com/reference/androidx/media3/common/video/Frame frame, @https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/common/video/SyncFenceWrapper writeCompleteFence )` Queues a filled frame for further processing. |
| `abstract void` | `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter#signalEndOfStream()()` Notifies this `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter` that the current stream has ended. |

## Public methods

### close

```
abstract void close()
```

Blocks until all resources are released.

### configure

```
abstract void configure(Format format, @Frame.Usage long usage)
```

Format and usage support can be `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter.Info#isSupported(androidx.media3.common.Format,long)` on the `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter.Info` before configuring.

Must be called before `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter#dequeueInputFrame(java.util.concurrent.Executor,java.lang.Runnable)`.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/Format format` | The format to configure. |
| `@https://developer.android.com/reference/androidx/media3/common/video/Frame.Usage long usage` | The `@FrameUsage` flags describing how the frame will be used. |

| Throws |
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalStateException.html` | if any frames are dequeued at the point this method is called. |
| `https://developer.android.com/reference/java/lang/IllegalArgumentException.html` | if the format or usage is unsupported. |

### dequeueInputFrame

```
abstract @Nullable AsyncFrame dequeueInputFrame(Executor wakeupExecutor, Runnable wakeupListener)
```

Dequeues an `https://developer.android.com/reference/androidx/media3/common/video/AsyncFrame` storing a `https://developer.android.com/reference/androidx/media3/common/video/Frame` of the `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter#configure(androidx.media3.common.Format,long)` format and usage, and a `https://developer.android.com/reference/androidx/media3/common/video/SyncFenceWrapper` that must be waited on before filling the frame.

The returned frame must be filled and `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter#queueInputFrame(androidx.media3.common.video.Frame,androidx.media3.common.video.SyncFenceWrapper)` back for processing.

If the `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter` is at capacity, this method returns null and will notify the listener when capacity is available, and it can be called again.

Only the most recent `wakeupListener` will be notified when capacity is available.

| Parameters |
|---|---|
| `https://developer.android.com/reference/java/util/concurrent/Executor.html wakeupExecutor` | The `https://developer.android.com/reference/java/util/concurrent/Executor.html` on which the `wakeupListener` is invoked. |
| `https://developer.android.com/reference/java/lang/Runnable.html wakeupListener` | A `https://developer.android.com/reference/java/lang/Runnable.html` to be invoked when capacity becomes available. |

| Returns |
|---|---|
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/common/video/AsyncFrame` | The dequeued frame, or null if the writer is at capacity. |

| Throws |
|---|---|
| `https://developer.android.com/reference/java/lang/IllegalStateException.html` | if `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter#configure(androidx.media3.common.Format,long)` has not been called. |

### getInfo

```
abstract FrameWriter.Info getInfo()
```

Returns the `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter.Info` for this FrameWriter.

### queueInputFrame

```
abstract void queueInputFrame(
    Frame frame,
    @Nullable SyncFenceWrapper writeCompleteFence
)
```

Queues a filled frame for further processing.

The queued frame must have been previously `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter#dequeueInputFrame(java.util.concurrent.Executor,java.lang.Runnable)` from this writer.

| Parameters |
|---|---|
| `https://developer.android.com/reference/androidx/media3/common/video/Frame frame` | The filled frame to queue. |
| `@https://developer.android.com/reference/androidx/annotation/Nullable https://developer.android.com/reference/androidx/media3/common/video/SyncFenceWrapper writeCompleteFence` | A `https://developer.android.com/reference/androidx/media3/common/video/SyncFenceWrapper` that will signal when the caller has finished writing to the frame, or `null` if the write was synchronous. |

### signalEndOfStream

```
abstract void signalEndOfStream()
```

Notifies this `https://developer.android.com/reference/androidx/media3/common/video/FrameWriter` that the current stream has ended.

More frames may be queued after calling this method, if the current stream changes.