Package com.google.android.exoplayer2.transformer

## Class Transformer

- java.lang.Object
- - com.google.android.exoplayer2.transformer.Transformer

-     public final class Transformer
      extends Object

  A transformer to transform media inputs.

  The same Transformer instance can be used to transform multiple inputs (sequentially, not concurrently).

  Transformer instances must be accessed from a single application thread. For the vast majority of cases this should be the application's main thread. The thread on which a Transformer instance must be accessed can be explicitly specified by passing a `Looper` when creating the transformer. If no Looper is specified, then the Looper of the thread that the `Transformer.Builder` is created on is used, or if that thread does not have a Looper, the Looper of the application's main thread is used. In all cases the Looper of the thread from which the transformer must be accessed can be queried using `getApplicationLooper()`.

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class | Description
    --- | --- | ---
    `static class` | `Transformer.Builder` | A builder for `Transformer` instances.
    `static interface` | `Transformer.Listener` | A listener for the transformation events.
    `static interface` | `Transformer.ProgressState` | Progress state.

  - ### Field Summary

    Fields
    Modifier and Type | Field | Description
    --- | --- | ---
    `static int` | `PROGRESS_STATE_AVAILABLE` | Indicates that the progress is available.
    `static int` | `PROGRESS_STATE_NO_TRANSFORMATION` | Indicates that there is no current transformation.
    `static int` | `PROGRESS_STATE_UNAVAILABLE` | Indicates that the progress is permanently unavailable for the current transformation.
    `static int` | `PROGRESS_STATE_WAITING_FOR_AVAILABILITY` | Indicates that the progress is unavailable for the current transformation, but might become available.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `Transformer.Builder` | `buildUpon()` | Returns a `Transformer.Builder` initialized with the values of this instance.
    `void` | `cancel()` | Cancels the transformation that is currently in progress, if any.
    `Looper` | `getApplicationLooper()` | Returns the `Looper` associated with the application thread that's used to access the transformer and on which transformer events are received.
    `int` | `getProgress​(ProgressHolder progressHolder)` | Returns the current `Transformer.ProgressState` and updates `progressHolder` with the current progress if it is `available`.
    `void` | `setListener​(Transformer.Listener listener)` | Sets the `Transformer.Listener` to listen to the transformation events.
    `void` | `startTransformation​(MediaItem mediaItem, ParcelFileDescriptor parcelFileDescriptor)` | Starts an asynchronous operation to transform the given `MediaItem`.
    `void` | `startTransformation​(MediaItem mediaItem, String path)` | Starts an asynchronous operation to transform the given `MediaItem`.

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Field Detail

    - #### PROGRESS_STATE_WAITING_FOR_AVAILABILITY

          public static final int PROGRESS_STATE_WAITING_FOR_AVAILABILITY

      Indicates that the progress is unavailable for the current transformation, but might become available.
      See Also:
        Constant Field Values

    - #### PROGRESS_STATE_AVAILABLE

          public static final int PROGRESS_STATE_AVAILABLE

      Indicates that the progress is available.
      See Also:
        Constant Field Values

    - #### PROGRESS_STATE_UNAVAILABLE

          public static final int PROGRESS_STATE_UNAVAILABLE

      Indicates that the progress is permanently unavailable for the current transformation.
      See Also:
        Constant Field Values

    - #### PROGRESS_STATE_NO_TRANSFORMATION

          public static final int PROGRESS_STATE_NO_TRANSFORMATION

      Indicates that there is no current transformation.
      See Also:
        Constant Field Values

  - ### Method Detail

    - #### buildUpon

          public Transformer.Builder buildUpon()

      Returns a `Transformer.Builder` initialized with the values of this instance.

    - #### setListener

          public void setListener​(Transformer.Listener listener)

      Sets the `Transformer.Listener` to listen to the transformation events.
      Parameters:
        `listener` - A `Transformer.Listener`.
      Throws:
        `IllegalStateException` - If this method is called from the wrong thread.

    - #### startTransformation

          public void startTransformation​(MediaItem mediaItem,
                                          String path)
                                   throws IOException

      Starts an asynchronous operation to transform the given `MediaItem`.

      The transformation state is notified through the `listener`.

      Concurrent transformations on the same Transformer object are not allowed.

      The output can contain at most one video track and one audio track. Other track types are ignored. For adaptive bitrate `media sources`, the highest bitrate video and audio streams are selected.

      Parameters:
        `mediaItem` - The `MediaItem` to transform. The supported sample formats depend on the output container format and are described in `MediaMuxer.addTrack(MediaFormat)`.
        `path` - The path to the output file.
      Throws:
        `IllegalArgumentException` - If the path is invalid.
        `IllegalStateException` - If this method is called from the wrong thread.
        `IllegalStateException` - If a transformation is already in progress.
        `IOException` - If an error occurs opening the output file for writing.

    - #### startTransformation

          public void startTransformation​(MediaItem mediaItem,
                                          ParcelFileDescriptor parcelFileDescriptor)
                                   throws IOException

      Starts an asynchronous operation to transform the given `MediaItem`.

      The transformation state is notified through the `listener`.

      Concurrent transformations on the same Transformer object are not allowed.

      The output can contain at most one video track and one audio track. Other track types are ignored. For adaptive bitrate `media sources`, the highest bitrate video and audio streams are selected.

      Parameters:
        `mediaItem` - The `MediaItem` to transform. The supported sample formats depend on the output container format and are described in `MediaMuxer.addTrack(MediaFormat)`.
        `parcelFileDescriptor` - A readable and writable `ParcelFileDescriptor` of the output. The file referenced by this ParcelFileDescriptor should not be used before the transformation is completed. It is the responsibility of the caller to close the ParcelFileDescriptor. This can be done after this method returns.
      Throws:
        `IllegalArgumentException` - If the file descriptor is invalid.
        `IllegalStateException` - If this method is called from the wrong thread.
        `IllegalStateException` - If a transformation is already in progress.
        `IOException` - If an error occurs opening the output file for writing.

    - #### getApplicationLooper

          public Looper getApplicationLooper()

      Returns the `Looper` associated with the application thread that's used to access the transformer and on which transformer events are received.

    - #### getProgress

          @ProgressState
          public int getProgress​(ProgressHolder progressHolder)

      Returns the current `Transformer.ProgressState` and updates `progressHolder` with the current progress if it is `available`.

      After a transformation `completes`, this method returns `PROGRESS_STATE_NO_TRANSFORMATION`.

      Parameters:
        `progressHolder` - A `ProgressHolder`, updated to hold the percentage progress if `available`.
      Returns:
        The `Transformer.ProgressState`.
      Throws:
        `IllegalStateException` - If this method is called from the wrong thread.

    - #### cancel

          public void cancel()

      Cancels the transformation that is currently in progress, if any.
      Throws:
        `IllegalStateException` - If this method is called from the wrong thread.