diff --git a/library/common/src/main/java/com/google/android/exoplayer2/util/VideoFrameProcessor.java b/library/common/src/main/java/com/google/android/exoplayer2/util/VideoFrameProcessor.java index 217ce16f7f6..bccf9adb943 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/util/VideoFrameProcessor.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/util/VideoFrameProcessor.java @@ -204,7 +204,7 @@ interface Listener { *

Call {@link #setInputFrameInfo} before this method if the {@link FrameInfo} of the new input * stream differs from that of the current input stream. */ - // TODO(b/286032822) Merge this and setInputFrameInfo. + // TODO(b/274109008) Merge this and setInputFrameInfo. void registerInputStream(@InputType int inputType); /** @@ -218,7 +218,6 @@ interface Listener { * *

Can be called on any thread. */ - // TODO(b/286032822) Simplify frame and stream registration. void setInputFrameInfo(FrameInfo inputFrameInfo); /** diff --git a/library/effect/src/main/java/com/google/android/exoplayer2/effect/ExternalTextureManager.java b/library/effect/src/main/java/com/google/android/exoplayer2/effect/ExternalTextureManager.java index df04b5ff5e4..52b3866a568 100644 --- a/library/effect/src/main/java/com/google/android/exoplayer2/effect/ExternalTextureManager.java +++ b/library/effect/src/main/java/com/google/android/exoplayer2/effect/ExternalTextureManager.java @@ -17,7 +17,6 @@ import static com.google.android.exoplayer2.util.Assertions.checkState; import static com.google.android.exoplayer2.util.Assertions.checkStateNotNull; -import static java.util.concurrent.TimeUnit.MILLISECONDS; import android.graphics.SurfaceTexture; import android.view.Surface; @@ -27,13 +26,9 @@ import com.google.android.exoplayer2.util.FrameInfo; import com.google.android.exoplayer2.util.GlTextureInfo; import com.google.android.exoplayer2.util.GlUtil; -import com.google.android.exoplayer2.util.Log; -import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.VideoFrameProcessingException; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.Future; -import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.atomic.AtomicInteger; /** @@ -42,15 +37,6 @@ */ /* package */ final class ExternalTextureManager implements TextureManager { - private static final String TAG = "ExtTexMgr"; - private static final String TIMER_THREAD_NAME = "ExtTexMgr:Timer"; - /** - * The time out in milliseconds after calling signalEndOfCurrentInputStream after which the input - * stream is considered to have ended, even if not all expected frames have been received from the - * decoder. This has been observed on some decoders. - */ - private static final long SURFACE_TEXTURE_TIMEOUT_MS = 500; - private final VideoFrameProcessingTaskExecutor videoFrameProcessingTaskExecutor; private final ExternalShaderProgram externalShaderProgram; private final int externalTexId; @@ -58,7 +44,6 @@ private final SurfaceTexture surfaceTexture; private final float[] textureTransformMatrix; private final Queue pendingFrames; - private final ScheduledExecutorService forceEndOfStreamExecutorService; // Incremented on any thread, decremented on the GL thread only. private final AtomicInteger externalShaderProgramInputCapacity; @@ -81,10 +66,6 @@ // TODO(b/238302341) Remove the use of after flush task, block the calling thread instead. @Nullable private volatile VideoFrameProcessingTask onFlushCompleteTask; - @Nullable private Future forceSignalEndOfStreamFuture; - - // Whether to reject frames from the SurfaceTexture. Accessed only on GL thread. - private boolean shouldRejectIncomingFrames; /** * Creates a new instance. @@ -110,7 +91,6 @@ public ExternalTextureManager( surfaceTexture = new SurfaceTexture(externalTexId); textureTransformMatrix = new float[16]; pendingFrames = new ConcurrentLinkedQueue<>(); - forceEndOfStreamExecutorService = Util.newSingleThreadScheduledExecutor(TIMER_THREAD_NAME); externalShaderProgramInputCapacity = new AtomicInteger(); surfaceTexture.setOnFrameAvailableListener( unused -> @@ -121,16 +101,7 @@ public ExternalTextureManager( numberOfFramesToDropOnBecomingAvailable--; surfaceTexture.updateTexImage(); maybeExecuteAfterFlushTask(); - } else if (shouldRejectIncomingFrames) { - surfaceTexture.updateTexImage(); - Log.w( - TAG, - "Dropping frame received on SurfaceTexture after forcing EOS: " - + surfaceTexture.getTimestamp() / 1000); } else { - if (currentInputStreamEnded) { - restartForceSignalEndOfStreamTimer(); - } availableFrameCount++; maybeQueueFrameToExternalShaderProgram(); } @@ -167,7 +138,6 @@ public void onInputFrameProcessed(GlTextureInfo inputTexture) { currentInputStreamEnded = false; externalShaderProgram.signalEndOfCurrentInputStream(); DebugTraceUtil.recordExternalInputManagerSignalEndOfCurrentInputStream(); - cancelForceSignalEndOfStreamTimer(); } else { maybeQueueFrameToExternalShaderProgram(); } @@ -195,7 +165,6 @@ public void onFlush() { public void registerInputFrame(FrameInfo frame) { checkState(!inputStreamEnded); pendingFrames.add(frame); - videoFrameProcessingTaskExecutor.submit(() -> shouldRejectIncomingFrames = false); } /** @@ -216,10 +185,8 @@ public void signalEndOfCurrentInputStream() { if (pendingFrames.isEmpty() && currentFrame == null) { externalShaderProgram.signalEndOfCurrentInputStream(); DebugTraceUtil.recordExternalInputManagerSignalEndOfCurrentInputStream(); - cancelForceSignalEndOfStreamTimer(); } else { currentInputStreamEnded = true; - restartForceSignalEndOfStreamTimer(); } }); } @@ -234,7 +201,6 @@ public void signalEndOfInput() { public void release() { surfaceTexture.release(); surface.release(); - forceEndOfStreamExecutorService.shutdownNow(); } private void maybeExecuteAfterFlushTask() { @@ -246,36 +212,6 @@ private void maybeExecuteAfterFlushTask() { // Methods that must be called on the GL thread. - private void restartForceSignalEndOfStreamTimer() { - cancelForceSignalEndOfStreamTimer(); - forceSignalEndOfStreamFuture = - forceEndOfStreamExecutorService.schedule( - () -> videoFrameProcessingTaskExecutor.submit(this::forceSignalEndOfStream), - SURFACE_TEXTURE_TIMEOUT_MS, - MILLISECONDS); - } - - private void cancelForceSignalEndOfStreamTimer() { - if (forceSignalEndOfStreamFuture != null) { - forceSignalEndOfStreamFuture.cancel(/* mayInterruptIfRunning= */ false); - } - forceSignalEndOfStreamFuture = null; - } - - private void forceSignalEndOfStream() { - // Reset because there could be further input streams after the current one ends. - Log.w( - TAG, - Util.formatInvariant( - "Forcing EOS after missing %d frames for %d ms", - pendingFrames.size(), SURFACE_TEXTURE_TIMEOUT_MS)); - currentInputStreamEnded = false; - pendingFrames.clear(); - currentFrame = null; - shouldRejectIncomingFrames = true; - signalEndOfCurrentInputStream(); - } - private void flush() { // A frame that is registered before flush may arrive after flush. numberOfFramesToDropOnBecomingAvailable = pendingFrames.size() - availableFrameCount;