diff --git a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/silence.dump b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/silence.dump index ebb6465175..fb912f428d 100644 --- a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/silence.dump +++ b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/silence.dump @@ -280,8 +280,8 @@ sample: presentationTimeUs = 998458 sample: trackType = audio - dataHashCode = -873373951 - size = 4232 + dataHashCode = -1506281855 + size = 4236 isKeyFrame = true presentationTimeUs = 1000000 sample: diff --git a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/silence_48000hz.dump b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/silence_48000hz.dump index 1733c93d3e..97ad292fc0 100644 --- a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/silence_48000hz.dump +++ b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample.mp4/silence_48000hz.dump @@ -280,8 +280,8 @@ sample: presentationTimeUs = 998437 sample: trackType = audio - dataHashCode = -1577850751 - size = 4604 + dataHashCode = 1020903425 + size = 4608 isKeyFrame = true presentationTimeUs = 1000000 sample: @@ -289,7 +289,7 @@ sample: dataHashCode = 923521 size = 4 isKeyFrame = true - presentationTimeUs = 1023979 + presentationTimeUs = 1024000 sample: trackType = video dataHashCode = -770308242 diff --git a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample_18byte_nclx_colr.mp4/silence.dump b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample_18byte_nclx_colr.mp4/silence.dump index cb3541e9ad..b05e083a41 100644 --- a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample_18byte_nclx_colr.mp4/silence.dump +++ b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample_18byte_nclx_colr.mp4/silence.dump @@ -283,8 +283,8 @@ sample: presentationTimeUs = 998458 sample: trackType = audio - dataHashCode = 799574529 - size = 176 + dataHashCode = -1268670079 + size = 180 isKeyFrame = true presentationTimeUs = 1000000 sample: diff --git a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample_twos_pcm.mp4/silence.dump b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample_twos_pcm.mp4/silence.dump index debc6b9e33..139cf8d4bc 100644 --- a/libraries/test_data/src/test/assets/transformerdumps/mp4/sample_twos_pcm.mp4/silence.dump +++ b/libraries/test_data/src/test/assets/transformerdumps/mp4/sample_twos_pcm.mp4/silence.dump @@ -292,8 +292,8 @@ sample: presentationTimeUs = 1044897 sample: trackType = audio - dataHashCode = -2019986431 - size = 3680 + dataHashCode = 1976404865 + size = 3684 isKeyFrame = true presentationTimeUs = 1068117 sample: diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultAudioMixer.java b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultAudioMixer.java index 6b977aa844..8439729083 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultAudioMixer.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/DefaultAudioMixer.java @@ -133,10 +133,7 @@ public final class DefaultAudioMixer implements AudioMixer { endTimeUs >= mixerStartTimeUs, "End time must be at least the configured start time."); endPosition = - Util.scaleLargeTimestamp( - endTimeUs - mixerStartTimeUs, - /* multiplier= */ outputAudioFormat.sampleRate, - /* divisor= */ C.MICROS_PER_SECOND); + Util.durationUsToSampleCount(endTimeUs - mixerStartTimeUs, outputAudioFormat.sampleRate); updateInputFrameLimit(); } @@ -156,10 +153,8 @@ public final class DefaultAudioMixer implements AudioMixer { } long startFrameOffset = - Util.scaleLargeTimestamp( - startTimeUs - mixerStartTimeUs, - /* multiplier= */ sourceFormat.sampleRate, - /* divisor= */ C.MICROS_PER_SECOND); + Util.durationUsToSampleCount(startTimeUs - mixerStartTimeUs, sourceFormat.sampleRate); + int sourceId = nextSourceId++; sources.append( sourceId, diff --git a/libraries/transformer/src/main/java/androidx/media3/transformer/SilentAudioGenerator.java b/libraries/transformer/src/main/java/androidx/media3/transformer/SilentAudioGenerator.java index 8837fc0e1d..fcd80f3052 100644 --- a/libraries/transformer/src/main/java/androidx/media3/transformer/SilentAudioGenerator.java +++ b/libraries/transformer/src/main/java/androidx/media3/transformer/SilentAudioGenerator.java @@ -16,7 +16,6 @@ package androidx.media3.transformer; -import androidx.media3.common.C; import androidx.media3.common.audio.AudioProcessor.AudioFormat; import androidx.media3.common.util.Util; import java.nio.ByteBuffer; @@ -49,14 +48,11 @@ import java.util.concurrent.atomic.AtomicLong; * @param durationUs The duration of the additional silence to generate, in microseconds. */ public void addSilence(long durationUs) { - // The number of frames is not a timestamp, however this utility method provides - // overflow-safe multiplication & division. - long outputFrameCount = - Util.scaleLargeTimestamp( - /* timestamp= */ durationUs, - /* multiplier= */ audioFormat.sampleRate, - /* divisor= */ C.MICROS_PER_SECOND); + long outputFrameCount = Util.durationUsToSampleCount(durationUs, audioFormat.sampleRate); + // If the durationUs maps to a non-integer number of samples, then an extra sample is output. + // In the worst case, this is one sample (~22us of audio) per media item. + // TODO(b/260618558): Track leftover duration when generating in mixer. remainingBytesToOutput.addAndGet(audioFormat.bytesPerFrame * outputFrameCount); }