diff --git a/library/core/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java b/library/core/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java index 6847c9cbe2..2a61e7dd15 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/extractor/mp4/Mp4Extractor.java @@ -401,21 +401,27 @@ public final class Mp4Extractor implements Extractor, SeekMap { for (int i = 0; i < trackCount; i++) { TrackSampleTable trackSampleTable = trackSampleTables.get(i); Track track = trackSampleTable.track; + long trackDurationUs = + track.durationUs != C.TIME_UNSET ? track.durationUs : trackSampleTable.durationUs; + durationUs = Math.max(durationUs, trackDurationUs); Mp4Track mp4Track = new Mp4Track(track, trackSampleTable, extractorOutput.track(i, track.type)); + // Each sample has up to three bytes of overhead for the start code that replaces its length. // Allow ten source samples per output sample, like the platform extractor. int maxInputSize = trackSampleTable.maximumSize + 3 * 10; Format format = track.format.copyWithMaxInputSize(maxInputSize); + if (track.type == C.TRACK_TYPE_VIDEO + && trackDurationUs > 0 + && trackSampleTable.sampleCount > 1) { + float frameRate = trackSampleTable.sampleCount / (trackDurationUs / 1000000f); + format = format.copyWithFrameRate(frameRate); + } format = MetadataUtil.getFormatWithMetadata( track.type, format, udtaMetadata, mdtaMetadata, gaplessInfoHolder); mp4Track.trackOutput.format(format); - durationUs = - Math.max( - durationUs, - track.durationUs != C.TIME_UNSET ? track.durationUs : trackSampleTable.durationUs); if (track.type == C.TRACK_TYPE_VIDEO && firstVideoTrackIndex == C.INDEX_UNSET) { firstVideoTrackIndex = tracks.size(); } diff --git a/library/core/src/test/assets/mp4/sample.mp4.0.dump b/library/core/src/test/assets/mp4/sample.mp4.0.dump index b05d8250ab..37e1054f79 100644 --- a/library/core/src/test/assets/mp4/sample.mp4.0.dump +++ b/library/core/src/test/assets/mp4/sample.mp4.0.dump @@ -12,7 +12,7 @@ track 0: maxInputSize = 36722 width = 1080 height = 720 - frameRate = -1.0 + frameRate = 29.970028 rotationDegrees = 0 pixelWidthHeightRatio = 1.0 channelCount = -1 diff --git a/library/core/src/test/assets/mp4/sample.mp4.1.dump b/library/core/src/test/assets/mp4/sample.mp4.1.dump index 84d86f8ccf..6284e85034 100644 --- a/library/core/src/test/assets/mp4/sample.mp4.1.dump +++ b/library/core/src/test/assets/mp4/sample.mp4.1.dump @@ -12,7 +12,7 @@ track 0: maxInputSize = 36722 width = 1080 height = 720 - frameRate = -1.0 + frameRate = 29.970028 rotationDegrees = 0 pixelWidthHeightRatio = 1.0 channelCount = -1 diff --git a/library/core/src/test/assets/mp4/sample.mp4.2.dump b/library/core/src/test/assets/mp4/sample.mp4.2.dump index 9bbe8caa01..15b56a036f 100644 --- a/library/core/src/test/assets/mp4/sample.mp4.2.dump +++ b/library/core/src/test/assets/mp4/sample.mp4.2.dump @@ -12,7 +12,7 @@ track 0: maxInputSize = 36722 width = 1080 height = 720 - frameRate = -1.0 + frameRate = 29.970028 rotationDegrees = 0 pixelWidthHeightRatio = 1.0 channelCount = -1 diff --git a/library/core/src/test/assets/mp4/sample.mp4.3.dump b/library/core/src/test/assets/mp4/sample.mp4.3.dump index f210f277b3..073d5c774a 100644 --- a/library/core/src/test/assets/mp4/sample.mp4.3.dump +++ b/library/core/src/test/assets/mp4/sample.mp4.3.dump @@ -12,7 +12,7 @@ track 0: maxInputSize = 36722 width = 1080 height = 720 - frameRate = -1.0 + frameRate = 29.970028 rotationDegrees = 0 pixelWidthHeightRatio = 1.0 channelCount = -1