Skip to content

Commit

Permalink
Add PassthroughSamplePipeline for audio.
Browse files Browse the repository at this point in the history
When no transformation is needed, the passthrough pipeline allows us to skip decoding and re-encoding.

PiperOrigin-RevId: 407789767
  • Loading branch information
hmsch authored and tonihei committed Nov 5, 2021
1 parent 85e222a commit 8552345
Show file tree
Hide file tree
Showing 6 changed files with 498 additions and 402 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,7 @@ private ExoPlaybackException createRendererException(Throwable cause, int errorC
errorCode);
}

// TODO(internal b/204978301): Ensure encoder and decoder timestamps match when no speed change.
private static long getBufferDurationUs(long bytesWritten, int bytesPerFrame, int sampleRate) {
long framesWritten = bytesWritten / bytesPerFrame;
return framesWritten * C.MICROS_PER_SECOND / sampleRate;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
/*
* Copyright 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

package com.google.android.exoplayer2.transformer;

import androidx.annotation.Nullable;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.decoder.DecoderInputBuffer;

/** Pipeline that passes through the samples without any re-encoding or transformation. */
/* package */ final class PassthroughSamplePipeline implements SamplePipeline {

private final DecoderInputBuffer buffer;
private final Format format;

private boolean hasPendingBuffer;

public PassthroughSamplePipeline(Format format) {
this.format = format;
buffer = new DecoderInputBuffer(DecoderInputBuffer.BUFFER_REPLACEMENT_MODE_DIRECT);
hasPendingBuffer = false;
}

@Override
@Nullable
public DecoderInputBuffer dequeueInputBuffer() {
return hasPendingBuffer ? null : buffer;
}

@Override
public void queueInputBuffer() {
hasPendingBuffer = true;
}

@Override
public boolean processData() {
return false;
}

@Override
public Format getOutputFormat() {
return format;
}

@Override
@Nullable
public DecoderInputBuffer getOutputBuffer() {
return hasPendingBuffer ? buffer : null;
}

@Override
public void releaseOutputBuffer() {
buffer.clear();
hasPendingBuffer = false;
}

@Override
public boolean isEnded() {
return buffer.isEndOfStream();
}

@Override
public void release() {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,14 @@ private boolean ensureRendererConfigured() throws ExoPlaybackException {
if (result != C.RESULT_FORMAT_READ) {
return false;
}
samplePipeline =
new AudioSamplePipeline(checkNotNull(formatHolder.format), transformation, getIndex());
Format decoderInputFormat = checkNotNull(formatHolder.format);
if ((transformation.audioMimeType != null
&& !transformation.audioMimeType.equals(decoderInputFormat.sampleMimeType))
|| transformation.flattenForSlowMotion) {
samplePipeline = new AudioSamplePipeline(decoderInputFormat, transformation, getIndex());
} else {
samplePipeline = new PassthroughSamplePipeline(decoderInputFormat);
}
return true;
}

Expand Down
Loading

0 comments on commit 8552345

Please sign in to comment.