mirror of
https://github.com/androidx/media.git
synced 2025-05-08 08:00:49 +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);
|
/* partIndex */ C.INDEX_UNSET);
|
||||||
}
|
}
|
||||||
long targetPositionInPlaylistUs = targetPositionInPeriodUs - startOfPlaylistInPeriodUs;
|
long targetPositionInPlaylistUs = targetPositionInPeriodUs - startOfPlaylistInPeriodUs;
|
||||||
long mediaSequence =
|
int segmentIndexInPlaylist =
|
||||||
Util.binarySearchFloor(
|
Util.binarySearchFloor(
|
||||||
mediaPlaylist.segments,
|
mediaPlaylist.segments,
|
||||||
/* value= */ targetPositionInPlaylistUs,
|
/* value= */ targetPositionInPlaylistUs,
|
||||||
/* inclusive= */ true,
|
/* inclusive= */ true,
|
||||||
/* stayInBounds= */ !playlistTracker.isLive() || previous == null)
|
/* stayInBounds= */ !playlistTracker.isLive() || previous == null);
|
||||||
+ mediaPlaylist.mediaSequence;
|
long mediaSequence = segmentIndexInPlaylist + mediaPlaylist.mediaSequence;
|
||||||
return new Pair<>(mediaSequence, /* partIndex */ C.INDEX_UNSET);
|
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.
|
// If loading has not completed, we return the previous chunk again.
|
||||||
return (previous.isLoadCompleted()
|
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);
|
(long) (parseDoubleAttr(line, REGEX_ATTR_DURATION) * C.MICROS_PER_SECOND);
|
||||||
boolean isIndependent =
|
boolean isIndependent =
|
||||||
parseOptionalBooleanAttribute(line, REGEX_INDEPENDENT, /* defaultValue= */ false);
|
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);
|
boolean isGap = parseOptionalBooleanAttribute(line, REGEX_GAP, /* defaultValue= */ false);
|
||||||
@Nullable
|
@Nullable
|
||||||
String byteRange = parseOptionalStringAttr(line, REGEX_ATTR_BYTERANGE, variableDefinitions);
|
String byteRange = parseOptionalStringAttr(line, REGEX_ATTR_BYTERANGE, variableDefinitions);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user