Skip to content

Commit

Permalink
Add getter and callbacks for static metadata retrieval.
Browse files Browse the repository at this point in the history
Issue:#7266
PiperOrigin-RevId: 335416280
  • Loading branch information
Samrobbo authored and kim-vde committed Oct 6, 2020
1 parent 41192ee commit a552e35
Show file tree
Hide file tree
Showing 14 changed files with 215 additions and 21 deletions.
2 changes: 2 additions & 0 deletions RELEASENOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
still possible until the next major release using
`setThrowsWhenUsingWrongThread(false)`
([#4463](https://github.com/google/ExoPlayer/issues/4463)).
* Add a getter and callback for static metadata to the player
([#7266](https://github.com/google/ExoPlayer/issues/7266)).
* Track selection:
* Add option to specify multiple preferred audio or text languages.
* Data sources:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.source.TrackGroup;
import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.trackselection.FixedTrackSelection;
Expand All @@ -51,6 +52,7 @@
import com.google.android.gms.common.api.ResultCallback;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
Expand Down Expand Up @@ -561,6 +563,12 @@ public TrackGroupArray getCurrentTrackGroups() {
return currentTrackGroups;
}

@Override
public List<Metadata> getCurrentStaticMetadata() {
// CastPlayer does not currently support metadata.
return Collections.emptyList();
}

@Override
public Timeline getCurrentTimeline() {
return currentTimeline;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.PlayerMessage.Target;
import com.google.android.exoplayer2.analytics.AnalyticsCollector;
import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
import com.google.android.exoplayer2.source.MediaSourceFactory;
Expand All @@ -43,6 +44,7 @@
import com.google.android.exoplayer2.util.Clock;
import com.google.android.exoplayer2.util.Log;
import com.google.android.exoplayer2.util.Util;
import com.google.common.collect.ImmutableList;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
Expand Down Expand Up @@ -861,6 +863,11 @@ public TrackSelectionArray getCurrentTrackSelections() {
return playbackInfo.trackSelectorResult.selections;
}

@Override
public List<Metadata> getCurrentStaticMetadata() {
return playbackInfo.staticMetadata;
}

@Override
public Timeline getCurrentTimeline() {
return playbackInfo.timeline;
Expand Down Expand Up @@ -1168,7 +1175,8 @@ private PlaybackInfo maskTimelineAndPosition(
/* requestedContentPositionUs= */ C.msToUs(maskingWindowPositionMs),
/* totalBufferedDurationUs= */ 0,
TrackGroupArray.EMPTY,
emptyTrackSelectorResult);
emptyTrackSelectorResult,
ImmutableList.of());
playbackInfo = playbackInfo.copyWithLoadingMediaPeriodId(dummyMediaPeriodId);
playbackInfo.bufferedPositionUs = playbackInfo.positionUs;
return playbackInfo;
Expand All @@ -1195,7 +1203,8 @@ private PlaybackInfo maskTimelineAndPosition(
/* requestedContentPositionUs= */ newContentPositionUs,
/* totalBufferedDurationUs= */ 0,
playingPeriodChanged ? TrackGroupArray.EMPTY : playbackInfo.trackGroups,
playingPeriodChanged ? emptyTrackSelectorResult : playbackInfo.trackSelectorResult);
playingPeriodChanged ? emptyTrackSelectorResult : playbackInfo.trackSelectorResult,
playingPeriodChanged ? ImmutableList.of() : playbackInfo.staticMetadata);
playbackInfo = playbackInfo.copyWithLoadingMediaPeriodId(newPeriodId);
playbackInfo.bufferedPositionUs = newContentPositionUs;
} else if (newContentPositionUs == oldContentPositionUs) {
Expand All @@ -1219,7 +1228,8 @@ private PlaybackInfo maskTimelineAndPosition(
/* requestedContentPositionUs= */ playbackInfo.positionUs,
/* totalBufferedDurationUs= */ maskedBufferedPositionUs - playbackInfo.positionUs,
playbackInfo.trackGroups,
playbackInfo.trackSelectorResult);
playbackInfo.trackSelectorResult,
playbackInfo.staticMetadata);
playbackInfo = playbackInfo.copyWithLoadingMediaPeriodId(newPeriodId);
playbackInfo.bufferedPositionUs = maskedBufferedPositionUs;
}
Expand All @@ -1241,7 +1251,8 @@ private PlaybackInfo maskTimelineAndPosition(
/* requestedContentPositionUs= */ newContentPositionUs,
maskedTotalBufferedDurationUs,
playbackInfo.trackGroups,
playbackInfo.trackSelectorResult);
playbackInfo.trackSelectorResult,
playbackInfo.staticMetadata);
playbackInfo.bufferedPositionUs = maskedBufferedPositionUs;
}
return playbackInfo;
Expand Down Expand Up @@ -1348,6 +1359,7 @@ private static final class PlaybackInfoUpdate implements Runnable {
private final boolean isLoadingChanged;
private final boolean timelineChanged;
private final boolean trackSelectorResultChanged;
private final boolean staticMetadataChanged;
private final boolean playWhenReadyChanged;
private final boolean playbackSuppressionReasonChanged;
private final boolean isPlayingChanged;
Expand Down Expand Up @@ -1387,6 +1399,8 @@ public PlaybackInfoUpdate(
timelineChanged = !previousPlaybackInfo.timeline.equals(playbackInfo.timeline);
trackSelectorResultChanged =
previousPlaybackInfo.trackSelectorResult != playbackInfo.trackSelectorResult;
staticMetadataChanged =
!previousPlaybackInfo.staticMetadata.equals(playbackInfo.staticMetadata);
playWhenReadyChanged = previousPlaybackInfo.playWhenReady != playbackInfo.playWhenReady;
playbackSuppressionReasonChanged =
previousPlaybackInfo.playbackSuppressionReason != playbackInfo.playbackSuppressionReason;
Expand Down Expand Up @@ -1428,6 +1442,11 @@ public void run() {
listener.onTracksChanged(
playbackInfo.trackGroups, playbackInfo.trackSelectorResult.selections));
}
if (staticMetadataChanged) {
invokeAll(
listenerSnapshot,
listener -> listener.onStaticMetadataChanged(playbackInfo.staticMetadata));
}
if (isLoadingChanged) {
invokeAll(
listenerSnapshot, listener -> listener.onIsLoadingChanged(playbackInfo.isLoading));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,14 @@
import com.google.android.exoplayer2.Player.PlaybackSuppressionReason;
import com.google.android.exoplayer2.Player.RepeatMode;
import com.google.android.exoplayer2.analytics.AnalyticsCollector;
import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.source.MediaPeriod;
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
import com.google.android.exoplayer2.source.SampleStream;
import com.google.android.exoplayer2.source.ShuffleOrder;
import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
import com.google.android.exoplayer2.trackselection.TrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
import com.google.android.exoplayer2.upstream.BandwidthMeter;
Expand All @@ -49,6 +51,7 @@
import com.google.android.exoplayer2.util.TraceUtil;
import com.google.android.exoplayer2.util.Util;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
Expand Down Expand Up @@ -1338,6 +1341,7 @@ private void resetInternal(
/* isLoading= */ false,
resetTrackInfo ? TrackGroupArray.EMPTY : playbackInfo.trackGroups,
resetTrackInfo ? emptyTrackSelectorResult : playbackInfo.trackSelectorResult,
resetTrackInfo ? ImmutableList.of() : playbackInfo.staticMetadata,
mediaPeriodId,
playbackInfo.playWhenReady,
playbackInfo.playbackSuppressionReason,
Expand Down Expand Up @@ -2096,6 +2100,7 @@ private PlaybackInfo handlePositionDiscontinuity(
resetPendingPauseAtEndOfPeriod();
TrackGroupArray trackGroupArray = playbackInfo.trackGroups;
TrackSelectorResult trackSelectorResult = playbackInfo.trackSelectorResult;
List<Metadata> staticMetadata = playbackInfo.staticMetadata;
if (mediaSourceList.isPrepared()) {
@Nullable MediaPeriodHolder playingPeriodHolder = queue.getPlayingPeriod();
trackGroupArray =
Expand All @@ -2106,18 +2111,35 @@ private PlaybackInfo handlePositionDiscontinuity(
playingPeriodHolder == null
? emptyTrackSelectorResult
: playingPeriodHolder.getTrackSelectorResult();
staticMetadata = extractMetadataFromTrackSelectionArray(trackSelectorResult.selections);
} else if (!mediaPeriodId.equals(playbackInfo.periodId)) {
// Reset previously kept track info if unprepared and the period changes.
trackGroupArray = TrackGroupArray.EMPTY;
trackSelectorResult = emptyTrackSelectorResult;
staticMetadata = ImmutableList.of();
}

return playbackInfo.copyWithNewPosition(
mediaPeriodId,
positionUs,
contentPositionUs,
getTotalBufferedDurationUs(),
trackGroupArray,
trackSelectorResult);
trackSelectorResult,
staticMetadata);
}

private ImmutableList<Metadata> extractMetadataFromTrackSelectionArray(
TrackSelectionArray trackSelectionArray) {
ImmutableList.Builder<Metadata> builder = new ImmutableList.Builder<>();
for (int i = 0; i < trackSelectionArray.length; i++) {
@Nullable TrackSelection trackSelection = trackSelectionArray.get(i);
if (trackSelection != null) {
Format format = trackSelection.getFormat(0);
builder.add(format.metadata == null ? new Metadata() : format.metadata);
}
}
return builder.build();
}

private void enableRenderers() throws ExoPlaybackException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,12 @@
import androidx.annotation.CheckResult;
import androidx.annotation.Nullable;
import com.google.android.exoplayer2.Player.PlaybackSuppressionReason;
import com.google.android.exoplayer2.metadata.Metadata;
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.trackselection.TrackSelectorResult;
import com.google.common.collect.ImmutableList;
import java.util.List;

/**
* Information about an ongoing playback.
Expand Down Expand Up @@ -57,6 +60,8 @@
public final TrackGroupArray trackGroups;
/** The result of the current track selection. */
public final TrackSelectorResult trackSelectorResult;
/** The current static metadata of the track selections. */
public final List<Metadata> staticMetadata;
/** The {@link MediaPeriodId} of the currently loading media period in the {@link #timeline}. */
public final MediaPeriodId loadingMediaPeriodId;
/** Whether playback should proceed when {@link #playbackState} == {@link Player#STATE_READY}. */
Expand Down Expand Up @@ -104,6 +109,7 @@ public static PlaybackInfo createDummy(TrackSelectorResult emptyTrackSelectorRes
/* isLoading= */ false,
TrackGroupArray.EMPTY,
emptyTrackSelectorResult,
/* staticMetadata= */ ImmutableList.of(),
PLACEHOLDER_MEDIA_PERIOD_ID,
/* playWhenReady= */ false,
Player.PLAYBACK_SUPPRESSION_REASON_NONE,
Expand All @@ -126,6 +132,7 @@ public static PlaybackInfo createDummy(TrackSelectorResult emptyTrackSelectorRes
* @param isLoading See {@link #isLoading}.
* @param trackGroups See {@link #trackGroups}.
* @param trackSelectorResult See {@link #trackSelectorResult}.
* @param staticMetadata See {@link #staticMetadata}.
* @param loadingMediaPeriodId See {@link #loadingMediaPeriodId}.
* @param playWhenReady See {@link #playWhenReady}.
* @param playbackSuppressionReason See {@link #playbackSuppressionReason}.
Expand All @@ -145,6 +152,7 @@ public PlaybackInfo(
boolean isLoading,
TrackGroupArray trackGroups,
TrackSelectorResult trackSelectorResult,
List<Metadata> staticMetadata,
MediaPeriodId loadingMediaPeriodId,
boolean playWhenReady,
@PlaybackSuppressionReason int playbackSuppressionReason,
Expand All @@ -162,6 +170,7 @@ public PlaybackInfo(
this.isLoading = isLoading;
this.trackGroups = trackGroups;
this.trackSelectorResult = trackSelectorResult;
this.staticMetadata = staticMetadata;
this.loadingMediaPeriodId = loadingMediaPeriodId;
this.playWhenReady = playWhenReady;
this.playbackSuppressionReason = playbackSuppressionReason;
Expand Down Expand Up @@ -189,6 +198,8 @@ public static MediaPeriodId getDummyPeriodForEmptyTimeline() {
* @param trackGroups The track groups for the new position. See {@link #trackGroups}.
* @param trackSelectorResult The track selector result for the new position. See {@link
* #trackSelectorResult}.
* @param staticMetadata The static metadata for the track selections. See {@link
* #staticMetadata}.
* @return Copied playback info with new playing position.
*/
@CheckResult
Expand All @@ -198,7 +209,8 @@ public PlaybackInfo copyWithNewPosition(
long requestedContentPositionUs,
long totalBufferedDurationUs,
TrackGroupArray trackGroups,
TrackSelectorResult trackSelectorResult) {
TrackSelectorResult trackSelectorResult,
List<Metadata> staticMetadata) {
return new PlaybackInfo(
timeline,
periodId,
Expand All @@ -208,6 +220,7 @@ public PlaybackInfo copyWithNewPosition(
isLoading,
trackGroups,
trackSelectorResult,
staticMetadata,
loadingMediaPeriodId,
playWhenReady,
playbackSuppressionReason,
Expand Down Expand Up @@ -236,6 +249,7 @@ public PlaybackInfo copyWithTimeline(Timeline timeline) {
isLoading,
trackGroups,
trackSelectorResult,
staticMetadata,
loadingMediaPeriodId,
playWhenReady,
playbackSuppressionReason,
Expand Down Expand Up @@ -264,6 +278,7 @@ public PlaybackInfo copyWithPlaybackState(int playbackState) {
isLoading,
trackGroups,
trackSelectorResult,
staticMetadata,
loadingMediaPeriodId,
playWhenReady,
playbackSuppressionReason,
Expand Down Expand Up @@ -292,6 +307,7 @@ public PlaybackInfo copyWithPlaybackError(@Nullable ExoPlaybackException playbac
isLoading,
trackGroups,
trackSelectorResult,
staticMetadata,
loadingMediaPeriodId,
playWhenReady,
playbackSuppressionReason,
Expand Down Expand Up @@ -320,6 +336,7 @@ public PlaybackInfo copyWithIsLoading(boolean isLoading) {
isLoading,
trackGroups,
trackSelectorResult,
staticMetadata,
loadingMediaPeriodId,
playWhenReady,
playbackSuppressionReason,
Expand Down Expand Up @@ -348,6 +365,7 @@ public PlaybackInfo copyWithLoadingMediaPeriodId(MediaPeriodId loadingMediaPerio
isLoading,
trackGroups,
trackSelectorResult,
staticMetadata,
loadingMediaPeriodId,
playWhenReady,
playbackSuppressionReason,
Expand Down Expand Up @@ -380,6 +398,7 @@ public PlaybackInfo copyWithPlayWhenReady(
isLoading,
trackGroups,
trackSelectorResult,
staticMetadata,
loadingMediaPeriodId,
playWhenReady,
playbackSuppressionReason,
Expand Down Expand Up @@ -408,6 +427,7 @@ public PlaybackInfo copyWithPlaybackParameters(PlaybackParameters playbackParame
isLoading,
trackGroups,
trackSelectorResult,
staticMetadata,
loadingMediaPeriodId,
playWhenReady,
playbackSuppressionReason,
Expand Down Expand Up @@ -437,6 +457,7 @@ public PlaybackInfo copyWithOffloadSchedulingEnabled(boolean offloadSchedulingEn
isLoading,
trackGroups,
trackSelectorResult,
staticMetadata,
loadingMediaPeriodId,
playWhenReady,
playbackSuppressionReason,
Expand Down Expand Up @@ -465,6 +486,7 @@ public PlaybackInfo copyWithSleepingForOffload(boolean sleepingForOffload) {
isLoading,
trackGroups,
trackSelectorResult,
staticMetadata,
loadingMediaPeriodId,
playWhenReady,
playbackSuppressionReason,
Expand Down
Loading

0 comments on commit a552e35

Please sign in to comment.