mirror of
https://github.com/androidx/media.git
synced 2025-05-15 19:49:50 +08:00
Change SilenceSkippingAudioProcessor to not rely on the frame MSB.
PiperOrigin-RevId: 309925306
This commit is contained in:
parent
918963c2b4
commit
d944f32f24
@ -17,11 +17,13 @@ package com.google.android.exoplayer2.audio;
|
|||||||
|
|
||||||
import androidx.annotation.IntDef;
|
import androidx.annotation.IntDef;
|
||||||
import com.google.android.exoplayer2.C;
|
import com.google.android.exoplayer2.C;
|
||||||
|
import com.google.android.exoplayer2.util.Assertions;
|
||||||
import com.google.android.exoplayer2.util.Util;
|
import com.google.android.exoplayer2.util.Util;
|
||||||
import java.lang.annotation.Documented;
|
import java.lang.annotation.Documented;
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An {@link AudioProcessor} that skips silence in the input stream. Input and output are 16-bit
|
* An {@link AudioProcessor} that skips silence in the input stream. Input and output are 16-bit
|
||||||
@ -39,19 +41,9 @@ public final class SilenceSkippingAudioProcessor extends BaseAudioProcessor {
|
|||||||
* not exceed {@link #MINIMUM_SILENCE_DURATION_US}.
|
* not exceed {@link #MINIMUM_SILENCE_DURATION_US}.
|
||||||
*/
|
*/
|
||||||
private static final long PADDING_SILENCE_US = 20_000;
|
private static final long PADDING_SILENCE_US = 20_000;
|
||||||
/**
|
/** The absolute level below which an individual PCM sample is classified as silent. */
|
||||||
* The absolute level below which an individual PCM sample is classified as silent. Note: the
|
|
||||||
* specified value will be rounded so that the threshold check only depends on the more
|
|
||||||
* significant byte, for efficiency.
|
|
||||||
*/
|
|
||||||
private static final short SILENCE_THRESHOLD_LEVEL = 1024;
|
private static final short SILENCE_THRESHOLD_LEVEL = 1024;
|
||||||
|
|
||||||
/**
|
|
||||||
* Threshold for classifying an individual PCM sample as silent based on its more significant
|
|
||||||
* byte. This is {@link #SILENCE_THRESHOLD_LEVEL} divided by 256 with rounding.
|
|
||||||
*/
|
|
||||||
private static final byte SILENCE_THRESHOLD_LEVEL_MSB = (SILENCE_THRESHOLD_LEVEL + 128) >> 8;
|
|
||||||
|
|
||||||
/** Trimming states. */
|
/** Trimming states. */
|
||||||
@Documented
|
@Documented
|
||||||
@Retention(RetentionPolicy.SOURCE)
|
@Retention(RetentionPolicy.SOURCE)
|
||||||
@ -325,9 +317,10 @@ public final class SilenceSkippingAudioProcessor extends BaseAudioProcessor {
|
|||||||
* classified as a noisy frame, or the limit of the buffer if no such frame exists.
|
* classified as a noisy frame, or the limit of the buffer if no such frame exists.
|
||||||
*/
|
*/
|
||||||
private int findNoisePosition(ByteBuffer buffer) {
|
private int findNoisePosition(ByteBuffer buffer) {
|
||||||
|
Assertions.checkArgument(buffer.order() == ByteOrder.LITTLE_ENDIAN);
|
||||||
// The input is in ByteOrder.nativeOrder(), which is little endian on Android.
|
// The input is in ByteOrder.nativeOrder(), which is little endian on Android.
|
||||||
for (int i = buffer.position() + 1; i < buffer.limit(); i += 2) {
|
for (int i = buffer.position(); i < buffer.limit(); i += 2) {
|
||||||
if (Math.abs(buffer.get(i)) > SILENCE_THRESHOLD_LEVEL_MSB) {
|
if (Math.abs(buffer.getShort(i)) > SILENCE_THRESHOLD_LEVEL) {
|
||||||
// Round to the start of the frame.
|
// Round to the start of the frame.
|
||||||
return bytesPerFrame * (i / bytesPerFrame);
|
return bytesPerFrame * (i / bytesPerFrame);
|
||||||
}
|
}
|
||||||
@ -340,9 +333,10 @@ public final class SilenceSkippingAudioProcessor extends BaseAudioProcessor {
|
|||||||
* from the byte position to the limit are classified as silent.
|
* from the byte position to the limit are classified as silent.
|
||||||
*/
|
*/
|
||||||
private int findNoiseLimit(ByteBuffer buffer) {
|
private int findNoiseLimit(ByteBuffer buffer) {
|
||||||
|
Assertions.checkArgument(buffer.order() == ByteOrder.LITTLE_ENDIAN);
|
||||||
// The input is in ByteOrder.nativeOrder(), which is little endian on Android.
|
// The input is in ByteOrder.nativeOrder(), which is little endian on Android.
|
||||||
for (int i = buffer.limit() - 1; i >= buffer.position(); i -= 2) {
|
for (int i = buffer.limit() - 2; i >= buffer.position(); i -= 2) {
|
||||||
if (Math.abs(buffer.get(i)) > SILENCE_THRESHOLD_LEVEL_MSB) {
|
if (Math.abs(buffer.getShort(i)) > SILENCE_THRESHOLD_LEVEL) {
|
||||||
// Return the start of the next frame.
|
// Return the start of the next frame.
|
||||||
return bytesPerFrame * (i / bytesPerFrame) + bytesPerFrame;
|
return bytesPerFrame * (i / bytesPerFrame) + bytesPerFrame;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user