Use parts when choosing next chunk after track change

Issue: #5011
PiperOrigin-RevId: 346080748
This commit is contained in:
bachinger 2020-12-07 14:39:20 +00:00 committed by Ian Baker
parent 6796c4d01c
commit 734565a83c
2 changed files with 29 additions and 7 deletions

View File

@ -700,14 +700,34 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull;
/* partIndex */ C.INDEX_UNSET);
}
long targetPositionInPlaylistUs = targetPositionInPeriodUs - startOfPlaylistInPeriodUs;
long mediaSequence =
int segmentIndexInPlaylist =
Util.binarySearchFloor(
mediaPlaylist.segments,
/* value= */ targetPositionInPlaylistUs,
/* inclusive= */ true,
/* stayInBounds= */ !playlistTracker.isLive() || previous == null)
+ mediaPlaylist.mediaSequence;
return new Pair<>(mediaSequence, /* partIndex */ C.INDEX_UNSET);
mediaPlaylist.segments,
/* value= */ targetPositionInPlaylistUs,
/* inclusive= */ true,
/* stayInBounds= */ !playlistTracker.isLive() || previous == null);
long mediaSequence = segmentIndexInPlaylist + mediaPlaylist.mediaSequence;
int partIndex = C.INDEX_UNSET;
if (segmentIndexInPlaylist >= 0) {
// In case we are inside the live window, we try to pick a part if available.
Segment segment = mediaPlaylist.segments.get(segmentIndexInPlaylist);
List<HlsMediaPlaylist.Part> parts =
targetPositionInPlaylistUs < segment.relativeStartTimeUs + segment.durationUs
? segment.parts
: mediaPlaylist.trailingParts;
for (int i = 0; i < parts.size(); i++) {
HlsMediaPlaylist.Part part = parts.get(i);
if (targetPositionInPlaylistUs < part.relativeStartTimeUs + part.durationUs) {
if (part.isIndependent) {
partIndex = i;
// Increase media sequence by one if the part is a trailing part.
mediaSequence += parts == mediaPlaylist.trailingParts ? 1 : 0;
}
break;
}
}
}
return new Pair<>(mediaSequence, partIndex);
}
// If loading has not completed, we return the previous chunk again.
return (previous.isLoadCompleted()

View File

@ -839,6 +839,8 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
(long) (parseDoubleAttr(line, REGEX_ATTR_DURATION) * C.MICROS_PER_SECOND);
boolean isIndependent =
parseOptionalBooleanAttribute(line, REGEX_INDEPENDENT, /* defaultValue= */ false);
// The first part of a segment is always independent if the segments are independent.
isIndependent |= hasIndependentSegmentsTag && trailingParts.isEmpty();
boolean isGap = parseOptionalBooleanAttribute(line, REGEX_GAP, /* defaultValue= */ false);
@Nullable
String byteRange = parseOptionalStringAttr(line, REGEX_ATTR_BYTERANGE, variableDefinitions);