Merge pull request #9576 from TiVo:p-fix-duration-round
PiperOrigin-RevId: 406839109
This commit is contained in:
parent
f67ec8973c
commit
8cefb845df
@ -48,6 +48,7 @@ import java.io.BufferedReader;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
import java.math.BigDecimal;
|
||||||
import java.util.ArrayDeque;
|
import java.util.ArrayDeque;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
@ -759,8 +760,7 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
|
|||||||
parseStringAttr(line, REGEX_VALUE, variableDefinitions));
|
parseStringAttr(line, REGEX_VALUE, variableDefinitions));
|
||||||
}
|
}
|
||||||
} else if (line.startsWith(TAG_MEDIA_DURATION)) {
|
} else if (line.startsWith(TAG_MEDIA_DURATION)) {
|
||||||
segmentDurationUs =
|
segmentDurationUs = parseTimeSecondsToUs(line, REGEX_MEDIA_DURATION);
|
||||||
(long) (parseDoubleAttr(line, REGEX_MEDIA_DURATION) * C.MICROS_PER_SECOND);
|
|
||||||
segmentTitle = parseOptionalStringAttr(line, REGEX_MEDIA_TITLE, "", variableDefinitions);
|
segmentTitle = parseOptionalStringAttr(line, REGEX_MEDIA_TITLE, "", variableDefinitions);
|
||||||
} else if (line.startsWith(TAG_SKIP)) {
|
} else if (line.startsWith(TAG_SKIP)) {
|
||||||
int skippedSegmentCount = parseIntAttr(line, REGEX_SKIPPED_SEGMENTS);
|
int skippedSegmentCount = parseIntAttr(line, REGEX_SKIPPED_SEGMENTS);
|
||||||
@ -1202,6 +1202,12 @@ public final class HlsPlaylistParser implements ParsingLoadable.Parser<HlsPlayli
|
|||||||
return defaultValue;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static long parseTimeSecondsToUs(String line, Pattern pattern) throws ParserException {
|
||||||
|
String timeValueSeconds = parseStringAttr(line, pattern, Collections.emptyMap());
|
||||||
|
BigDecimal timeValue = new BigDecimal(timeValueSeconds);
|
||||||
|
return timeValue.multiply(new BigDecimal(C.MICROS_PER_SECOND)).longValue();
|
||||||
|
}
|
||||||
|
|
||||||
private static double parseDoubleAttr(String line, Pattern pattern) throws ParserException {
|
private static double parseDoubleAttr(String line, Pattern pattern) throws ParserException {
|
||||||
return Double.parseDouble(parseStringAttr(line, pattern, Collections.emptyMap()));
|
return Double.parseDouble(parseStringAttr(line, pattern, Collections.emptyMap()));
|
||||||
}
|
}
|
||||||
|
@ -77,6 +77,10 @@ public class HlsMediaPlaylistParserTest {
|
|||||||
+ "\n"
|
+ "\n"
|
||||||
+ "#EXTINF:7.975,\n"
|
+ "#EXTINF:7.975,\n"
|
||||||
+ "https://priv.example.com/fileSequence2683.ts\n"
|
+ "https://priv.example.com/fileSequence2683.ts\n"
|
||||||
|
+ "\n"
|
||||||
|
// 2.002 tests correct rounding, see https://github.com/google/ExoPlayer/issues/9575.
|
||||||
|
+ "#EXTINF:2.002,\n"
|
||||||
|
+ "https://priv.example.com/fileSequence2684.ts\n"
|
||||||
+ "#EXT-X-ENDLIST";
|
+ "#EXT-X-ENDLIST";
|
||||||
InputStream inputStream = new ByteArrayInputStream(Util.getUtf8Bytes(playlistString));
|
InputStream inputStream = new ByteArrayInputStream(Util.getUtf8Bytes(playlistString));
|
||||||
HlsPlaylist playlist = new HlsPlaylistParser().parse(playlistUri, inputStream);
|
HlsPlaylist playlist = new HlsPlaylistParser().parse(playlistUri, inputStream);
|
||||||
@ -93,7 +97,7 @@ public class HlsMediaPlaylistParserTest {
|
|||||||
assertThat(mediaPlaylist.partTargetDurationUs).isEqualTo(C.TIME_UNSET);
|
assertThat(mediaPlaylist.partTargetDurationUs).isEqualTo(C.TIME_UNSET);
|
||||||
List<Segment> segments = mediaPlaylist.segments;
|
List<Segment> segments = mediaPlaylist.segments;
|
||||||
assertThat(segments).isNotNull();
|
assertThat(segments).isNotNull();
|
||||||
assertThat(segments).hasSize(5);
|
assertThat(segments).hasSize(6);
|
||||||
|
|
||||||
Segment segment = segments.get(0);
|
Segment segment = segments.get(0);
|
||||||
assertThat(mediaPlaylist.discontinuitySequence + segment.relativeDiscontinuitySequence)
|
assertThat(mediaPlaylist.discontinuitySequence + segment.relativeDiscontinuitySequence)
|
||||||
@ -152,6 +156,9 @@ public class HlsMediaPlaylistParserTest {
|
|||||||
assertThat(segment.byteRangeLength).isEqualTo(C.LENGTH_UNSET);
|
assertThat(segment.byteRangeLength).isEqualTo(C.LENGTH_UNSET);
|
||||||
assertThat(segment.byteRangeOffset).isEqualTo(0);
|
assertThat(segment.byteRangeOffset).isEqualTo(0);
|
||||||
assertThat(segment.url).isEqualTo("https://priv.example.com/fileSequence2683.ts");
|
assertThat(segment.url).isEqualTo("https://priv.example.com/fileSequence2683.ts");
|
||||||
|
|
||||||
|
segment = segments.get(5);
|
||||||
|
assertThat(segment.durationUs).isEqualTo(2002000);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@ -389,7 +396,7 @@ public class HlsMediaPlaylistParserTest {
|
|||||||
.parse(playlistUri, inputStream);
|
.parse(playlistUri, inputStream);
|
||||||
|
|
||||||
assertThat(playlist.segments).hasSize(3);
|
assertThat(playlist.segments).hasSize(3);
|
||||||
assertThat(playlist.segments.get(1).relativeStartTimeUs).isEqualTo(4000079);
|
assertThat(playlist.segments.get(1).relativeStartTimeUs).isEqualTo(4000080);
|
||||||
assertThat(previousPlaylist.segments.get(0).relativeDiscontinuitySequence).isEqualTo(0);
|
assertThat(previousPlaylist.segments.get(0).relativeDiscontinuitySequence).isEqualTo(0);
|
||||||
assertThat(previousPlaylist.segments.get(1).relativeDiscontinuitySequence).isEqualTo(1);
|
assertThat(previousPlaylist.segments.get(1).relativeDiscontinuitySequence).isEqualTo(1);
|
||||||
assertThat(previousPlaylist.segments.get(2).relativeDiscontinuitySequence).isEqualTo(1);
|
assertThat(previousPlaylist.segments.get(2).relativeDiscontinuitySequence).isEqualTo(1);
|
||||||
@ -448,12 +455,12 @@ public class HlsMediaPlaylistParserTest {
|
|||||||
assertThat(playlist.segments.get(0).parts.get(0).relativeDiscontinuitySequence).isEqualTo(1);
|
assertThat(playlist.segments.get(0).parts.get(0).relativeDiscontinuitySequence).isEqualTo(1);
|
||||||
assertThat(playlist.segments.get(0).parts.get(1).relativeStartTimeUs).isEqualTo(2000000);
|
assertThat(playlist.segments.get(0).parts.get(1).relativeStartTimeUs).isEqualTo(2000000);
|
||||||
assertThat(playlist.segments.get(0).parts.get(1).relativeDiscontinuitySequence).isEqualTo(1);
|
assertThat(playlist.segments.get(0).parts.get(1).relativeDiscontinuitySequence).isEqualTo(1);
|
||||||
assertThat(playlist.segments.get(1).relativeStartTimeUs).isEqualTo(4000079);
|
assertThat(playlist.segments.get(1).relativeStartTimeUs).isEqualTo(4000080);
|
||||||
assertThat(playlist.segments.get(1).parts.get(0).relativeStartTimeUs).isEqualTo(4000079);
|
assertThat(playlist.segments.get(1).parts.get(0).relativeStartTimeUs).isEqualTo(4000080);
|
||||||
assertThat(playlist.segments.get(1).parts.get(1).relativeDiscontinuitySequence).isEqualTo(1);
|
assertThat(playlist.segments.get(1).parts.get(1).relativeDiscontinuitySequence).isEqualTo(1);
|
||||||
assertThat(playlist.segments.get(1).parts.get(1).relativeStartTimeUs).isEqualTo(6000079);
|
assertThat(playlist.segments.get(1).parts.get(1).relativeStartTimeUs).isEqualTo(6000080);
|
||||||
assertThat(playlist.segments.get(1).parts.get(1).relativeDiscontinuitySequence).isEqualTo(1);
|
assertThat(playlist.segments.get(1).parts.get(1).relativeDiscontinuitySequence).isEqualTo(1);
|
||||||
assertThat(playlist.trailingParts.get(0).relativeStartTimeUs).isEqualTo(8000158);
|
assertThat(playlist.trailingParts.get(0).relativeStartTimeUs).isEqualTo(8000160);
|
||||||
assertThat(playlist.trailingParts.get(0).relativeDiscontinuitySequence).isEqualTo(1);
|
assertThat(playlist.trailingParts.get(0).relativeDiscontinuitySequence).isEqualTo(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user