diff --git a/libraries/common/src/main/java/androidx/media3/common/FrameProcessor.java b/libraries/common/src/main/java/androidx/media3/common/FrameProcessor.java index 6eb1e991be..fb3bfd9421 100644 --- a/libraries/common/src/main/java/androidx/media3/common/FrameProcessor.java +++ b/libraries/common/src/main/java/androidx/media3/common/FrameProcessor.java @@ -16,6 +16,7 @@ package androidx.media3.common; import android.content.Context; +import android.opengl.EGLExt; import android.view.Surface; import androidx.annotation.Nullable; import androidx.media3.common.util.UnstableApi; @@ -174,10 +175,12 @@ public interface FrameProcessor { * false} using the {@link Factory} and should be called exactly once for each frame that becomes * {@linkplain Listener#onOutputFrameAvailable(long) available}. * - * @param releaseTimeNs The release time to use for the frame, in nanoseconds. Use {@link - * #DROP_OUTPUT_FRAME} to drop the frame, or {@link #RELEASE_OUTPUT_FRAME_IMMEDIATELY} to - * release the frame immediately. If {@code releaseTimeNs} is after {@link System#nanoTime()} - * at the time of the release, the frame is also dropped. + *
The {@code releaseTimeNs} may be passed to {@link EGLExt#eglPresentationTimeANDROID}
+ * depending on the implementation.
+ *
+ * @param releaseTimeNs The release time to use for the frame, in nanoseconds. The release time
+ * can be before of after the current system time. Use {@link #DROP_OUTPUT_FRAME} to drop the
+ * frame, or {@link #RELEASE_OUTPUT_FRAME_IMMEDIATELY} to release the frame immediately.
*/
void releaseOutputFrame(long releaseTimeNs);
diff --git a/libraries/effect/src/androidTest/java/androidx/media3/effect/GlEffectsFrameProcessorFrameReleaseTest.java b/libraries/effect/src/androidTest/java/androidx/media3/effect/GlEffectsFrameProcessorFrameReleaseTest.java
index 23cd032ec8..a778613727 100644
--- a/libraries/effect/src/androidTest/java/androidx/media3/effect/GlEffectsFrameProcessorFrameReleaseTest.java
+++ b/libraries/effect/src/androidTest/java/androidx/media3/effect/GlEffectsFrameProcessorFrameReleaseTest.java
@@ -158,7 +158,7 @@ public final class GlEffectsFrameProcessorFrameReleaseTest {
}
@Test
- public void controlledFrameRelease_withLateFrame_dropsFrame() throws Exception {
+ public void controlledFrameRelease_withLateFrame_releasesFrame() throws Exception {
long originalPresentationTimeUs = 1234;
long releaseTimeBeforeCurrentTimeNs = System.nanoTime() - 345678;
AtomicLong actualPresentationTimeUs = new AtomicLong();
@@ -175,7 +175,9 @@ public final class GlEffectsFrameProcessorFrameReleaseTest {
assertThat(frameProcessingException.get()).isNull();
assertThat(actualPresentationTimeUs.get()).isEqualTo(originalPresentationTimeUs);
- assertThat(outputReleaseTimesNs).isEmpty();
+ assertThat(outputReleaseTimesNs).hasSize(1);
+ // The actual release time is determined by the FrameProcessor when releasing the frame.
+ assertThat(outputReleaseTimesNs.remove()).isAtLeast(releaseTimeBeforeCurrentTimeNs);
}
@Test
diff --git a/libraries/effect/src/main/java/androidx/media3/effect/FinalMatrixTextureProcessorWrapper.java b/libraries/effect/src/main/java/androidx/media3/effect/FinalMatrixTextureProcessorWrapper.java
index 4a4410d23c..49af8e1e67 100644
--- a/libraries/effect/src/main/java/androidx/media3/effect/FinalMatrixTextureProcessorWrapper.java
+++ b/libraries/effect/src/main/java/androidx/media3/effect/FinalMatrixTextureProcessorWrapper.java
@@ -150,10 +150,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
frameProcessorListener.onOutputFrameAvailable(offsetPresentationTimeUs);
if (releaseFramesAutomatically) {
renderFrameToSurfaces(
- inputTexture,
- presentationTimeUs,
- /* releaseTimeNs= */ offsetPresentationTimeUs * 1000,
- /* dropLateFrame= */ false);
+ inputTexture, presentationTimeUs, /* releaseTimeNs= */ offsetPresentationTimeUs * 1000);
} else {
availableFrames.add(Pair.create(inputTexture, presentationTimeUs));
}
@@ -169,21 +166,11 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
@WorkerThread
public void releaseOutputFrame(long releaseTimeNs) {
checkState(!releaseFramesAutomatically);
-
- boolean dropLateFrame = true;
- if (releaseTimeNs == FrameProcessor.RELEASE_OUTPUT_FRAME_IMMEDIATELY) {
- dropLateFrame = false;
- releaseTimeNs = System.nanoTime();
- } else if (releaseTimeNs == FrameProcessor.DROP_OUTPUT_FRAME) {
- releaseTimeNs = C.TIME_UNSET;
- }
-
Pair