mirror of
https://github.com/androidx/media.git
synced 2025-05-15 19:49:50 +08:00
Work around non-empty EoS buffers with timestamp 0
Issue: #5045 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=220237752
This commit is contained in:
parent
a8d1f04f92
commit
032883e1d2
@ -7,6 +7,9 @@
|
||||
here ([#2826](https://github.com/google/ExoPlayer/issues/2826)).
|
||||
* Add options for controlling audio track selections to `DefaultTrackSelector`
|
||||
([#3314](https://github.com/google/ExoPlayer/issues/3314)).
|
||||
* Work around an issue where a non-empty end-of-stream audio buffer would be
|
||||
output with timestamp zero, causing the player position to jump backwards
|
||||
([#5045](https://github.com/google/ExoPlayer/issues/5045)).
|
||||
* Do not retry failed loads whose error is `FileNotFoundException`.
|
||||
|
||||
### 2.9.1 ###
|
||||
|
@ -23,6 +23,7 @@ import android.media.MediaCrypto;
|
||||
import android.media.MediaFormat;
|
||||
import android.media.audiofx.Virtualizer;
|
||||
import android.os.Handler;
|
||||
import android.support.annotation.CallSuper;
|
||||
import android.support.annotation.Nullable;
|
||||
import com.google.android.exoplayer2.C;
|
||||
import com.google.android.exoplayer2.ExoPlaybackException;
|
||||
@ -85,6 +86,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
private int codecMaxInputSize;
|
||||
private boolean passthroughEnabled;
|
||||
private boolean codecNeedsDiscardChannelsWorkaround;
|
||||
private boolean codecNeedsEosBufferTimestampWorkaround;
|
||||
private android.media.MediaFormat passthroughMediaFormat;
|
||||
private @C.Encoding int pcmEncoding;
|
||||
private int channelCount;
|
||||
@ -344,6 +346,7 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
float codecOperatingRate) {
|
||||
codecMaxInputSize = getCodecMaxInputSize(codecInfo, format, getStreamFormats());
|
||||
codecNeedsDiscardChannelsWorkaround = codecNeedsDiscardChannelsWorkaround(codecInfo.name);
|
||||
codecNeedsEosBufferTimestampWorkaround = codecNeedsEosBufferTimestampWorkaround(codecInfo.name);
|
||||
passthroughEnabled = codecInfo.passthrough;
|
||||
String codecMimeType = passthroughEnabled ? MimeTypes.AUDIO_RAW : codecInfo.mimeType;
|
||||
MediaFormat mediaFormat =
|
||||
@ -599,9 +602,9 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
lastInputTimeUs = Math.max(buffer.timeUs, lastInputTimeUs);
|
||||
}
|
||||
|
||||
@CallSuper
|
||||
@Override
|
||||
protected void onProcessedOutputBuffer(long presentationTimeUs) {
|
||||
super.onProcessedOutputBuffer(presentationTimeUs);
|
||||
while (pendingStreamChangeCount != 0 && presentationTimeUs >= pendingStreamChangeTimesUs[0]) {
|
||||
audioSink.handleDiscontinuity();
|
||||
pendingStreamChangeCount--;
|
||||
@ -626,6 +629,13 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
boolean shouldSkip,
|
||||
Format format)
|
||||
throws ExoPlaybackException {
|
||||
if (codecNeedsEosBufferTimestampWorkaround
|
||||
&& bufferPresentationTimeUs == 0
|
||||
&& (bufferFlags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0
|
||||
&& lastInputTimeUs != C.TIME_UNSET) {
|
||||
bufferPresentationTimeUs = lastInputTimeUs;
|
||||
}
|
||||
|
||||
if (passthroughEnabled && (bufferFlags & MediaCodec.BUFFER_FLAG_CODEC_CONFIG) != 0) {
|
||||
// Discard output buffers from the passthrough (raw) decoder containing codec specific data.
|
||||
codec.releaseOutputBuffer(bufferIndex, false);
|
||||
@ -802,6 +812,24 @@ public class MediaCodecAudioRenderer extends MediaCodecRenderer implements Media
|
||||
|| Util.DEVICE.startsWith("heroqlte"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the decoder may output a non-empty buffer with timestamp 0 as the end of stream
|
||||
* buffer.
|
||||
*
|
||||
* <p>See <a href="https://github.com/google/ExoPlayer/issues/5045">GitHub issue #5045</a>.
|
||||
*/
|
||||
private static boolean codecNeedsEosBufferTimestampWorkaround(String codecName) {
|
||||
return Util.SDK_INT < 21
|
||||
&& "OMX.SEC.mp3.dec".equals(codecName)
|
||||
&& "samsung".equals(Util.MANUFACTURER)
|
||||
&& (Util.DEVICE.startsWith("baffin")
|
||||
|| Util.DEVICE.startsWith("grand")
|
||||
|| Util.DEVICE.startsWith("fortuna")
|
||||
|| Util.DEVICE.startsWith("gprimelte")
|
||||
|| Util.DEVICE.startsWith("j2y18lte")
|
||||
|| Util.DEVICE.startsWith("ms01"));
|
||||
}
|
||||
|
||||
private final class AudioSinkListener implements AudioSink.Listener {
|
||||
|
||||
@Override
|
||||
|
Loading…
x
Reference in New Issue
Block a user