From 1bea48f2495f0853b2ac8096a8ca3cbd55d0c670 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 2 Aug 2016 03:27:16 -0700 Subject: [PATCH] Suppress noop format changes For self-initializing segments, DefaultTrackOutput receives a null format and then the actual format. This broke the deduplication logic in InfoQueue.format, since there were two transitions: FormatX->Null and Null->FormatX. This CL allows deduplication to succeed in this case. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=129081583 --- .../extractor/DefaultTrackOutput.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer2/extractor/DefaultTrackOutput.java b/library/src/main/java/com/google/android/exoplayer2/extractor/DefaultTrackOutput.java index 461da41373..2b039916f0 100644 --- a/library/src/main/java/com/google/android/exoplayer2/extractor/DefaultTrackOutput.java +++ b/library/src/main/java/com/google/android/exoplayer2/extractor/DefaultTrackOutput.java @@ -449,8 +449,8 @@ public final class DefaultTrackOutput implements TrackOutput { @Override public void format(Format format) { Format adjustedFormat = getAdjustedSampleFormat(format, sampleOffsetUs); - infoQueue.format(adjustedFormat); - if (upstreamFormatChangeListener != null) { + boolean formatChanged = infoQueue.format(adjustedFormat); + if (upstreamFormatChangeListener != null && formatChanged) { upstreamFormatChangeListener.onUpstreamFormatChanged(adjustedFormat); } } @@ -608,6 +608,7 @@ public final class DefaultTrackOutput implements TrackOutput { private long largestDequeuedTimestampUs; private long largestQueuedTimestampUs; + private boolean upstreamFormatRequired; private Format upstreamFormat; private int upstreamSourceId; @@ -622,6 +623,7 @@ public final class DefaultTrackOutput implements TrackOutput { formats = new Format[capacity]; largestDequeuedTimestampUs = Long.MIN_VALUE; largestQueuedTimestampUs = Long.MIN_VALUE; + upstreamFormatRequired = true; } public void clearSampleData() { @@ -711,7 +713,7 @@ public final class DefaultTrackOutput implements TrackOutput { * Returns the upstream {@link Format} in which samples are being queued. */ public synchronized Format getUpstreamFormat() { - return upstreamFormat; + return upstreamFormatRequired ? null : upstreamFormat; } /** @@ -826,15 +828,24 @@ public final class DefaultTrackOutput implements TrackOutput { // Called by the loading thread. - public synchronized void format(Format format) { - // We suppress changes between equal formats so we can use referential equality in readData. - if (!Util.areEqual(format, upstreamFormat)) { + public synchronized boolean format(Format format) { + if (format == null) { + upstreamFormatRequired = true; + return false; + } + upstreamFormatRequired = false; + if (Util.areEqual(format, upstreamFormat)) { + // Suppress changes between equal formats so we can use referential equality in readData. + return false; + } else { upstreamFormat = format; + return true; } } public synchronized void commitSample(long timeUs, int sampleFlags, long offset, int size, byte[] encryptionKey) { + Assertions.checkState(!upstreamFormatRequired); commitSampleTimestamp(timeUs); timesUs[relativeWriteIndex] = timeUs; offsets[relativeWriteIndex] = offset;