mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Add workaround for unmatched track indices in tkhd and tfhd.
If there is only one track, we can assume that both boxes refer to the same track even if the track indices don't match. Issue:#4083 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=203485872
This commit is contained in:
parent
3b70d1d889
commit
2c00be1aa3
@ -78,6 +78,9 @@
|
||||
* Add workaround for track index mismatches between trex and tkhd boxes in
|
||||
fragmented MP4 files
|
||||
([#4477](https://github.com/google/ExoPlayer/issues/4477)).
|
||||
* Add workaround for track index mismatches between tfhd and tkhd boxes in
|
||||
fragmented MP4 files
|
||||
([#4083](https://github.com/google/ExoPlayer/issues/4083)).
|
||||
|
||||
### 2.8.2 ###
|
||||
|
||||
|
@ -654,7 +654,7 @@ public final class FragmentedMp4Extractor implements Extractor {
|
||||
private static void parseTraf(ContainerAtom traf, SparseArray<TrackBundle> trackBundleArray,
|
||||
@Flags int flags, byte[] extendedTypeScratch) throws ParserException {
|
||||
LeafAtom tfhd = traf.getLeafAtomOfType(Atom.TYPE_tfhd);
|
||||
TrackBundle trackBundle = parseTfhd(tfhd.data, trackBundleArray, flags);
|
||||
TrackBundle trackBundle = parseTfhd(tfhd.data, trackBundleArray);
|
||||
if (trackBundle == null) {
|
||||
return;
|
||||
}
|
||||
@ -805,13 +805,13 @@ public final class FragmentedMp4Extractor implements Extractor {
|
||||
* @return The {@link TrackBundle} to which the {@link TrackFragment} belongs, or null if the tfhd
|
||||
* does not refer to any {@link TrackBundle}.
|
||||
*/
|
||||
private static TrackBundle parseTfhd(ParsableByteArray tfhd,
|
||||
SparseArray<TrackBundle> trackBundles, int flags) {
|
||||
private static TrackBundle parseTfhd(
|
||||
ParsableByteArray tfhd, SparseArray<TrackBundle> trackBundles) {
|
||||
tfhd.setPosition(Atom.HEADER_SIZE);
|
||||
int fullAtom = tfhd.readInt();
|
||||
int atomFlags = Atom.parseFullAtomFlags(fullAtom);
|
||||
int trackId = tfhd.readInt();
|
||||
TrackBundle trackBundle = trackBundles.get((flags & FLAG_SIDELOADED) == 0 ? trackId : 0);
|
||||
TrackBundle trackBundle = getTrackBundle(trackBundles, trackId);
|
||||
if (trackBundle == null) {
|
||||
return null;
|
||||
}
|
||||
@ -836,6 +836,17 @@ public final class FragmentedMp4Extractor implements Extractor {
|
||||
return trackBundle;
|
||||
}
|
||||
|
||||
private static @Nullable TrackBundle getTrackBundle(
|
||||
SparseArray<TrackBundle> trackBundles, int trackId) {
|
||||
if (trackBundles.size() == 1) {
|
||||
// Ignore track id if there is only one track. This is either because we have a side-loaded
|
||||
// track (flag FLAG_SIDELOADED) or to cope with non-matching track indices (see
|
||||
// https://github.com/google/ExoPlayer/issues/4083).
|
||||
return trackBundles.valueAt(/* index= */ 0);
|
||||
}
|
||||
return trackBundles.get(trackId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a tfdt atom (defined in 14496-12).
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user