Don't crash updating a representation without an index.

This commit is contained in:
Oliver Woodman 2015-09-01 14:13:22 +01:00
parent ebeafe23c0
commit d5f8d1a1b1

View File

@ -788,30 +788,30 @@ public class DashChunkSource implements ChunkSource {
public void updateRepresentation(Representation newRepresentation) public void updateRepresentation(Representation newRepresentation)
throws BehindLiveWindowException{ throws BehindLiveWindowException{
DashSegmentIndex oldIndex = segmentIndex; DashSegmentIndex oldIndex = representation.getIndex();
DashSegmentIndex newIndex = newRepresentation.getIndex();
representation = newRepresentation;
if (newIndex == null) {
return;
}
segmentIndex = newIndex;
int oldIndexLastSegmentNum = oldIndex.getLastSegmentNum(); int oldIndexLastSegmentNum = oldIndex.getLastSegmentNum();
long oldIndexEndTimeUs = oldIndex.getTimeUs(oldIndexLastSegmentNum) long oldIndexEndTimeUs = oldIndex.getTimeUs(oldIndexLastSegmentNum)
+ oldIndex.getDurationUs(oldIndexLastSegmentNum); + oldIndex.getDurationUs(oldIndexLastSegmentNum);
DashSegmentIndex newIndex = newRepresentation.getIndex();
int newIndexFirstSegmentNum = newIndex.getFirstSegmentNum(); int newIndexFirstSegmentNum = newIndex.getFirstSegmentNum();
long newIndexStartTimeUs = newIndex.getTimeUs(newIndexFirstSegmentNum); long newIndexStartTimeUs = newIndex.getTimeUs(newIndexFirstSegmentNum);
int segmentNumShift;
if (oldIndexEndTimeUs == newIndexStartTimeUs) { if (oldIndexEndTimeUs == newIndexStartTimeUs) {
// The new manifest continues where the old one ended, with no overlap. // The new manifest continues where the old one ended, with no overlap.
segmentNumShift = oldIndex.getLastSegmentNum() + 1 - newIndexFirstSegmentNum; segmentNumShift += oldIndex.getLastSegmentNum() + 1 - newIndexFirstSegmentNum;
} else if (oldIndexEndTimeUs < newIndexStartTimeUs) { } else if (oldIndexEndTimeUs < newIndexStartTimeUs) {
// There's a gap between the old manifest and the new one which means we've slipped // There's a gap between the old manifest and the new one which means we've slipped
// behind the live window and can't proceed. // behind the live window and can't proceed.
throw new BehindLiveWindowException(); throw new BehindLiveWindowException();
} else { } else {
// The new manifest overlaps with the old one. // The new manifest overlaps with the old one.
segmentNumShift = oldIndex.getSegmentNum(newIndexStartTimeUs) - newIndexFirstSegmentNum; segmentNumShift += oldIndex.getSegmentNum(newIndexStartTimeUs) - newIndexFirstSegmentNum;
} }
representation = newRepresentation;
segmentIndex = newIndex;
this.segmentNumShift += segmentNumShift;
} }
public int getSegmentNum(long positionUs) { public int getSegmentNum(long positionUs) {