diff --git a/libraries/common/src/main/java/androidx/media3/common/util/Util.java b/libraries/common/src/main/java/androidx/media3/common/util/Util.java index 0fe8d485bf..15b43939c4 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/Util.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/Util.java @@ -491,6 +491,15 @@ public final class Util { return TextUtils.isEmpty(scheme) || "file".equals(scheme); } + /** Returns true if the code path is currently running on an emulator. */ + @UnstableApi + public static boolean isRunningOnEmulator() { + String deviceName = Ascii.toLowerCase(Util.DEVICE); + return deviceName.contains("emulator") + || deviceName.contains("emu64a") + || deviceName.contains("generic"); + } + /** * Tests two objects for {@link Object#equals(Object)} equality, handling the case where one or * both may be null. diff --git a/libraries/effect/src/main/java/androidx/media3/effect/ExternalTextureManager.java b/libraries/effect/src/main/java/androidx/media3/effect/ExternalTextureManager.java index a35d20764a..86c6e9ccbe 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/ExternalTextureManager.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/ExternalTextureManager.java @@ -16,6 +16,7 @@ package androidx.media3.effect; import static androidx.media3.common.util.Assertions.checkStateNotNull; +import static androidx.media3.common.util.Util.isRunningOnEmulator; import static java.util.concurrent.TimeUnit.MILLISECONDS; import android.graphics.SurfaceTexture; @@ -30,7 +31,6 @@ import androidx.media3.common.util.GlUtil; import androidx.media3.common.util.Log; import androidx.media3.common.util.Util; import androidx.media3.effect.GlShaderProgram.InputListener; -import com.google.common.base.Ascii; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Future; @@ -55,11 +55,7 @@ import java.util.concurrent.atomic.AtomicInteger; * operation takes a long time to finish, the timeout could be a result of slow GL operation back * pressured the decoder, and the decoder is not able to decode another frame. */ - private static final long SURFACE_TEXTURE_TIMEOUT_MS = - Ascii.toLowerCase(Util.DEVICE).contains("emulator") - || Ascii.toLowerCase(Util.DEVICE).contains("generic") - ? 10_000 - : 500; + private static final long SURFACE_TEXTURE_TIMEOUT_MS = isRunningOnEmulator() ? 10_000 : 500; private final GlObjectsProvider glObjectsProvider; private final ExternalShaderProgram externalShaderProgram; diff --git a/libraries/test_utils/src/main/java/androidx/media3/test/utils/BitmapPixelTestUtil.java b/libraries/test_utils/src/main/java/androidx/media3/test/utils/BitmapPixelTestUtil.java index b7c592f1f1..d35e5a7e32 100644 --- a/libraries/test_utils/src/main/java/androidx/media3/test/utils/BitmapPixelTestUtil.java +++ b/libraries/test_utils/src/main/java/androidx/media3/test/utils/BitmapPixelTestUtil.java @@ -18,6 +18,7 @@ package androidx.media3.test.utils; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Util.SDK_INT; +import static androidx.media3.common.util.Util.isRunningOnEmulator; import static androidx.test.core.app.ApplicationProvider.getApplicationContext; import static com.google.common.truth.Truth.assertThat; import static java.lang.Math.abs; @@ -39,7 +40,6 @@ import androidx.media3.common.util.GlUtil; import androidx.media3.common.util.Log; import androidx.media3.common.util.UnstableApi; import androidx.media3.common.util.Util; -import com.google.common.base.Ascii; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -95,10 +95,7 @@ public class BitmapPixelTestUtil { * if running on physical devices. */ public static final float MAXIMUM_AVERAGE_PIXEL_ABSOLUTE_DIFFERENCE = - Ascii.toLowerCase(Util.DEVICE).contains("emulator") - || Ascii.toLowerCase(Util.DEVICE).contains("generic") - ? 1f - : MAXIMUM_AVERAGE_PIXEL_ABSOLUTE_DIFFERENCE_DIFFERENT_DEVICE; + isRunningOnEmulator() ? 1f : MAXIMUM_AVERAGE_PIXEL_ABSOLUTE_DIFFERENCE_DIFFERENT_DEVICE; /** * Maximum allowed average pixel difference between bitmaps with 16-bit primaries generated using diff --git a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/DefaultVideoCompositorPixelTest.java b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/DefaultVideoCompositorPixelTest.java index 0401756cde..59e6f986ce 100644 --- a/libraries/transformer/src/androidTest/java/androidx/media3/transformer/DefaultVideoCompositorPixelTest.java +++ b/libraries/transformer/src/androidTest/java/androidx/media3/transformer/DefaultVideoCompositorPixelTest.java @@ -16,6 +16,7 @@ package androidx.media3.transformer; import static androidx.media3.common.util.Util.SDK_INT; +import static androidx.media3.common.util.Util.isRunningOnEmulator; import static androidx.media3.test.utils.BitmapPixelTestUtil.MAXIMUM_AVERAGE_PIXEL_ABSOLUTE_DIFFERENCE; import static androidx.media3.test.utils.BitmapPixelTestUtil.maybeSaveTestBitmap; import static androidx.media3.test.utils.BitmapPixelTestUtil.readBitmapUnpremultipliedAlpha; @@ -62,7 +63,6 @@ import androidx.media3.effect.VideoCompositorSettings; import androidx.media3.test.utils.BitmapPixelTestUtil; import androidx.media3.test.utils.TextureBitmapReader; import androidx.media3.test.utils.VideoFrameProcessorTestRunner; -import com.google.common.base.Ascii; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import java.io.IOException; @@ -96,11 +96,7 @@ public final class DefaultVideoCompositorPixelTest { // Golden images were generated on an API 33 emulator. API 26 emulators have a different text // rendering implementation that leads to a larger pixel difference. public static final float MAXIMUM_AVERAGE_PIXEL_ABSOLUTE_DIFFERENCE_WITH_TEXT_OVERLAY = - (Ascii.toLowerCase(Util.DEVICE).contains("emulator") - || Ascii.toLowerCase(Util.DEVICE).contains("generic")) - && SDK_INT <= 26 - ? 2.5f - : MAXIMUM_AVERAGE_PIXEL_ABSOLUTE_DIFFERENCE; + isRunningOnEmulator() && SDK_INT <= 26 ? 2.5f : MAXIMUM_AVERAGE_PIXEL_ABSOLUTE_DIFFERENCE; @Parameterized.Parameter public boolean useSharedExecutor; @Rule public final TestName testName = new TestName(); diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoader.java b/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoader.java index 94293aef64..c2b53daa52 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoader.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/ExoPlayerAssetLoader.java @@ -17,6 +17,7 @@ package androidx.media3.transformer; import static androidx.media3.common.util.Assertions.checkNotNull; +import static androidx.media3.common.util.Util.isRunningOnEmulator; import static androidx.media3.exoplayer.DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_AFTER_REBUFFER_MS; import static androidx.media3.exoplayer.DefaultLoadControl.DEFAULT_BUFFER_FOR_PLAYBACK_MS; import static androidx.media3.exoplayer.DefaultLoadControl.DEFAULT_MAX_BUFFER_MS; @@ -40,7 +41,6 @@ import androidx.media3.common.Timeline; import androidx.media3.common.Tracks; import androidx.media3.common.util.Clock; import androidx.media3.common.util.UnstableApi; -import androidx.media3.common.util.Util; import androidx.media3.exoplayer.DefaultLoadControl; import androidx.media3.exoplayer.ExoPlayer; import androidx.media3.exoplayer.Renderer; @@ -54,7 +54,6 @@ import androidx.media3.exoplayer.trackselection.DefaultTrackSelector; import androidx.media3.exoplayer.video.VideoRendererEventListener; import androidx.media3.extractor.DefaultExtractorsFactory; import androidx.media3.extractor.mp4.Mp4Extractor; -import com.google.common.base.Ascii; import com.google.common.collect.ImmutableMap; /** An {@link AssetLoader} implementation that uses an {@link ExoPlayer} to load samples. */ @@ -375,8 +374,7 @@ public final class ExoPlayerAssetLoader implements AssetLoader { private static long getReleaseTimeoutMs() { // b/297916906 - Emulators need a larger timeout for releasing. - return Ascii.toLowerCase(Util.DEVICE).contains("emulator") - || Ascii.toLowerCase(Util.DEVICE).contains("generic") + return isRunningOnEmulator() ? EMULATOR_RELEASE_TIMEOUT_MS : ExoPlayer.DEFAULT_RELEASE_TIMEOUT_MS; }