Commit 6799d6da by Oliver Woodman

Fixed issue where calling valueAt on a SparseArray with an index greater than…

Fixed issue where calling valueAt on a SparseArray with an index greater than the size of the SparseArray would sometimes return the class' internal DELETED object and cause a ClassCastException.
parent 7bf1d891
...@@ -714,16 +714,14 @@ public class DashChunkSource implements ChunkSource { ...@@ -714,16 +714,14 @@ public class DashChunkSource implements ChunkSource {
return periodHolders.valueAt(0); return periodHolders.valueAt(0);
} }
for (int i = 0; i < periodHolders.size(); i++) { for (int i = 0; i < periodHolders.size() - 1; i++) {
PeriodHolder periodHolder = periodHolders.valueAt(i); PeriodHolder periodHolder = periodHolders.valueAt(i);
if (positionUs >= periodHolder.getAvailableStartTimeUs() if (positionUs < periodHolder.getAvailableEndTimeUs()) {
&& (periodHolder.isIndexUnbounded()
|| positionUs < periodHolder.getAvailableEndTimeUs())) {
return periodHolder; return periodHolder;
} }
} }
// if positionUs is after the last period, return the last period // positionUs is within or after the last period
return periodHolders.valueAt(periodHolders.size() - 1); return periodHolders.valueAt(periodHolders.size() - 1);
} }
...@@ -731,6 +729,7 @@ public class DashChunkSource implements ChunkSource { ...@@ -731,6 +729,7 @@ public class DashChunkSource implements ChunkSource {
Period firstPeriod = manifest.periods.get(0); Period firstPeriod = manifest.periods.get(0);
while (periodHolders.size() > 0 while (periodHolders.size() > 0
&& periodHolders.valueAt(0).startTimeUs < firstPeriod.startMs * 1000) { && periodHolders.valueAt(0).startTimeUs < firstPeriod.startMs * 1000) {
// this existing period is no longer on the manifest, we need to remove it
PeriodHolder periodHolder = periodHolders.valueAt(0); PeriodHolder periodHolder = periodHolders.valueAt(0);
// TODO: a better call would be periodHolders.removeAt(0), but that was added in // TODO: a better call would be periodHolders.removeAt(0), but that was added in
// API 11 and this project currently uses API 9; if that changes, we should switch // API 11 and this project currently uses API 9; if that changes, we should switch
...@@ -738,7 +737,6 @@ public class DashChunkSource implements ChunkSource { ...@@ -738,7 +737,6 @@ public class DashChunkSource implements ChunkSource {
periodHolders.remove(periodHolder.manifestIndex); periodHolders.remove(periodHolder.manifestIndex);
} }
int periodIndex = 0;
for (int i = 0; i < manifest.periods.size(); i++) { for (int i = 0; i < manifest.periods.size(); i++) {
Period period = manifest.periods.get(i); Period period = manifest.periods.get(i);
AdaptationSet adaptationSet = period.adaptationSets.get(adaptationSetIndex); AdaptationSet adaptationSet = period.adaptationSets.get(adaptationSetIndex);
...@@ -754,13 +752,9 @@ public class DashChunkSource implements ChunkSource { ...@@ -754,13 +752,9 @@ public class DashChunkSource implements ChunkSource {
} }
} }
PeriodHolder periodHolder = periodHolders.valueAt(periodIndex); if (i < periodHolders.size()) {
if (periodHolder == null) { // this is an existing period, we need to update it
long periodStartUs = period.startMs * 1000; PeriodHolder periodHolder = periodHolders.valueAt(i);
periodHolder = new PeriodHolder(periodHolderNextIndex, periodStartUs, newRepresentations);
periodHolders.put(periodHolderNextIndex, periodHolder);
periodHolderNextIndex++;
} else {
for (int j = 0; j < newRepresentations.length; j++) { for (int j = 0; j < newRepresentations.length; j++) {
RepresentationHolder representationHolder = RepresentationHolder representationHolder =
periodHolder.representationHolders.get(newRepresentations[j].format.id); periodHolder.representationHolders.get(newRepresentations[j].format.id);
...@@ -771,8 +765,14 @@ public class DashChunkSource implements ChunkSource { ...@@ -771,8 +765,14 @@ public class DashChunkSource implements ChunkSource {
return; return;
} }
} }
} else {
// this is a new period, we need to add it
long periodStartUs = period.startMs * 1000;
PeriodHolder periodHolder = new PeriodHolder(periodHolderNextIndex, periodStartUs,
newRepresentations);
periodHolders.put(periodHolderNextIndex, periodHolder);
periodHolderNextIndex++;
} }
periodIndex++;
} }
currentManifest = manifest; currentManifest = manifest;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment