Package com.google.android.exoplayer2.source

## Class ConcatenatingMediaSource2

- java.lang.Object
- - com.google.android.exoplayer2.source.BaseMediaSource
  - - com.google.android.exoplayer2.source.CompositeMediaSource<Integer>
    - - com.google.android.exoplayer2.source.ConcatenatingMediaSource2

- All Implemented Interfaces:
    `MediaSource`

      public final class ConcatenatingMediaSource2
      extends CompositeMediaSource<Integer>

  Concatenates multiple `MediaSources`, combining everything in one single `Timeline.Window`.

  This class can only be used under the following conditions:

  - All sources must be non-empty.
  - All `Windows` defined by the sources, except the first, must have an `period offset` of zero. This excludes, for example, live streams or `ClippingMediaSource` with a non-zero start position.

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class | Description
    --- | --- | ---
    `static class` | `ConcatenatingMediaSource2.Builder` | A builder for `ConcatenatingMediaSource2` instances.

    - ### Nested classes/interfaces inherited from interface com.google.android.exoplayer2.source.MediaSource

      `MediaSource.Factory, MediaSource.MediaPeriodId, MediaSource.MediaSourceCaller`

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method | Description
    --- | --- | ---
    `MediaPeriod` | `createPeriod​(MediaSource.MediaPeriodId id, Allocator allocator, long startPositionUs)` | Returns a new `MediaPeriod` identified by `periodId`.
    `protected void` | `enableInternal()` | Enables the source, see `BaseMediaSource.enable(MediaSourceCaller)`.
    `Timeline` | `getInitialTimeline()` | Returns the initial placeholder timeline that is returned immediately when the real timeline is not yet known, or null to let the player create an initial timeline.
    `MediaItem` | `getMediaItem()` | Returns the `MediaItem` whose media is provided by the source.
    `protected MediaSource.MediaPeriodId` | `getMediaPeriodIdForChildMediaPeriodId​(Integer childSourceId, MediaSource.MediaPeriodId mediaPeriodId)` | Returns the `MediaSource.MediaPeriodId` in the composite source corresponding to the specified `MediaSource.MediaPeriodId` in a child source.
    `protected int` | `getWindowIndexForChildWindowIndex​(Integer childSourceId, int windowIndex)` | Returns the window index in the composite source corresponding to the specified window index in a child source.
    `protected void` | `onChildSourceInfoRefreshed​(Integer childSourceId, MediaSource mediaSource, Timeline newTimeline)` | Called when the source info of a child source has been refreshed.
    `protected void` | `prepareSourceInternal​(TransferListener mediaTransferListener)` | Starts source preparation and enables the source, see `BaseMediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId)`.
    `void` | `releasePeriod​(MediaPeriod mediaPeriod)` | Releases the period.
    `protected void` | `releaseSourceInternal()` | Releases the source, see `BaseMediaSource.releaseSource(MediaSourceCaller)`.

    - ### Methods inherited from class com.google.android.exoplayer2.source.CompositeMediaSource

      `disableChildSource, disableInternal, enableChildSource, getMediaTimeForChildMediaTime, maybeThrowSourceInfoRefreshError, prepareChildSource, releaseChildSource`

    - ### Methods inherited from class com.google.android.exoplayer2.source.BaseMediaSource

      `addDrmEventListener, addEventListener, createDrmEventDispatcher, createDrmEventDispatcher, createEventDispatcher, createEventDispatcher, createEventDispatcher, disable, enable, getPlayerId, isEnabled, prepareSource, prepareSource, refreshSourceInfo, releaseSource, removeDrmEventListener, removeEventListener`

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

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

    - ### Methods inherited from interface com.google.android.exoplayer2.source.MediaSource

      `isSingleWindow`

- - ### Method Detail

    - #### getInitialTimeline

          @Nullable
          public Timeline getInitialTimeline()

      Description copied from interface: `MediaSource`
      Returns the initial placeholder timeline that is returned immediately when the real timeline is not yet known, or null to let the player create an initial timeline.

      The initial timeline must use the same uids for windows and periods that the real timeline will use. It also must provide windows which are marked as dynamic to indicate that the window is expected to change when the real timeline arrives.

      Any media source which has multiple windows should typically provide such an initial timeline to make sure the player reports the correct number of windows immediately.

    - #### getMediaItem

          public MediaItem getMediaItem()

      Description copied from interface: `MediaSource`
      Returns the `MediaItem` whose media is provided by the source.

    - #### prepareSourceInternal

          protected void prepareSourceInternal​(@Nullable
                                               TransferListener mediaTransferListener)

      Description copied from class: `BaseMediaSource`
      Starts source preparation and enables the source, see `BaseMediaSource.prepareSource(MediaSourceCaller, TransferListener, PlayerId)`. This method is called at most once until the next call to `BaseMediaSource.releaseSourceInternal()`.
      Overrides:
        `prepareSourceInternal` in class `CompositeMediaSource<Integer>`
      Parameters:
        `mediaTransferListener` - The transfer listener which should be informed of any media data transfers. May be null if no listener is available. Note that this listener should usually be only informed of transfers related to the media loads and not of auxiliary loads for manifests and other data.

    - #### enableInternal

          protected void enableInternal()

      Description copied from class: `BaseMediaSource`
      Enables the source, see `BaseMediaSource.enable(MediaSourceCaller)`.
      Overrides:
        `enableInternal` in class `CompositeMediaSource<Integer>`

    - #### createPeriod

          public MediaPeriod createPeriod​(MediaSource.MediaPeriodId id,
                                          Allocator allocator,
                                          long startPositionUs)

      Description copied from interface: `MediaSource`
      Returns a new `MediaPeriod` identified by `periodId`.

      Should not be called directly from application code.

      Must only be called if the source is enabled.

      Parameters:
        `id` - The identifier of the period.
        `allocator` - An `Allocator` from which to obtain media buffer allocations.
        `startPositionUs` - The expected start position, in microseconds.
      Returns:
        A new `MediaPeriod`.

    - #### releasePeriod

          public void releasePeriod​(MediaPeriod mediaPeriod)

      Description copied from interface: `MediaSource`
      Releases the period.

      Should not be called directly from application code.

      Parameters:
        `mediaPeriod` - The period to release.

    - #### releaseSourceInternal

          protected void releaseSourceInternal()

      Description copied from class: `BaseMediaSource`
      Releases the source, see `BaseMediaSource.releaseSource(MediaSourceCaller)`. This method is called exactly once after each call to `BaseMediaSource.prepareSourceInternal(TransferListener)`.
      Overrides:
        `releaseSourceInternal` in class `CompositeMediaSource<Integer>`

    - #### onChildSourceInfoRefreshed

          protected void onChildSourceInfoRefreshed​(Integer childSourceId,
                                                    MediaSource mediaSource,
                                                    Timeline newTimeline)

      Description copied from class: `CompositeMediaSource`
      Called when the source info of a child source has been refreshed.
      Specified by:
        `onChildSourceInfoRefreshed` in class `CompositeMediaSource<Integer>`
      Parameters:
        `childSourceId` - The unique id used to prepare the child source.
        `mediaSource` - The child source whose source info has been refreshed.
        `newTimeline` - The timeline of the child source.

    - #### getMediaPeriodIdForChildMediaPeriodId

          @Nullable
          protected MediaSource.MediaPeriodId getMediaPeriodIdForChildMediaPeriodId​(Integer childSourceId,
                                                                                    MediaSource.MediaPeriodId mediaPeriodId)

      Description copied from class: `CompositeMediaSource`
      Returns the `MediaSource.MediaPeriodId` in the composite source corresponding to the specified `MediaSource.MediaPeriodId` in a child source. The default implementation does not change the media period id.
      Overrides:
        `getMediaPeriodIdForChildMediaPeriodId` in class `CompositeMediaSource<Integer>`
      Parameters:
        `childSourceId` - The unique id used to prepare the child source.
        `mediaPeriodId` - A `MediaSource.MediaPeriodId` of the child source.
      Returns:
        The corresponding `MediaSource.MediaPeriodId` in the composite source. Null if no corresponding media period id can be determined.

    - #### getWindowIndexForChildWindowIndex

          protected int getWindowIndexForChildWindowIndex​(Integer childSourceId,
                                                          int windowIndex)

      Description copied from class: `CompositeMediaSource`
      Returns the window index in the composite source corresponding to the specified window index in a child source. The default implementation does not change the window index.
      Overrides:
        `getWindowIndexForChildWindowIndex` in class `CompositeMediaSource<Integer>`
      Parameters:
        `childSourceId` - The unique id used to prepare the child source.
        `windowIndex` - A window index of the child source.
      Returns:
        The corresponding window index in the composite source.