mirror of
https://github.com/androidx/media.git
synced 2025-05-07 15:40:37 +08:00
Use parts when choosing next chunk after track change
Issue: #5011 PiperOrigin-RevId: 346080748
This commit is contained in:
parent
6796c4d01c
commit
734565a83c
@ -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()
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user