Merge pull request #6603 from TiVo:fix-tunneling-stuck-release
PiperOrigin-RevId: 290041295
This commit is contained in:
parent
38bc7355c7
commit
c269ffe1e6
@ -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,7 +563,7 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
|||||||
clearReportedVideoSize();
|
clearReportedVideoSize();
|
||||||
clearRenderedFirstFrame();
|
clearRenderedFirstFrame();
|
||||||
frameReleaseTimeHelper.disable();
|
frameReleaseTimeHelper.disable();
|
||||||
tunnelingOnFrameRenderedListener = null;
|
releaseOnFrameRenderedListener();
|
||||||
try {
|
try {
|
||||||
super.onDisabled();
|
super.onDisabled();
|
||||||
} finally {
|
} finally {
|
||||||
@ -1805,15 +1805,54 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void releaseOnFrameRenderedListener() {
|
||||||
|
if (tunnelingOnFrameRenderedListener != null) {
|
||||||
|
tunnelingOnFrameRenderedListener.release();
|
||||||
|
}
|
||||||
|
tunnelingOnFrameRenderedListener = null;
|
||||||
|
}
|
||||||
|
|
||||||
@TargetApi(23)
|
@TargetApi(23)
|
||||||
private final class OnFrameRenderedListenerV23 implements MediaCodec.OnFrameRenderedListener {
|
private final class OnFrameRenderedListenerV23 implements MediaCodec.OnFrameRenderedListener {
|
||||||
|
|
||||||
private OnFrameRenderedListenerV23(MediaCodec codec) {
|
private final Handler handler;
|
||||||
codec.setOnFrameRenderedListener(this, new Handler());
|
private final MediaCodec codec;
|
||||||
|
|
||||||
|
public OnFrameRenderedListenerV23(MediaCodec mediaCodec) {
|
||||||
|
handler = new Handler();
|
||||||
|
codec = mediaCodec;
|
||||||
|
codec.setOnFrameRenderedListener(/* listener= */ this, handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stop listening for the codec OnFrameRendered events and invalidate all queued such events.
|
||||||
|
*
|
||||||
|
* <p>Not required when switching one frame render listener for another and may cause overhead
|
||||||
|
* (MediaCodec calls native_enableOnFrameRenderedListener() twice then). The stale event logic
|
||||||
|
* prevents issues for a listener switch.
|
||||||
|
*/
|
||||||
|
public void release() {
|
||||||
|
codec.setOnFrameRenderedListener(null, null);
|
||||||
|
handler.removeCallbacksAndMessages(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFrameRendered(MediaCodec codec, long presentationTimeUs, long nanoTime) {
|
public void onFrameRendered(MediaCodec codec, long presentationTimeUs, long nanoTime) {
|
||||||
|
// Workaround bug in MediaCodec that causes deadlock if you call directly back into the
|
||||||
|
// MediaCodec from this listener method.
|
||||||
|
// Deadlock occurs because MediaCodec calls this listener method holding a lock,
|
||||||
|
// which may also be required by calls made back into the MediaCodec.
|
||||||
|
// This was fixed in https://android-review.googlesource.com/1156807.
|
||||||
|
//
|
||||||
|
// The workaround queues the event for subsequent processing, where the lock will not be held.
|
||||||
|
if (Util.SDK_INT < 30) {
|
||||||
|
handler.postAtFrontOfQueue(() -> handleFrameRendered(presentationTimeUs));
|
||||||
|
} else {
|
||||||
|
handleFrameRendered(presentationTimeUs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void handleFrameRendered(long presentationTimeUs) {
|
||||||
if (this != tunnelingOnFrameRenderedListener) {
|
if (this != tunnelingOnFrameRenderedListener) {
|
||||||
// Stale event.
|
// Stale event.
|
||||||
return;
|
return;
|
||||||
@ -1824,6 +1863,5 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
|
|||||||
onProcessedTunneledBuffer(presentationTimeUs);
|
onProcessedTunneledBuffer(presentationTimeUs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user