From d8df5411b85de393c61ac65b3ba35a71eb1245a0 Mon Sep 17 00:00:00 2001 From: bachinger Date: Thu, 1 Oct 2020 14:34:50 +0100 Subject: [PATCH 01/30] Fix flaky test PiperOrigin-RevId: 334801561 --- .../test/java/com/google/android/exoplayer2/ExoPlayerTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java index 45ba914d34..e7e35902ec 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/ExoPlayerTest.java @@ -6943,6 +6943,7 @@ public final class ExoPlayerTest { ActionSchedule actionSchedule = new ActionSchedule.Builder(TAG) .waitForPlaybackState(Player.STATE_READY) + .waitForPendingPlayerCommands() .executeRunnable( new PlayerRunnable() { @Override From fe754f313e8ddba5a77f149ee23f0082c1c2fea6 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Tue, 1 Dec 2020 11:02:30 +0000 Subject: [PATCH 02/30] Mask ad media periods before the URI is available Previously `MediaPeriodQueue` would return null if an ad media URI hadn't loaded yet, but this meant that the player could be stuck in `STATE_READY` if an `AdsLoader` unexpectedly didn't provide an ad URI. Fix this behavior by masking ad media periods. `MaskingMediaPeriod` no longer requires a `MediaSource` to instantiate it. This also fixes a specific case where playback gets stuck when using the IMA extension with an empty ad where the IMA SDK unexpectedly doesn't notify the ad group fetch error. Issue: #8205 PiperOrigin-RevId: 344984824 --- RELEASENOTES.md | 8 +- .../android/exoplayer2/MediaPeriodQueue.java | 35 +++---- .../google/android/exoplayer2/Timeline.java | 13 --- .../exoplayer2/source/MaskingMediaPeriod.java | 51 +++++----- .../exoplayer2/source/MaskingMediaSource.java | 4 +- .../exoplayer2/source/ads/AdsMediaSource.java | 98 +++++++++++++++---- .../exoplayer2/MediaPeriodQueueTest.java | 23 +++-- 7 files changed, 142 insertions(+), 90 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 4db085b9e1..a41e080c2d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,9 +1,15 @@ # Release notes +### 2.12.3 (???-??-??) ### + +* IMA extension: + * Fix a condition where playback can get stuck before an empty ad + ([#8205](https://github.com/google/ExoPlayer/issues/8205)). + ### 2.12.2 (2020-12-01) ### * Core library: - * Suppress exceptions from registering/unregistering the stream volume + * Suppress exceptions from registering and unregistering the stream volume receiver ([#8087](https://github.com/google/ExoPlayer/issues/8087)), ([#8106](https://github.com/google/ExoPlayer/issues/8106)). * Suppress ProGuard warnings caused by Guava's compile-only dependencies diff --git a/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java b/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java index fa6201bf37..7ba7589a56 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/MediaPeriodQueue.java @@ -672,15 +672,13 @@ import com.google.common.collect.ImmutableList; period.getNextAdIndexToPlay(adGroupIndex, currentPeriodId.adIndexInAdGroup); if (nextAdIndexInAdGroup < adCountInCurrentAdGroup) { // Play the next ad in the ad group if it's available. - return !period.isAdAvailable(adGroupIndex, nextAdIndexInAdGroup) - ? null - : getMediaPeriodInfoForAd( - timeline, - currentPeriodId.periodUid, - adGroupIndex, - nextAdIndexInAdGroup, - mediaPeriodInfo.requestedContentPositionUs, - currentPeriodId.windowSequenceNumber); + return getMediaPeriodInfoForAd( + timeline, + currentPeriodId.periodUid, + adGroupIndex, + nextAdIndexInAdGroup, + mediaPeriodInfo.requestedContentPositionUs, + currentPeriodId.windowSequenceNumber); } else { // Play content from the ad group position. long startPositionUs = mediaPeriodInfo.requestedContentPositionUs; @@ -720,15 +718,13 @@ import com.google.common.collect.ImmutableList; currentPeriodId.windowSequenceNumber); } int adIndexInAdGroup = period.getFirstAdIndexToPlay(nextAdGroupIndex); - return !period.isAdAvailable(nextAdGroupIndex, adIndexInAdGroup) - ? null - : getMediaPeriodInfoForAd( - timeline, - currentPeriodId.periodUid, - nextAdGroupIndex, - adIndexInAdGroup, - /* contentPositionUs= */ mediaPeriodInfo.durationUs, - currentPeriodId.windowSequenceNumber); + return getMediaPeriodInfoForAd( + timeline, + currentPeriodId.periodUid, + nextAdGroupIndex, + adIndexInAdGroup, + /* contentPositionUs= */ mediaPeriodInfo.durationUs, + currentPeriodId.windowSequenceNumber); } } @@ -737,9 +733,6 @@ import com.google.common.collect.ImmutableList; Timeline timeline, MediaPeriodId id, long requestedContentPositionUs, long startPositionUs) { timeline.getPeriodByUid(id.periodUid, period); if (id.isAd()) { - if (!period.isAdAvailable(id.adGroupIndex, id.adIndexInAdGroup)) { - return null; - } return getMediaPeriodInfoForAd( timeline, id.periodUid, diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Timeline.java b/library/core/src/main/java/com/google/android/exoplayer2/Timeline.java index e992eb588d..a7fb1ae20b 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Timeline.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Timeline.java @@ -609,19 +609,6 @@ public abstract class Timeline { return adPlaybackState.adGroups[adGroupIndex].count; } - /** - * Returns whether the URL for the specified ad is known. - * - * @param adGroupIndex The ad group index. - * @param adIndexInAdGroup The ad index in the ad group. - * @return Whether the URL for the specified ad is known. - */ - public boolean isAdAvailable(int adGroupIndex, int adIndexInAdGroup) { - AdPlaybackState.AdGroup adGroup = adPlaybackState.adGroups[adGroupIndex]; - return adGroup.count != C.LENGTH_UNSET - && adGroup.states[adIndexInAdGroup] != AdPlaybackState.AD_STATE_UNAVAILABLE; - } - /** * Returns the duration of the ad at index {@code adIndexInAdGroup} in the ad group at * {@code adGroupIndex}, in microseconds, or {@link C#TIME_UNSET} if not yet known. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MaskingMediaPeriod.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MaskingMediaPeriod.java index 9514241035..a69835532f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MaskingMediaPeriod.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MaskingMediaPeriod.java @@ -15,6 +15,8 @@ */ package com.google.android.exoplayer2.source; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; +import static com.google.android.exoplayer2.util.Assertions.checkState; import static com.google.android.exoplayer2.util.Util.castNonNull; import androidx.annotation.Nullable; @@ -25,12 +27,13 @@ import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.upstream.Allocator; import java.io.IOException; import org.checkerframework.checker.nullness.compatqual.NullableType; +import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /** - * Media period that wraps a media source and defers calling its {@link - * MediaSource#createPeriod(MediaPeriodId, Allocator, long)} method until {@link - * #createPeriod(MediaPeriodId)} has been called. This is useful if you need to return a media - * period immediately but the media source that should create it is not yet prepared. + * Media period that defers calling {@link MediaSource#createPeriod(MediaPeriodId, Allocator, long)} + * on a given source until {@link #createPeriod(MediaPeriodId)} has been called. This is useful if + * you need to return a media period immediately but the media source that should create it is not + * yet available or prepared. */ public final class MaskingMediaPeriod implements MediaPeriod, MediaPeriod.Callback { @@ -46,33 +49,32 @@ public final class MaskingMediaPeriod implements MediaPeriod, MediaPeriod.Callba void onPrepareError(MediaPeriodId mediaPeriodId, IOException exception); } - /** The {@link MediaSource} which will create the actual media period. */ - public final MediaSource mediaSource; /** The {@link MediaPeriodId} used to create the masking media period. */ public final MediaPeriodId id; + private final long preparePositionUs; private final Allocator allocator; - @Nullable private MediaPeriod mediaPeriod; + /** The {@link MediaSource} that will create the underlying media period. */ + private @MonotonicNonNull MediaSource mediaSource; + + private @MonotonicNonNull MediaPeriod mediaPeriod; @Nullable private Callback callback; - private long preparePositionUs; @Nullable private PrepareListener listener; private boolean notifiedPrepareError; private long preparePositionOverrideUs; /** - * Creates a new masking media period. + * Creates a new masking media period. The media source must be set via {@link + * #setMediaSource(MediaSource)} before preparation can start. * - * @param mediaSource The media source to wrap. * @param id The identifier used to create the masking media period. * @param allocator The allocator used to create the media period. * @param preparePositionUs The expected start position, in microseconds. */ - public MaskingMediaPeriod( - MediaSource mediaSource, MediaPeriodId id, Allocator allocator, long preparePositionUs) { + public MaskingMediaPeriod(MediaPeriodId id, Allocator allocator, long preparePositionUs) { this.id = id; this.allocator = allocator; - this.mediaSource = mediaSource; this.preparePositionUs = preparePositionUs; preparePositionOverrideUs = C.TIME_UNSET; } @@ -108,6 +110,12 @@ public final class MaskingMediaPeriod implements MediaPeriod, MediaPeriod.Callba return preparePositionOverrideUs; } + /** Sets the {@link MediaSource} that will create the underlying media period. */ + public void setMediaSource(MediaSource mediaSource) { + checkState(this.mediaSource == null); + this.mediaSource = mediaSource; + } + /** * Calls {@link MediaSource#createPeriod(MediaPeriodId, Allocator, long)} on the wrapped source * then prepares it if {@link #prepare(Callback, long)} has been called. Call {@link @@ -117,18 +125,16 @@ public final class MaskingMediaPeriod implements MediaPeriod, MediaPeriod.Callba */ public void createPeriod(MediaPeriodId id) { long preparePositionUs = getPreparePositionWithOverride(this.preparePositionUs); - mediaPeriod = mediaSource.createPeriod(id, allocator, preparePositionUs); + mediaPeriod = checkNotNull(mediaSource).createPeriod(id, allocator, preparePositionUs); if (callback != null) { - mediaPeriod.prepare(this, preparePositionUs); + mediaPeriod.prepare(/* callback= */ this, preparePositionUs); } } - /** - * Releases the period. - */ + /** Releases the period. */ public void releasePeriod() { if (mediaPeriod != null) { - mediaSource.releasePeriod(mediaPeriod); + checkNotNull(mediaSource).releasePeriod(mediaPeriod); } } @@ -136,7 +142,8 @@ public final class MaskingMediaPeriod implements MediaPeriod, MediaPeriod.Callba public void prepare(Callback callback, long preparePositionUs) { this.callback = callback; if (mediaPeriod != null) { - mediaPeriod.prepare(this, getPreparePositionWithOverride(this.preparePositionUs)); + mediaPeriod.prepare( + /* callback= */ this, getPreparePositionWithOverride(this.preparePositionUs)); } } @@ -145,10 +152,10 @@ public final class MaskingMediaPeriod implements MediaPeriod, MediaPeriod.Callba try { if (mediaPeriod != null) { mediaPeriod.maybeThrowPrepareError(); - } else { + } else if (mediaSource != null) { mediaSource.maybeThrowSourceInfoRefreshError(); } - } catch (final IOException e) { + } catch (IOException e) { if (listener == null) { throw e; } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/MaskingMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/MaskingMediaSource.java index 19f5df2aa5..5d2e1c6fb7 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/MaskingMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/MaskingMediaSource.java @@ -111,8 +111,8 @@ public final class MaskingMediaSource extends CompositeMediaSource { @Override public MaskingMediaPeriod createPeriod( MediaPeriodId id, Allocator allocator, long startPositionUs) { - MaskingMediaPeriod mediaPeriod = - new MaskingMediaPeriod(mediaSource, id, allocator, startPositionUs); + MaskingMediaPeriod mediaPeriod = new MaskingMediaPeriod(id, allocator, startPositionUs); + mediaPeriod.setMediaSource(mediaSource); if (isPrepared) { MediaPeriodId idInSource = id.copyWithPeriodUid(getInternalPeriodUid(id.periodUid)); mediaPeriod.createPeriod(idInSource); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java index 7320f6f6c5..10e9d8e3be 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/ads/AdsMediaSource.java @@ -15,6 +15,8 @@ */ package com.google.android.exoplayer2.source.ads; +import static com.google.android.exoplayer2.util.Assertions.checkNotNull; + import android.net.Uri; import android.os.Handler; import android.os.Looper; @@ -116,7 +118,7 @@ public final class AdsMediaSource extends CompositeMediaSource { */ public RuntimeException getRuntimeExceptionForUnexpected() { Assertions.checkState(type == TYPE_UNEXPECTED); - return (RuntimeException) Assertions.checkNotNull(getCause()); + return (RuntimeException) checkNotNull(getCause()); } } @@ -257,12 +259,10 @@ public final class AdsMediaSource extends CompositeMediaSource { @Override public MediaPeriod createPeriod(MediaPeriodId id, Allocator allocator, long startPositionUs) { - AdPlaybackState adPlaybackState = Assertions.checkNotNull(this.adPlaybackState); + AdPlaybackState adPlaybackState = checkNotNull(this.adPlaybackState); if (adPlaybackState.adGroupCount > 0 && id.isAd()) { int adGroupIndex = id.adGroupIndex; int adIndexInAdGroup = id.adIndexInAdGroup; - Uri adUri = - Assertions.checkNotNull(adPlaybackState.adGroups[adGroupIndex].uris[adIndexInAdGroup]); if (adMediaSourceHolders[adGroupIndex].length <= adIndexInAdGroup) { int adCount = adIndexInAdGroup + 1; adMediaSourceHolders[adGroupIndex] = @@ -272,16 +272,14 @@ public final class AdsMediaSource extends CompositeMediaSource { AdMediaSourceHolder adMediaSourceHolder = adMediaSourceHolders[adGroupIndex][adIndexInAdGroup]; if (adMediaSourceHolder == null) { - MediaSource adMediaSource = - adMediaSourceFactory.createMediaSource(MediaItem.fromUri(adUri)); - adMediaSourceHolder = new AdMediaSourceHolder(adMediaSource); + adMediaSourceHolder = new AdMediaSourceHolder(id); adMediaSourceHolders[adGroupIndex][adIndexInAdGroup] = adMediaSourceHolder; - prepareChildSource(id, adMediaSource); + maybeUpdateAdMediaSources(); } - return adMediaSourceHolder.createMediaPeriod(adUri, id, allocator, startPositionUs); + return adMediaSourceHolder.createMediaPeriod(id, allocator, startPositionUs); } else { - MaskingMediaPeriod mediaPeriod = - new MaskingMediaPeriod(contentMediaSource, id, allocator, startPositionUs); + MaskingMediaPeriod mediaPeriod = new MaskingMediaPeriod(id, allocator, startPositionUs); + mediaPeriod.setMediaSource(contentMediaSource); mediaPeriod.createPeriod(id); return mediaPeriod; } @@ -293,10 +291,10 @@ public final class AdsMediaSource extends CompositeMediaSource { MediaPeriodId id = maskingMediaPeriod.id; if (id.isAd()) { AdMediaSourceHolder adMediaSourceHolder = - Assertions.checkNotNull(adMediaSourceHolders[id.adGroupIndex][id.adIndexInAdGroup]); + checkNotNull(adMediaSourceHolders[id.adGroupIndex][id.adIndexInAdGroup]); adMediaSourceHolder.releaseMediaPeriod(maskingMediaPeriod); if (adMediaSourceHolder.isInactive()) { - releaseChildSource(id); + adMediaSourceHolder.release(); adMediaSourceHolders[id.adGroupIndex][id.adIndexInAdGroup] = null; } } else { @@ -307,7 +305,7 @@ public final class AdsMediaSource extends CompositeMediaSource { @Override protected void releaseSourceInternal() { super.releaseSourceInternal(); - Assertions.checkNotNull(componentListener).release(); + checkNotNull(componentListener).release(); componentListener = null; contentTimeline = null; adPlaybackState = null; @@ -321,7 +319,7 @@ public final class AdsMediaSource extends CompositeMediaSource { if (mediaPeriodId.isAd()) { int adGroupIndex = mediaPeriodId.adGroupIndex; int adIndexInAdGroup = mediaPeriodId.adIndexInAdGroup; - Assertions.checkNotNull(adMediaSourceHolders[adGroupIndex][adIndexInAdGroup]) + checkNotNull(adMediaSourceHolders[adGroupIndex][adIndexInAdGroup]) .handleSourceInfoRefresh(timeline); } else { Assertions.checkArgument(timeline.getPeriodCount() == 1); @@ -346,9 +344,41 @@ public final class AdsMediaSource extends CompositeMediaSource { Arrays.fill(adMediaSourceHolders, new AdMediaSourceHolder[0]); } this.adPlaybackState = adPlaybackState; + maybeUpdateAdMediaSources(); maybeUpdateSourceInfo(); } + /** + * Initializes any {@link AdMediaSourceHolder AdMediaSourceHolders} where the ad media URI is + * newly known. + */ + private void maybeUpdateAdMediaSources() { + @Nullable AdPlaybackState adPlaybackState = this.adPlaybackState; + if (adPlaybackState == null) { + return; + } + for (int adGroupIndex = 0; adGroupIndex < adMediaSourceHolders.length; adGroupIndex++) { + for (int adIndexInAdGroup = 0; + adIndexInAdGroup < this.adMediaSourceHolders[adGroupIndex].length; + adIndexInAdGroup++) { + @Nullable + AdMediaSourceHolder adMediaSourceHolder = + this.adMediaSourceHolders[adGroupIndex][adIndexInAdGroup]; + if (adMediaSourceHolder != null + && !adMediaSourceHolder.hasMediaSource() + && adPlaybackState.adGroups[adGroupIndex] != null + && adIndexInAdGroup < adPlaybackState.adGroups[adGroupIndex].uris.length) { + @Nullable Uri adUri = adPlaybackState.adGroups[adGroupIndex].uris[adIndexInAdGroup]; + if (adUri != null) { + MediaSource adMediaSource = + adMediaSourceFactory.createMediaSource(MediaItem.fromUri(adUri)); + adMediaSourceHolder.initializeWithMediaSource(adMediaSource, adUri); + } + } + } + } + } + private void maybeUpdateSourceInfo() { @Nullable Timeline contentTimeline = this.contentTimeline; if (adPlaybackState != null && contentTimeline != null) { @@ -461,22 +491,38 @@ public final class AdsMediaSource extends CompositeMediaSource { private final class AdMediaSourceHolder { - private final MediaSource adMediaSource; + private final MediaPeriodId id; private final List activeMediaPeriods; + private @MonotonicNonNull Uri adUri; + private @MonotonicNonNull MediaSource adMediaSource; private @MonotonicNonNull Timeline timeline; - public AdMediaSourceHolder(MediaSource adMediaSource) { - this.adMediaSource = adMediaSource; + public AdMediaSourceHolder(MediaPeriodId id) { + this.id = id; activeMediaPeriods = new ArrayList<>(); } + public void initializeWithMediaSource(MediaSource adMediaSource, Uri adUri) { + this.adMediaSource = adMediaSource; + this.adUri = adUri; + for (int i = 0; i < activeMediaPeriods.size(); i++) { + MaskingMediaPeriod maskingMediaPeriod = activeMediaPeriods.get(i); + maskingMediaPeriod.setMediaSource(adMediaSource); + maskingMediaPeriod.setPrepareListener(new AdPrepareListener(adUri)); + } + prepareChildSource(id, adMediaSource); + } + public MediaPeriod createMediaPeriod( - Uri adUri, MediaPeriodId id, Allocator allocator, long startPositionUs) { + MediaPeriodId id, Allocator allocator, long startPositionUs) { MaskingMediaPeriod maskingMediaPeriod = - new MaskingMediaPeriod(adMediaSource, id, allocator, startPositionUs); - maskingMediaPeriod.setPrepareListener(new AdPrepareListener(adUri)); + new MaskingMediaPeriod(id, allocator, startPositionUs); activeMediaPeriods.add(maskingMediaPeriod); + if (adMediaSource != null) { + maskingMediaPeriod.setMediaSource(adMediaSource); + maskingMediaPeriod.setPrepareListener(new AdPrepareListener(checkNotNull(adUri))); + } if (timeline != null) { Object periodUid = timeline.getUidOfPeriod(/* periodIndex= */ 0); MediaPeriodId adSourceMediaPeriodId = new MediaPeriodId(periodUid, id.windowSequenceNumber); @@ -510,6 +556,16 @@ public final class AdsMediaSource extends CompositeMediaSource { maskingMediaPeriod.releasePeriod(); } + public void release() { + if (hasMediaSource()) { + releaseChildSource(id); + } + } + + public boolean hasMediaSource() { + return adMediaSource != null; + } + public boolean isInactive() { return activeMediaPeriods.isEmpty(); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java b/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java index 20be8fe12b..0eaab52ff4 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/MediaPeriodQueueTest.java @@ -16,7 +16,6 @@ package com.google.android.exoplayer2; import static com.google.common.truth.Truth.assertThat; -import static org.junit.Assert.assertNull; import static org.mockito.Mockito.mock; import static org.robolectric.Shadows.shadowOf; @@ -103,7 +102,8 @@ public final class MediaPeriodQueueTest { public void getNextMediaPeriodInfo_withPrerollAd_returnsCorrectMediaPeriodInfos() { setupAdTimeline(/* adGroupTimesUs...= */ 0); setAdGroupLoaded(/* adGroupIndex= */ 0); - assertNextMediaPeriodInfoIsAd(/* adGroupIndex= */ 0, /* contentPositionUs= */ C.TIME_UNSET); + assertNextMediaPeriodInfoIsAd( + /* adGroupIndex= */ 0, AD_DURATION_US, /* contentPositionUs= */ C.TIME_UNSET); advance(); assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( /* periodUid= */ firstPeriodUid, @@ -128,12 +128,14 @@ public final class MediaPeriodQueueTest { /* isLastInPeriod= */ false, /* isLastInWindow= */ false, /* nextAdGroupIndex= */ 0); - // The next media period info should be null as we haven't loaded the ad yet. advance(); - assertNull(getNextMediaPeriodInfo()); + assertNextMediaPeriodInfoIsAd( + /* adGroupIndex= */ 0, + /* adDurationUs= */ C.TIME_UNSET, + /* contentPositionUs= */ FIRST_AD_START_TIME_US); setAdGroupLoaded(/* adGroupIndex= */ 0); assertNextMediaPeriodInfoIsAd( - /* adGroupIndex= */ 0, /* contentPositionUs= */ FIRST_AD_START_TIME_US); + /* adGroupIndex= */ 0, AD_DURATION_US, /* contentPositionUs= */ FIRST_AD_START_TIME_US); advance(); assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( /* periodUid= */ firstPeriodUid, @@ -147,7 +149,7 @@ public final class MediaPeriodQueueTest { advance(); setAdGroupLoaded(/* adGroupIndex= */ 1); assertNextMediaPeriodInfoIsAd( - /* adGroupIndex= */ 1, /* contentPositionUs= */ SECOND_AD_START_TIME_US); + /* adGroupIndex= */ 1, AD_DURATION_US, /* contentPositionUs= */ SECOND_AD_START_TIME_US); advance(); assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( /* periodUid= */ firstPeriodUid, @@ -175,7 +177,7 @@ public final class MediaPeriodQueueTest { advance(); setAdGroupLoaded(/* adGroupIndex= */ 0); assertNextMediaPeriodInfoIsAd( - /* adGroupIndex= */ 0, /* contentPositionUs= */ FIRST_AD_START_TIME_US); + /* adGroupIndex= */ 0, AD_DURATION_US, /* contentPositionUs= */ FIRST_AD_START_TIME_US); advance(); assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( /* periodUid= */ firstPeriodUid, @@ -189,7 +191,7 @@ public final class MediaPeriodQueueTest { advance(); setAdGroupLoaded(/* adGroupIndex= */ 1); assertNextMediaPeriodInfoIsAd( - /* adGroupIndex= */ 1, /* contentPositionUs= */ CONTENT_DURATION_US); + /* adGroupIndex= */ 1, AD_DURATION_US, /* contentPositionUs= */ CONTENT_DURATION_US); advance(); assertGetNextMediaPeriodInfoReturnsContentMediaPeriod( /* periodUid= */ firstPeriodUid, @@ -531,7 +533,8 @@ public final class MediaPeriodQueueTest { /* isFinal= */ isLastInWindow)); } - private void assertNextMediaPeriodInfoIsAd(int adGroupIndex, long contentPositionUs) { + private void assertNextMediaPeriodInfoIsAd( + int adGroupIndex, long adDurationUs, long contentPositionUs) { assertThat(getNextMediaPeriodInfo()) .isEqualTo( new MediaPeriodInfo( @@ -543,7 +546,7 @@ public final class MediaPeriodQueueTest { /* startPositionUs= */ 0, contentPositionUs, /* endPositionUs= */ C.TIME_UNSET, - /* durationUs= */ AD_DURATION_US, + adDurationUs, /* isLastInTimelinePeriod= */ false, /* isLastInTimelineWindow= */ false, /* isFinal= */ false)); From eb38a63e36811b8604c2ce106ff54f00e943a452 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 1 Dec 2020 17:28:16 +0000 Subject: [PATCH 03/30] Mini release note tweaks PiperOrigin-RevId: 345036042 --- RELEASENOTES.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a41e080c2d..976942f86f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -10,8 +10,8 @@ * Core library: * Suppress exceptions from registering and unregistering the stream volume - receiver ([#8087](https://github.com/google/ExoPlayer/issues/8087)), - ([#8106](https://github.com/google/ExoPlayer/issues/8106)). + receiver ([#8087](https://github.com/google/ExoPlayer/issues/8087), + [#8106](https://github.com/google/ExoPlayer/issues/8106)). * Suppress ProGuard warnings caused by Guava's compile-only dependencies ([#8103](https://github.com/google/ExoPlayer/issues/8103)). * Fix issue that could cause playback to freeze when selecting tracks, if @@ -64,7 +64,7 @@ that lie outside the length of the cue text. * Media2 extension: * Notify onBufferingEnded when the state of origin player becomes - STATE_IDLE or STATE_ENDED. + `STATE_IDLE` or `STATE_ENDED`. * Allow to remove all playlist items that makes the player reset. ### 2.12.1 (2020-10-23) ### From 495347d3c00837af79f0d66a0191c98c8bde69b7 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Thu, 3 Dec 2020 17:11:03 +0000 Subject: [PATCH 04/30] Merge pull request #8215 from TiVo:p-fix-apple-iframe-bug PiperOrigin-RevId: 345202157 --- .../source/hls/BundledHlsMediaChunkExtractor.java | 5 +++++ .../android/exoplayer2/source/hls/HlsMediaChunk.java | 8 ++++++++ .../exoplayer2/source/hls/HlsMediaChunkExtractor.java | 11 +++++++++++ 3 files changed, 24 insertions(+) diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/BundledHlsMediaChunkExtractor.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/BundledHlsMediaChunkExtractor.java index 78fc9ae732..3311d263c6 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/BundledHlsMediaChunkExtractor.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/BundledHlsMediaChunkExtractor.java @@ -101,4 +101,9 @@ public final class BundledHlsMediaChunkExtractor implements HlsMediaChunkExtract return new BundledHlsMediaChunkExtractor( newExtractorInstance, masterPlaylistFormat, timestampAdjuster); } + + @Override + public void onTruncatedSegmentParsed() { + extractor.seek(/* position= */ 0, /* timeUs= */ 0); + } } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java index 9994ede1cf..8de69a68d1 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunk.java @@ -403,6 +403,14 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; } try { while (!loadCanceled && extractor.read(input)) {} + } catch (EOFException e) { + if ((trackFormat.roleFlags & C.ROLE_FLAG_TRICK_PLAY) != 0) { + // See onTruncatedSegmentParsed's javadoc for more info on why we are swallowing the EOF + // exception for trick play tracks. + extractor.onTruncatedSegmentParsed(); + } else { + throw e; + } } finally { nextLoadPosition = (int) (input.getPosition() - dataSpec.position); } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunkExtractor.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunkExtractor.java index 0ca5c5d0ad..084a3450ba 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunkExtractor.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/HlsMediaChunkExtractor.java @@ -59,4 +59,15 @@ public interface HlsMediaChunkExtractor { * instances that are not {@link #isReusable() reusable}. */ HlsMediaChunkExtractor recreate(); + + /** + * Resets the sample parsing state. + * + *

Resetting the parsing state allows support for Fragmented MP4 EXT-X-I-FRAME-STREAM-INF + * segments. EXT-X-I-FRAME-STREAM-INF segments are truncated to include only a leading key frame. + * After parsing said keyframe, an extractor may reach an unexpected end of file. By resetting its + * state, we can continue feeding samples from the following segments to the extractor. See #7512 for context. + */ + void onTruncatedSegmentParsed(); } From 35173a016be925d857d1a5041c7def396367c736 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 2 Dec 2020 14:01:43 +0000 Subject: [PATCH 05/30] Add an MKV asset with SSA subtitles for extractor and playback tests Asset generated using a temporary SSA file and: ``` $ mkvmerge -o sample_with_ssa_subtitles.mkv sample.mkv input.ssa ``` PiperOrigin-RevId: 345217628 --- .../extractor/mkv/MatroskaExtractorTest.java | 6 + .../mkv/sample_with_ssa_subtitles.mkv.0.dump | 283 ++++++++++++++++++ .../mkv/sample_with_ssa_subtitles.mkv.1.dump | 283 ++++++++++++++++++ .../mkv/sample_with_ssa_subtitles.mkv.2.dump | 283 ++++++++++++++++++ .../mkv/sample_with_ssa_subtitles.mkv.3.dump | 283 ++++++++++++++++++ ...with_ssa_subtitles.mkv.unknown_length.dump | 283 ++++++++++++++++++ .../media/mkv/sample_with_ssa_subtitles.mkv | Bin 0 -> 109804 bytes 7 files changed, 1421 insertions(+) create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.0.dump create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.1.dump create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.2.dump create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.3.dump create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.unknown_length.dump create mode 100644 testdata/src/test/assets/media/mkv/sample_with_ssa_subtitles.mkv diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractorTest.java index 8e22aace8a..9c0e2761d3 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractorTest.java @@ -46,6 +46,12 @@ public final class MatroskaExtractorTest { MatroskaExtractor::new, "media/mkv/sample_with_srt.mkv", simulationConfig); } + @Test + public void mkvSample_withSsaSubtitles() throws Exception { + ExtractorAsserts.assertBehavior( + MatroskaExtractor::new, "media/mkv/sample_with_ssa_subtitles.mkv", simulationConfig); + } + @Test public void mkvSample_withHtcRotationInfoInTrackName() throws Exception { ExtractorAsserts.assertBehavior( diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.0.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.0.dump new file mode 100644 index 0000000000..16df131ed3 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.0.dump @@ -0,0 +1,283 @@ +seekMap: + isSeekable = true + duration = 1139000 + getPosition(0) = [[timeUs=0, position=6106]] + getPosition(1) = [[timeUs=0, position=6106], [timeUs=67000, position=6106]] + getPosition(569500) = [[timeUs=67000, position=6106]] + getPosition(1139000) = [[timeUs=67000, position=6106]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 67000 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 134000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 100000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 267000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 200000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 167000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 234000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 400000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 334000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 300000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 367000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 500000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 467000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 434000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 634000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 567000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 534000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 600000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 767000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 700000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 667000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 734000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 900000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 834000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 800000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 867000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 1034000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 967000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 934000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 1000000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 129000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 163829 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 198659 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 233489 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 268319 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 303149 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 337979 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 372809 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 408000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 442829 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 477659 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 512489 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 547319 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 582149 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 616979 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 651809 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 687000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 721829 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 756659 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 791489 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 826319 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 861149 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 895979 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 930809 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 965000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 999829 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 1034659 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1069489 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1104319 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 81 + sample count = 1 + format 0: + id = 3 + sampleMimeType = text/x-ssa + selectionFlags = 1 + language = und + initializationData: + data = length 90, hash A5E21974 + data = length 470, hash 40E7D996 + sample 0: + time = 0 + flags = 1 + data = length 81, hash F61A8B12 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.1.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.1.dump new file mode 100644 index 0000000000..16df131ed3 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.1.dump @@ -0,0 +1,283 @@ +seekMap: + isSeekable = true + duration = 1139000 + getPosition(0) = [[timeUs=0, position=6106]] + getPosition(1) = [[timeUs=0, position=6106], [timeUs=67000, position=6106]] + getPosition(569500) = [[timeUs=67000, position=6106]] + getPosition(1139000) = [[timeUs=67000, position=6106]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 67000 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 134000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 100000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 267000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 200000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 167000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 234000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 400000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 334000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 300000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 367000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 500000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 467000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 434000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 634000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 567000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 534000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 600000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 767000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 700000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 667000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 734000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 900000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 834000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 800000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 867000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 1034000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 967000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 934000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 1000000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 129000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 163829 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 198659 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 233489 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 268319 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 303149 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 337979 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 372809 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 408000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 442829 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 477659 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 512489 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 547319 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 582149 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 616979 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 651809 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 687000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 721829 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 756659 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 791489 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 826319 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 861149 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 895979 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 930809 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 965000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 999829 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 1034659 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1069489 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1104319 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 81 + sample count = 1 + format 0: + id = 3 + sampleMimeType = text/x-ssa + selectionFlags = 1 + language = und + initializationData: + data = length 90, hash A5E21974 + data = length 470, hash 40E7D996 + sample 0: + time = 0 + flags = 1 + data = length 81, hash F61A8B12 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.2.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.2.dump new file mode 100644 index 0000000000..16df131ed3 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.2.dump @@ -0,0 +1,283 @@ +seekMap: + isSeekable = true + duration = 1139000 + getPosition(0) = [[timeUs=0, position=6106]] + getPosition(1) = [[timeUs=0, position=6106], [timeUs=67000, position=6106]] + getPosition(569500) = [[timeUs=67000, position=6106]] + getPosition(1139000) = [[timeUs=67000, position=6106]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 67000 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 134000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 100000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 267000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 200000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 167000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 234000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 400000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 334000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 300000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 367000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 500000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 467000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 434000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 634000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 567000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 534000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 600000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 767000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 700000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 667000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 734000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 900000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 834000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 800000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 867000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 1034000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 967000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 934000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 1000000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 129000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 163829 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 198659 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 233489 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 268319 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 303149 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 337979 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 372809 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 408000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 442829 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 477659 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 512489 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 547319 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 582149 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 616979 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 651809 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 687000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 721829 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 756659 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 791489 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 826319 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 861149 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 895979 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 930809 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 965000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 999829 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 1034659 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1069489 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1104319 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 81 + sample count = 1 + format 0: + id = 3 + sampleMimeType = text/x-ssa + selectionFlags = 1 + language = und + initializationData: + data = length 90, hash A5E21974 + data = length 470, hash 40E7D996 + sample 0: + time = 0 + flags = 1 + data = length 81, hash F61A8B12 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.3.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.3.dump new file mode 100644 index 0000000000..16df131ed3 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.3.dump @@ -0,0 +1,283 @@ +seekMap: + isSeekable = true + duration = 1139000 + getPosition(0) = [[timeUs=0, position=6106]] + getPosition(1) = [[timeUs=0, position=6106], [timeUs=67000, position=6106]] + getPosition(569500) = [[timeUs=67000, position=6106]] + getPosition(1139000) = [[timeUs=67000, position=6106]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 67000 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 134000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 100000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 267000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 200000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 167000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 234000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 400000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 334000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 300000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 367000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 500000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 467000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 434000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 634000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 567000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 534000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 600000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 767000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 700000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 667000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 734000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 900000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 834000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 800000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 867000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 1034000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 967000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 934000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 1000000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 129000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 163829 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 198659 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 233489 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 268319 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 303149 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 337979 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 372809 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 408000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 442829 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 477659 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 512489 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 547319 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 582149 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 616979 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 651809 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 687000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 721829 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 756659 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 791489 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 826319 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 861149 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 895979 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 930809 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 965000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 999829 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 1034659 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1069489 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1104319 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 81 + sample count = 1 + format 0: + id = 3 + sampleMimeType = text/x-ssa + selectionFlags = 1 + language = und + initializationData: + data = length 90, hash A5E21974 + data = length 470, hash 40E7D996 + sample 0: + time = 0 + flags = 1 + data = length 81, hash F61A8B12 +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.unknown_length.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.unknown_length.dump new file mode 100644 index 0000000000..16df131ed3 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_ssa_subtitles.mkv.unknown_length.dump @@ -0,0 +1,283 @@ +seekMap: + isSeekable = true + duration = 1139000 + getPosition(0) = [[timeUs=0, position=6106]] + getPosition(1) = [[timeUs=0, position=6106], [timeUs=67000, position=6106]] + getPosition(569500) = [[timeUs=67000, position=6106]] + getPosition(1139000) = [[timeUs=67000, position=6106]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 67000 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 134000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 100000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 267000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 200000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 167000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 234000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 400000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 334000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 300000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 367000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 500000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 467000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 434000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 634000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 567000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 534000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 600000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 767000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 700000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 667000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 734000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 900000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 834000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 800000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 867000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 1034000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 967000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 934000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 1000000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 129000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 163829 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 198659 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 233489 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 268319 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 303149 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 337979 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 372809 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 408000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 442829 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 477659 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 512489 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 547319 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 582149 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 616979 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 651809 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 687000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 721829 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 756659 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 791489 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 826319 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 861149 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 895979 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 930809 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 965000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 999829 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 1034659 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1069489 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1104319 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 81 + sample count = 1 + format 0: + id = 3 + sampleMimeType = text/x-ssa + selectionFlags = 1 + language = und + initializationData: + data = length 90, hash A5E21974 + data = length 470, hash 40E7D996 + sample 0: + time = 0 + flags = 1 + data = length 81, hash F61A8B12 +tracksEnded = true diff --git a/testdata/src/test/assets/media/mkv/sample_with_ssa_subtitles.mkv b/testdata/src/test/assets/media/mkv/sample_with_ssa_subtitles.mkv new file mode 100644 index 0000000000000000000000000000000000000000..5683aa394822fc57aae8336e896667dfd492088c GIT binary patch literal 109804 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 YGrh(s91G4jTe1FT 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 G>;Eru5`aGd literal 0 HcmV?d00001 From 2516e94eb9f7ff5670d0f6ed129a131408d2e4b0 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Thu, 3 Dec 2020 09:56:22 +0000 Subject: [PATCH 06/30] Fix `SonicAudioProcessor` end of stream behavior The `AudioProcessor` interface requires that no more input is queued after queueing end of stream, but `DefaultAudioSink` did queue more input and the implementation of `SonicAudioProcessor` actually relied on this to drain output at the end of the stream. Fix this behavior by getting `Sonic` output in `getOutput` and having `DefaultAudioSink` only queue input to processors that are not draining. Also add TODOs to clean up audio processor implementations where the code handles interaction that doesn't conform to the interface. PiperOrigin-RevId: 345406478 --- .../exoplayer2/ext/gvr/GvrAudioProcessor.java | 1 + .../exoplayer2/audio/DefaultAudioSink.java | 4 +- .../exoplayer2/audio/SonicAudioProcessor.java | 47 ++++++++++--------- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/extensions/gvr/src/main/java/com/google/android/exoplayer2/ext/gvr/GvrAudioProcessor.java b/extensions/gvr/src/main/java/com/google/android/exoplayer2/ext/gvr/GvrAudioProcessor.java index 14570759c3..041ca09db4 100644 --- a/extensions/gvr/src/main/java/com/google/android/exoplayer2/ext/gvr/GvrAudioProcessor.java +++ b/extensions/gvr/src/main/java/com/google/android/exoplayer2/ext/gvr/GvrAudioProcessor.java @@ -135,6 +135,7 @@ public class GvrAudioProcessor implements AudioProcessor { @Override public void queueEndOfStream() { + // TODO(internal b/174554082): assert gvrAudioSurround is non-null here and in getOutput. if (gvrAudioSurround != null) { gvrAudioSurround.triggerProcessing(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java index 26ec4b94c2..691580143a 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/DefaultAudioSink.java @@ -869,7 +869,9 @@ public final class DefaultAudioSink implements AudioSink { writeBuffer(input, avSyncPresentationTimeUs); } else { AudioProcessor audioProcessor = activeAudioProcessors[index]; - audioProcessor.queueInput(input); + if (index > drainingAudioProcessorIndex) { + audioProcessor.queueInput(input); + } ByteBuffer output = audioProcessor.getOutput(); outputBuffers[index] = output; if (output.hasRemaining()) { diff --git a/library/core/src/main/java/com/google/android/exoplayer2/audio/SonicAudioProcessor.java b/library/core/src/main/java/com/google/android/exoplayer2/audio/SonicAudioProcessor.java index ef5bbbc078..f859761954 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/audio/SonicAudioProcessor.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/audio/SonicAudioProcessor.java @@ -165,32 +165,20 @@ public final class SonicAudioProcessor implements AudioProcessor { @Override public void queueInput(ByteBuffer inputBuffer) { + if (!inputBuffer.hasRemaining()) { + return; + } Sonic sonic = checkNotNull(this.sonic); - if (inputBuffer.hasRemaining()) { - ShortBuffer shortBuffer = inputBuffer.asShortBuffer(); - int inputSize = inputBuffer.remaining(); - inputBytes += inputSize; - sonic.queueInput(shortBuffer); - inputBuffer.position(inputBuffer.position() + inputSize); - } - int outputSize = sonic.getOutputSize(); - if (outputSize > 0) { - if (buffer.capacity() < outputSize) { - buffer = ByteBuffer.allocateDirect(outputSize).order(ByteOrder.nativeOrder()); - shortBuffer = buffer.asShortBuffer(); - } else { - buffer.clear(); - shortBuffer.clear(); - } - sonic.getOutput(shortBuffer); - outputBytes += outputSize; - buffer.limit(outputSize); - outputBuffer = buffer; - } + ShortBuffer shortBuffer = inputBuffer.asShortBuffer(); + int inputSize = inputBuffer.remaining(); + inputBytes += inputSize; + sonic.queueInput(shortBuffer); + inputBuffer.position(inputBuffer.position() + inputSize); } @Override public void queueEndOfStream() { + // TODO(internal b/174554082): assert sonic is non-null here and in getOutput. if (sonic != null) { sonic.queueEndOfStream(); } @@ -199,6 +187,23 @@ public final class SonicAudioProcessor implements AudioProcessor { @Override public ByteBuffer getOutput() { + @Nullable Sonic sonic = this.sonic; + if (sonic != null) { + int outputSize = sonic.getOutputSize(); + if (outputSize > 0) { + if (buffer.capacity() < outputSize) { + buffer = ByteBuffer.allocateDirect(outputSize).order(ByteOrder.nativeOrder()); + shortBuffer = buffer.asShortBuffer(); + } else { + buffer.clear(); + shortBuffer.clear(); + } + sonic.getOutput(shortBuffer); + outputBytes += outputSize; + buffer.limit(outputSize); + outputBuffer = buffer; + } + } ByteBuffer outputBuffer = this.outputBuffer; this.outputBuffer = EMPTY_BUFFER; return outputBuffer; From 8c935e366cb5b3829ea16ae1bdb0c3ea9c138fda Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Thu, 3 Dec 2020 17:12:15 +0000 Subject: [PATCH 07/30] Merge pull request #8154 from samoylenkodmitry:handle_out_of_space PiperOrigin-RevId: 345428731 --- .../upstream/cache/SimpleCache.java | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java index 29c09ff486..cc1e5a8e5e 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/SimpleCache.java @@ -409,18 +409,20 @@ public final class SimpleCache implements Cache { Assertions.checkNotNull(cachedContent); Assertions.checkState(cachedContent.isFullyLocked(position, length)); if (!cacheDir.exists()) { - // For some reason the cache directory doesn't exist. Make a best effort to create it. - cacheDir.mkdirs(); + // The cache directory has been deleted from underneath us. Recreate it, and remove in-memory + // spans corresponding to cache files that no longer exist. + createCacheDirectories(cacheDir); removeStaleSpans(); } evictor.onStartFile(this, key, position, length); // Randomly distribute files into subdirectories with a uniform distribution. - File fileDir = new File(cacheDir, Integer.toString(random.nextInt(SUBDIRECTORY_COUNT))); - if (!fileDir.exists()) { - fileDir.mkdir(); + File cacheSubDir = new File(cacheDir, Integer.toString(random.nextInt(SUBDIRECTORY_COUNT))); + if (!cacheSubDir.exists()) { + createCacheDirectories(cacheSubDir); } long lastTouchTimestamp = System.currentTimeMillis(); - return SimpleCacheSpan.getCacheFile(fileDir, cachedContent.id, position, lastTouchTimestamp); + return SimpleCacheSpan.getCacheFile( + cacheSubDir, cachedContent.id, position, lastTouchTimestamp); } @Override @@ -548,10 +550,10 @@ public final class SimpleCache implements Cache { /** Ensures that the cache's in-memory representation has been initialized. */ private void initialize() { if (!cacheDir.exists()) { - if (!cacheDir.mkdirs()) { - String message = "Failed to create cache directory: " + cacheDir; - Log.e(TAG, message); - initializationException = new CacheException(message); + try { + createCacheDirectories(cacheDir); + } catch (CacheException e) { + initializationException = e; return; } } @@ -834,6 +836,14 @@ public final class SimpleCache implements Cache { return Long.parseLong(fileName.substring(0, fileName.indexOf('.')), /* radix= */ 16); } + private static void createCacheDirectories(File cacheDir) throws CacheException { + if (!cacheDir.mkdirs()) { + String message = "Failed to create cache directory: " + cacheDir; + Log.e(TAG, message); + throw new CacheException(message); + } + } + private static synchronized boolean lockFolder(File cacheDir) { return lockedCacheDirs.add(cacheDir.getAbsoluteFile()); } From 2195facd855f090e33f0a1730205dd12b3f7bee4 Mon Sep 17 00:00:00 2001 From: ibaker Date: Thu, 3 Dec 2020 16:03:23 +0000 Subject: [PATCH 08/30] Gracefully handle null-terminated subtitle content in MKV containers This was reported for SSA/ASS in PR #8265, but it seems to me the SubRip part of the Matroska spec is similarly loose, so this change handles null-terminated strings in both. PiperOrigin-RevId: 345452667 --- RELEASENOTES.md | 3 + .../extractor/mkv/MatroskaExtractor.java | 9 + .../extractor/mkv/MatroskaExtractorTest.java | 15 + ...sample_with_null_terminated_srt.mkv.0.dump | 281 +++++++++++++++++ ...sample_with_null_terminated_srt.mkv.1.dump | 281 +++++++++++++++++ ...sample_with_null_terminated_srt.mkv.2.dump | 281 +++++++++++++++++ ...sample_with_null_terminated_srt.mkv.3.dump | 281 +++++++++++++++++ ...ull_terminated_srt.mkv.unknown_length.dump | 281 +++++++++++++++++ ...h_null_terminated_ssa_subtitles.mkv.0.dump | 283 ++++++++++++++++++ ...h_null_terminated_ssa_subtitles.mkv.1.dump | 283 ++++++++++++++++++ ...h_null_terminated_ssa_subtitles.mkv.2.dump | 283 ++++++++++++++++++ ...h_null_terminated_ssa_subtitles.mkv.3.dump | 283 ++++++++++++++++++ ...ated_ssa_subtitles.mkv.unknown_length.dump | 283 ++++++++++++++++++ .../mkv/sample_with_null_terminated_srt.mkv | Bin 0 -> 103299 bytes ...ple_with_null_terminated_ssa_subtitles.mkv | Bin 0 -> 109804 bytes 15 files changed, 2847 insertions(+) create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.0.dump create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.1.dump create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.2.dump create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.3.dump create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.unknown_length.dump create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.0.dump create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.1.dump create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.2.dump create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.3.dump create mode 100644 testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.unknown_length.dump create mode 100644 testdata/src/test/assets/media/mkv/sample_with_null_terminated_srt.mkv create mode 100644 testdata/src/test/assets/media/mkv/sample_with_null_terminated_ssa_subtitles.mkv diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 976942f86f..fc655e4e9f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -5,6 +5,9 @@ * IMA extension: * Fix a condition where playback can get stuck before an empty ad ([#8205](https://github.com/google/ExoPlayer/issues/8205)). +* Text: + * Gracefully handle null-terminated subtitle content in Matroska + containers. ### 2.12.2 (2020-12-01) ### diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java index c8f4cadcb1..f4022fe780 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractor.java @@ -1307,6 +1307,15 @@ public class MatroskaExtractor implements Extractor { Log.w(TAG, "Skipping subtitle sample with no duration."); } else { setSubtitleEndTime(track.codecId, blockDurationUs, subtitleSample.getData()); + // The Matroska spec doesn't clearly define whether subtitle samples are null-terminated + // or the sample should instead be sized precisely. We truncate the sample at a null-byte + // to gracefully handle null-terminated strings followed by garbage bytes. + for (int i = subtitleSample.getPosition(); i < subtitleSample.limit(); i++) { + if (subtitleSample.getData()[i] == 0) { + subtitleSample.setLimit(i); + break; + } + } // Note: If we ever want to support DRM protected subtitles then we'll need to output the // appropriate encryption data here. track.output.sampleData(subtitleSample, subtitleSample.limit()); diff --git a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractorTest.java b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractorTest.java index 9c0e2761d3..45c0bd1c9f 100644 --- a/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractorTest.java +++ b/library/extractor/src/test/java/com/google/android/exoplayer2/extractor/mkv/MatroskaExtractorTest.java @@ -46,12 +46,27 @@ public final class MatroskaExtractorTest { MatroskaExtractor::new, "media/mkv/sample_with_srt.mkv", simulationConfig); } + @Test + public void mkvSample_withNullTerminatedSubripSubtitles() throws Exception { + ExtractorAsserts.assertBehavior( + MatroskaExtractor::new, "media/mkv/sample_with_null_terminated_srt.mkv", simulationConfig); + } + @Test public void mkvSample_withSsaSubtitles() throws Exception { ExtractorAsserts.assertBehavior( MatroskaExtractor::new, "media/mkv/sample_with_ssa_subtitles.mkv", simulationConfig); } + // https://github.com/google/ExoPlayer/pull/8265 + @Test + public void mkvSample_withNullTerminatedSsaSubtitles() throws Exception { + ExtractorAsserts.assertBehavior( + MatroskaExtractor::new, + "media/mkv/sample_with_null_terminated_ssa_subtitles.mkv", + simulationConfig); + } + @Test public void mkvSample_withHtcRotationInfoInTrackName() throws Exception { ExtractorAsserts.assertBehavior( diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.0.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.0.dump new file mode 100644 index 0000000000..ccf35b8c27 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.0.dump @@ -0,0 +1,281 @@ +seekMap: + isSeekable = true + duration = 1234000 + getPosition(0) = [[timeUs=0, position=1163]] + getPosition(1) = [[timeUs=0, position=1163]] + getPosition(617000) = [[timeUs=0, position=1163]] + getPosition(1234000) = [[timeUs=0, position=1163]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 0 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 67000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 33000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 200000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 133000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 100000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 167000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 333000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 267000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 233000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 300000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 433000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 400000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 367000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 567000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 500000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 467000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 533000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 700000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 633000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 600000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 667000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 833000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 767000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 733000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 800000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 967000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 900000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 867000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 933000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 62000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 97000 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 131000 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 166000 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 201000 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 236000 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 270000 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 306000 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 341000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 376000 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 410000 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 445000 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 480000 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 514000 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 550000 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 585000 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 620000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 654000 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 690000 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 724000 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 759000 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 793000 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 829000 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 864000 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 898000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 932000 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 968000 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1002000 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1037000 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 49 + sample count = 1 + format 0: + id = 3 + sampleMimeType = application/x-subrip + selectionFlags = 1 + language = en + label = Subs Label + sample 0: + time = 0 + flags = 1 + data = length 49, hash DE7F89EF +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.1.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.1.dump new file mode 100644 index 0000000000..ccf35b8c27 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.1.dump @@ -0,0 +1,281 @@ +seekMap: + isSeekable = true + duration = 1234000 + getPosition(0) = [[timeUs=0, position=1163]] + getPosition(1) = [[timeUs=0, position=1163]] + getPosition(617000) = [[timeUs=0, position=1163]] + getPosition(1234000) = [[timeUs=0, position=1163]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 0 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 67000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 33000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 200000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 133000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 100000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 167000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 333000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 267000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 233000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 300000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 433000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 400000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 367000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 567000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 500000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 467000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 533000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 700000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 633000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 600000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 667000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 833000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 767000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 733000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 800000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 967000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 900000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 867000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 933000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 62000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 97000 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 131000 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 166000 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 201000 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 236000 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 270000 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 306000 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 341000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 376000 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 410000 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 445000 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 480000 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 514000 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 550000 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 585000 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 620000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 654000 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 690000 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 724000 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 759000 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 793000 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 829000 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 864000 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 898000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 932000 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 968000 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1002000 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1037000 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 49 + sample count = 1 + format 0: + id = 3 + sampleMimeType = application/x-subrip + selectionFlags = 1 + language = en + label = Subs Label + sample 0: + time = 0 + flags = 1 + data = length 49, hash DE7F89EF +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.2.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.2.dump new file mode 100644 index 0000000000..ccf35b8c27 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.2.dump @@ -0,0 +1,281 @@ +seekMap: + isSeekable = true + duration = 1234000 + getPosition(0) = [[timeUs=0, position=1163]] + getPosition(1) = [[timeUs=0, position=1163]] + getPosition(617000) = [[timeUs=0, position=1163]] + getPosition(1234000) = [[timeUs=0, position=1163]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 0 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 67000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 33000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 200000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 133000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 100000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 167000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 333000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 267000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 233000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 300000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 433000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 400000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 367000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 567000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 500000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 467000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 533000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 700000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 633000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 600000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 667000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 833000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 767000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 733000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 800000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 967000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 900000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 867000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 933000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 62000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 97000 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 131000 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 166000 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 201000 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 236000 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 270000 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 306000 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 341000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 376000 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 410000 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 445000 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 480000 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 514000 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 550000 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 585000 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 620000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 654000 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 690000 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 724000 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 759000 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 793000 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 829000 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 864000 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 898000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 932000 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 968000 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1002000 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1037000 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 49 + sample count = 1 + format 0: + id = 3 + sampleMimeType = application/x-subrip + selectionFlags = 1 + language = en + label = Subs Label + sample 0: + time = 0 + flags = 1 + data = length 49, hash DE7F89EF +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.3.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.3.dump new file mode 100644 index 0000000000..ccf35b8c27 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.3.dump @@ -0,0 +1,281 @@ +seekMap: + isSeekable = true + duration = 1234000 + getPosition(0) = [[timeUs=0, position=1163]] + getPosition(1) = [[timeUs=0, position=1163]] + getPosition(617000) = [[timeUs=0, position=1163]] + getPosition(1234000) = [[timeUs=0, position=1163]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 0 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 67000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 33000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 200000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 133000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 100000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 167000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 333000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 267000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 233000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 300000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 433000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 400000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 367000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 567000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 500000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 467000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 533000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 700000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 633000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 600000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 667000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 833000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 767000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 733000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 800000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 967000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 900000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 867000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 933000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 62000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 97000 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 131000 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 166000 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 201000 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 236000 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 270000 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 306000 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 341000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 376000 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 410000 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 445000 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 480000 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 514000 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 550000 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 585000 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 620000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 654000 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 690000 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 724000 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 759000 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 793000 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 829000 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 864000 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 898000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 932000 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 968000 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1002000 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1037000 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 49 + sample count = 1 + format 0: + id = 3 + sampleMimeType = application/x-subrip + selectionFlags = 1 + language = en + label = Subs Label + sample 0: + time = 0 + flags = 1 + data = length 49, hash DE7F89EF +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.unknown_length.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.unknown_length.dump new file mode 100644 index 0000000000..ccf35b8c27 --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_srt.mkv.unknown_length.dump @@ -0,0 +1,281 @@ +seekMap: + isSeekable = true + duration = 1234000 + getPosition(0) = [[timeUs=0, position=1163]] + getPosition(1) = [[timeUs=0, position=1163]] + getPosition(617000) = [[timeUs=0, position=1163]] + getPosition(1234000) = [[timeUs=0, position=1163]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 0 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 67000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 33000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 200000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 133000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 100000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 167000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 333000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 267000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 233000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 300000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 433000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 400000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 367000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 567000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 500000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 467000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 533000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 700000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 633000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 600000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 667000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 833000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 767000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 733000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 800000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 967000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 900000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 867000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 933000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 62000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 97000 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 131000 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 166000 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 201000 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 236000 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 270000 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 306000 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 341000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 376000 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 410000 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 445000 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 480000 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 514000 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 550000 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 585000 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 620000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 654000 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 690000 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 724000 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 759000 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 793000 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 829000 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 864000 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 898000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 932000 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 968000 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1002000 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1037000 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 49 + sample count = 1 + format 0: + id = 3 + sampleMimeType = application/x-subrip + selectionFlags = 1 + language = en + label = Subs Label + sample 0: + time = 0 + flags = 1 + data = length 49, hash DE7F89EF +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.0.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.0.dump new file mode 100644 index 0000000000..ec1eaf729b --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.0.dump @@ -0,0 +1,283 @@ +seekMap: + isSeekable = true + duration = 1139000 + getPosition(0) = [[timeUs=0, position=6106]] + getPosition(1) = [[timeUs=0, position=6106], [timeUs=67000, position=6106]] + getPosition(569500) = [[timeUs=67000, position=6106]] + getPosition(1139000) = [[timeUs=67000, position=6106]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 67000 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 134000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 100000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 267000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 200000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 167000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 234000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 400000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 334000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 300000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 367000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 500000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 467000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 434000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 634000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 567000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 534000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 600000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 767000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 700000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 667000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 734000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 900000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 834000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 800000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 867000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 1034000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 967000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 934000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 1000000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 129000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 163829 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 198659 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 233489 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 268319 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 303149 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 337979 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 372809 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 408000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 442829 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 477659 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 512489 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 547319 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 582149 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 616979 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 651809 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 687000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 721829 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 756659 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 791489 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 826319 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 861149 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 895979 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 930809 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 965000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 999829 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 1034659 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1069489 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1104319 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 71 + sample count = 1 + format 0: + id = 3 + sampleMimeType = text/x-ssa + selectionFlags = 1 + language = und + initializationData: + data = length 90, hash A5E21974 + data = length 470, hash 40E7D996 + sample 0: + time = 0 + flags = 1 + data = length 71, hash 2B8E631C +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.1.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.1.dump new file mode 100644 index 0000000000..ec1eaf729b --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.1.dump @@ -0,0 +1,283 @@ +seekMap: + isSeekable = true + duration = 1139000 + getPosition(0) = [[timeUs=0, position=6106]] + getPosition(1) = [[timeUs=0, position=6106], [timeUs=67000, position=6106]] + getPosition(569500) = [[timeUs=67000, position=6106]] + getPosition(1139000) = [[timeUs=67000, position=6106]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 67000 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 134000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 100000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 267000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 200000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 167000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 234000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 400000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 334000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 300000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 367000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 500000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 467000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 434000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 634000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 567000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 534000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 600000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 767000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 700000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 667000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 734000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 900000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 834000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 800000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 867000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 1034000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 967000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 934000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 1000000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 129000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 163829 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 198659 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 233489 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 268319 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 303149 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 337979 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 372809 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 408000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 442829 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 477659 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 512489 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 547319 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 582149 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 616979 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 651809 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 687000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 721829 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 756659 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 791489 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 826319 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 861149 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 895979 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 930809 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 965000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 999829 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 1034659 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1069489 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1104319 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 71 + sample count = 1 + format 0: + id = 3 + sampleMimeType = text/x-ssa + selectionFlags = 1 + language = und + initializationData: + data = length 90, hash A5E21974 + data = length 470, hash 40E7D996 + sample 0: + time = 0 + flags = 1 + data = length 71, hash 2B8E631C +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.2.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.2.dump new file mode 100644 index 0000000000..ec1eaf729b --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.2.dump @@ -0,0 +1,283 @@ +seekMap: + isSeekable = true + duration = 1139000 + getPosition(0) = [[timeUs=0, position=6106]] + getPosition(1) = [[timeUs=0, position=6106], [timeUs=67000, position=6106]] + getPosition(569500) = [[timeUs=67000, position=6106]] + getPosition(1139000) = [[timeUs=67000, position=6106]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 67000 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 134000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 100000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 267000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 200000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 167000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 234000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 400000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 334000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 300000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 367000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 500000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 467000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 434000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 634000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 567000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 534000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 600000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 767000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 700000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 667000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 734000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 900000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 834000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 800000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 867000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 1034000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 967000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 934000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 1000000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 129000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 163829 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 198659 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 233489 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 268319 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 303149 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 337979 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 372809 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 408000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 442829 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 477659 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 512489 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 547319 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 582149 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 616979 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 651809 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 687000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 721829 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 756659 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 791489 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 826319 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 861149 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 895979 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 930809 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 965000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 999829 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 1034659 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1069489 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1104319 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 71 + sample count = 1 + format 0: + id = 3 + sampleMimeType = text/x-ssa + selectionFlags = 1 + language = und + initializationData: + data = length 90, hash A5E21974 + data = length 470, hash 40E7D996 + sample 0: + time = 0 + flags = 1 + data = length 71, hash 2B8E631C +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.3.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.3.dump new file mode 100644 index 0000000000..ec1eaf729b --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.3.dump @@ -0,0 +1,283 @@ +seekMap: + isSeekable = true + duration = 1139000 + getPosition(0) = [[timeUs=0, position=6106]] + getPosition(1) = [[timeUs=0, position=6106], [timeUs=67000, position=6106]] + getPosition(569500) = [[timeUs=67000, position=6106]] + getPosition(1139000) = [[timeUs=67000, position=6106]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 67000 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 134000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 100000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 267000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 200000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 167000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 234000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 400000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 334000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 300000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 367000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 500000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 467000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 434000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 634000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 567000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 534000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 600000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 767000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 700000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 667000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 734000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 900000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 834000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 800000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 867000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 1034000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 967000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 934000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 1000000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 129000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 163829 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 198659 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 233489 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 268319 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 303149 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 337979 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 372809 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 408000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 442829 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 477659 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 512489 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 547319 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 582149 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 616979 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 651809 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 687000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 721829 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 756659 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 791489 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 826319 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 861149 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 895979 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 930809 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 965000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 999829 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 1034659 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1069489 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1104319 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 71 + sample count = 1 + format 0: + id = 3 + sampleMimeType = text/x-ssa + selectionFlags = 1 + language = und + initializationData: + data = length 90, hash A5E21974 + data = length 470, hash 40E7D996 + sample 0: + time = 0 + flags = 1 + data = length 71, hash 2B8E631C +tracksEnded = true diff --git a/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.unknown_length.dump b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.unknown_length.dump new file mode 100644 index 0000000000..ec1eaf729b --- /dev/null +++ b/testdata/src/test/assets/extractordumps/mkv/sample_with_null_terminated_ssa_subtitles.mkv.unknown_length.dump @@ -0,0 +1,283 @@ +seekMap: + isSeekable = true + duration = 1139000 + getPosition(0) = [[timeUs=0, position=6106]] + getPosition(1) = [[timeUs=0, position=6106], [timeUs=67000, position=6106]] + getPosition(569500) = [[timeUs=67000, position=6106]] + getPosition(1139000) = [[timeUs=67000, position=6106]] +numberOfTracks = 3 +track 1: + total output bytes = 89502 + sample count = 30 + format 0: + id = 1 + sampleMimeType = video/avc + width = 1080 + height = 720 + selectionFlags = 1 + language = und + initializationData: + data = length 30, hash F6F3D010 + data = length 10, hash 7A0D0F2B + sample 0: + time = 67000 + flags = 1 + data = length 36477, hash F0F36CFE + sample 1: + time = 134000 + flags = 0 + data = length 5341, hash 40B85E2 + sample 2: + time = 100000 + flags = 0 + data = length 596, hash 357B4D92 + sample 3: + time = 267000 + flags = 0 + data = length 7704, hash A39EDA06 + sample 4: + time = 200000 + flags = 0 + data = length 989, hash 2813C72D + sample 5: + time = 167000 + flags = 0 + data = length 721, hash C50D1C73 + sample 6: + time = 234000 + flags = 0 + data = length 519, hash 65FE1911 + sample 7: + time = 400000 + flags = 0 + data = length 6160, hash E1CAC0EC + sample 8: + time = 334000 + flags = 0 + data = length 953, hash 7160C661 + sample 9: + time = 300000 + flags = 0 + data = length 620, hash 7A7AE07C + sample 10: + time = 367000 + flags = 0 + data = length 405, hash 5CC7F4E7 + sample 11: + time = 500000 + flags = 0 + data = length 4852, hash 9DB6979D + sample 12: + time = 467000 + flags = 0 + data = length 547, hash E31A6979 + sample 13: + time = 434000 + flags = 0 + data = length 570, hash FEC40D00 + sample 14: + time = 634000 + flags = 0 + data = length 5525, hash 7C478F7E + sample 15: + time = 567000 + flags = 0 + data = length 1082, hash DA07059A + sample 16: + time = 534000 + flags = 0 + data = length 807, hash 93478E6B + sample 17: + time = 600000 + flags = 0 + data = length 744, hash 9A8E6026 + sample 18: + time = 767000 + flags = 0 + data = length 4732, hash C73B23C0 + sample 19: + time = 700000 + flags = 0 + data = length 1004, hash 8A19A228 + sample 20: + time = 667000 + flags = 0 + data = length 794, hash 8126022C + sample 21: + time = 734000 + flags = 0 + data = length 645, hash F08300E5 + sample 22: + time = 900000 + flags = 0 + data = length 2684, hash 727FE378 + sample 23: + time = 834000 + flags = 0 + data = length 787, hash 419A7821 + sample 24: + time = 800000 + flags = 0 + data = length 649, hash 5C159346 + sample 25: + time = 867000 + flags = 0 + data = length 509, hash F912D655 + sample 26: + time = 1034000 + flags = 0 + data = length 1226, hash 29815C21 + sample 27: + time = 967000 + flags = 0 + data = length 898, hash D997AD0A + sample 28: + time = 934000 + flags = 0 + data = length 476, hash A0423645 + sample 29: + time = 1000000 + flags = 0 + data = length 486, hash DDF32CBB +track 2: + total output bytes = 12120 + sample count = 29 + format 0: + id = 2 + sampleMimeType = audio/ac3 + channelCount = 1 + sampleRate = 44100 + selectionFlags = 1 + language = und + sample 0: + time = 129000 + flags = 1 + data = length 416, hash 211F2286 + sample 1: + time = 163829 + flags = 1 + data = length 418, hash 77425A86 + sample 2: + time = 198659 + flags = 1 + data = length 418, hash A0FE5CA1 + sample 3: + time = 233489 + flags = 1 + data = length 418, hash 2309B066 + sample 4: + time = 268319 + flags = 1 + data = length 418, hash 928A653B + sample 5: + time = 303149 + flags = 1 + data = length 418, hash 3422F0CB + sample 6: + time = 337979 + flags = 1 + data = length 418, hash EFF43D5B + sample 7: + time = 372809 + flags = 1 + data = length 418, hash FC8093C7 + sample 8: + time = 408000 + flags = 1 + data = length 418, hash CCC08A16 + sample 9: + time = 442829 + flags = 1 + data = length 418, hash 2A6EE863 + sample 10: + time = 477659 + flags = 1 + data = length 418, hash D69A9251 + sample 11: + time = 512489 + flags = 1 + data = length 418, hash BCFB758D + sample 12: + time = 547319 + flags = 1 + data = length 418, hash 11B66799 + sample 13: + time = 582149 + flags = 1 + data = length 418, hash C824D392 + sample 14: + time = 616979 + flags = 1 + data = length 418, hash C167D872 + sample 15: + time = 651809 + flags = 1 + data = length 418, hash 4221C855 + sample 16: + time = 687000 + flags = 1 + data = length 418, hash 4D4FF934 + sample 17: + time = 721829 + flags = 1 + data = length 418, hash 984AA025 + sample 18: + time = 756659 + flags = 1 + data = length 418, hash BB788B46 + sample 19: + time = 791489 + flags = 1 + data = length 418, hash 9EFBFD97 + sample 20: + time = 826319 + flags = 1 + data = length 418, hash DF1A460C + sample 21: + time = 861149 + flags = 1 + data = length 418, hash 2BDB56A + sample 22: + time = 895979 + flags = 1 + data = length 418, hash CA230060 + sample 23: + time = 930809 + flags = 1 + data = length 418, hash D2F19F41 + sample 24: + time = 965000 + flags = 1 + data = length 418, hash AF392D79 + sample 25: + time = 999829 + flags = 1 + data = length 418, hash C5D7F2A3 + sample 26: + time = 1034659 + flags = 1 + data = length 418, hash 733A35AE + sample 27: + time = 1069489 + flags = 1 + data = length 418, hash DE46E5D3 + sample 28: + time = 1104319 + flags = 1 + data = length 418, hash 56AB8D37 +track 3: + total output bytes = 71 + sample count = 1 + format 0: + id = 3 + sampleMimeType = text/x-ssa + selectionFlags = 1 + language = und + initializationData: + data = length 90, hash A5E21974 + data = length 470, hash 40E7D996 + sample 0: + time = 0 + flags = 1 + data = length 71, hash 2B8E631C +tracksEnded = true diff --git a/testdata/src/test/assets/media/mkv/sample_with_null_terminated_srt.mkv b/testdata/src/test/assets/media/mkv/sample_with_null_terminated_srt.mkv new file mode 100644 index 0000000000000000000000000000000000000000..8a9298a7bc5329fe3c82f8251c409469b5877641 GIT binary patch literal 103299 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 *!d-89skw?3TYHb8uTj7WV?@z#so_T1){W*f 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�$>U=)WXoDY59C|sX%6weZ8N=#pyW8 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

=7y0SA&?_25p#l=z^N9VQ>1bU*clt~7+R7Hxt znN0NBSi_@td6$>a{47MB%4Q!C0_Y#Y8sX$4J?VxbFd;DGtM;wK^<^BtRgHIoUeRq1 z5QNiiC+2 zRh$O+2d)s}quQOST$tQjULPI28Us*CNimU!yo-Bi1og_#(m!{~plywkf!H(4c8(CM z-7lW*!s*ioo&y2to#wsPc%VQFe&jC;L3Ke-KVl&8v(B&Hit=XC%gy;gwK9?;TVYY7 z_9;+XB$?Goz2$&>>?cjuDxlg^se94988qDxNyE7D8lyC zav-0i1dRr_P$#K_n<;rhp_Sw603vqmoq7`DzUNU_>V1N)LtFuHbc1$Y*Ep&5_;$

3T0$6&z=` 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 Date: Fri, 4 Dec 2020 18:33:02 +0000 Subject: [PATCH 09/30] Add iso9 to the list of supported MP4 brands Issue: #8308 #minor-release PiperOrigin-RevId: 345707141 --- .../com/google/android/exoplayer2/extractor/mp4/Sniffer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Sniffer.java b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Sniffer.java index 00acb29906..72ce336b73 100644 --- a/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Sniffer.java +++ b/library/extractor/src/main/java/com/google/android/exoplayer2/extractor/mp4/Sniffer.java @@ -37,6 +37,7 @@ import java.io.IOException; 0x69736f34, // iso4 0x69736f35, // iso5 0x69736f36, // iso6 + 0x69736f39, // iso9 0x61766331, // avc1 0x68766331, // hvc1 0x68657631, // hev1 From 6db6d14b16c1324bde1677cce8cfa3571d201d9a Mon Sep 17 00:00:00 2001 From: kimvde Date: Mon, 7 Dec 2020 12:32:55 +0000 Subject: [PATCH 10/30] Throw ParserException if AAC config is invalid Issue:#8295 PiperOrigin-RevId: 346064966 --- .../android/exoplayer2/audio/AacUtil.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/library/common/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java b/library/common/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java index 4a03b79856..c97893b428 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/audio/AacUtil.java @@ -18,7 +18,6 @@ package com.google.android.exoplayer2.audio; import androidx.annotation.IntDef; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.ParserException; -import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.ParsableBitArray; import java.lang.annotation.Documented; @@ -173,7 +172,8 @@ public final class AacUtil { * * @param audioSpecificConfig A byte array containing the AudioSpecificConfig to parse. * @return The parsed configuration. - * @throws ParserException If the AudioSpecificConfig cannot be parsed as it's not supported. + * @throws ParserException If the AudioSpecificConfig cannot be parsed because it is invalid or + * unsupported. */ public static Config parseAudioSpecificConfig(byte[] audioSpecificConfig) throws ParserException { return parseAudioSpecificConfig( @@ -188,7 +188,8 @@ public final class AacUtil { * @param forceReadToEnd Whether the entire AudioSpecificConfig should be read. Required for * knowing the length of the configuration payload. * @return The parsed configuration. - * @throws ParserException If the AudioSpecificConfig cannot be parsed as it's not supported. + * @throws ParserException If the AudioSpecificConfig cannot be parsed because it is invalid or + * unsupported. */ public static Config parseAudioSpecificConfig(ParsableBitArray bitArray, boolean forceReadToEnd) throws ParserException { @@ -248,7 +249,9 @@ public final class AacUtil { } // For supported containers, bits_to_decode() is always 0. int channelCount = AUDIO_SPECIFIC_CONFIG_CHANNEL_COUNT_TABLE[channelConfiguration]; - Assertions.checkArgument(channelCount != AUDIO_SPECIFIC_CONFIG_CHANNEL_CONFIGURATION_INVALID); + if (channelCount == AUDIO_SPECIFIC_CONFIG_CHANNEL_CONFIGURATION_INVALID) { + throw new ParserException(); + } return new Config(sampleRateHz, channelCount, codecs); } @@ -336,15 +339,17 @@ public final class AacUtil { * * @param bitArray The bit array containing the audio specific configuration. * @return The sampling frequency. + * @throws ParserException If the audio specific configuration is invalid. */ - private static int getSamplingFrequency(ParsableBitArray bitArray) { + private static int getSamplingFrequency(ParsableBitArray bitArray) throws ParserException { int samplingFrequency; int frequencyIndex = bitArray.readBits(4); if (frequencyIndex == AUDIO_SPECIFIC_CONFIG_FREQUENCY_INDEX_ARBITRARY) { samplingFrequency = bitArray.readBits(24); - } else { - Assertions.checkArgument(frequencyIndex < 13); + } else if (frequencyIndex < 13) { samplingFrequency = AUDIO_SPECIFIC_CONFIG_SAMPLING_RATE_TABLE[frequencyIndex]; + } else { + throw new ParserException(); } return samplingFrequency; } From fa0cc1e15f2dfea62c2d2cfa45169fca8763147a Mon Sep 17 00:00:00 2001 From: bachinger Date: Tue, 8 Dec 2020 17:45:08 +0000 Subject: [PATCH 11/30] Improve javadoc of Window.windowStartTimeMs PiperOrigin-RevId: 346346359 --- .../src/main/java/com/google/android/exoplayer2/Timeline.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/Timeline.java b/library/core/src/main/java/com/google/android/exoplayer2/Timeline.java index a7fb1ae20b..19be5bf9d0 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/Timeline.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/Timeline.java @@ -166,7 +166,7 @@ public abstract class Timeline { /** * The window's start time in milliseconds since the Unix epoch, or {@link C#TIME_UNSET} if - * unknown or not applicable. For informational purposes only. + * unknown or not applicable. */ public long windowStartTimeMs; From a028ce8964c7f3565ff8450cac0183f856c9a2c9 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 10 Dec 2020 13:34:15 +0000 Subject: [PATCH 12/30] Fix missing Javadoc PiperOrigin-RevId: 346764371 --- .../main/java/com/google/android/exoplayer2/ui/PlayerView.java | 3 ++- .../com/google/android/exoplayer2/ui/StyledPlayerView.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java index c1587d8cdf..726d6cf6f0 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/PlayerView.java @@ -131,7 +131,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; *

  • Default: {@code never} * *
  • {@code resize_mode} - Controls how video and album art is resized within the view. - * Valid values are {@code fit}, {@code fixed_width}, {@code fixed_height} and {@code fill}. + * Valid values are {@code fit}, {@code fixed_width}, {@code fixed_height}, {@code fill} and + * {@code zoom}. *
      *
    • Corresponding method: {@link #setResizeMode(int)} *
    • Default: {@code fit} diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java index 4ae1b32215..81df78536d 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerView.java @@ -133,7 +133,8 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; *
    • Default: {@code never} *
    *
  • {@code resize_mode} - Controls how video and album art is resized within the view. - * Valid values are {@code fit}, {@code fixed_width}, {@code fixed_height} and {@code fill}. + * Valid values are {@code fit}, {@code fixed_width}, {@code fixed_height}, {@code fill} and + * {@code zoom}. *
      *
    • Corresponding method: {@link #setResizeMode(int)} *
    • Default: {@code fit} From 3a0b1f7da7938239cb29b879850afe9410864152 Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 11 Dec 2020 17:09:26 +0000 Subject: [PATCH 13/30] Fix UI menu not dismissing on API level 22 and earlier Issue: #8272 PiperOrigin-RevId: 347010412 --- RELEASENOTES.md | 5 +++++ .../android/exoplayer2/ui/StyledPlayerControlView.java | 7 +++++++ 2 files changed, 12 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index fc655e4e9f..b9252d1789 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -2,6 +2,11 @@ ### 2.12.3 (???-??-??) ### +* UI: + * Fix issue where pop-up menus belonging to `StyledPlayerControlView` + would not be dismissed when tapping outside of the menu area or pressing + the back button, on API level 22 and earlier + ([#8272](https://github.com/google/ExoPlayer/issues/8272)). * IMA extension: * Fix a condition where playback can get stuck before an empty ad ([#8205](https://github.com/google/ExoPlayer/issues/8205)). diff --git a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java index 3cff0ef3cb..ab09454c95 100644 --- a/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java +++ b/library/ui/src/main/java/com/google/android/exoplayer2/ui/StyledPlayerControlView.java @@ -21,7 +21,9 @@ import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; +import android.graphics.Color; import android.graphics.Typeface; +import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Looper; import android.util.AttributeSet; @@ -673,6 +675,11 @@ public class StyledPlayerControlView extends FrameLayout { settingsView.setLayoutManager(new LinearLayoutManager(getContext())); settingsWindow = new PopupWindow(settingsView, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, true); + if (Util.SDK_INT < 23) { + // Work around issue where tapping outside of the menu area or pressing the back button + // doesn't dismiss the menu as expected. See: https://github.com/google/ExoPlayer/issues/8272. + settingsWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + } settingsWindow.setOnDismissListener(componentListener); needToHideBars = true; From a015b7ec82d5dddbf7a0693189de9f18dd6e925d Mon Sep 17 00:00:00 2001 From: sungsoo Date: Sun, 13 Dec 2020 23:45:47 +0000 Subject: [PATCH 14/30] Make media2 extension depend on androidx media2 1.1.0 Issue: #8011 PiperOrigin-RevId: 347288689 --- RELEASENOTES.md | 4 + constants.gradle | 2 + extensions/media2/build.gradle | 4 +- .../ext/media2/MediaSessionUtilTest.java | 88 ------------------- .../ext/media2/MediaSessionUtil.java | 37 -------- .../ext/media2/SessionPlayerConnector.java | 22 +---- 6 files changed, 11 insertions(+), 146 deletions(-) delete mode 100644 extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/MediaSessionUtilTest.java delete mode 100644 extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/MediaSessionUtil.java diff --git a/RELEASENOTES.md b/RELEASENOTES.md index b9252d1789..9cb18be33d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -13,6 +13,10 @@ * Text: * Gracefully handle null-terminated subtitle content in Matroska containers. +* Media2 extension + * Make media2-extension depend on AndroidX media2:media2-session:1.1.0 to + fix a deadlock while creating PlaybackStateCompat internally. + ([#8011](https://github.com/google/ExoPlayer/issues/8011)). ### 2.12.2 (2020-12-01) ### diff --git a/constants.gradle b/constants.gradle index b06636dd20..769f595b6d 100644 --- a/constants.gradle +++ b/constants.gradle @@ -32,7 +32,9 @@ project.ext { androidxAnnotationVersion = '1.1.0' androidxAppCompatVersion = '1.1.0' androidxCollectionVersion = '1.1.0' + androidxFuturesVersion = '1.1.0' androidxMediaVersion = '1.0.1' + androidxMedia2Version = '1.1.0' androidxMultidexVersion = '2.0.0' androidxRecyclerViewVersion = '1.1.0' androidxTestCoreVersion = '1.2.0' diff --git a/extensions/media2/build.gradle b/extensions/media2/build.gradle index bdafee5558..a89354d7b3 100644 --- a/extensions/media2/build.gradle +++ b/extensions/media2/build.gradle @@ -18,8 +18,8 @@ android.defaultConfig.minSdkVersion 19 dependencies { implementation project(modulePrefix + 'library-core') implementation 'androidx.collection:collection:' + androidxCollectionVersion - implementation 'androidx.concurrent:concurrent-futures:1.1.0' - api 'androidx.media2:media2-session:1.0.3' + implementation 'androidx.concurrent:concurrent-futures:' + androidxFuturesVersion + api 'androidx.media2:media2-session:' + androidxMedia2Version compileOnly 'org.checkerframework:checker-compat-qual:' + checkerframeworkCompatVersion compileOnly 'org.checkerframework:checker-qual:' + checkerframeworkVersion compileOnly 'org.jetbrains.kotlin:kotlin-annotations-jvm:' + kotlinAnnotationsVersion diff --git a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/MediaSessionUtilTest.java b/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/MediaSessionUtilTest.java deleted file mode 100644 index 8cf586b846..0000000000 --- a/extensions/media2/src/androidTest/java/com/google/android/exoplayer2/ext/media2/MediaSessionUtilTest.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2020 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.ext.media2; - -import static com.google.common.truth.Truth.assertThat; -import static java.util.concurrent.TimeUnit.MILLISECONDS; - -import android.content.Context; -import android.support.v4.media.session.MediaControllerCompat; -import android.support.v4.media.session.MediaSessionCompat; -import androidx.annotation.NonNull; -import androidx.media2.common.SessionPlayer; -import androidx.media2.common.SessionPlayer.PlayerResult; -import androidx.media2.session.MediaSession; -import androidx.test.core.app.ApplicationProvider; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.platform.app.InstrumentationRegistry; -import com.google.android.exoplayer2.ext.media2.test.R; -import com.google.android.exoplayer2.util.Assertions; -import com.google.common.util.concurrent.ListenableFuture; -import java.util.concurrent.CountDownLatch; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** Unit test for {@link MediaSessionUtil} */ -@RunWith(AndroidJUnit4.class) -public class MediaSessionUtilTest { - private static final int PLAYER_STATE_CHANGE_WAIT_TIME_MS = 5_000; - - @Rule public final PlayerTestRule playerTestRule = new PlayerTestRule(); - - @Test - public void getSessionCompatToken_withMediaControllerCompat_returnsValidToken() throws Exception { - Context context = ApplicationProvider.getApplicationContext(); - - SessionPlayerConnector sessionPlayerConnector = playerTestRule.getSessionPlayerConnector(); - MediaSession.SessionCallback sessionCallback = - new SessionCallbackBuilder(context, sessionPlayerConnector).build(); - TestUtils.loadResource(R.raw.audio, sessionPlayerConnector); - ListenableFuture prepareResult = sessionPlayerConnector.prepare(); - CountDownLatch latch = new CountDownLatch(1); - sessionPlayerConnector.registerPlayerCallback( - playerTestRule.getExecutor(), - new SessionPlayer.PlayerCallback() { - @Override - public void onPlayerStateChanged(@NonNull SessionPlayer player, int playerState) { - if (playerState == SessionPlayer.PLAYER_STATE_PLAYING) { - latch.countDown(); - } - } - }); - - MediaSession session2 = - new MediaSession.Builder(context, sessionPlayerConnector) - .setSessionCallback(playerTestRule.getExecutor(), sessionCallback) - .build(); - - InstrumentationRegistry.getInstrumentation() - .runOnMainSync( - () -> { - try { - MediaSessionCompat.Token token = - Assertions.checkNotNull(MediaSessionUtil.getSessionCompatToken(session2)); - MediaControllerCompat controllerCompat = new MediaControllerCompat(context, token); - controllerCompat.getTransportControls().play(); - } catch (Exception e) { - throw new IllegalStateException(e); - } - }); - assertThat(prepareResult.get(PLAYER_STATE_CHANGE_WAIT_TIME_MS, MILLISECONDS).getResultCode()) - .isEqualTo(PlayerResult.RESULT_SUCCESS); - assertThat(latch.await(PLAYER_STATE_CHANGE_WAIT_TIME_MS, MILLISECONDS)).isTrue(); - } -} diff --git a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/MediaSessionUtil.java b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/MediaSessionUtil.java deleted file mode 100644 index e7cc9545b1..0000000000 --- a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/MediaSessionUtil.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2020 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.ext.media2; - -import android.annotation.SuppressLint; -import android.support.v4.media.session.MediaSessionCompat; -import androidx.media2.session.MediaSession; - -/** Utility methods to use {@link MediaSession} with other ExoPlayer modules. */ -public final class MediaSessionUtil { - - /** Gets the {@link MediaSessionCompat.Token} from the {@link MediaSession}. */ - // TODO(b/152764014): Deprecate this API when MediaSession#getSessionCompatToken() is released. - public static MediaSessionCompat.Token getSessionCompatToken(MediaSession mediaSession) { - @SuppressLint("RestrictedApi") - @SuppressWarnings("RestrictTo") - MediaSessionCompat sessionCompat = mediaSession.getSessionCompat(); - return sessionCompat.getSessionToken(); - } - - private MediaSessionUtil() { - // Prevent from instantiation. - } -} diff --git a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.java b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.java index ccb29f8ca6..0415a5cf38 100644 --- a/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.java +++ b/extensions/media2/src/main/java/com/google/android/exoplayer2/ext/media2/SessionPlayerConnector.java @@ -437,8 +437,6 @@ public final class SessionPlayerConnector extends SessionPlayer { /* defaultValueWhenException= */ END_OF_PLAYLIST); } - // TODO(b/147706139): Call super.close() after updating media2-common to 1.1.0 - @SuppressWarnings("MissingSuperCall") @Override public void close() { synchronized (stateLock) { @@ -454,6 +452,7 @@ public final class SessionPlayerConnector extends SessionPlayer { player.close(); return null; }); + super.close(); } // SessionPlayerConnector-specific functions. @@ -559,8 +558,8 @@ public final class SessionPlayerConnector extends SessionPlayer { } } - // TODO: Remove this suppress warnings and call onCurrentMediaItemChanged with a null item - // once AndroidX media2 1.2.0 is released + // TODO(internal b/160846312): Remove this suppress warnings and call onCurrentMediaItemChanged + // with a null item once we depend on media2 1.2.0. @SuppressWarnings("nullness:argument.type.incompatible") private void handlePlaylistChangedOnHandler() { List currentPlaylist = player.getPlaylist(); @@ -578,11 +577,6 @@ public final class SessionPlayerConnector extends SessionPlayer { SessionPlayerConnector.this, currentPlaylist, playlistMetadata); if (notifyCurrentMediaItem) { callback.onCurrentMediaItemChanged(SessionPlayerConnector.this, currentMediaItem); - - // Workaround for MediaSession's issue that current media item change isn't propagated - // to the legacy controllers. - // TODO(b/160846312): Remove this workaround with media2 1.1.0-stable. - callback.onSeekCompleted(SessionPlayerConnector.this, currentPosition); } }); } @@ -597,11 +591,6 @@ public final class SessionPlayerConnector extends SessionPlayer { notifySessionPlayerCallback( callback -> { callback.onCurrentMediaItemChanged(SessionPlayerConnector.this, currentMediaItem); - - // Workaround for MediaSession's issue that current media item change isn't propagated - // to the legacy controllers. - // TODO(b/160846312): Remove this workaround with media2 1.1.0-stable. - callback.onSeekCompleted(SessionPlayerConnector.this, currentPosition); }); } @@ -722,11 +711,6 @@ public final class SessionPlayerConnector extends SessionPlayer { notifySessionPlayerCallback( callback -> { callback.onCurrentMediaItemChanged(SessionPlayerConnector.this, mediaItem); - - // Workaround for MediaSession's issue that current media item change isn't propagated - // to the legacy controllers. - // TODO(b/160846312): Remove this workaround with media2 1.1.0-stable. - callback.onSeekCompleted(SessionPlayerConnector.this, currentPosition); }); } From 125de92989d3369a51c11cc8c6de97dfb0c9c16e Mon Sep 17 00:00:00 2001 From: krocard Date: Wed, 16 Dec 2020 11:06:59 +0000 Subject: [PATCH 15/30] Clarify EventLogger Window log PiperOrigin-RevId: 347789441 --- .../java/com/google/android/exoplayer2/util/EventLogger.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java index a441e81bc4..53afd7a7a3 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/EventLogger.java @@ -179,9 +179,9 @@ public class EventLogger implements AnalyticsListener { " " + "window [" + getTimeString(window.getDurationMs()) - + ", " + + ", seekable=" + window.isSeekable - + ", " + + ", dynamic=" + window.isDynamic + "]"); } From ffa746f3904a72702bd5a0d4434959ed4614f973 Mon Sep 17 00:00:00 2001 From: andrewlewis Date: Wed, 16 Dec 2020 11:17:36 +0000 Subject: [PATCH 16/30] Fix checking imaAdMediaInfo nullness It's intended to log a warning in this case, rather than throw. Issue: #8290 PiperOrigin-RevId: 347790527 --- RELEASENOTES.md | 4 ++++ .../com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 9cb18be33d..5324ba62ed 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -10,6 +10,9 @@ * IMA extension: * Fix a condition where playback can get stuck before an empty ad ([#8205](https://github.com/google/ExoPlayer/issues/8205)). + * Log a warning rather than throwing when reaching the end of the stream + with an ad playing but without ad media info + ([#8290](https://github.com/google/ExoPlayer/issues/8290)). * Text: * Gracefully handle null-terminated subtitle content in Matroska containers. @@ -78,6 +81,7 @@ * Notify onBufferingEnded when the state of origin player becomes `STATE_IDLE` or `STATE_ENDED`. * Allow to remove all playlist items that makes the player reset. + ([#8047](https://github.com/google/ExoPlayer/issues/8047)). ### 2.12.1 (2020-10-23) ### diff --git a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java index 252aa2e396..574fbfa917 100644 --- a/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java +++ b/extensions/ima/src/main/java/com/google/android/exoplayer2/ext/ima/ImaAdsLoader.java @@ -1260,7 +1260,7 @@ public final class ImaAdsLoader && playWhenReady) { ensureSentContentCompleteIfAtEndOfStream(); } else if (imaAdState != IMA_AD_STATE_NONE && playbackState == Player.STATE_ENDED) { - AdMediaInfo adMediaInfo = checkNotNull(imaAdMediaInfo); + @Nullable AdMediaInfo adMediaInfo = imaAdMediaInfo; if (adMediaInfo == null) { Log.w(TAG, "onEnded without ad media info"); } else { From d0e6dec19988becc9ab0ae1e7fe1a8ccdee548c5 Mon Sep 17 00:00:00 2001 From: ibaker Date: Wed, 16 Dec 2020 13:06:31 +0000 Subject: [PATCH 17/30] Fix EPI.seekTo to balance operation acks when seeking during an ad This regression was introduced in https://github.com/google/ExoPlayer/commit/b1e9257de143e9f377895b63868ef47b4fc0eea9 Issue: #8349 PiperOrigin-RevId: 347802049 --- RELEASENOTES.md | 3 +++ .../java/com/google/android/exoplayer2/ExoPlayerImpl.java | 6 ++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 5324ba62ed..c2ee9d6562 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -2,6 +2,9 @@ ### 2.12.3 (???-??-??) ### +* Core library: + * Fix playback issues after seeking during an ad + ([#8349](https://github.com/google/ExoPlayer/issues/8349)). * UI: * Fix issue where pop-up menus belonging to `StyledPlayerControlView` would not be dismissed when tapping outside of the menu area or pressing diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java index 377863a083..17463b3cd1 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImpl.java @@ -601,8 +601,10 @@ import java.util.concurrent.TimeoutException; // general because the midroll ad preceding the seek destination must be played before the // content position can be played, if a different ad is playing at the moment. Log.w(TAG, "seekTo ignored because an ad is playing"); - playbackInfoUpdateListener.onPlaybackInfoUpdate( - new ExoPlayerImplInternal.PlaybackInfoUpdate(playbackInfo)); + ExoPlayerImplInternal.PlaybackInfoUpdate playbackInfoUpdate = + new ExoPlayerImplInternal.PlaybackInfoUpdate(this.playbackInfo); + playbackInfoUpdate.incrementPendingOperationAcks(1); + playbackInfoUpdateListener.onPlaybackInfoUpdate(playbackInfoUpdate); return; } @Player.State From c22fd76b6b53f291b27556e598f9be8d7c9fdeef Mon Sep 17 00:00:00 2001 From: christosts Date: Wed, 16 Dec 2020 16:31:15 +0000 Subject: [PATCH 18/30] HlsPlaylistParser: ignore subtitles without URI Issue: #8323 PiperOrigin-RevId: 347827615 --- .../source/hls/playlist/HlsPlaylistParser.java | 9 ++++++++- .../hls/playlist/HlsMasterPlaylistParserTest.java | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java index fd6efbf445..e6bdb0e03a 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/playlist/HlsPlaylistParser.java @@ -34,6 +34,7 @@ import com.google.android.exoplayer2.source.hls.playlist.HlsMasterPlaylist.Varia import com.google.android.exoplayer2.source.hls.playlist.HlsMediaPlaylist.Segment; import com.google.android.exoplayer2.upstream.ParsingLoadable; import com.google.android.exoplayer2.util.Assertions; +import com.google.android.exoplayer2.util.Log; import com.google.android.exoplayer2.util.MimeTypes; import com.google.android.exoplayer2.util.UriUtil; import com.google.android.exoplayer2.util.Util; @@ -61,6 +62,8 @@ import org.checkerframework.checker.nullness.qual.PolyNull; */ public final class HlsPlaylistParser implements ParsingLoadable.Parser { + private static final String LOG_TAG = "HlsPlaylistParser"; + private static final String PLAYLIST_HEADER = "#EXTM3U"; private static final String TAG_PREFIX = "#EXT"; @@ -480,7 +483,11 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser Date: Thu, 17 Dec 2020 15:25:42 +0000 Subject: [PATCH 19/30] Explicitly fail playback if new format has no sampleMimeType This avoids a NullPointerException later when the format is used. Fixes https://github.com/google/ExoPlayer/issues/8283. PiperOrigin-RevId: 348017149 --- .../android/exoplayer2/mediacodec/MediaCodecRenderer.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java index a2ba72dbc0..4cecf7ce3c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java @@ -1455,6 +1455,11 @@ public abstract class MediaCodecRenderer extends BaseRenderer { protected void onInputFormatChanged(FormatHolder formatHolder) throws ExoPlaybackException { waitingForFirstSampleInFormat = true; Format newFormat = Assertions.checkNotNull(formatHolder.format); + if (newFormat.sampleMimeType == null) { + // If the new format is invalid, it is either a media bug or it is not intended to be played. + // See also https://github.com/google/ExoPlayer/issues/8283. + throw createRendererException(new IllegalArgumentException(), newFormat); + } setSourceDrmSession(formatHolder.drmSession); inputFormat = newFormat; From 2b8cfcf2ec25a0f47e9f77fb901659dcccc747ce Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Wed, 23 Dec 2020 22:51:10 +0000 Subject: [PATCH 20/30] Merge pull request #8357 from TiVo:p-fix-cea708anchor PiperOrigin-RevId: 348440799 --- RELEASENOTES.md | 2 ++ .../google/android/exoplayer2/text/cea/Cea708Decoder.java | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index c2ee9d6562..28d897f904 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -19,6 +19,8 @@ * Text: * Gracefully handle null-terminated subtitle content in Matroska containers. + * Fix CEA-708 anchor positioning + ([#1807](https://github.com/google/ExoPlayer/issues/1807)). * Media2 extension * Make media2-extension depend on AndroidX media2:media2-session:1.1.0 to fix a deadlock while creating PlaybackStateCompat internally. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java b/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java index 8bd46fabdc..56dd4ebef2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea708Decoder.java @@ -1226,18 +1226,18 @@ public final class Cea708Decoder extends CeaDecoder { // | | // 6-----7-----8 @AnchorType int verticalAnchorType; - if (anchorId % 3 == 0) { + if (anchorId / 3 == 0) { verticalAnchorType = Cue.ANCHOR_TYPE_START; - } else if (anchorId % 3 == 1) { + } else if (anchorId / 3 == 1) { verticalAnchorType = Cue.ANCHOR_TYPE_MIDDLE; } else { verticalAnchorType = Cue.ANCHOR_TYPE_END; } // TODO: Add support for right-to-left languages (i.e. where start is on the right). @AnchorType int horizontalAnchorType; - if (anchorId / 3 == 0) { + if (anchorId % 3 == 0) { horizontalAnchorType = Cue.ANCHOR_TYPE_START; - } else if (anchorId / 3 == 1) { + } else if (anchorId % 3 == 1) { horizontalAnchorType = Cue.ANCHOR_TYPE_MIDDLE; } else { horizontalAnchorType = Cue.ANCHOR_TYPE_END; From 858fa26e3a576884a1b8484dab1bb55c75132ef6 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 21 Dec 2020 12:08:44 +0000 Subject: [PATCH 21/30] Force PlayReady license URL The media specifies a URL that uses http rather than https, which the demo app doesn't permit by default. The URL here is the same except it uses https instead. #minor-release PiperOrigin-RevId: 348445571 --- demos/main/src/main/assets/media.exolist.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/demos/main/src/main/assets/media.exolist.json b/demos/main/src/main/assets/media.exolist.json index baa89f11ff..4d9e1df23a 100644 --- a/demos/main/src/main/assets/media.exolist.json +++ b/demos/main/src/main/assets/media.exolist.json @@ -251,7 +251,9 @@ { "name": "Super speed (MP4, H264, PlayReady)", "uri": "https://playready.directtaps.net/smoothstreaming/SSWSS720H264PR/SuperSpeedway_720.ism/Manifest", - "drm_scheme": "playready" + "drm_scheme": "playready", + "drm_license_uri": "https://playready.directtaps.net/pr/svc/rightsmanager.asmx", + "drm_force_default_license_uri": true } ] }, From ca287ba5623a01007067f2bf0692622ff92fefe2 Mon Sep 17 00:00:00 2001 From: olly Date: Wed, 23 Dec 2020 15:36:11 +0000 Subject: [PATCH 22/30] Fix bypass mode when the stream is empty Issue: #8374 PiperOrigin-RevId: 348792965 --- RELEASENOTES.md | 2 ++ .../exoplayer2/mediacodec/BatchBuffer.java | 36 +++++++++---------- .../mediacodec/MediaCodecRenderer.java | 30 +++++++++------- 3 files changed, 37 insertions(+), 31 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 28d897f904..77d8ffc8c7 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -5,6 +5,8 @@ * Core library: * Fix playback issues after seeking during an ad ([#8349](https://github.com/google/ExoPlayer/issues/8349)). + * Fix `MediaCodecRenderer` issue where empty streams would fail to play in + bypass mode ([#8374](https://github.com/google/ExoPlayer/issues/8374)). * UI: * Fix issue where pop-up menus belonging to `StyledPlayerControlView` would not be dismissed when tapping outside of the menu area or pressing diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/BatchBuffer.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/BatchBuffer.java index 3c40fe02d4..f770e92a21 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/BatchBuffer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/BatchBuffer.java @@ -153,26 +153,26 @@ import java.nio.ByteBuffer; } private void putAccessUnit(DecoderInputBuffer accessUnit) { - @Nullable ByteBuffer accessUnitData = accessUnit.data; - if (accessUnitData != null) { - accessUnit.flip(); - ensureSpaceForWrite(accessUnitData.remaining()); - this.data.put(accessUnitData); - } - if (accessUnit.isEndOfStream()) { setFlags(C.BUFFER_FLAG_END_OF_STREAM); - } - if (accessUnit.isDecodeOnly()) { - setFlags(C.BUFFER_FLAG_DECODE_ONLY); - } - if (accessUnit.isKeyFrame()) { - setFlags(C.BUFFER_FLAG_KEY_FRAME); - } - accessUnitCount++; - timeUs = accessUnit.timeUs; - if (accessUnitCount == 1) { // First read of the buffer - firstAccessUnitTimeUs = timeUs; + } else { + timeUs = accessUnit.timeUs; + if (accessUnit.isDecodeOnly()) { + setFlags(C.BUFFER_FLAG_DECODE_ONLY); + } + if (accessUnit.isKeyFrame()) { + setFlags(C.BUFFER_FLAG_KEY_FRAME); + } + @Nullable ByteBuffer accessUnitData = accessUnit.data; + if (accessUnitData != null) { + accessUnit.flip(); + ensureSpaceForWrite(accessUnitData.remaining()); + this.data.put(accessUnitData); + } + accessUnitCount++; + if (accessUnitCount == 1) { + firstAccessUnitTimeUs = timeUs; + } } accessUnit.clear(); } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java index 4cecf7ce3c..75ee7f5c81 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/mediacodec/MediaCodecRenderer.java @@ -450,6 +450,11 @@ public abstract class MediaCodecRenderer extends BaseRenderer { outputStreamStartPositionUs = C.TIME_UNSET; outputStreamOffsetUs = C.TIME_UNSET; bypassBatchBuffer = new BatchBuffer(); + bypassBatchBuffer.ensureSpaceForWrite(/* length= */ 0); + // MediaCodec outputs audio buffers in native endian: + // https://developer.android.com/reference/android/media/MediaCodec#raw-audio-buffers + // and code called from MediaCodecAudioRenderer.processOutputBuffer expects this endianness. + bypassBatchBuffer.data.order(ByteOrder.nativeOrder()); resetCodecStateForRelease(); } @@ -2134,7 +2139,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { * iteration of the rendering loop. * @param elapsedRealtimeUs {@link SystemClock#elapsedRealtime()} in microseconds, measured at the * start of the current iteration of the rendering loop. - * @return If more buffers are ready to be rendered. + * @return Whether immediately calling this method again will make more progress. * @throws ExoPlaybackException If an error occurred while processing a buffer or handling a * format change. */ @@ -2142,7 +2147,7 @@ public abstract class MediaCodecRenderer extends BaseRenderer { throws ExoPlaybackException { BatchBuffer batchBuffer = bypassBatchBuffer; - // Let's process the pending buffer if any. + // Process any data in the batch buffer. checkState(!outputStreamEnded); if (!batchBuffer.isEmpty()) { // Optimisation: Do not process buffer if empty. if (processOutputBuffer( @@ -2157,12 +2162,13 @@ public abstract class MediaCodecRenderer extends BaseRenderer { batchBuffer.isDecodeOnly(), batchBuffer.isEndOfStream(), outputFormat)) { - // Buffer completely processed onProcessedOutputBuffer(batchBuffer.getLastAccessUnitTimeUs()); } else { - return false; // Could not process buffer, let's try later. + // Could not process the whole buffer. Try again later. + return false; } } + // Process the end of stream, if it has been reached. if (batchBuffer.isEndOfStream()) { outputStreamEnded = true; return false; @@ -2197,19 +2203,17 @@ public abstract class MediaCodecRenderer extends BaseRenderer { onInputFormatChanged(formatHolder); } + boolean haveDataToProcess = false; if (batchBuffer.isEndOfStream()) { inputStreamEnded = true; + haveDataToProcess = true; + } + if (!batchBuffer.isEmpty()) { + batchBuffer.flip(); + haveDataToProcess = true; } - if (batchBuffer.isEmpty()) { - return false; // The buffer could not be filled, there is nothing more to do. - } - batchBuffer.flip(); // Buffer at least partially full, it can now be processed. - // MediaCodec outputs buffers in native endian: - // https://developer.android.com/reference/android/media/MediaCodec#raw-audio-buffers - // and code called from processOutputBuffer expects this endianness. - batchBuffer.data.order(ByteOrder.nativeOrder()); - return true; + return haveDataToProcess; } /** From edc5b83929cab66aa2f554bcd4058538e52eb187 Mon Sep 17 00:00:00 2001 From: olly Date: Tue, 5 Jan 2021 15:18:28 +0000 Subject: [PATCH 23/30] Fix DownloadManager assertion failure Issue: #8419 PiperOrigin-RevId: 350134719 --- RELEASENOTES.md | 6 +- .../exoplayer2/offline/DownloadManager.java | 34 ++++++----- .../offline/DownloadManagerTest.java | 58 +++++++++++++++++++ 3 files changed, 81 insertions(+), 17 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 77d8ffc8c7..f7177f9fe7 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -12,6 +12,10 @@ would not be dismissed when tapping outside of the menu area or pressing the back button, on API level 22 and earlier ([#8272](https://github.com/google/ExoPlayer/issues/8272)). +* Downloads: + * Fix crash in `DownloadManager` that could occur when adding a stopped + download with the same ID as a download currently being removed + ([#8419](https://github.com/google/ExoPlayer/issues/8419)). * IMA extension: * Fix a condition where playback can get stuck before an empty ad ([#8205](https://github.com/google/ExoPlayer/issues/8205)). @@ -147,7 +151,7 @@ ([#7378](https://github.com/google/ExoPlayer/issues/7378)). * Downloads: Fix issue retrying progressive downloads, which could also result in a crash in `DownloadManager.InternalHandler.onContentLengthChanged` - ([#8078](https://github.com/google/ExoPlayer/issues/8078). + ([#8078](https://github.com/google/ExoPlayer/issues/8078)). * HLS: Fix crash affecting chunkful preparation of master playlists that start with an I-FRAME only variant ([#8025](https://github.com/google/ExoPlayer/issues/8025)). diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java index b6228025cf..a989e2575f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DownloadManager.java @@ -856,7 +856,7 @@ public final class DownloadManager { private void setStopReason(Download download, int stopReason) { if (stopReason == STOP_REASON_NONE) { if (download.state == STATE_STOPPED) { - putDownloadWithState(download, STATE_QUEUED); + putDownloadWithState(download, STATE_QUEUED, STOP_REASON_NONE); } } else if (stopReason != download.stopReason) { @Download.State int state = download.state; @@ -910,7 +910,7 @@ public final class DownloadManager { Log.e(TAG, "Failed to remove nonexistent download: " + id); return; } - putDownloadWithState(download, STATE_REMOVING); + putDownloadWithState(download, STATE_REMOVING, STOP_REASON_NONE); syncTasks(); } @@ -924,10 +924,11 @@ public final class DownloadManager { Log.e(TAG, "Failed to load downloads."); } for (int i = 0; i < downloads.size(); i++) { - downloads.set(i, copyDownloadWithState(downloads.get(i), STATE_REMOVING)); + downloads.set(i, copyDownloadWithState(downloads.get(i), STATE_REMOVING, STOP_REASON_NONE)); } for (int i = 0; i < terminalDownloads.size(); i++) { - downloads.add(copyDownloadWithState(terminalDownloads.get(i), STATE_REMOVING)); + downloads.add( + copyDownloadWithState(terminalDownloads.get(i), STATE_REMOVING, STOP_REASON_NONE)); } Collections.sort(downloads, InternalHandler::compareStartTimes); try { @@ -1019,7 +1020,7 @@ public final class DownloadManager { } // We can start a download task. - download = putDownloadWithState(download, STATE_DOWNLOADING); + download = putDownloadWithState(download, STATE_DOWNLOADING, STOP_REASON_NONE); Downloader downloader = downloaderFactory.createDownloader(download.request); activeTask = new Task( @@ -1041,7 +1042,7 @@ public final class DownloadManager { Task activeTask, Download download, int accumulatingDownloadTaskCount) { Assertions.checkState(!activeTask.isRemove); if (!canDownloadsRun() || accumulatingDownloadTaskCount >= maxParallelDownloads) { - putDownloadWithState(download, STATE_QUEUED); + putDownloadWithState(download, STATE_QUEUED, STOP_REASON_NONE); activeTask.cancel(/* released= */ false); } } @@ -1161,8 +1162,9 @@ public final class DownloadManager { private void onRemoveTaskStopped(Download download) { if (download.state == STATE_RESTARTING) { - putDownloadWithState( - download, download.stopReason == STOP_REASON_NONE ? STATE_QUEUED : STATE_STOPPED); + @Download.State + int state = download.stopReason == STOP_REASON_NONE ? STATE_QUEUED : STATE_STOPPED; + putDownloadWithState(download, state, download.stopReason); syncTasks(); } else { int removeIndex = getDownloadIndex(download.request.id); @@ -1204,12 +1206,11 @@ public final class DownloadManager { return !downloadsPaused && notMetRequirements == 0; } - private Download putDownloadWithState(Download download, @Download.State int state) { - // Downloads in terminal states shouldn't be in the downloads list. This method cannot be used - // to set STATE_STOPPED either, because it doesn't have a stopReason argument. - Assertions.checkState( - state != STATE_COMPLETED && state != STATE_FAILED && state != STATE_STOPPED); - return putDownload(copyDownloadWithState(download, state)); + private Download putDownloadWithState( + Download download, @Download.State int state, int stopReason) { + // Downloads in terminal states shouldn't be in the downloads list. + Assertions.checkState(state != STATE_COMPLETED && state != STATE_FAILED); + return putDownload(copyDownloadWithState(download, state, stopReason)); } private Download putDownload(Download download) { @@ -1267,14 +1268,15 @@ public final class DownloadManager { return C.INDEX_UNSET; } - private static Download copyDownloadWithState(Download download, @Download.State int state) { + private static Download copyDownloadWithState( + Download download, @Download.State int state, int stopReason) { return new Download( download.request, state, download.startTimeMs, /* updateTimeMs= */ System.currentTimeMillis(), download.contentLength, - /* stopReason= */ 0, + stopReason, FAILURE_REASON_NONE, download.progress); } diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java index d5959584ad..4dd80b6c7c 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java @@ -582,6 +582,64 @@ public class DownloadManagerTest { assertThat(download2.state).isEqualTo(Download.STATE_REMOVING); } + @Test + public void addDownload_whilstRemovingWithStopReason_addsStartedDownload() throws Throwable { + runOnMainThread( + () -> downloadManager.addDownload(createDownloadRequest(ID1), /* stopReason= */ 1234)); + + postRemoveRequest(ID1); + FakeDownloader downloadRemover = getDownloaderAt(0); + downloadRemover.assertRemoveStarted(); + + // Re-add the download without a stop reason. + postDownloadRequest(ID1); + + downloadRemover.finish(); + + FakeDownloader downloader = getDownloaderAt(1); + downloader.finish(); + + assertDownloadIndexSize(1); + // We expect one downloader for the removal, and one for when the download was re-added. + assertDownloaderCount(2); + // The download has completed, and so is no longer current. + assertCurrentDownloadCount(0); + + Download download = postGetDownloadIndex().getDownload(ID1); + assertThat(download.state).isEqualTo(Download.STATE_COMPLETED); + assertThat(download.stopReason).isEqualTo(0); + } + + /** Test for https://github.com/google/ExoPlayer/issues/8419 */ + @Test + public void addDownloadWithStopReason_whilstRemoving_addsStoppedDownload() throws Throwable { + postDownloadRequest(ID1); + getDownloaderAt(0).finish(); + + postRemoveRequest(ID1); + FakeDownloader downloadRemover = getDownloaderAt(1); + downloadRemover.assertRemoveStarted(); + + // Re-add the download with a stop reason. + runOnMainThread( + () -> downloadManager.addDownload(createDownloadRequest(ID1), /* stopReason= */ 1234)); + + downloadRemover.finish(); + + assertDownloadIndexSize(1); + // We expect one downloader for the initial download, and one for the removal. A downloader + // should not be created when the download is re-added, since a stop reason is specified. + assertDownloaderCount(2); + // The download isn't completed, and is therefore still current. + assertCurrentDownloadCount(1); + + List downloads = postGetCurrentDownloads(); + Download download = downloads.get(0); + assertThat(download.request.id).isEqualTo(ID1); + assertThat(download.state).isEqualTo(Download.STATE_STOPPED); + assertThat(download.stopReason).isEqualTo(1234); + } + @Test public void mergeRequest_removing_becomesRestarting() { DownloadRequest downloadRequest = createDownloadRequest(ID1); From 6b8927962c037e414f56fbbe8471ae6c3264c4e0 Mon Sep 17 00:00:00 2001 From: krocard Date: Thu, 7 Jan 2021 14:28:48 +0000 Subject: [PATCH 24/30] Enable setOutputSurface workaround for Xiaomi Mi Box S Reported by https://github.com/google/ExoPlayer/issues/8329. PiperOrigin-RevId: 350547523 --- .../android/exoplayer2/video/MediaCodecVideoRenderer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java index 0f6ea28ed9..8da7866d0c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/video/MediaCodecVideoRenderer.java @@ -1577,16 +1577,18 @@ public class MediaCodecVideoRenderer extends MediaCodecRenderer { private static boolean evaluateDeviceNeedsSetOutputSurfaceWorkaround() { if (Util.SDK_INT <= 28) { - // Workaround for MiTV devices which have been observed broken up to API 28. + // Workaround for MiTV and MiBox devices which have been observed broken up to API 28. // https://github.com/google/ExoPlayer/issues/5169, // https://github.com/google/ExoPlayer/issues/6899. // https://github.com/google/ExoPlayer/issues/8014. + // https://github.com/google/ExoPlayer/issues/8329. switch (Util.DEVICE) { case "dangal": case "dangalUHD": case "dangalFHD": case "magnolia": case "machuca": + case "oneday": return true; default: break; // Do nothing. From 3db269812a6d8dc9b52985b9cebde785a61d54de Mon Sep 17 00:00:00 2001 From: christosts Date: Fri, 8 Jan 2021 13:29:02 +0000 Subject: [PATCH 25/30] Synchronize initialization of DefaultDownloadIndex There is a race condition when initializing the downloads database. The constructor of the DownloadManager kicks-off the database initialization in its internal thread, but at the same time an app can try to access the database directly through the manager's download index, e.g. doing DonwloadManager manager = new ... manager.getDownloadIndex().getDownload("id"); might enter DefaultDownloadIndex.ensureInitialized() from two threads. When upgrading the downloads table from version 2 to version 3, the first thread that enters the database transaction in ensureInitialized() will drop and recreate the table using the v3 schema. Then, the second thread will attempt to read from the newly created table using the v2 schema, which will fail. This race condition was not introduced in 2.12 but was there already. However, prior to 2.12, the code only dropped and re-created and the table and did not attempt to read any data. Hence, if the race condition happened, the code would drop and create the table twice, but no error would occur. Issue: #8420 #minor-release PiperOrigin-RevId: 350745463 --- .../offline/DefaultDownloadIndex.java | 58 ++++++++++--------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloadIndex.java b/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloadIndex.java index d9a060fe2d..3a18d4da10 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloadIndex.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/offline/DefaultDownloadIndex.java @@ -21,6 +21,7 @@ import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.net.Uri; +import androidx.annotation.GuardedBy; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import com.google.android.exoplayer2.database.DatabaseIOException; @@ -136,7 +137,9 @@ public final class DefaultDownloadIndex implements WritableDownloadIndex { private final String name; private final String tableName; private final DatabaseProvider databaseProvider; + private final Object initializationLock; + @GuardedBy("initializationLock") private boolean initialized; /** @@ -168,6 +171,7 @@ public final class DefaultDownloadIndex implements WritableDownloadIndex { this.name = name; this.databaseProvider = databaseProvider; tableName = TABLE_PREFIX + name; + initializationLock = new Object(); } @Override @@ -273,33 +277,35 @@ public final class DefaultDownloadIndex implements WritableDownloadIndex { } private void ensureInitialized() throws DatabaseIOException { - if (initialized) { - return; - } - try { - SQLiteDatabase readableDatabase = databaseProvider.getReadableDatabase(); - int version = VersionTable.getVersion(readableDatabase, VersionTable.FEATURE_OFFLINE, name); - if (version != TABLE_VERSION) { - SQLiteDatabase writableDatabase = databaseProvider.getWritableDatabase(); - writableDatabase.beginTransactionNonExclusive(); - try { - VersionTable.setVersion( - writableDatabase, VersionTable.FEATURE_OFFLINE, name, TABLE_VERSION); - List upgradedDownloads = - version == 2 ? loadDownloadsFromVersion2(writableDatabase) : new ArrayList<>(); - writableDatabase.execSQL("DROP TABLE IF EXISTS " + tableName); - writableDatabase.execSQL("CREATE TABLE " + tableName + " " + TABLE_SCHEMA); - for (Download download : upgradedDownloads) { - putDownloadInternal(download, writableDatabase); - } - writableDatabase.setTransactionSuccessful(); - } finally { - writableDatabase.endTransaction(); - } + synchronized (initializationLock) { + if (initialized) { + return; + } + try { + SQLiteDatabase readableDatabase = databaseProvider.getReadableDatabase(); + int version = VersionTable.getVersion(readableDatabase, VersionTable.FEATURE_OFFLINE, name); + if (version != TABLE_VERSION) { + SQLiteDatabase writableDatabase = databaseProvider.getWritableDatabase(); + writableDatabase.beginTransactionNonExclusive(); + try { + VersionTable.setVersion( + writableDatabase, VersionTable.FEATURE_OFFLINE, name, TABLE_VERSION); + List upgradedDownloads = + version == 2 ? loadDownloadsFromVersion2(writableDatabase) : new ArrayList<>(); + writableDatabase.execSQL("DROP TABLE IF EXISTS " + tableName); + writableDatabase.execSQL("CREATE TABLE " + tableName + " " + TABLE_SCHEMA); + for (Download download : upgradedDownloads) { + putDownloadInternal(download, writableDatabase); + } + writableDatabase.setTransactionSuccessful(); + } finally { + writableDatabase.endTransaction(); + } + } + initialized = true; + } catch (SQLException e) { + throw new DatabaseIOException(e); } - initialized = true; - } catch (SQLException e) { - throw new DatabaseIOException(e); } } From c5df90b1ece73ff79fa6ce82ce169542f595ffae Mon Sep 17 00:00:00 2001 From: ibaker Date: Fri, 8 Jan 2021 15:30:10 +0000 Subject: [PATCH 26/30] Propagate LoadErrorHandlingPolicy to SingleSampleMediaSource.Factory I think this was missed when integrating DefaultMediaSourceFactory with SingleSampleMediaSource.Factory in https://github.com/google/ExoPlayer/commit/315ba6f324b03ef651773a3bdb43386dcb1281ca Issue: #8430 PiperOrigin-RevId: 350759580 --- RELEASENOTES.md | 5 +++++ .../android/exoplayer2/source/DefaultMediaSourceFactory.java | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f7177f9fe7..fc4915cd11 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -7,6 +7,11 @@ ([#8349](https://github.com/google/ExoPlayer/issues/8349)). * Fix `MediaCodecRenderer` issue where empty streams would fail to play in bypass mode ([#8374](https://github.com/google/ExoPlayer/issues/8374)). + * Fix propagation of `LoadErrorHandlingPolicy` from + `DefaultMediaSourceFactory` into `SingleSampleMediaSource.Factory` when + creating subtitle media sources from + `MediaItem.playbackProperties.subtitles` + ([#8430](https://github.com/google/ExoPlayer/issues/8430)). * UI: * Fix issue where pop-up menus belonging to `StyledPlayerControlView` would not be dismissed when tapping outside of the menu area or pressing diff --git a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java index 8f85a0ac17..b3955d50c3 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/source/DefaultMediaSourceFactory.java @@ -251,7 +251,8 @@ public final class DefaultMediaSourceFactory implements MediaSourceFactory { MediaSource[] mediaSources = new MediaSource[subtitles.size() + 1]; mediaSources[0] = mediaSource; SingleSampleMediaSource.Factory singleSampleSourceFactory = - new SingleSampleMediaSource.Factory(dataSourceFactory); + new SingleSampleMediaSource.Factory(dataSourceFactory) + .setLoadErrorHandlingPolicy(loadErrorHandlingPolicy); for (int i = 0; i < subtitles.size(); i++) { mediaSources[i + 1] = singleSampleSourceFactory.createMediaSource( From 9add3c764ebe50f8780394cf4e805bc8472538cc Mon Sep 17 00:00:00 2001 From: olly Date: Fri, 8 Jan 2021 17:54:05 +0000 Subject: [PATCH 27/30] Fix flaky DownloadManager test PiperOrigin-RevId: 350782940 --- .../exoplayer2/offline/DownloadManagerTest.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java index 4dd80b6c7c..da78da6af2 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java @@ -24,6 +24,8 @@ import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.offline.DownloadManager.Listener; +import com.google.android.exoplayer2.robolectric.TestDownloadManagerListener; import com.google.android.exoplayer2.scheduler.Requirements; import com.google.android.exoplayer2.testutil.DownloadBuilder; import com.google.android.exoplayer2.testutil.DummyMainThread; @@ -621,11 +623,23 @@ public class DownloadManagerTest { downloadRemover.assertRemoveStarted(); // Re-add the download with a stop reason. + ConditionVariable downloadManagerIdleCondition = new ConditionVariable(); runOnMainThread( - () -> downloadManager.addDownload(createDownloadRequest(ID1), /* stopReason= */ 1234)); + () -> { + downloadManager.addListener( + new Listener() { + @Override + public void onIdle(DownloadManager downloadManager) { + downloadManagerIdleCondition.open(); + } + }); + downloadManager.addDownload(createDownloadRequest(ID1), /* stopReason= */ 1234); + }); downloadRemover.finish(); + assertThat(downloadManagerIdleCondition.block(TIMEOUT_MS)).isTrue(); + assertDownloadIndexSize(1); // We expect one downloader for the initial download, and one for the removal. A downloader // should not be created when the download is re-added, since a stop reason is specified. From ee5423d0530c474c0d0d5d6b37ee9ec04ce452f3 Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Mon, 11 Jan 2021 15:00:05 +0000 Subject: [PATCH 28/30] Simplify comment #minor-release PiperOrigin-RevId: 351144857 --- .../com/google/android/exoplayer2/ExoPlayerImplInternal.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java index e33b93ac0e..38d57ac0bc 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/ExoPlayerImplInternal.java @@ -1762,8 +1762,8 @@ import java.util.concurrent.atomic.AtomicBoolean; } } if (shouldContinueLoading) { - // We should still be loading, except in the case that it's no longer possible (i.e., because - // we've loaded the current playlist to the end). + // We should still be loading, except when there is nothing to load or we have fully loaded + // the current period. shouldContinueLoading = isLoadingPossible(); updateIsLoading(); } else { From 206e46e542e1ca0cc56e0da0a7dfd34e48b705f5 Mon Sep 17 00:00:00 2001 From: olly Date: Mon, 11 Jan 2021 16:25:08 +0000 Subject: [PATCH 29/30] DownloadManagerTest: Address remaining flakiness #minor-release PiperOrigin-RevId: 351158541 --- .../offline/DownloadManagerTest.java | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java index da78da6af2..927d17bead 100644 --- a/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java +++ b/library/core/src/test/java/com/google/android/exoplayer2/offline/DownloadManagerTest.java @@ -24,7 +24,6 @@ import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import com.google.android.exoplayer2.C; -import com.google.android.exoplayer2.offline.DownloadManager.Listener; import com.google.android.exoplayer2.robolectric.TestDownloadManagerListener; import com.google.android.exoplayer2.scheduler.Requirements; import com.google.android.exoplayer2.testutil.DownloadBuilder; @@ -600,6 +599,7 @@ public class DownloadManagerTest { FakeDownloader downloader = getDownloaderAt(1); downloader.finish(); + assertCompleted(ID1); assertDownloadIndexSize(1); // We expect one downloader for the removal, and one for when the download was re-added. @@ -617,28 +617,18 @@ public class DownloadManagerTest { public void addDownloadWithStopReason_whilstRemoving_addsStoppedDownload() throws Throwable { postDownloadRequest(ID1); getDownloaderAt(0).finish(); + assertCompleted(ID1); postRemoveRequest(ID1); FakeDownloader downloadRemover = getDownloaderAt(1); downloadRemover.assertRemoveStarted(); // Re-add the download with a stop reason. - ConditionVariable downloadManagerIdleCondition = new ConditionVariable(); runOnMainThread( - () -> { - downloadManager.addListener( - new Listener() { - @Override - public void onIdle(DownloadManager downloadManager) { - downloadManagerIdleCondition.open(); - } - }); - downloadManager.addDownload(createDownloadRequest(ID1), /* stopReason= */ 1234); - }); + () -> downloadManager.addDownload(createDownloadRequest(ID1), /* stopReason= */ 1234)); downloadRemover.finish(); - - assertThat(downloadManagerIdleCondition.block(TIMEOUT_MS)).isTrue(); + downloadManagerListener.blockUntilIdle(); assertDownloadIndexSize(1); // We expect one downloader for the initial download, and one for the removal. A downloader From e9237bcb0f9951cfdb75e3a571a8b1e5c53ad43b Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 11 Jan 2021 17:27:52 +0000 Subject: [PATCH 30/30] Bump version to 2.12.3 PiperOrigin-RevId: 351169686 --- RELEASENOTES.md | 28 +++++++++---------- constants.gradle | 4 +-- .../exoplayer2/ExoPlayerLibraryInfo.java | 6 ++-- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index fc4915cd11..cfa9686a7e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -1,12 +1,12 @@ # Release notes -### 2.12.3 (???-??-??) ### +### 2.12.3 (2021-01-13) ### * Core library: - * Fix playback issues after seeking during an ad - ([#8349](https://github.com/google/ExoPlayer/issues/8349)). * Fix `MediaCodecRenderer` issue where empty streams would fail to play in bypass mode ([#8374](https://github.com/google/ExoPlayer/issues/8374)). + * Fix playback issues after seeking during an ad + ([#8349](https://github.com/google/ExoPlayer/issues/8349)). * Fix propagation of `LoadErrorHandlingPolicy` from `DefaultMediaSourceFactory` into `SingleSampleMediaSource.Factory` when creating subtitle media sources from @@ -18,21 +18,21 @@ the back button, on API level 22 and earlier ([#8272](https://github.com/google/ExoPlayer/issues/8272)). * Downloads: - * Fix crash in `DownloadManager` that could occur when adding a stopped - download with the same ID as a download currently being removed - ([#8419](https://github.com/google/ExoPlayer/issues/8419)). -* IMA extension: - * Fix a condition where playback can get stuck before an empty ad - ([#8205](https://github.com/google/ExoPlayer/issues/8205)). - * Log a warning rather than throwing when reaching the end of the stream - with an ad playing but without ad media info - ([#8290](https://github.com/google/ExoPlayer/issues/8290)). + * Fix crash in `DownloadManager` that could occur when adding a stopped + download with the same ID as a download currently being removed + ([#8419](https://github.com/google/ExoPlayer/issues/8419)). * Text: * Gracefully handle null-terminated subtitle content in Matroska containers. * Fix CEA-708 anchor positioning ([#1807](https://github.com/google/ExoPlayer/issues/1807)). -* Media2 extension +* IMA extension: + * Fix a condition where playback could get stuck before an empty ad + ([#8205](https://github.com/google/ExoPlayer/issues/8205)). + * Log a warning rather than throwing when reaching the end of the stream + with an ad playing but without ad media info + ([#8290](https://github.com/google/ExoPlayer/issues/8290)). +* Media2 extension: * Make media2-extension depend on AndroidX media2:media2-session:1.1.0 to fix a deadlock while creating PlaybackStateCompat internally. ([#8011](https://github.com/google/ExoPlayer/issues/8011)). @@ -96,7 +96,7 @@ * Media2 extension: * Notify onBufferingEnded when the state of origin player becomes `STATE_IDLE` or `STATE_ENDED`. - * Allow to remove all playlist items that makes the player reset. + * Allow to remove all playlist items that makes the player reset ([#8047](https://github.com/google/ExoPlayer/issues/8047)). ### 2.12.1 (2020-10-23) ### diff --git a/constants.gradle b/constants.gradle index 769f595b6d..50ce661b9a 100644 --- a/constants.gradle +++ b/constants.gradle @@ -13,8 +13,8 @@ // limitations under the License. project.ext { // ExoPlayer version and version code. - releaseVersion = '2.12.2' - releaseVersionCode = 2012002 + releaseVersion = '2.12.3' + releaseVersionCode = 2012003 minSdkVersion = 16 appTargetSdkVersion = 29 targetSdkVersion = 28 // TODO: Bump once b/143232359 is resolved. Also fix TODOs in UtilTest. diff --git a/library/common/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java b/library/common/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java index 0caa3d50df..aadf3bd0a4 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/ExoPlayerLibraryInfo.java @@ -30,11 +30,11 @@ public final class ExoPlayerLibraryInfo { /** The version of the library expressed as a string, for example "1.2.3". */ // Intentionally hardcoded. Do not derive from other constants (e.g. VERSION_INT) or vice versa. - public static final String VERSION = "2.12.2"; + public static final String VERSION = "2.12.3"; /** The version of the library expressed as {@code "ExoPlayerLib/" + VERSION}. */ // Intentionally hardcoded. Do not derive from other constants (e.g. VERSION) or vice versa. - public static final String VERSION_SLASHY = "ExoPlayerLib/2.12.2"; + public static final String VERSION_SLASHY = "ExoPlayerLib/2.12.3"; /** * The version of the library expressed as an integer, for example 1002003. @@ -44,7 +44,7 @@ public final class ExoPlayerLibraryInfo { * integer version 123045006 (123-045-006). */ // Intentionally hardcoded. Do not derive from other constants (e.g. VERSION) or vice versa. - public static final int VERSION_INT = 2012002; + public static final int VERSION_INT = 2012003; /** The default user agent for requests made by the library. */ public static final String DEFAULT_USER_AGENT =