From 7cba5429fc96bfeb242e06cec3c6f002f7bbcda5 Mon Sep 17 00:00:00 2001 From: hoangtc Date: Fri, 13 Jul 2018 06:00:29 -0700 Subject: [PATCH] Add supports for frame-capture retrying for MetadataRetriever. For the MetadataRetriever, for certain queries, after setting up the player to render a frame (by seeking to the position), sometimes the player will seek to the same position and ignore the seek, leading to the frame not being captured, leaving the retriever in deadlock, waiting for the frame forever. This CL adds a retry timer to avoid this and make sure we can return query result after some time. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=204460200 --- .../com/google/android/exoplayer2/ExoPlayer.java | 3 +++ .../com/google/android/exoplayer2/ExoPlayerImpl.java | 12 +++++++++++- .../google/android/exoplayer2/SimpleExoPlayer.java | 5 +++++ .../android/exoplayer2/testutil/StubExoPlayer.java | 5 +++++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java index ce43772d8d..0a0e2b0147 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayer.java @@ -242,4 +242,7 @@ public interface ExoPlayer extends Player { * @param seekParameters The seek parameters, or {@code null} to use the defaults. */ void setSeekParameters(@Nullable SeekParameters seekParameters); + + /** Returns the currently active {@link SeekParameters} of the player. */ + SeekParameters getSeekParameters(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 9a224aca5d..51858a5cae 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -64,6 +64,7 @@ import java.util.concurrent.CopyOnWriteArraySet; private boolean hasPendingPrepare; private boolean hasPendingSeek; private PlaybackParameters playbackParameters; + private SeekParameters seekParameters; private @Nullable ExoPlaybackException playbackError; // Playback information when there is no pending seek/set source operation. @@ -108,6 +109,7 @@ import java.util.concurrent.CopyOnWriteArraySet; window = new Timeline.Window(); period = new Timeline.Period(); playbackParameters = PlaybackParameters.DEFAULT; + seekParameters = SeekParameters.DEFAULT; eventHandler = new Handler(looper) { @Override @@ -339,7 +341,15 @@ import java.util.concurrent.CopyOnWriteArraySet; if (seekParameters == null) { seekParameters = SeekParameters.DEFAULT; } - internalPlayer.setSeekParameters(seekParameters); + if (!this.seekParameters.equals(seekParameters)) { + this.seekParameters = seekParameters; + internalPlayer.setSeekParameters(seekParameters); + } + } + + @Override + public SeekParameters getSeekParameters() { + return seekParameters; } @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java index 7ca801da6b..10f6b5c540 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/SimpleExoPlayer.java @@ -791,6 +791,11 @@ public class SimpleExoPlayer player.setSeekParameters(seekParameters); } + @Override + public SeekParameters getSeekParameters() { + return player.getSeekParameters(); + } + @Override public @Nullable Object getCurrentTag() { return player.getCurrentTag(); diff --git a/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java b/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java index 0718c5dd26..246e2918c4 100644 --- a/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java +++ b/testutils_robolectric/src/main/java/com/google/android/exoplayer2/testutil/StubExoPlayer.java @@ -159,6 +159,11 @@ public abstract class StubExoPlayer implements ExoPlayer { throw new UnsupportedOperationException(); } + @Override + public SeekParameters getSeekParameters() { + throw new UnsupportedOperationException(); + } + @Override public @Nullable Object getCurrentTag() { throw new UnsupportedOperationException();