Skip to content

Commit

Permalink
Expose ability to get adjusted seek position from MediaPeriod
Browse files Browse the repository at this point in the history
Issue: #2882

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=178606133
  • Loading branch information
ojw28 committed Dec 12, 2017
1 parent 8c7fe8a commit 2e3667e
Show file tree
Hide file tree
Showing 12 changed files with 104 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -660,10 +660,18 @@ private void seekToInternal(SeekPosition seekPosition) throws ExoPlaybackExcepti
periodPositionUs = 0;
}
try {
if (periodId.equals(playbackInfo.periodId)
&& ((periodPositionUs / 1000) == (playbackInfo.positionUs / 1000))) {
// Seek position equals the current position. Do nothing.
return;
if (periodId.equals(playbackInfo.periodId)) {
long adjustedPeriodPositionUs = periodPositionUs;
if (playingPeriodHolder != null) {
adjustedPeriodPositionUs =
playingPeriodHolder.mediaPeriod.getAdjustedSeekPositionUs(
adjustedPeriodPositionUs, SeekParameters.DEFAULT);
}
if ((adjustedPeriodPositionUs / 1000) == (playbackInfo.positionUs / 1000)) {
// Seek will be performed to the current position. Do nothing.
periodPositionUs = playbackInfo.positionUs;
return;
}
}
long newPeriodPositionUs = seekToPeriodPosition(periodId, periodPositionUs);
seekPositionAdjusted |= periodPositionUs != newPeriodPositionUs;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.util.Assertions;
Expand Down Expand Up @@ -170,6 +171,12 @@ public long seekToUs(long positionUs) {
return seekUs - startUs;
}

@Override
public long getAdjustedSeekPositionUs(long positionUs, SeekParameters seekParameters) {
return mediaPeriod.getAdjustedSeekPositionUs(
positionUs + startUs, adjustSeekParameters(positionUs + startUs, seekParameters));
}

@Override
public long getNextLoadPositionUs() {
long nextLoadPositionUs = mediaPeriod.getNextLoadPositionUs();
Expand Down Expand Up @@ -202,6 +209,20 @@ public void onContinueLoadingRequested(MediaPeriod source) {
return pendingInitialDiscontinuityPositionUs != C.TIME_UNSET;
}

private SeekParameters adjustSeekParameters(long positionUs, SeekParameters seekParameters) {
long toleranceBeforeMs = Math.min(positionUs - startUs, seekParameters.toleranceBeforeUs);
long toleranceAfterMs =
endUs == C.TIME_END_OF_SOURCE
? seekParameters.toleranceAfterUs
: Math.min(endUs - positionUs, seekParameters.toleranceAfterUs);
if (toleranceBeforeMs == seekParameters.toleranceBeforeUs
&& toleranceAfterMs == seekParameters.toleranceAfterUs) {
return seekParameters;
} else {
return new SeekParameters(toleranceBeforeMs, toleranceAfterMs);
}
}

private static boolean shouldKeepInitialDiscontinuity(long startUs, TrackSelection[] selections) {
// If the clipping start position is non-zero, the clipping sample streams will adjust
// timestamps on buffers they read from the unclipped sample streams. These adjusted buffer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
package com.google.android.exoplayer2.source;

import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.source.MediaSource.MediaPeriodId;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.upstream.Allocator;
Expand Down Expand Up @@ -114,6 +115,11 @@ public long seekToUs(long positionUs) {
return mediaPeriod.seekToUs(positionUs);
}

@Override
public long getAdjustedSeekPositionUs(long positionUs, SeekParameters seekParameters) {
return mediaPeriod.getAdjustedSeekPositionUs(positionUs, seekParameters);
}

@Override
public long getNextLoadPositionUs() {
return mediaPeriod.getNextLoadPositionUs();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.extractor.DefaultExtractorInput;
import com.google.android.exoplayer2.extractor.Extractor;
Expand Down Expand Up @@ -369,6 +370,12 @@ public long seekToUs(long positionUs) {
return positionUs;
}

@Override
public long getAdjustedSeekPositionUs(long positionUs, SeekParameters seekParameters) {
// Treat all seeks into non-seekable media as being to t=0.
return seekMap.isSeekable() ? positionUs : 0;
}

// SampleStream methods.

/* package */ boolean isReady(int track) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.ExoPlayer;
import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.Timeline;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import java.io.IOException;
Expand Down Expand Up @@ -149,6 +150,19 @@ long selectTracks(
*/
long seekToUs(long positionUs);

/**
* Returns the position to which a seek will be performed, given the specified seek position and
* {@link SeekParameters}.
*
* <p>This method should only be called after the period has been prepared.
*
* @param positionUs The seek position in microseconds.
* @param seekParameters Parameters that control how the seek is performed. Implementations may
* apply seek parameters on a best effort basis.
* @return The actual position to which a seek will be performed, in microseconds.
*/
long getAdjustedSeekPositionUs(long positionUs, SeekParameters seekParameters);

// SequenceableLoader interface. Overridden to provide more specific documentation.

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
package com.google.android.exoplayer2.source;

import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.trackselection.TrackSelection;
import com.google.android.exoplayer2.util.Assertions;
import java.io.IOException;
Expand Down Expand Up @@ -192,6 +193,11 @@ public long seekToUs(long positionUs) {
return positionUs;
}

@Override
public long getAdjustedSeekPositionUs(long positionUs, SeekParameters seekParameters) {
return enabledPeriods[0].getAdjustedSeekPositionUs(positionUs, seekParameters);
}

// MediaPeriod.Callback implementation

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.FormatHolder;
import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;
import com.google.android.exoplayer2.source.SingleSampleMediaSource.EventListener;
import com.google.android.exoplayer2.trackselection.TrackSelection;
Expand Down Expand Up @@ -153,11 +154,16 @@ public long getBufferedPositionUs() {
@Override
public long seekToUs(long positionUs) {
for (int i = 0; i < sampleStreams.size(); i++) {
sampleStreams.get(i).seekToUs(positionUs);
sampleStreams.get(i).reset();
}
return positionUs;
}

@Override
public long getAdjustedSeekPositionUs(long positionUs, SeekParameters seekParameters) {
return positionUs;
}

// Loader.Callback implementation.

@Override
Expand Down Expand Up @@ -208,7 +214,7 @@ private final class SampleStreamImpl implements SampleStream {

private int streamState;

public void seekToUs(long positionUs) {
public void reset() {
if (streamState == STREAM_STATE_END_OF_STREAM) {
streamState = STREAM_STATE_SEND_SAMPLE;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import android.util.SparseIntArray;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory;
import com.google.android.exoplayer2.source.EmptySampleStream;
import com.google.android.exoplayer2.source.MediaPeriod;
Expand Down Expand Up @@ -306,6 +307,11 @@ public long seekToUs(long positionUs) {
return positionUs;
}

@Override
public long getAdjustedSeekPositionUs(long positionUs, SeekParameters seekParameters) {
return positionUs;
}

// SequenceableLoader.Callback implementation.

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import android.os.Handler;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory;
import com.google.android.exoplayer2.source.MediaPeriod;
import com.google.android.exoplayer2.source.MediaSourceEventListener.EventDispatcher;
Expand Down Expand Up @@ -244,6 +245,11 @@ public long seekToUs(long positionUs) {
return positionUs;
}

@Override
public long getAdjustedSeekPositionUs(long positionUs, SeekParameters seekParameters) {
return positionUs;
}

// HlsSampleStreamWrapper.Callback implementation.

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import android.util.Base64;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.extractor.mp4.TrackEncryptionBox;
import com.google.android.exoplayer2.source.CompositeSequenceableLoaderFactory;
import com.google.android.exoplayer2.source.MediaPeriod;
Expand Down Expand Up @@ -182,6 +183,11 @@ public long seekToUs(long positionUs) {
return positionUs;
}

@Override
public long getAdjustedSeekPositionUs(long positionUs, SeekParameters seekParameters) {
return positionUs;
}

// SequenceableLoader.Callback implementation

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import android.os.Handler;
import android.support.annotation.Nullable;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.SeekParameters;
import com.google.android.exoplayer2.source.MediaPeriod;
import com.google.android.exoplayer2.source.SampleStream;
import com.google.android.exoplayer2.source.TrackGroup;
Expand Down Expand Up @@ -176,6 +177,11 @@ public long seekToUs(long positionUs) {
return positionUs + seekOffsetUs;
}

@Override
public long getAdjustedSeekPositionUs(long positionUs, SeekParameters seekParameters) {
return positionUs;
}

@Override
public long getNextLoadPositionUs() {
Assert.assertTrue(prepared);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -422,8 +422,12 @@ public void onTrackSelectionsInvalidated() {
SampleStream[] sampleStreams = new SampleStream[renderers.length];
boolean[] mayRetainStreamFlags = new boolean[renderers.length];
Arrays.fill(mayRetainStreamFlags, true);
mediaPeriod.selectTracks(selectorResult.selections.getAll(), mayRetainStreamFlags,
sampleStreams, new boolean[renderers.length], 0);
mediaPeriod.selectTracks(
selectorResult.selections.getAll(),
mayRetainStreamFlags,
sampleStreams,
new boolean[renderers.length],
/* positionUs = */ 0);
eventListenerHandler.post(new Runnable() {
@Override
public void run() {
Expand Down

0 comments on commit 2e3667e

Please sign in to comment.