mirror of
https://github.com/samsonjs/media.git
synced 2026-04-27 15:07:40 +00:00
cleanups for videoframereleasetimehelper
This commit is contained in:
parent
3830307cd3
commit
2081667591
1 changed files with 35 additions and 49 deletions
|
|
@ -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;
|
||||||
@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 {
|
||||||
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 {
|
||||||
* 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 {
|
||||||
* @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;
|
||||||
|
useDefaultDisplayVsync = true;
|
||||||
|
vsyncSampler = VSyncSampler.getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
private VideoFrameReleaseTimeHelper(double defaultDisplayRefreshRate) {
|
|
||||||
useDefaultDisplayVsync = defaultDisplayRefreshRate != DISPLAY_REFRESH_RATE_UNKNOWN;
|
|
||||||
if (useDefaultDisplayVsync) {
|
|
||||||
vsyncSampler = VSyncSampler.getInstance();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enables the helper.
|
* Enables the helper.
|
||||||
|
|
@ -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,38 +103,14 @@ 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) {
|
||||||
|
vsyncDurationNs = (long) (C.NANOS_PER_SECOND / defaultDisplayRefreshRate);
|
||||||
if (useDefaultDisplayVsync) {
|
vsyncOffsetNs = (vsyncDurationNs * VSYNC_OFFSET_PERCENTAGE) / 100;
|
||||||
vsyncDurationNs = (long) (C.NANOS_PER_SECOND / defaultDisplayRefreshRate);
|
|
||||||
vsyncOffsetNs = (vsyncDurationNs * VSYNC_OFFSET_PERCENTAGE) / 100;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -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 {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@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 {
|
||||||
|
|
||||||
@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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue