Seek to start position when reusing the last used shared period

The last used shared media period is reused after all media periods have been
released. In case the sample streams are already filled up, they need to be
reset or they download samples from the current position up to the seek
position. This causes long buffering states or load stuck exceptions.

A seek when reusing the shared period takes care for reseting the period or
internally seeks to the current position in the already available samples.

#minor-release

PiperOrigin-RevId: 428484187
This commit is contained in:
bachinger 2022-02-14 13:48:56 +00:00 committed by Ian Baker
parent 6048ca2faa
commit 28b8ae7076

View File

@ -264,10 +264,12 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource
public MediaPeriod createPeriod(MediaPeriodId id, Allocator allocator, long startPositionUs) {
@Nullable SharedMediaPeriod sharedPeriod = null;
Pair<Long, Object> sharedMediaPeriodKey = new Pair<>(id.windowSequenceNumber, id.periodUid);
boolean reusedSharedPeriod = false;
if (lastUsedMediaPeriod != null) {
if (lastUsedMediaPeriod.periodUid.equals(id.periodUid)) {
sharedPeriod = lastUsedMediaPeriod;
mediaPeriods.put(sharedMediaPeriodKey, sharedPeriod);
reusedSharedPeriod = true;
} else {
lastUsedMediaPeriod.release(mediaSource);
}
@ -298,6 +300,9 @@ public final class ServerSideAdInsertionMediaSource extends BaseMediaSource
new MediaPeriodImpl(
sharedPeriod, id, createEventDispatcher(id), createDrmEventDispatcher(id));
sharedPeriod.add(mediaPeriod);
if (reusedSharedPeriod && sharedPeriod.trackSelections.length > 0) {
mediaPeriod.seekToUs(startPositionUs);
}
return mediaPeriod;
}