Package com.google.android.exoplayer2.extractor.mp4

## Class Mp4Extractor

- java.lang.Object
- - com.google.android.exoplayer2.extractor.mp4.Mp4Extractor

- All Implemented Interfaces:
    `Extractor`, `SeekMap`

      public final class Mp4Extractor
      extends Object
      implements Extractor, SeekMap

  Extracts data from the MP4 container format.

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class | Description
    --- | --- | ---
    `static interface` | `Mp4Extractor.Flags` | Flags controlling the behavior of the extractor.

    - ### Nested classes/interfaces inherited from interface com.google.android.exoplayer2.extractor.Extractor

      `Extractor.ReadResult`

    - ### Nested classes/interfaces inherited from interface com.google.android.exoplayer2.extractor.SeekMap

      `SeekMap.SeekPoints, SeekMap.Unseekable`

  - ### Field Summary

    Fields
    Modifier and Type | Field | Description
    --- | --- | ---
    `static ExtractorsFactory` | `FACTORY` | Factory for `Mp4Extractor` instances.
    `static int` | `FLAG_READ_MOTION_PHOTO_METADATA` | Flag to extract `MotionPhotoMetadata` from HEIC motion photos following the Google Photos Motion Photo File Format V1.1.
    `static int` | `FLAG_READ_SEF_DATA` | Flag to extract `SlowMotionData` metadata from Samsung Extension Format (SEF) slow motion videos.
    `static int` | `FLAG_WORKAROUND_IGNORE_EDIT_LISTS` | Flag to ignore any edit lists in the stream.

    - ### Fields inherited from interface com.google.android.exoplayer2.extractor.Extractor

      `RESULT_CONTINUE, RESULT_END_OF_INPUT, RESULT_SEEK`

  - ### Constructor Summary

    Constructors
    Constructor | Description
    --- | ---
    `Mp4Extractor()` | Creates a new extractor for unfragmented MP4 streams.
    `Mp4Extractor​(@com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.Flags int flags)` | Creates a new extractor for unfragmented MP4 streams, using the specified flags to control the extractor's behavior.

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `long` | `getDurationUs()` | Returns the duration of the stream in microseconds.
    `SeekMap.SeekPoints` | `getSeekPoints​(long timeUs)` | Obtains seek points for the specified seek time in microseconds.
    `SeekMap.SeekPoints` | `getSeekPoints​(long timeUs, int trackId)` | Equivalent to `SeekMap.getSeekPoints(long)`, except it adds the `trackId` parameter.
    `void` | `init​(ExtractorOutput output)` | Initializes the extractor with an `ExtractorOutput`.
    `boolean` | `isSeekable()` | Returns whether seeking is supported.
    `int` | `read​(ExtractorInput input, PositionHolder seekPosition)` | Extracts data read from a provided `ExtractorInput`.
    `void` | `release()` | Releases all kept resources.
    `void` | `seek​(long position, long timeUs)` | Notifies the extractor that a seek has occurred.
    `boolean` | `sniff​(ExtractorInput input)` | Returns whether this extractor can extract samples from the `ExtractorInput`, which must provide data from the start of the stream.

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

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

- - ### Field Detail

    - #### FACTORY

          public static final ExtractorsFactory FACTORY

      Factory for `Mp4Extractor` instances.

    - #### FLAG_WORKAROUND_IGNORE_EDIT_LISTS

          public static final int FLAG_WORKAROUND_IGNORE_EDIT_LISTS

      Flag to ignore any edit lists in the stream.
      See Also:
        Constant Field Values

    - #### FLAG_READ_MOTION_PHOTO_METADATA

          public static final int FLAG_READ_MOTION_PHOTO_METADATA

      Flag to extract `MotionPhotoMetadata` from HEIC motion photos following the Google Photos Motion Photo File Format V1.1.

      As playback is not supported for motion photos, this flag should only be used for metadata retrieval use cases.

      See Also:
        Constant Field Values

    - #### FLAG_READ_SEF_DATA

          public static final int FLAG_READ_SEF_DATA

      Flag to extract `SlowMotionData` metadata from Samsung Extension Format (SEF) slow motion videos.
      See Also:
        Constant Field Values

  - ### Constructor Detail

    - #### Mp4Extractor

          public Mp4Extractor()

      Creates a new extractor for unfragmented MP4 streams.

    - #### Mp4Extractor

          public Mp4Extractor​(@com.google.android.exoplayer2.extractor.mp4.Mp4Extractor.Flags int flags)

      Creates a new extractor for unfragmented MP4 streams, using the specified flags to control the extractor's behavior.
      Parameters:
        `flags` - Flags that control the extractor's behavior.

  - ### Method Detail

    - #### sniff

          public boolean sniff​(ExtractorInput input)
                        throws IOException

      Description copied from interface: `Extractor`
      Returns whether this extractor can extract samples from the `ExtractorInput`, which must provide data from the start of the stream.

      If `true` is returned, the `input`'s reading position may have been modified. Otherwise, only its peek position may have been modified.

      Specified by:
        `sniff` in interface `Extractor`
      Parameters:
        `input` - The `ExtractorInput` from which data should be peeked/read.
      Returns:
        Whether this extractor can read the provided input.
      Throws:
        `IOException` - If an error occurred reading from the input.

    - #### init

          public void init​(ExtractorOutput output)

      Description copied from interface: `Extractor`
      Initializes the extractor with an `ExtractorOutput`. Called at most once.
      Specified by:
        `init` in interface `Extractor`
      Parameters:
        `output` - An `ExtractorOutput` to receive extracted data.

    - #### seek

          public void seek​(long position,
                           long timeUs)

      Description copied from interface: `Extractor`
      Notifies the extractor that a seek has occurred.

      Following a call to this method, the `ExtractorInput` passed to the next invocation of `Extractor.read(ExtractorInput, PositionHolder)` is required to provide data starting from `position` in the stream. Valid random access positions are the start of the stream and positions that can be obtained from any `SeekMap` passed to the `ExtractorOutput`.

      Specified by:
        `seek` in interface `Extractor`
      Parameters:
        `position` - The byte offset in the stream from which data will be provided.
        `timeUs` - The seek time in microseconds.

    - #### release

          public void release()

      Description copied from interface: `Extractor`
      Releases all kept resources.
      Specified by:
        `release` in interface `Extractor`

    - #### read

          public int read​(ExtractorInput input,
                          PositionHolder seekPosition)
                   throws IOException

      Description copied from interface: `Extractor`
      Extracts data read from a provided `ExtractorInput`. Must not be called before `Extractor.init(ExtractorOutput)`.

      A single call to this method will block until some progress has been made, but will not block for longer than this. Hence each call will consume only a small amount of input data.

      In the common case, `Extractor.RESULT_CONTINUE` is returned to indicate that the `ExtractorInput` passed to the next read is required to provide data continuing from the position in the stream reached by the returning call. If the extractor requires data to be provided from a different position, then that position is set in `seekPosition` and `Extractor.RESULT_SEEK` is returned. If the extractor reached the end of the data provided by the `ExtractorInput`, then `Extractor.RESULT_END_OF_INPUT` is returned.

      When this method throws an `IOException`, extraction may continue by providing an `ExtractorInput` with an unchanged `read position` to a subsequent call to this method.

      Specified by:
        `read` in interface `Extractor`
      Parameters:
        `input` - The `ExtractorInput` from which data should be read.
        `seekPosition` - If `Extractor.RESULT_SEEK` is returned, this holder is updated to hold the position of the required data.
      Returns:
        One of the `RESULT_` values defined in this interface.
      Throws:
        `IOException` - If an error occurred reading from or parsing the input.

    - #### isSeekable

          public boolean isSeekable()

      Description copied from interface: `SeekMap`
      Returns whether seeking is supported.
      Specified by:
        `isSeekable` in interface `SeekMap`
      Returns:
        Whether seeking is supported.

    - #### getDurationUs

          public long getDurationUs()

      Description copied from interface: `SeekMap`
      Returns the duration of the stream in microseconds.
      Specified by:
        `getDurationUs` in interface `SeekMap`
      Returns:
        The duration of the stream in microseconds, or `C.TIME_UNSET` if the duration is unknown.

    - #### getSeekPoints

          public SeekMap.SeekPoints getSeekPoints​(long timeUs)

      Description copied from interface: `SeekMap`
      Obtains seek points for the specified seek time in microseconds. The returned `SeekMap.SeekPoints` will contain one or two distinct seek points.

      Two seek points [A, B] are returned in the case that seeking can only be performed to discrete points in time, there does not exist a seek point at exactly the requested time, and there exist seek points on both sides of it. In this case A and B are the closest seek points before and after the requested time. A single seek point is returned in all other cases.

      Specified by:
        `getSeekPoints` in interface `SeekMap`
      Parameters:
        `timeUs` - A seek time in microseconds.
      Returns:
        The corresponding seek points.

    - #### getSeekPoints

          public SeekMap.SeekPoints getSeekPoints​(long timeUs,
                                                  int trackId)

      Equivalent to `SeekMap.getSeekPoints(long)`, except it adds the `trackId` parameter.
      Parameters:
        `timeUs` - A seek time in microseconds.
        `trackId` - The id of the track on which to seek for `SeekMap.SeekPoints`. May be `C.INDEX_UNSET` if the extractor is expected to define the strategy for generating `SeekMap.SeekPoints`.
      Returns:
        The corresponding seek points.