Commit 621d7a49 by Steve Mayhew

Fix not to call codec.setOnFrameRenderedListener(null, null) unless stoping codec

Refator to lift a method to create (and destroy) the OnFrameRenderedListenerV23() and split destroying the Handler from removing the MediaCodec onFrameRenderedListener to avoid double call to codec.setOnFrameRenderedListener()
parent 224236b4
...@@ -158,7 +158,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { ...@@ -158,7 +158,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
private boolean tunneling; private boolean tunneling;
private int tunnelingAudioSessionId; private int tunnelingAudioSessionId;
/* package */ OnFrameRenderedListenerV23 tunnelingOnFrameRenderedListener; /* package */ @Nullable OnFrameRenderedListenerV23 tunnelingOnFrameRenderedListener;
private long lastInputTimeUs; private long lastInputTimeUs;
private long outputStreamOffsetUs; private long outputStreamOffsetUs;
...@@ -563,10 +563,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { ...@@ -563,10 +563,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
clearReportedVideoSize(); clearReportedVideoSize();
clearRenderedFirstFrame(); clearRenderedFirstFrame();
frameReleaseTimeHelper.disable(); frameReleaseTimeHelper.disable();
if (tunnelingOnFrameRenderedListener != null) { destroyOnFrameRenderListener();
tunnelingOnFrameRenderedListener.destroyHandler(getCodec());
}
tunnelingOnFrameRenderedListener = null;
try { try {
super.onDisabled(); super.onDisabled();
} finally { } finally {
...@@ -690,10 +687,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { ...@@ -690,10 +687,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
} }
codec.configure(mediaFormat, surface, crypto, 0); codec.configure(mediaFormat, surface, crypto, 0);
if (Util.SDK_INT >= 23 && tunneling) { if (Util.SDK_INT >= 23 && tunneling) {
if (tunnelingOnFrameRenderedListener != null) { createOnFrameRenderedListener(codec);
tunnelingOnFrameRenderedListener.destroyHandler(codec);
}
tunnelingOnFrameRenderedListener = new OnFrameRenderedListenerV23(codec);
} }
} }
...@@ -1234,10 +1228,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { ...@@ -1234,10 +1228,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
MediaCodec codec = getCodec(); MediaCodec codec = getCodec();
// If codec is null then the listener will be instantiated in configureCodec. // If codec is null then the listener will be instantiated in configureCodec.
if (codec != null) { if (codec != null) {
if (tunnelingOnFrameRenderedListener != null) { createOnFrameRenderedListener(codec);
tunnelingOnFrameRenderedListener.destroyHandler(codec);
}
tunnelingOnFrameRenderedListener = new OnFrameRenderedListenerV23(codec);
} }
} }
} }
...@@ -1796,6 +1787,28 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { ...@@ -1796,6 +1787,28 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
return deviceNeedsSetOutputSurfaceWorkaround; return deviceNeedsSetOutputSurfaceWorkaround;
} }
private void createOnFrameRenderedListener(MediaCodec codec) {
OnFrameRenderedListenerV23 oldListener = tunnelingOnFrameRenderedListener;
tunnelingOnFrameRenderedListener = new OnFrameRenderedListenerV23(codec);
if (oldListener != null) {
oldListener.destroyHandler();
}
}
private void destroyOnFrameRenderListener() {
if (tunnelingOnFrameRenderedListener != null) {
tunnelingOnFrameRenderedListener.destroyHandler();
MediaCodec codec = getCodec();
if (codec != null) {
tunnelingOnFrameRenderedListener.disable(codec);
}
}
tunnelingOnFrameRenderedListener = null;
}
protected Surface getSurface() { protected Surface getSurface() {
return surface; return surface;
} }
...@@ -1826,16 +1839,24 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { ...@@ -1826,16 +1839,24 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
/** /**
* Cleanup any messages pending for this listener before removing references to it * Cleanup any messages pending for this listener before removing references to it
*
* @param codec optional, if the codec is still around it should be passed here
*/ */
void destroyHandler(@Nullable MediaCodec codec) { void destroyHandler() {
if (codec != null) {
codec.setOnFrameRenderedListener(null, null);
}
handler.removeCallbacksAndMessages(null); handler.removeCallbacksAndMessages(null);
} }
/**
* Not required if we are switching one frame render listener for another and may cause
* overhead (MediaCodec calls native_enableOnFrameRenderedListener() twice then). The
* stale event logic should prevent issues for a listener switch.
*
* This still might be a good idea when stopping the codec.
*
* @param codec codec that is being run down.
*/
private void disable(MediaCodec codec) {
codec.setOnFrameRenderedListener(null, null);
}
@Override @Override
public void onFrameRendered(MediaCodec codec, long presentationTimeUs, long nanoTime) { public void onFrameRendered(MediaCodec codec, long presentationTimeUs, long nanoTime) {
if (this != tunnelingOnFrameRenderedListener) { if (this != tunnelingOnFrameRenderedListener) {
......
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