Commit e202560d by krocard Committed by Oliver Woodman

Tunneling timestamp use Message instead of Runnable

This avoids allocating a Runnable.

PiperOrigin-RevId: 290079660
parent 0ac22d34
...@@ -195,7 +195,7 @@ public final class ParsableBitArray { ...@@ -195,7 +195,7 @@ public final class ParsableBitArray {
if (numBits <= 32) { if (numBits <= 32) {
return Util.toUnsignedLong(readBits(numBits)); return Util.toUnsignedLong(readBits(numBits));
} }
return Util.toUnsignedLong(readBits(numBits - 32)) << 32 | Util.toUnsignedLong(readBits(32)); return Util.toLong(readBits(numBits - 32), readBits(32));
} }
/** /**
......
...@@ -1216,6 +1216,18 @@ public final class Util { ...@@ -1216,6 +1216,18 @@ public final class Util {
} }
/** /**
* Return the long that is composed of the bits of the 2 specified integers.
*
* @param mostSignificantBits The 32 most significant bits of the long to return.
* @param leastSignificantBits The 32 least significant bits of the long to return.
* @return a long where its 32 most significant bits are {@code mostSignificantBits} bits and its
* 32 least significant bits are {@code leastSignificantBits}.
*/
public static long toLong(int mostSignificantBits, int leastSignificantBits) {
return (toUnsignedLong(mostSignificantBits) << 32) | toUnsignedLong(leastSignificantBits);
}
/**
* Returns a byte array containing values parsed from the hex string provided. * Returns a byte array containing values parsed from the hex string provided.
* *
* @param hexString The hex string to convert to bytes. * @param hexString The hex string to convert to bytes.
......
...@@ -26,6 +26,7 @@ import android.media.MediaCrypto; ...@@ -26,6 +26,7 @@ import android.media.MediaCrypto;
import android.media.MediaFormat; import android.media.MediaFormat;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.os.Message;
import android.os.SystemClock; import android.os.SystemClock;
import android.util.Pair; import android.util.Pair;
import android.view.Surface; import android.view.Surface;
...@@ -1813,13 +1814,16 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { ...@@ -1813,13 +1814,16 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
} }
@TargetApi(23) @TargetApi(23)
private final class OnFrameRenderedListenerV23 implements MediaCodec.OnFrameRenderedListener { private final class OnFrameRenderedListenerV23
implements MediaCodec.OnFrameRenderedListener, Handler.Callback {
private static final int HANDLE_FRAME_RENDERED = 0;
private final Handler handler; private final Handler handler;
private final MediaCodec codec; private final MediaCodec codec;
public OnFrameRenderedListenerV23(MediaCodec mediaCodec) { public OnFrameRenderedListenerV23(MediaCodec mediaCodec) {
handler = new Handler(); handler = new Handler(this);
codec = mediaCodec; codec = mediaCodec;
codec.setOnFrameRenderedListener(/* listener= */ this, handler); codec.setOnFrameRenderedListener(/* listener= */ this, handler);
} }
...@@ -1846,12 +1850,29 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { ...@@ -1846,12 +1850,29 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer {
// //
// The workaround queues the event for subsequent processing, where the lock will not be held. // The workaround queues the event for subsequent processing, where the lock will not be held.
if (Util.SDK_INT < 30) { if (Util.SDK_INT < 30) {
handler.postAtFrontOfQueue(() -> handleFrameRendered(presentationTimeUs)); Message message =
Message.obtain(
handler,
/* what= */ HANDLE_FRAME_RENDERED,
/* arg1= */ (int) (presentationTimeUs >> 32),
/* arg2= */ (int) presentationTimeUs);
handler.sendMessageAtFrontOfQueue(message);
} else { } else {
handleFrameRendered(presentationTimeUs); handleFrameRendered(presentationTimeUs);
} }
} }
@Override
public boolean handleMessage(Message message) {
switch (message.what) {
case HANDLE_FRAME_RENDERED:
handleFrameRendered(Util.toLong(message.arg1, message.arg2));
return true;
default:
return false;
}
}
private void handleFrameRendered(long presentationTimeUs) { private void handleFrameRendered(long presentationTimeUs) {
if (this != tunnelingOnFrameRenderedListener) { if (this != tunnelingOnFrameRenderedListener) {
// Stale event. // Stale event.
......
...@@ -236,6 +236,31 @@ public class UtilTest { ...@@ -236,6 +236,31 @@ public class UtilTest {
} }
@Test @Test
public void testToLongZeroValue() {
assertThat(Util.toLong(0, 0)).isEqualTo(0);
}
@Test
public void testToLongValue() {
assertThat(Util.toLong(1, -4)).isEqualTo(0x1FFFFFFFCL);
}
@Test
public void testToLongBigValue() {
assertThat(Util.toLong(0x7ABCDEF, 0x12345678)).isEqualTo(0x7ABCDEF_12345678L);
}
@Test
public void testToLongMaxValue() {
assertThat(Util.toLong(0x0FFFFFFF, 0xFFFFFFFF)).isEqualTo(0x0FFFFFFF_FFFFFFFFL);
}
@Test
public void testToLongBigNegativeValue() {
assertThat(Util.toLong(0xFEDCBA, 0x87654321)).isEqualTo(0xFEDCBA_87654321L);
}
@Test
public void testGetCodecsOfType() { public void testGetCodecsOfType() {
assertThat(getCodecsOfType(null, C.TRACK_TYPE_VIDEO)).isNull(); assertThat(getCodecsOfType(null, C.TRACK_TYPE_VIDEO)).isNull();
assertThat(getCodecsOfType("avc1.64001e,vp9.63.1", C.TRACK_TYPE_AUDIO)).isNull(); assertThat(getCodecsOfType("avc1.64001e,vp9.63.1", C.TRACK_TYPE_AUDIO)).isNull();
......
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