Commit 16ea3644 by samrobinson Committed by Ian Baker

Merge feedXFromInput and feedXFromSilence in ATSP.

PiperOrigin-RevId: 492195931
parent 02fa8aa7
...@@ -32,6 +32,7 @@ import com.google.android.exoplayer2.util.Util; ...@@ -32,6 +32,7 @@ import com.google.android.exoplayer2.util.Util;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.List; import java.util.List;
import org.checkerframework.checker.nullness.qual.EnsuresNonNullIf;
import org.checkerframework.dataflow.qual.Pure; import org.checkerframework.dataflow.qual.Pure;
/** /**
...@@ -174,16 +175,10 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -174,16 +175,10 @@ import org.checkerframework.dataflow.qual.Pure;
@Override @Override
protected boolean processDataUpToMuxer() throws TransformationException { protected boolean processDataUpToMuxer() throws TransformationException {
if (!audioProcessingPipeline.isOperational()) { if (!audioProcessingPipeline.isOperational()) {
return silentAudioGenerator == null ? feedEncoderFromInput() : feedEncoderFromSilence(); return feedEncoderFromInput();
} }
if (feedEncoderFromProcessingPipeline()) { return feedEncoderFromProcessingPipeline() || feedProcessingPipelineFromInput();
return true;
}
return silentAudioGenerator == null
? feedProcessingPipelineFromInput()
: feedProcessingPipelineFromSilence();
} }
@Override @Override
...@@ -220,17 +215,19 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -220,17 +215,19 @@ import org.checkerframework.dataflow.qual.Pure;
* @return Whether it may be possible to feed more data immediately by calling this method again. * @return Whether it may be possible to feed more data immediately by calling this method again.
*/ */
private boolean feedEncoderFromInput() throws TransformationException { private boolean feedEncoderFromInput() throws TransformationException {
if (!hasPendingInputBuffer || !encoder.maybeDequeueInputBuffer(encoderInputBuffer)) { if ((!isInputSilent() && !hasPendingInputBuffer)
|| !encoder.maybeDequeueInputBuffer(encoderInputBuffer)) {
return false; return false;
} }
if (inputBuffer.isEndOfStream()) { if (isInputSilent() ? silentAudioGenerator.isEnded() : inputBuffer.isEndOfStream()) {
queueEndOfStreamToEncoder(); queueEndOfStreamToEncoder();
hasPendingInputBuffer = false; hasPendingInputBuffer = false;
return false; return false;
} }
ByteBuffer inputData = checkNotNull(inputBuffer.data); ByteBuffer inputData =
isInputSilent() ? silentAudioGenerator.getBuffer() : checkNotNull(inputBuffer.data);
feedEncoder(inputData); feedEncoder(inputData);
if (!inputData.hasRemaining()) { if (!inputData.hasRemaining()) {
hasPendingInputBuffer = false; hasPendingInputBuffer = false;
...@@ -267,18 +264,19 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -267,18 +264,19 @@ import org.checkerframework.dataflow.qual.Pure;
* @return Whether it may be possible to feed more data immediately by calling this method again. * @return Whether it may be possible to feed more data immediately by calling this method again.
*/ */
private boolean feedProcessingPipelineFromInput() { private boolean feedProcessingPipelineFromInput() {
if (!hasPendingInputBuffer) { if (!isInputSilent() && !hasPendingInputBuffer) {
return false; return false;
} }
if (inputBuffer.isEndOfStream()) { if (isInputSilent() ? silentAudioGenerator.isEnded() : inputBuffer.isEndOfStream()) {
audioProcessingPipeline.queueEndOfStream(); audioProcessingPipeline.queueEndOfStream();
hasPendingInputBuffer = false; hasPendingInputBuffer = false;
return false; return false;
} }
checkState(!audioProcessingPipeline.isEnded()); checkState(!audioProcessingPipeline.isEnded());
ByteBuffer inputData = checkNotNull(inputBuffer.data); ByteBuffer inputData =
isInputSilent() ? silentAudioGenerator.getBuffer() : checkNotNull(inputBuffer.data);
audioProcessingPipeline.queueInput(inputData); audioProcessingPipeline.queueInput(inputData);
if (inputData.hasRemaining()) { if (inputData.hasRemaining()) {
return false; return false;
...@@ -288,45 +286,6 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -288,45 +286,6 @@ import org.checkerframework.dataflow.qual.Pure;
} }
/** /**
* Attempts to pass silent audio to the encoder.
*
* @return Whether it may be possible to feed more data immediately by calling this method again.
*/
private boolean feedEncoderFromSilence() throws TransformationException {
checkNotNull(silentAudioGenerator);
if (!encoder.maybeDequeueInputBuffer(encoderInputBuffer)) {
return false;
}
if (silentAudioGenerator.isEnded()) {
queueEndOfStreamToEncoder();
return false;
}
ByteBuffer silence = silentAudioGenerator.getBuffer();
feedEncoder(silence);
return true;
}
/**
* Attempts to feed silent audio to the {@link AudioProcessingPipeline}.
*
* @return Whether it may be possible to feed more data immediately by calling this method again.
*/
private boolean feedProcessingPipelineFromSilence() {
checkNotNull(silentAudioGenerator);
if (silentAudioGenerator.isEnded()) {
audioProcessingPipeline.queueEndOfStream();
return false;
}
checkState(!audioProcessingPipeline.isEnded());
ByteBuffer silence = silentAudioGenerator.getBuffer();
audioProcessingPipeline.queueInput(silence);
return !silence.hasRemaining();
}
/**
* Feeds as much data as possible between the current position and limit of the specified {@link * Feeds as much data as possible between the current position and limit of the specified {@link
* ByteBuffer} to the encoder, and advances its position by the number of bytes fed. * ByteBuffer} to the encoder, and advances its position by the number of bytes fed.
*/ */
...@@ -400,4 +359,9 @@ import org.checkerframework.dataflow.qual.Pure; ...@@ -400,4 +359,9 @@ import org.checkerframework.dataflow.qual.Pure;
} }
nextEncoderInputBufferTimeUs += bufferDurationUs; nextEncoderInputBufferTimeUs += bufferDurationUs;
} }
@EnsuresNonNullIf(expression = "silentAudioGenerator", result = true)
private boolean isInputSilent() {
return silentAudioGenerator != null;
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment