From 9add30e5824fda220cae6b6a9b8e53344a9d3512 Mon Sep 17 00:00:00 2001 From: huangdarwin Date: Wed, 29 Nov 2023 04:27:22 -0800 Subject: [PATCH] Effect: Use Bitmap generation ID to detect changes. This is much simpler than using protected methods that signal updates in bitmaps. PiperOrigin-RevId: 586295312 --- .../androidx/media3/effect/BitmapOverlay.java | 17 ++++------------- .../androidx/media3/effect/DrawableOverlay.java | 13 +------------ .../androidx/media3/effect/TextOverlay.java | 14 +------------- 3 files changed, 6 insertions(+), 38 deletions(-) diff --git a/libraries/effect/src/main/java/androidx/media3/effect/BitmapOverlay.java b/libraries/effect/src/main/java/androidx/media3/effect/BitmapOverlay.java index af7ef92799..fb0f4f2674 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/BitmapOverlay.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/BitmapOverlay.java @@ -44,7 +44,7 @@ public abstract class BitmapOverlay extends TextureOverlay { private final float[] flipVerticallyMatrix; private int lastTextureId; - private boolean hasUpdatedBitmapReference; + private int lastBitmapGenerationId; private @Nullable Bitmap lastBitmap; /* package */ BitmapOverlay() { @@ -75,22 +75,13 @@ public abstract class BitmapOverlay extends TextureOverlay { return new Size(checkNotNull(lastBitmap).getWidth(), checkNotNull(lastBitmap).getHeight()); } - /** - * Returns whether the cached bitmap overlay should be updated using the latest {@linkplain - * #getBitmap bitmap}. - */ - protected boolean shouldInvalidateCache() { - // Bitmap#sameAs() is documented as a slow method. Therefore, only use a reference comparison by - // default, instead of the deeper comparison done in sameAs. - return hasUpdatedBitmapReference; - } - @Override public int getTextureId(long presentationTimeUs) throws VideoFrameProcessingException { Bitmap bitmap = getBitmap(presentationTimeUs); - hasUpdatedBitmapReference = bitmap != lastBitmap; - if (shouldInvalidateCache()) { + int generationId = bitmap.getGenerationId(); + if (bitmap != lastBitmap || generationId != lastBitmapGenerationId) { lastBitmap = bitmap; + lastBitmapGenerationId = generationId; try { if (lastTextureId == C.INDEX_UNSET) { lastTextureId = GlUtil.generateTexture(); diff --git a/libraries/effect/src/main/java/androidx/media3/effect/DrawableOverlay.java b/libraries/effect/src/main/java/androidx/media3/effect/DrawableOverlay.java index 3bdfd29097..f5c44fa420 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/DrawableOverlay.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/DrawableOverlay.java @@ -33,7 +33,6 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; */ @UnstableApi public abstract class DrawableOverlay extends BitmapOverlay { - private boolean hasUpdatedDrawable; private @MonotonicNonNull Bitmap lastBitmap; private @MonotonicNonNull Drawable lastDrawable; @@ -47,22 +46,12 @@ public abstract class DrawableOverlay extends BitmapOverlay { */ public abstract Drawable getDrawable(long presentationTimeUs); - /** - * Returns whether the cached drawable overlay should be updated using the latest {@linkplain - * #getDrawable drawable} - */ - @Override - protected final boolean shouldInvalidateCache() { - return hasUpdatedDrawable; - } - @Override public Bitmap getBitmap(long presentationTimeUs) { Drawable overlayDrawable = getDrawable(presentationTimeUs); // TODO(b/227625365): Drawable doesn't implement the equals method, so investigate other methods // of detecting the need to redraw the bitmap. - hasUpdatedDrawable = !overlayDrawable.equals(lastDrawable); - if (shouldInvalidateCache()) { + if (!overlayDrawable.equals(lastDrawable)) { lastDrawable = overlayDrawable; if (lastBitmap == null || lastBitmap.getWidth() != lastDrawable.getIntrinsicWidth() diff --git a/libraries/effect/src/main/java/androidx/media3/effect/TextOverlay.java b/libraries/effect/src/main/java/androidx/media3/effect/TextOverlay.java index 50730ac9ac..d806f0ad20 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/TextOverlay.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/TextOverlay.java @@ -80,8 +80,6 @@ public abstract class TextOverlay extends BitmapOverlay { public static final int TEXT_SIZE_PIXELS = 100; - private boolean hasUpdatedText; - private @MonotonicNonNull Bitmap lastBitmap; private @MonotonicNonNull SpannableString lastText; @@ -92,20 +90,10 @@ public abstract class TextOverlay extends BitmapOverlay { */ public abstract SpannableString getText(long presentationTimeUs); - /** - * Returns whether the cached text overlay should be updated using the latest {@linkplain #getText - * text} - */ - @Override - protected final boolean shouldInvalidateCache() { - return hasUpdatedText; - } - @Override public Bitmap getBitmap(long presentationTimeUs) { SpannableString overlayText = getText(presentationTimeUs); - hasUpdatedText = !overlayText.equals(lastText); - if (shouldInvalidateCache()) { + if (!overlayText.equals(lastText)) { lastText = overlayText; TextPaint textPaint = new TextPaint(); textPaint.setTextSize(TEXT_SIZE_PIXELS);