Commit 20816675 by Drew Hill

cleanups for videoframereleasetimehelper

parent 3830307c
...@@ -24,6 +24,7 @@ import android.os.HandlerThread; ...@@ -24,6 +24,7 @@ import android.os.HandlerThread;
import android.os.Message; import android.os.Message;
import android.view.Choreographer; import android.view.Choreographer;
import android.view.Choreographer.FrameCallback; import android.view.Choreographer.FrameCallback;
import android.view.Display;
import android.view.WindowManager; import android.view.WindowManager;
import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.C;
...@@ -33,7 +34,6 @@ import com.google.android.exoplayer2.C; ...@@ -33,7 +34,6 @@ import com.google.android.exoplayer2.C;
@TargetApi(16) @TargetApi(16)
public final class VideoFrameReleaseTimeHelper { public final class VideoFrameReleaseTimeHelper {
private static final int DISPLAY_ID_UNKNOWN = -1;
private static final double DISPLAY_REFRESH_RATE_UNKNOWN = -1; private static final double DISPLAY_REFRESH_RATE_UNKNOWN = -1;
private static final long CHOREOGRAPHER_SAMPLE_DELAY_MILLIS = 500; private static final long CHOREOGRAPHER_SAMPLE_DELAY_MILLIS = 500;
private static final long MAX_ALLOWED_DRIFT_NS = 20000000; private static final long MAX_ALLOWED_DRIFT_NS = 20000000;
...@@ -41,10 +41,10 @@ public final class VideoFrameReleaseTimeHelper { ...@@ -41,10 +41,10 @@ public final class VideoFrameReleaseTimeHelper {
private static final long VSYNC_OFFSET_PERCENTAGE = 80; private static final long VSYNC_OFFSET_PERCENTAGE = 80;
private static final int MIN_FRAMES_FOR_ADJUSTMENT = 6; private static final int MIN_FRAMES_FOR_ADJUSTMENT = 6;
private DisplayManager.DisplayListener displayListener = null;
private Context context = null; private Context context = null;
private VSyncSampler vsyncSampler = null; private final DefaultDisplayListener defaultDisplayListener;
private final VSyncSampler vsyncSampler;
private final boolean useDefaultDisplayVsync; private final boolean useDefaultDisplayVsync;
private long vsyncDurationNs = -1; // Value unused. private long vsyncDurationNs = -1; // Value unused.
private long vsyncOffsetNs = -1; // Value unused. private long vsyncOffsetNs = -1; // Value unused.
...@@ -63,7 +63,10 @@ public final class VideoFrameReleaseTimeHelper { ...@@ -63,7 +63,10 @@ public final class VideoFrameReleaseTimeHelper {
* the default display's vsync signal. * the default display's vsync signal.
*/ */
public VideoFrameReleaseTimeHelper() { public VideoFrameReleaseTimeHelper() {
this(DISPLAY_REFRESH_RATE_UNKNOWN); defaultDisplayListener = null;
useDefaultDisplayVsync = false;
vsyncSampler = null;
context = null;
} }
/** /**
...@@ -73,16 +76,13 @@ public final class VideoFrameReleaseTimeHelper { ...@@ -73,16 +76,13 @@ public final class VideoFrameReleaseTimeHelper {
* @param context A context from which information about the default display can be retrieved. * @param context A context from which information about the default display can be retrieved.
*/ */
public VideoFrameReleaseTimeHelper(Context context) { public VideoFrameReleaseTimeHelper(Context context) {
this(getDefaultDisplayRefreshRate(context));
this.context = context.getApplicationContext(); this.context = context.getApplicationContext();
} defaultDisplayListener = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 ?
new DefaultDisplayListener(context) : null;
private VideoFrameReleaseTimeHelper(double defaultDisplayRefreshRate) { useDefaultDisplayVsync = true;
useDefaultDisplayVsync = defaultDisplayRefreshRate != DISPLAY_REFRESH_RATE_UNKNOWN;
if (useDefaultDisplayVsync) {
vsyncSampler = VSyncSampler.getInstance(); vsyncSampler = VSyncSampler.getInstance();
} }
}
/** /**
* Enables the helper. * Enables the helper.
...@@ -92,7 +92,8 @@ public final class VideoFrameReleaseTimeHelper { ...@@ -92,7 +92,8 @@ public final class VideoFrameReleaseTimeHelper {
if (useDefaultDisplayVsync) { if (useDefaultDisplayVsync) {
vsyncSampler.addObserver(); vsyncSampler.addObserver();
setSync(getDefaultDisplayRefreshRate(context)); setSync(getDefaultDisplayRefreshRate(context));
registerDisplayListener(); if (defaultDisplayListener != null)
defaultDisplayListener.register();
} }
} }
...@@ -102,39 +103,15 @@ public final class VideoFrameReleaseTimeHelper { ...@@ -102,39 +103,15 @@ public final class VideoFrameReleaseTimeHelper {
public void disable() { public void disable() {
if (useDefaultDisplayVsync) { if (useDefaultDisplayVsync) {
vsyncSampler.removeObserver(); vsyncSampler.removeObserver();
unregisterDisplayListener(); if (defaultDisplayListener != null)
} defaultDisplayListener.unregister();
}
private void registerDisplayListener() {
if (displayListener == null && context != null &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
DisplayManager displayManager = context.getSystemService(DisplayManager.class);
if (displayManager != null) {
displayListener = new DefaultDisplayListener(context);
displayManager.registerDisplayListener(displayListener, null);
}
}
}
private void unregisterDisplayListener() {
if (context != null && displayListener != null &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
DisplayManager displayManager = context.getSystemService(DisplayManager.class);
if (displayManager != null) {
displayManager.unregisterDisplayListener(displayListener);
displayListener = null;
}
} }
} }
private void setSync(double defaultDisplayRefreshRate) { private void setSync(double defaultDisplayRefreshRate) {
if (useDefaultDisplayVsync) {
vsyncDurationNs = (long) (C.NANOS_PER_SECOND / defaultDisplayRefreshRate); vsyncDurationNs = (long) (C.NANOS_PER_SECOND / defaultDisplayRefreshRate);
vsyncOffsetNs = (vsyncDurationNs * VSYNC_OFFSET_PERCENTAGE) / 100; vsyncOffsetNs = (vsyncDurationNs * VSYNC_OFFSET_PERCENTAGE) / 100;
} }
}
/** /**
* Adjusts a frame release timestamp. * Adjusts a frame release timestamp.
...@@ -234,12 +211,6 @@ public final class VideoFrameReleaseTimeHelper { ...@@ -234,12 +211,6 @@ public final class VideoFrameReleaseTimeHelper {
return snappedAfterDiff < snappedBeforeDiff ? snappedAfterNs : snappedBeforeNs; return snappedAfterDiff < snappedBeforeDiff ? snappedAfterNs : snappedBeforeNs;
} }
private static int getDefaultDisplayId(Context context) {
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
return manager != null && manager.getDefaultDisplay() != null ?
manager.getDefaultDisplay().getDisplayId() : DISPLAY_ID_UNKNOWN;
}
private static double getDefaultDisplayRefreshRate(Context context) { private static double getDefaultDisplayRefreshRate(Context context) {
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
return manager != null && manager.getDefaultDisplay() != null ? return manager != null && manager.getDefaultDisplay() != null ?
...@@ -341,12 +312,16 @@ public final class VideoFrameReleaseTimeHelper { ...@@ -341,12 +312,16 @@ public final class VideoFrameReleaseTimeHelper {
} }
@TargetApi(17) @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private class DefaultDisplayListener implements DisplayManager.DisplayListener { private class DefaultDisplayListener implements DisplayManager.DisplayListener {
private final Context context; private final Context context;
private final DisplayManager displayManager;
DefaultDisplayListener(Context context) { DefaultDisplayListener(Context context) {
this.context = context; this.context = context;
displayManager = context != null ?
(DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE) : null;
} }
@Override @Override
...@@ -359,12 +334,23 @@ public final class VideoFrameReleaseTimeHelper { ...@@ -359,12 +334,23 @@ public final class VideoFrameReleaseTimeHelper {
@Override @Override
public void onDisplayChanged(int displayId) { public void onDisplayChanged(int displayId) {
final int defaultDisplayId = getDefaultDisplayId(context); if (displayId == Display.DEFAULT_DISPLAY) {
if (displayId == defaultDisplayId || defaultDisplayId == DISPLAY_ID_UNKNOWN) {
setSync(getDefaultDisplayRefreshRate(context)); setSync(getDefaultDisplayRefreshRate(context));
} }
} }
public void register() {
if (displayManager != null && context != null) { // context is used on callback
displayManager.registerDisplayListener(this, null);
}
}
public void unregister() {
if (displayManager != null) {
displayManager.unregisterDisplayListener(this);
}
}
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment