diff --git a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java index 1a3417b426a..6ae634ebb8e 100644 --- a/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java +++ b/libraries/exoplayer_hls/src/main/java/androidx/media3/exoplayer/hls/HlsSampleStreamWrapper.java @@ -1392,23 +1392,31 @@ private void buildTracksFromSampleStreams() { Format sampleFormat = Assertions.checkStateNotNull(sampleQueues[i].getUpstreamFormat()); if (i == primaryExtractorTrackIndex) { Format[] formats = new Format[chunkSourceTrackCount]; - if (chunkSourceTrackCount == 1) { - formats[0] = sampleFormat.withManifestFormatInfo(chunkSourceTrackGroup.getFormat(0)); - } else { - for (int j = 0; j < chunkSourceTrackCount; j++) { - formats[j] = deriveFormat(chunkSourceTrackGroup.getFormat(j), sampleFormat, true); + for (int j = 0; j < chunkSourceTrackCount; j++) { + Format playlistFormat = chunkSourceTrackGroup.getFormat(j); + if (primaryExtractorTrackType == C.TRACK_TYPE_AUDIO && muxedAudioFormat != null) { + playlistFormat = playlistFormat.withManifestFormatInfo(muxedAudioFormat); } + // If there's only a single variant (chunkSourceTrackCount == 1) then we can safely + // retain all fields from sampleFormat. Else we need to use deriveFormat to retain only + // the fields that will be the same for all variants. + formats[j] = + chunkSourceTrackCount == 1 + ? sampleFormat.withManifestFormatInfo(playlistFormat) + : deriveFormat(playlistFormat, sampleFormat, /* propagateBitrates= */ true); } trackGroups[i] = new TrackGroup(formats); primaryTrackGroupIndex = i; } else { @Nullable - Format trackFormat = + Format playlistFormat = primaryExtractorTrackType == C.TRACK_TYPE_VIDEO && MimeTypes.isAudio(sampleFormat.sampleMimeType) ? muxedAudioFormat : null; - trackGroups[i] = new TrackGroup(deriveFormat(trackFormat, sampleFormat, false)); + trackGroups[i] = + new TrackGroup( + deriveFormat(playlistFormat, sampleFormat, /* propagateBitrates= */ false)); } } this.trackGroups = createTrackGroupArrayWithDrmInfo(trackGroups); @@ -1496,8 +1504,12 @@ private static int getTrackTypeScore(int trackType) { * sample format that may have been obtained from a chunk belonging to a different track in the * same track group. * + *

Note: Since the sample format may have been obtained from a chunk belonging to a different + * track, it should not be used as a source for data that may vary between tracks. + * * @param playlistFormat The format information obtained from the master playlist. - * @param sampleFormat The format information obtained from the samples. + * @param sampleFormat The format information obtained from samples within a chunk. The chunk may + * belong to a different track in the same track group. * @param propagateBitrates Whether the bitrates from the playlist format should be included in * the derived format. * @return The derived track format.