diff --git a/app/src/main/java/com/facebook/encapp/AsyncBufferEncoder.java b/app/src/main/java/com/facebook/encapp/AsyncBufferEncoder.java index cd7bc182..98707e0c 100644 --- a/app/src/main/java/com/facebook/encapp/AsyncBufferEncoder.java +++ b/app/src/main/java/com/facebook/encapp/AsyncBufferEncoder.java @@ -348,18 +348,26 @@ private void sendEndOfStream() { return; // Already sent EOS } - // Get a buffer for EOS - Integer bufferIndex = mAvailableInputBuffers.poll(); - if (bufferIndex == null) { - // Wait for a buffer - while (!mStopRequested && bufferIndex == null) { - bufferIndex = mAvailableInputBuffers.poll(); - if (bufferIndex == null) { - try { - Thread.sleep(1); - } catch (InterruptedException e) { - return; + // Wait for a buffer to send EOS - with timeout + Integer bufferIndex = null; + long startTime = System.currentTimeMillis(); + final long EOS_TIMEOUT_MS = 5000; + + while (!mStopRequested && bufferIndex == null) { + bufferIndex = mAvailableInputBuffers.poll(); + if (bufferIndex == null) { + if (System.currentTimeMillis() - startTime > EOS_TIMEOUT_MS) { + Log.e(TAG, "Timeout waiting for input buffer to send EOS - forcing completion"); + mOutputDone.set(true); + synchronized (mCompletionLock) { + mCompletionLock.notifyAll(); } + return; + } + try { + Thread.sleep(1); + } catch (InterruptedException e) { + return; } } } @@ -371,6 +379,10 @@ private void sendEndOfStream() { Log.d(TAG, "Queued EOS at frame " + mInFramesCount); } catch (IllegalStateException e) { Log.e(TAG, "Error queueing EOS: " + e.getMessage()); + mOutputDone.set(true); + synchronized (mCompletionLock) { + mCompletionLock.notifyAll(); + } } } } @@ -460,10 +472,9 @@ private class AsyncEncoderCallbackHandler extends MediaCodec.Callback { @Override public void onInputBufferAvailable(@NonNull MediaCodec codec, int index) { - // Add buffer to available queue - InputFeeder will use it - if (!mInputDone.get()) { - mAvailableInputBuffers.add(index); - } + // Always add buffers to the queue - InputFeeder needs them for EOS signaling + // even after we stop adding frames + mAvailableInputBuffers.add(index); } @Override diff --git a/app/src/main/java/com/facebook/encapp/BufferEncoder.java b/app/src/main/java/com/facebook/encapp/BufferEncoder.java index 35135529..8805cac0 100644 --- a/app/src/main/java/com/facebook/encapp/BufferEncoder.java +++ b/app/src/main/java/com/facebook/encapp/BufferEncoder.java @@ -331,6 +331,8 @@ public String start() { int size = -1; // get the ByteBuffer where we will write the image to encode ByteBuffer byteBuffer = mCodec.getInputBuffer(index); + Log.d(TAG, "Set runtime"); + setRuntimeParameters(mInFramesCount); while (size < 0 && !input_done) { try { size = queueInputBufferEncoder(