diff --git a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index 5fbf343182a..933c13e3e4e 100644 --- a/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -39,6 +39,10 @@ import android.os.Build; import android.media.PlaybackParams; + +import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.source.TrackGroup; + /** * Implements the internal behavior of {@link ExoPlayerImpl}. */ @@ -168,6 +172,7 @@ public SourceInfo(Timeline timeline, Object manifest, PlaybackInfo playbackInfo, private Timeline timeline; private float speed; + private boolean pendingFormatSpeed; public ExoPlayerImplInternal(Renderer[] renderers, TrackSelector trackSelector, LoadControl loadControl, boolean playWhenReady, Handler eventHandler, @@ -181,6 +186,9 @@ public ExoPlayerImplInternal(Renderer[] renderers, TrackSelector trackSelector, this.playbackInfo = playbackInfo; this.player = player; + this.pendingFormatSpeed = false; + this.speed = 1; + rendererCapabilities = new RendererCapabilities[renderers.length]; for (int i = 0; i < renderers.length; i++) { renderers[i].setIndex(i); @@ -1355,6 +1363,10 @@ private void setPlayingPeriodHolder(MediaPeriodHolder periodHolder) throws ExoPl } playingPeriodHolder = periodHolder; + if (pendingFormatSpeed) { + setFormatSpeed(speed); + pendingFormatSpeed = false; + } eventHandler.obtainMessage(MSG_TRACKS_CHANGED, periodHolder.trackSelectorResult).sendToTarget(); enableRenderers(rendererWasEnabledFlags, enabledRendererCount); } @@ -1428,6 +1440,11 @@ public void setPlaybackSpeed(float speed) { rendererMediaClock.setPlaybackSpeed(speed); } } + if (playingPeriodHolder != null) { + setFormatSpeed(speed); + } else { + pendingFormatSpeed = true; + } } private void maybeUpdatePlaybackSpeed(ExoPlayerMessage msg) { @@ -1436,6 +1453,24 @@ private void maybeUpdatePlaybackSpeed(ExoPlayerMessage msg) { } } + private void setFormatSpeed(float speed) { + Assertions.checkNotNull(playingPeriodHolder); + TrackGroupArray rendererTrackGroups = playingPeriodHolder.mediaPeriod.getTrackGroups(); + if (rendererTrackGroups.length > 0) { + for (int groupIndex = 0; groupIndex < rendererTrackGroups.length; groupIndex++) { + TrackGroup trackGroup = rendererTrackGroups.get(groupIndex); + if (trackGroup != null) { + for (int trackIndex = 0; trackIndex < trackGroup.length; trackIndex++) { + Format format = trackGroup.getFormat(trackIndex); + if (format != null) { + format.speed = speed; + } + } + } + } + } + } + /** * Holds a {@link MediaPeriod} with information required to play it as part of a timeline. */ diff --git a/library/src/main/java/com/google/android/exoplayer2/Format.java b/library/src/main/java/com/google/android/exoplayer2/Format.java index 866e512288f..96b30dcc879 100644 --- a/library/src/main/java/com/google/android/exoplayer2/Format.java +++ b/library/src/main/java/com/google/android/exoplayer2/Format.java @@ -188,6 +188,11 @@ public final class Format implements Parcelable { // Video. + /** + * For trickPlayBack case. + */ + public float speed; + public static Format createVideoContainerFormat(String id, String containerMimeType, String sampleMimeType, String codecs, int bitrate, int width, int height, float frameRate, List initializationData, @C.SelectionFlags int selectionFlags) { @@ -377,6 +382,8 @@ public static Format createSampleFormat(String id, String sampleMimeType, String : initializationData; this.drmInitData = drmInitData; this.metadata = metadata; + + this.speed = 1; } @SuppressWarnings("ResourceType") diff --git a/library/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveVideoTrackSelection.java b/library/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveVideoTrackSelection.java index 868303cc5b8..d302106dd15 100644 --- a/library/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveVideoTrackSelection.java +++ b/library/src/main/java/com/google/android/exoplayer2/trackselection/AdaptiveVideoTrackSelection.java @@ -237,7 +237,7 @@ private int determineIdealSelectedIndex(long nowMs) { for (int i = 0; i < length; i++) { if (nowMs == Long.MIN_VALUE || !isBlacklisted(i, nowMs)) { Format format = getFormat(i); - if (format.bitrate <= effectiveBitrate) { + if ((format.bitrate * format.speed) <= effectiveBitrate) { return i; } else { lowestBitrateNonBlacklistedIndex = i;