Skip to content

Commit

Permalink
Update stale TrackSelections in chunk sources when keeping the streams.
Browse files Browse the repository at this point in the history
If we keep streams in chunk sources after selecting new tracks, we also keep
a reference to a stale disabled TrackSelection object. Fix this by updating
the TrackSelection object when keeping the stream. The static part of the
selection (i.e. the subset of selected tracks) stays the same in all cases.

Issue:#6256
PiperOrigin-RevId: 261696082
  • Loading branch information
tonihei authored and ojw28 committed Aug 5, 2019
1 parent 936a778 commit d1ac272
Show file tree
Hide file tree
Showing 10 changed files with 61 additions and 19 deletions.
3 changes: 3 additions & 0 deletions RELEASENOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@
* Fix issue when calling `performClick` on `PlayerView` without
`PlayerControlView`
([#6260](https://github.com/google/ExoPlayer/issues/6260)).
* Fix issue where playback speeds are not used in adaptive track selections
after manual selection changes for other renderers
([#6256](https://github.com/google/ExoPlayer/issues/6256)).

### 2.10.3 ###

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,13 +106,16 @@ default List<StreamKey> getStreamKeys(List<TrackSelection> trackSelections) {
* Performs a track selection.
*
* <p>The call receives track {@code selections} for each renderer, {@code mayRetainStreamFlags}
* indicating whether the existing {@code SampleStream} can be retained for each selection, and
* indicating whether the existing {@link SampleStream} can be retained for each selection, and
* the existing {@code stream}s themselves. The call will update {@code streams} to reflect the
* provided selections, clearing, setting and replacing entries as required. If an existing sample
* stream is retained but with the requirement that the consuming renderer be reset, then the
* corresponding flag in {@code streamResetFlags} will be set to true. This flag will also be set
* if a new sample stream is created.
*
* <p>Note that previously received {@link TrackSelection TrackSelections} are no longer valid and
* references need to be replaced even if the corresponding {@link SampleStream} is kept.
*
* <p>This method is only called after the period has been prepared.
*
* @param selections The renderer track selections.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,11 @@ DashChunkSource createDashChunkSource(
* @param newManifest The new manifest.
*/
void updateManifest(DashManifest newManifest, int periodIndex);

/**
* Updates the track selection.
*
* @param trackSelection The new track selection instance. Must be equivalent to the previous one.
*/
void updateTrackSelection(TrackSelection trackSelection);
}
Original file line number Diff line number Diff line change
Expand Up @@ -402,17 +402,27 @@ private void selectNewStreams(
int[] streamIndexToTrackGroupIndex) {
// Create newly selected primary and event streams.
for (int i = 0; i < selections.length; i++) {
if (streams[i] == null && selections[i] != null) {
TrackSelection selection = selections[i];
if (selection == null) {
continue;
}
if (streams[i] == null) {
// Create new stream for selection.
streamResetFlags[i] = true;
int trackGroupIndex = streamIndexToTrackGroupIndex[i];
TrackGroupInfo trackGroupInfo = trackGroupInfos[trackGroupIndex];
if (trackGroupInfo.trackGroupCategory == TrackGroupInfo.CATEGORY_PRIMARY) {
streams[i] = buildSampleStream(trackGroupInfo, selections[i], positionUs);
streams[i] = buildSampleStream(trackGroupInfo, selection, positionUs);
} else if (trackGroupInfo.trackGroupCategory == TrackGroupInfo.CATEGORY_MANIFEST_EVENTS) {
EventStream eventStream = eventStreams.get(trackGroupInfo.eventStreamGroupIndex);
Format format = selections[i].getTrackGroup().getFormat(0);
Format format = selection.getTrackGroup().getFormat(0);
streams[i] = new EventSampleStream(eventStream, format, manifest.dynamic);
}
} else if (streams[i] instanceof ChunkSampleStream) {
// Update selection in existing stream.
@SuppressWarnings("unchecked")
ChunkSampleStream<DashChunkSource> stream = (ChunkSampleStream<DashChunkSource>) streams[i];
stream.getChunkSource().updateTrackSelection(selection);
}
}
// Create newly selected embedded streams from the corresponding primary stream. Note that this
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,6 @@ public DashChunkSource createDashChunkSource(

private final LoaderErrorThrower manifestLoaderErrorThrower;
private final int[] adaptationSetIndices;
private final TrackSelection trackSelection;
private final int trackType;
private final DataSource dataSource;
private final long elapsedRealtimeOffsetMs;
Expand All @@ -120,6 +119,7 @@ public DashChunkSource createDashChunkSource(

protected final RepresentationHolder[] representationHolders;

private TrackSelection trackSelection;
private DashManifest manifest;
private int periodIndex;
private IOException fatalError;
Expand Down Expand Up @@ -222,6 +222,11 @@ public void updateManifest(DashManifest newManifest, int newPeriodIndex) {
}
}

@Override
public void updateTrackSelection(TrackSelection trackSelection) {
this.trackSelection = trackSelection;
}

@Override
public void maybeThrowError() throws IOException {
if (fatalError != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,17 +183,15 @@ public TrackGroup getTrackGroup() {
}

/**
* Selects tracks for use.
* Sets the current track selection.
*
* @param trackSelection The track selection.
* @param trackSelection The {@link TrackSelection}.
*/
public void selectTracks(TrackSelection trackSelection) {
public void setTrackSelection(TrackSelection trackSelection) {
this.trackSelection = trackSelection;
}

/**
* Returns the current track selection.
*/
/** Returns the current {@link TrackSelection}. */
public TrackSelection getTrackSelection() {
return trackSelection;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -292,14 +292,17 @@ public boolean selectTracks(TrackSelection[] selections, boolean[] mayRetainStre
TrackSelection primaryTrackSelection = oldPrimaryTrackSelection;
// Select new tracks.
for (int i = 0; i < selections.length; i++) {
if (streams[i] == null && selections[i] != null) {
TrackSelection selection = selections[i];
if (selection == null) {
continue;
}
int trackGroupIndex = trackGroups.indexOf(selection.getTrackGroup());
if (trackGroupIndex == primaryTrackGroupIndex) {
primaryTrackSelection = selection;
chunkSource.setTrackSelection(selection);
}
if (streams[i] == null) {
enabledTrackGroupCount++;
TrackSelection selection = selections[i];
int trackGroupIndex = trackGroups.indexOf(selection.getTrackGroup());
if (trackGroupIndex == primaryTrackGroupIndex) {
primaryTrackSelection = selection;
chunkSource.selectTracks(selection);
}
streams[i] = new HlsSampleStream(this, trackGroupIndex);
streamResetFlags[i] = true;
if (trackGroupToSampleQueueIndex != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,10 @@ public SsChunkSource createChunkSource(

private final LoaderErrorThrower manifestLoaderErrorThrower;
private final int streamElementIndex;
private final TrackSelection trackSelection;
private final ChunkExtractorWrapper[] extractorWrappers;
private final DataSource dataSource;

private TrackSelection trackSelection;
private SsManifest manifest;
private int currentManifestChunkOffset;

Expand Down Expand Up @@ -155,6 +155,11 @@ public void updateManifest(SsManifest newManifest) {
manifest = newManifest;
}

@Override
public void updateTrackSelection(TrackSelection trackSelection) {
this.trackSelection = trackSelection;
}

// ChunkSource implementation.

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,11 @@ SsChunkSource createChunkSource(
* @param newManifest The new manifest.
*/
void updateManifest(SsManifest newManifest);

/**
* Updates the track selection.
*
* @param trackSelection The new track selection instance. Must be equivalent to the previous one.
*/
void updateTrackSelection(TrackSelection trackSelection);
}
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ public long selectTracks(TrackSelection[] selections, boolean[] mayRetainStreamF
stream.release();
streams[i] = null;
} else {
stream.getChunkSource().updateTrackSelection(selections[i]);
sampleStreamsList.add(stream);
}
}
Expand Down

0 comments on commit d1ac272

Please sign in to comment.