From ac3501dd84394bafe9dc14ec2e0a6c04fbfa04a6 Mon Sep 17 00:00:00 2001 From: Drew Hill Date: Thu, 12 Oct 2017 08:39:06 -0400 Subject: [PATCH] make videoframereleasetimehelper get refresh rate when it's enabled, so we can reuse video renderer for multiple clips with different frame rates --- .../video/MediaCodecVideoRenderer.java | 2 +- .../video/VideoFrameReleaseTimeHelper.java | 36 +++++++++++-------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index 4c1f4c0eb2..f8c3eace24 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -236,7 +236,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { tunnelingAudioSessionId = getConfiguration().tunnelingAudioSessionId; tunneling = tunnelingAudioSessionId != C.AUDIO_SESSION_ID_UNSET; eventDispatcher.enabled(decoderCounters); - frameReleaseTimeHelper.enable(); + frameReleaseTimeHelper.enable(context); } @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseTimeHelper.java b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseTimeHelper.java index ad489c2312..96693a1bd2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseTimeHelper.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/VideoFrameReleaseTimeHelper.java @@ -38,10 +38,10 @@ public final class VideoFrameReleaseTimeHelper { private static final long VSYNC_OFFSET_PERCENTAGE = 80; private static final int MIN_FRAMES_FOR_ADJUSTMENT = 6; - private final VSyncSampler vsyncSampler; - private final boolean useDefaultDisplayVsync; - private final long vsyncDurationNs; - private final long vsyncOffsetNs; + private VSyncSampler vsyncSampler; + private boolean useDefaultDisplayVsync; + private long vsyncDurationNs; + private long vsyncOffsetNs; private long lastFramePresentationTimeUs; private long adjustedLastFrameTimeNs; @@ -71,24 +71,16 @@ public final class VideoFrameReleaseTimeHelper { } private VideoFrameReleaseTimeHelper(double defaultDisplayRefreshRate) { - useDefaultDisplayVsync = defaultDisplayRefreshRate != DISPLAY_REFRESH_RATE_UNKNOWN; - if (useDefaultDisplayVsync) { - vsyncSampler = VSyncSampler.getInstance(); - vsyncDurationNs = (long) (C.NANOS_PER_SECOND / defaultDisplayRefreshRate); - vsyncOffsetNs = (vsyncDurationNs * VSYNC_OFFSET_PERCENTAGE) / 100; - } else { - vsyncSampler = null; - vsyncDurationNs = -1; // Value unused. - vsyncOffsetNs = -1; // Value unused. - } + setSync(defaultDisplayRefreshRate); } /** * Enables the helper. */ - public void enable() { + public void enable(Context context) { haveSync = false; if (useDefaultDisplayVsync) { + setSync(getDefaultDisplayRefreshRate(context)); vsyncSampler.addObserver(); } } @@ -102,6 +94,20 @@ public final class VideoFrameReleaseTimeHelper { } } + private void setSync(double defaultDisplayRefreshRate) { + + useDefaultDisplayVsync = defaultDisplayRefreshRate != DISPLAY_REFRESH_RATE_UNKNOWN; + if (useDefaultDisplayVsync) { + vsyncSampler = VSyncSampler.getInstance(); + vsyncDurationNs = (long) (C.NANOS_PER_SECOND / defaultDisplayRefreshRate); + vsyncOffsetNs = (vsyncDurationNs * VSYNC_OFFSET_PERCENTAGE) / 100; + } else { + vsyncSampler = null; + vsyncDurationNs = -1; // Value unused. + vsyncOffsetNs = -1; // Value unused. + } + } + /** * Adjusts a frame release timestamp. *