From 531ff0e19dbc6c6c4c8ba29c3a877dfa69d18d61 Mon Sep 17 00:00:00 2001 From: christosts Date: Tue, 14 Dec 2021 18:51:17 +0000 Subject: [PATCH] Add getMetrics() in MediaCodecAdapter Before the introduction of the MediaCodecAdapter, users could get access directly to the MediaCodec instance from MediaCodecRenderer.getCodec() and then retrieve the codec metrics. This change exposes MediaCodec.getMetrics() on the MediaCodecAdapter. Issue: google/ExoPlayer#9766 #minor-release PiperOrigin-RevId: 416343023 --- .../mediacodec/AsynchronousMediaCodecAdapter.java | 8 ++++++++ .../media3/exoplayer/mediacodec/MediaCodecAdapter.java | 9 +++++++++ .../mediacodec/SynchronousMediaCodecAdapter.java | 9 +++++++++ .../media3/test/utils/CapturingRenderersFactory.java | 7 +++++++ 4 files changed, 33 insertions(+) diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecAdapter.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecAdapter.java index c54fef3591..715f1b183a 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecAdapter.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/AsynchronousMediaCodecAdapter.java @@ -22,6 +22,7 @@ import android.media.MediaFormat; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; +import android.os.PersistableBundle; import android.view.Surface; import androidx.annotation.IntDef; import androidx.annotation.Nullable; @@ -306,6 +307,13 @@ import java.nio.ByteBuffer; codec.signalEndOfInputStream(); } + @Override + @RequiresApi(26) + public PersistableBundle getMetrics() { + maybeBlockOnQueueing(); + return codec.getMetrics(); + } + @VisibleForTesting /* package */ void onError(MediaCodec.CodecException error) { asynchronousMediaCodecCallback.onError(codec, error); diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecAdapter.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecAdapter.java index 6e75445e7f..c188c831f0 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecAdapter.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/MediaCodecAdapter.java @@ -20,6 +20,7 @@ import android.media.MediaCrypto; import android.media.MediaFormat; import android.os.Bundle; import android.os.Handler; +import android.os.PersistableBundle; import android.view.Surface; import androidx.annotation.Nullable; import androidx.annotation.RequiresApi; @@ -338,4 +339,12 @@ public interface MediaCodecAdapter { */ @RequiresApi(18) void signalEndOfInputStream(); + + /** + * Returns metrics data about the current codec instance. + * + * @see MediaCodec#getMetrics() + */ + @RequiresApi(26) + PersistableBundle getMetrics(); } diff --git a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/SynchronousMediaCodecAdapter.java b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/SynchronousMediaCodecAdapter.java index 60ffb6eb64..5f97cf81e2 100644 --- a/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/SynchronousMediaCodecAdapter.java +++ b/libraries/exoplayer/src/main/java/androidx/media3/exoplayer/mediacodec/SynchronousMediaCodecAdapter.java @@ -23,6 +23,7 @@ import android.media.MediaCodec; import android.media.MediaFormat; import android.os.Bundle; import android.os.Handler; +import android.os.PersistableBundle; import android.view.Surface; import androidx.annotation.DoNotInline; import androidx.annotation.Nullable; @@ -233,8 +234,16 @@ public final class SynchronousMediaCodecAdapter implements MediaCodecAdapter { codec.setVideoScalingMode(scalingMode); } + @Override + @RequiresApi(26) + public PersistableBundle getMetrics() { + return codec.getMetrics(); + } + @RequiresApi(18) private static final class Api18 { + private Api18() {} + @DoNotInline public static Surface createCodecInputSurface(MediaCodec codec) { return codec.createInputSurface(); diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/CapturingRenderersFactory.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/CapturingRenderersFactory.java index 7cb20eca75..8355b7f4a7 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/CapturingRenderersFactory.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/CapturingRenderersFactory.java @@ -23,6 +23,7 @@ import android.media.MediaCodec; import android.media.MediaFormat; import android.os.Bundle; import android.os.Handler; +import android.os.PersistableBundle; import android.util.SparseArray; import android.view.Surface; import androidx.annotation.Nullable; @@ -277,6 +278,12 @@ public class CapturingRenderersFactory implements RenderersFactory, Dumper.Dumpa delegate.signalEndOfInputStream(); } + @RequiresApi(26) + @Override + public PersistableBundle getMetrics() { + return delegate.getMetrics(); + } + // Dumpable implementation @Override