diff --git a/libraries/effect/src/androidTest/java/androidx/media3/effect/FrameDropTest.java b/libraries/effect/src/androidTest/java/androidx/media3/effect/FrameDropTest.java index 8ae0125049..20583691d1 100644 --- a/libraries/effect/src/androidTest/java/androidx/media3/effect/FrameDropTest.java +++ b/libraries/effect/src/androidTest/java/androidx/media3/effect/FrameDropTest.java @@ -59,8 +59,6 @@ public class FrameDropTest { checkNotNull(videoFrameProcessorTestRunner).release(); } - // TODO: b/536973872 - When support for testing multiple frames in the output, test whether the - // correct frames comes out. @RequiresNonNull("actualPresentationTimesUs") @Test public void frameDrop_withDefaultStrategy_outputsFramesAtTheCorrectPresentationTimesUs() @@ -72,9 +70,10 @@ public class FrameDropTest { .setOnOutputFrameAvailableForRenderingListener(actualPresentationTimesUs::add) .build(); + videoFrameProcessorTestRunner.registerInputStream(INPUT_TYPE_BITMAP); ImmutableList timestampsMs = ImmutableList.of(0, 16, 32, 48, 58, 71, 86); for (int timestampMs : timestampsMs) { - videoFrameProcessorTestRunner.registerAndQueueInputBitmap( + videoFrameProcessorTestRunner.queueInputBitmap( readBitmap(ORIGINAL_PNG_ASSET_PATH), /* durationUs= */ C.MICROS_PER_SECOND, /* offsetToAddUs= */ timestampMs * 1000L, diff --git a/libraries/effect/src/main/java/androidx/media3/effect/BaseGlShaderProgram.java b/libraries/effect/src/main/java/androidx/media3/effect/BaseGlShaderProgram.java index 35e2193e4a..4484d5fd01 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/BaseGlShaderProgram.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/BaseGlShaderProgram.java @@ -44,8 +44,8 @@ import java.util.concurrent.Executor; */ @UnstableApi public abstract class BaseGlShaderProgram implements GlShaderProgram { - private final TexturePool outputTexturePool; - protected InputListener inputListener; + protected final TexturePool outputTexturePool; + private InputListener inputListener; private OutputListener outputListener; private ErrorListener errorListener; private Executor errorListenerExecutor; @@ -184,4 +184,17 @@ public abstract class BaseGlShaderProgram implements GlShaderProgram { throw new VideoFrameProcessingException(e); } } + + protected final InputListener getInputListener() { + return inputListener; + } + + protected final OutputListener getOutputListener() { + return outputListener; + } + + protected final void onError(Exception e) { + errorListenerExecutor.execute( + () -> errorListener.onError(VideoFrameProcessingException.from(e))); + } } diff --git a/libraries/effect/src/main/java/androidx/media3/effect/DefaultFrameDroppingShaderProgram.java b/libraries/effect/src/main/java/androidx/media3/effect/DefaultFrameDroppingShaderProgram.java index 5686cef8f5..7882ad2ef7 100644 --- a/libraries/effect/src/main/java/androidx/media3/effect/DefaultFrameDroppingShaderProgram.java +++ b/libraries/effect/src/main/java/androidx/media3/effect/DefaultFrameDroppingShaderProgram.java @@ -22,14 +22,17 @@ import static java.lang.Math.abs; import android.content.Context; import androidx.annotation.Nullable; import androidx.media3.common.C; +import androidx.media3.common.GlObjectsProvider; import androidx.media3.common.GlTextureInfo; import androidx.media3.common.VideoFrameProcessingException; +import androidx.media3.common.util.GlUtil; +import androidx.media3.common.util.Size; /** - * Drops frames by only queuing input frames that are chosen by the frame dropping strategy. + * Drops frames by only making selected frames available to the {@link OutputListener}. * - *

The strategy used is to queue the current frame, x, with timestamp T_x if and only if one of - * the following is true: + *

The current frame, x, with timestamp T_x is {@linkplain OutputListener#onOutputFrameAvailable + * made available to the output listener} if and only if one of the following is true: * *