From b5206b8e050a2570a9b69f9c3108286b85ef0a2e 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 --- RELEASENOTES.md | 3 +++ .../mediacodec/AsynchronousMediaCodecAdapter.java | 8 ++++++++ .../android/exoplayer2/mediacodec/MediaCodecAdapter.java | 9 +++++++++ .../mediacodec/SynchronousMediaCodecAdapter.java | 9 +++++++++ .../exoplayer2/testutil/CapturingRenderersFactory.java | 7 +++++++ 5 files changed, 36 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index e78187d458..5f03454544 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -18,6 +18,9 @@ around an issue that occurs on some devices when switching a surface from a secure codec to another codec (#8696)[https://github.com/google/ExoPlayer/issues/8696]. + * Add `MediaCodecAdapter.getMetrics()` to allow users obtain metrics data + from `MediaCodec`. + ([#9766](https://github.com/google/ExoPlayer/issues/9766)). * Android 12 compatibility: * Upgrade the Cast extension to depend on `com.google.android.gms:play-services-cast-framework:20.1.0`. Earlier diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java index c56bf54f8c..c49bdb4035 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/AsynchronousMediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/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/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java index ffd7758680..3636cf26ed 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/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; @@ -336,4 +337,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/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java index 00000fea99..cfe3c4e875 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/SynchronousMediaCodecAdapter.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/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; @@ -231,8 +232,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/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java b/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java index 5540eab1da..1823dac443 100644 --- a/testutils/src/main/java/com/google/android/exoplayer2/testutil/CapturingRenderersFactory.java +++ b/testutils/src/main/java/com/google/android/exoplayer2/testutil/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; @@ -275,6 +276,12 @@ public class CapturingRenderersFactory implements RenderersFactory, Dumper.Dumpa delegate.signalEndOfInputStream(); } + @RequiresApi(26) + @Override + public PersistableBundle getMetrics() { + return delegate.getMetrics(); + } + // Dumpable implementation @Override