From 80ec64696e22856ce324ef03535754f838a49778 Mon Sep 17 00:00:00 2001 From: claincly Date: Thu, 4 Aug 2022 16:49:03 +0000 Subject: [PATCH] Factor out RTP timestamp to sample time method PiperOrigin-RevId: 465337074 --- .../exoplayer/rtsp/reader/RtpAacReader.java | 11 +---- .../exoplayer/rtsp/reader/RtpAc3Reader.java | 12 +---- .../exoplayer/rtsp/reader/RtpAmrReader.java | 11 +---- .../exoplayer/rtsp/reader/RtpH263Reader.java | 15 ++---- .../exoplayer/rtsp/reader/RtpH264Reader.java | 16 ++----- .../exoplayer/rtsp/reader/RtpH265Reader.java | 16 ++----- .../exoplayer/rtsp/reader/RtpMpeg4Reader.java | 16 ++----- .../exoplayer/rtsp/reader/RtpOpusReader.java | 17 ++----- .../exoplayer/rtsp/reader/RtpPcmReader.java | 14 ++---- .../exoplayer/rtsp/reader/RtpReaderUtils.java | 46 +++++++++++++++++++ .../exoplayer/rtsp/reader/RtpVp8Reader.java | 16 ++----- .../exoplayer/rtsp/reader/RtpVp9Reader.java | 16 ++----- 12 files changed, 86 insertions(+), 120 deletions(-) create mode 100644 libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpReaderUtils.java diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAacReader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAacReader.java index 869ad20f6f..456b911970 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAacReader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAacReader.java @@ -16,6 +16,7 @@ package androidx.media3.exoplayer.rtsp.reader; import static androidx.media3.common.util.Assertions.checkNotNull; +import static androidx.media3.exoplayer.rtsp.reader.RtpReaderUtils.toSampleTimeUs; import androidx.media3.common.C; import androidx.media3.common.util.ParsableBitArray; @@ -153,14 +154,4 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; trackOutput.sampleMetadata( sampleTimeUs, C.BUFFER_FLAG_KEY_FRAME, size, /* offset= */ 0, /* cryptoData= */ null); } - - /** Returns the correct sample time from RTP timestamp, accounting for the AAC sampling rate. */ - private static long toSampleTimeUs( - long startTimeOffsetUs, long rtpTimestamp, long firstReceivedRtpTimestamp, int sampleRate) { - return startTimeOffsetUs - + Util.scaleLargeTimestamp( - rtpTimestamp - firstReceivedRtpTimestamp, - /* multiplier= */ C.MICROS_PER_SECOND, - /* divisor= */ sampleRate); - } } diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAc3Reader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAc3Reader.java index b69673f5eb..676476620e 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAc3Reader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAc3Reader.java @@ -18,12 +18,12 @@ package androidx.media3.exoplayer.rtsp.reader; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Util.castNonNull; +import static androidx.media3.exoplayer.rtsp.reader.RtpReaderUtils.toSampleTimeUs; import androidx.media3.common.C; import androidx.media3.common.util.ParsableBitArray; import androidx.media3.common.util.ParsableByteArray; import androidx.media3.common.util.UnstableApi; -import androidx.media3.common.util.Util; import androidx.media3.exoplayer.rtsp.RtpPayloadFormat; import androidx.media3.extractor.Ac3Util; import androidx.media3.extractor.ExtractorOutput; @@ -208,14 +208,4 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /* cryptoData= */ null); numBytesPendingMetadataOutput = 0; } - - /** Returns the correct sample time from RTP timestamp, accounting for the AC3 sampling rate. */ - private static long toSampleTimeUs( - long startTimeOffsetUs, long rtpTimestamp, long firstReceivedRtpTimestamp, int sampleRate) { - return startTimeOffsetUs - + Util.scaleLargeTimestamp( - rtpTimestamp - firstReceivedRtpTimestamp, - /* multiplier= */ C.MICROS_PER_SECOND, - /* divisor= */ sampleRate); - } } diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAmrReader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAmrReader.java index 5f66337276..b175fcea7f 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAmrReader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpAmrReader.java @@ -18,6 +18,7 @@ package androidx.media3.exoplayer.rtsp.reader; import static androidx.media3.common.util.Assertions.checkArgument; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkStateNotNull; +import static androidx.media3.exoplayer.rtsp.reader.RtpReaderUtils.toSampleTimeUs; import androidx.media3.common.C; import androidx.media3.common.MimeTypes; @@ -183,14 +184,4 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; ? AMR_WB_FRAME_TYPE_INDEX_TO_FRAME_SIZE[frameType] : AMR_NB_FRAME_TYPE_INDEX_TO_FRAME_SIZE[frameType]; } - - /** Returns the correct sample time from RTP timestamp, accounting for the AMR sampling rate. */ - private static long toSampleTimeUs( - long startTimeOffsetUs, long rtpTimestamp, long firstReceivedRtpTimestamp, int sampleRate) { - return startTimeOffsetUs - + Util.scaleLargeTimestamp( - rtpTimestamp - firstReceivedRtpTimestamp, - /* multiplier= */ C.MICROS_PER_SECOND, - /* divisor= */ sampleRate); - } } diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH263Reader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH263Reader.java index 1c62d7ab5e..cb3512c523 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH263Reader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH263Reader.java @@ -18,6 +18,7 @@ package androidx.media3.exoplayer.rtsp.reader; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Assertions.checkStateNotNull; +import static androidx.media3.exoplayer.rtsp.reader.RtpReaderUtils.toSampleTimeUs; import androidx.media3.common.C; import androidx.media3.common.util.Log; @@ -35,7 +36,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /* package */ final class RtpH263Reader implements RtpPayloadReader { private static final String TAG = "RtpH263Reader"; - private static final long MEDIA_CLOCK_FREQUENCY = 90_000; + private static final int MEDIA_CLOCK_FREQUENCY = 90_000; /** I-frame VOP unit type. */ private static final int I_VOP = 0; @@ -164,7 +165,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; // Write the video sample. trackOutput.sampleData(data, fragmentSize); fragmentedSampleSizeBytes += fragmentSize; - fragmentedSampleTimeUs = toSampleUs(startTimeOffsetUs, timestamp, firstReceivedTimestamp); + fragmentedSampleTimeUs = + toSampleTimeUs(startTimeOffsetUs, timestamp, firstReceivedTimestamp, MEDIA_CLOCK_FREQUENCY); if (rtpMarker) { outputSampleMetadataForFragmentedPackets(); @@ -242,13 +244,4 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; isKeyFrame = false; gotFirstPacketOfH263Frame = false; } - - private static long toSampleUs( - long startTimeOffsetUs, long rtpTimestamp, long firstReceivedRtpTimestamp) { - return startTimeOffsetUs - + Util.scaleLargeTimestamp( - (rtpTimestamp - firstReceivedRtpTimestamp), - /* multiplier= */ C.MICROS_PER_SECOND, - /* divisor= */ MEDIA_CLOCK_FREQUENCY); - } } diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH264Reader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH264Reader.java index 659a28f70f..9f6d48872a 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH264Reader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH264Reader.java @@ -18,6 +18,7 @@ package androidx.media3.exoplayer.rtsp.reader; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkStateNotNull; import static androidx.media3.common.util.Util.castNonNull; +import static androidx.media3.exoplayer.rtsp.reader.RtpReaderUtils.toSampleTimeUs; import androidx.media3.common.C; import androidx.media3.common.ParserException; @@ -36,7 +37,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; /* package */ final class RtpH264Reader implements RtpPayloadReader { private static final String TAG = "RtpH264Reader"; - private static final long MEDIA_CLOCK_FREQUENCY = 90_000; + private static final int MEDIA_CLOCK_FREQUENCY = 90_000; /** Offset of payload data within a FU type A payload. */ private static final int FU_PAYLOAD_OFFSET = 2; @@ -115,7 +116,9 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; firstReceivedTimestamp = timestamp; } - long timeUs = toSampleUs(startTimeOffsetUs, timestamp, firstReceivedTimestamp); + long timeUs = + toSampleTimeUs( + startTimeOffsetUs, timestamp, firstReceivedTimestamp, MEDIA_CLOCK_FREQUENCY); trackOutput.sampleMetadata( timeUs, bufferFlags, fragmentedSampleSizeBytes, /* offset= */ 0, /* cryptoData= */ null); fragmentedSampleSizeBytes = 0; @@ -287,15 +290,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; return bytesWritten; } - private static long toSampleUs( - long startTimeOffsetUs, long rtpTimestamp, long firstReceivedRtpTimestamp) { - return startTimeOffsetUs - + Util.scaleLargeTimestamp( - (rtpTimestamp - firstReceivedRtpTimestamp), - /* multiplier= */ C.MICROS_PER_SECOND, - /* divisor= */ MEDIA_CLOCK_FREQUENCY); - } - private static @C.BufferFlags int getBufferFlagsFromNalType(int nalType) { return nalType == NAL_UNIT_TYPE_IDR ? C.BUFFER_FLAG_KEY_FRAME : 0; } diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH265Reader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH265Reader.java index 144e094ae5..725dd178ae 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH265Reader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpH265Reader.java @@ -17,6 +17,7 @@ package androidx.media3.exoplayer.rtsp.reader; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkStateNotNull; +import static androidx.media3.exoplayer.rtsp.reader.RtpReaderUtils.toSampleTimeUs; import androidx.media3.common.C; import androidx.media3.common.ParserException; @@ -38,7 +39,7 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; /* package */ final class RtpH265Reader implements RtpPayloadReader { private static final String TAG = "RtpH265Reader"; - private static final long MEDIA_CLOCK_FREQUENCY = 90_000; + private static final int MEDIA_CLOCK_FREQUENCY = 90_000; /** Offset of payload data within a FU payload. */ private static final int FU_PAYLOAD_OFFSET = 3; /** Aggregation Packet. RFC7798 Section 4.4.2. */ @@ -111,7 +112,9 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; firstReceivedTimestamp = timestamp; } - long timeUs = toSampleUs(startTimeOffsetUs, timestamp, firstReceivedTimestamp); + long timeUs = + toSampleTimeUs( + startTimeOffsetUs, timestamp, firstReceivedTimestamp, MEDIA_CLOCK_FREQUENCY); trackOutput.sampleMetadata( timeUs, bufferFlags, fragmentedSampleSizeBytes, /* offset= */ 0, /* cryptoData= */ null); fragmentedSampleSizeBytes = 0; @@ -254,15 +257,6 @@ import org.checkerframework.checker.nullness.qual.RequiresNonNull; return bytesWritten; } - private static long toSampleUs( - long startTimeOffsetUs, long rtpTimestamp, long firstReceivedRtpTimestamp) { - return startTimeOffsetUs - + Util.scaleLargeTimestamp( - (rtpTimestamp - firstReceivedRtpTimestamp), - /* multiplier= */ C.MICROS_PER_SECOND, - /* divisor= */ MEDIA_CLOCK_FREQUENCY); - } - private static @C.BufferFlags int getBufferFlagsFromNalType(int nalType) { return (nalType == NAL_IDR_W_RADL || nalType == NAL_IDR_N_LP) ? C.BUFFER_FLAG_KEY_FRAME : 0; } diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpMpeg4Reader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpMpeg4Reader.java index 6dee3695e1..bd5d415386 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpMpeg4Reader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpMpeg4Reader.java @@ -17,6 +17,7 @@ package androidx.media3.exoplayer.rtsp.reader; import static androidx.media3.common.util.Assertions.checkStateNotNull; import static androidx.media3.common.util.Util.castNonNull; +import static androidx.media3.exoplayer.rtsp.reader.RtpReaderUtils.toSampleTimeUs; import androidx.media3.common.C; import androidx.media3.common.util.Log; @@ -38,7 +39,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /* package */ final class RtpMpeg4Reader implements RtpPayloadReader { private static final String TAG = "RtpMpeg4Reader"; - private static final long MEDIA_CLOCK_FREQUENCY = 90_000; + private static final int MEDIA_CLOCK_FREQUENCY = 90_000; /** VOP (Video Object Plane) unit type. */ private static final int I_VOP = 0; @@ -104,7 +105,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; firstReceivedTimestamp = timestamp; } - long timeUs = toSampleUs(startTimeOffsetUs, timestamp, firstReceivedTimestamp); + long timeUs = + toSampleTimeUs( + startTimeOffsetUs, timestamp, firstReceivedTimestamp, MEDIA_CLOCK_FREQUENCY); trackOutput.sampleMetadata(timeUs, bufferFlags, sampleLength, 0, null); sampleLength = 0; } @@ -137,13 +140,4 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } return 0; } - - private static long toSampleUs( - long startTimeOffsetUs, long rtpTimestamp, long firstReceivedRtpTimestamp) { - return startTimeOffsetUs - + Util.scaleLargeTimestamp( - (rtpTimestamp - firstReceivedRtpTimestamp), - /* multiplier= */ C.MICROS_PER_SECOND, - /* divisor= */ MEDIA_CLOCK_FREQUENCY); - } } diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpOpusReader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpOpusReader.java index 9b8994ae6d..6c4fcaef44 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpOpusReader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpOpusReader.java @@ -17,6 +17,7 @@ package androidx.media3.exoplayer.rtsp.reader; import static androidx.media3.common.util.Assertions.checkArgument; import static androidx.media3.common.util.Assertions.checkStateNotNull; +import static androidx.media3.exoplayer.rtsp.reader.RtpReaderUtils.toSampleTimeUs; import androidx.media3.common.C; import androidx.media3.common.Format; @@ -38,7 +39,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; /* package */ final class RtpOpusReader implements RtpPayloadReader { private static final String TAG = "RtpOpusReader"; /* Opus uses a fixed 48KHz media clock RFC7845 Section 4. */ - private static final long MEDIA_CLOCK_FREQUENCY = 48_000; + private static final int MEDIA_CLOCK_FREQUENCY = 48_000; private final RtpPayloadFormat payloadFormat; @@ -113,7 +114,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; // sending opus data. int size = data.bytesLeft(); trackOutput.sampleData(data, size); - long timeUs = toSampleTimeUs(startTimeOffsetUs, timestamp, firstReceivedTimestamp); + long timeUs = + toSampleTimeUs( + startTimeOffsetUs, timestamp, firstReceivedTimestamp, MEDIA_CLOCK_FREQUENCY); trackOutput.sampleMetadata( timeUs, C.BUFFER_FLAG_KEY_FRAME, size, /* offset*/ 0, /* cryptoData*/ null); } @@ -144,14 +147,4 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; checkArgument(data.readUnsignedByte() == 1, "version number must always be 1"); data.setPosition(currPosition); } - - /** Returns the correct sample time from RTP timestamp, accounting for the OPUS sampling rate. */ - private static long toSampleTimeUs( - long startTimeOffsetUs, long rtpTimestamp, long firstReceivedRtpTimestamp) { - return startTimeOffsetUs - + Util.scaleLargeTimestamp( - rtpTimestamp - firstReceivedRtpTimestamp, - /* multiplier= */ C.MICROS_PER_SECOND, - /* divisor= */ MEDIA_CLOCK_FREQUENCY); - } } diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpPcmReader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpPcmReader.java index 3c82f3e5be..21f71aa27f 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpPcmReader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpPcmReader.java @@ -16,6 +16,7 @@ package androidx.media3.exoplayer.rtsp.reader; import static androidx.media3.common.util.Assertions.checkNotNull; +import static androidx.media3.exoplayer.rtsp.reader.RtpReaderUtils.toSampleTimeUs; import android.util.Log; import androidx.media3.common.C; @@ -78,7 +79,8 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } long sampleTimeUs = - toSampleUs(startTimeOffsetUs, timestamp, firstReceivedTimestamp, payloadFormat.clockRate); + toSampleTimeUs( + startTimeOffsetUs, timestamp, firstReceivedTimestamp, payloadFormat.clockRate); int size = data.bytesLeft(); trackOutput.sampleData(data, size); trackOutput.sampleMetadata( @@ -93,14 +95,4 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; firstReceivedTimestamp = nextRtpTimestamp; startTimeOffsetUs = timeUs; } - - /** Returns the correct sample time from RTP timestamp, accounting for the given clock rate. */ - private static long toSampleUs( - long startTimeOffsetUs, long rtpTimestamp, long firstReceivedRtpTimestamp, int clockRate) { - return startTimeOffsetUs - + Util.scaleLargeTimestamp( - rtpTimestamp - firstReceivedRtpTimestamp, - /* multiplier= */ C.MICROS_PER_SECOND, - /* divisor= */ clockRate); - } } diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpReaderUtils.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpReaderUtils.java new file mode 100644 index 0000000000..44e6a97e0e --- /dev/null +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpReaderUtils.java @@ -0,0 +1,46 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package androidx.media3.exoplayer.rtsp.reader; + +import androidx.media3.common.C; +import androidx.media3.common.util.Util; + +/** Utility methods for {@link RtpPayloadReader}s. */ +/* package */ class RtpReaderUtils { + + /** + * Converts RTP timestamp and media frequency to sample presentation time, in microseconds + * + * @param startTimeOffsetUs The offset of the RTP timebase, in microseconds. + * @param rtpTimestamp The RTP timestamp to convert. + * @param firstReceivedRtpTimestamp The first received RTP timestamp. + * @param mediaFrequency The media frequency. + * @return The calculated sample presentation time, in microseconds. + */ + public static long toSampleTimeUs( + long startTimeOffsetUs, + long rtpTimestamp, + long firstReceivedRtpTimestamp, + int mediaFrequency) { + return startTimeOffsetUs + + Util.scaleLargeTimestamp( + rtpTimestamp - firstReceivedRtpTimestamp, + /* multiplier= */ C.MICROS_PER_SECOND, + /* divisor= */ mediaFrequency); + } + + private RtpReaderUtils() {} +} diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp8Reader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp8Reader.java index fefc74349d..a167e6f205 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp8Reader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp8Reader.java @@ -18,6 +18,7 @@ package androidx.media3.exoplayer.rtsp.reader; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Assertions.checkStateNotNull; +import static androidx.media3.exoplayer.rtsp.reader.RtpReaderUtils.toSampleTimeUs; import androidx.media3.common.C; import androidx.media3.common.util.Log; @@ -37,7 +38,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private static final String TAG = "RtpVP8Reader"; /** VP8 uses a 90 KHz media clock (RFC7741 Section 4.1). */ - private static final long MEDIA_CLOCK_FREQUENCY = 90_000; + private static final int MEDIA_CLOCK_FREQUENCY = 90_000; private final RtpPayloadFormat payloadFormat; @@ -124,7 +125,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; fragmentedSampleSizeBytes += fragmentSize; } - fragmentedSampleTimeUs = toSampleUs(startTimeOffsetUs, timestamp, firstReceivedTimestamp); + fragmentedSampleTimeUs = + toSampleTimeUs( + startTimeOffsetUs, timestamp, firstReceivedTimestamp, MEDIA_CLOCK_FREQUENCY); if (rtpMarker) { outputSampleMetadataForFragmentedPackets(); @@ -215,13 +218,4 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; fragmentedSampleTimeUs = C.TIME_UNSET; gotFirstPacketOfVp8Frame = false; } - - private static long toSampleUs( - long startTimeOffsetUs, long rtpTimestamp, long firstReceivedRtpTimestamp) { - return startTimeOffsetUs - + Util.scaleLargeTimestamp( - (rtpTimestamp - firstReceivedRtpTimestamp), - /* multiplier= */ C.MICROS_PER_SECOND, - /* divisor= */ MEDIA_CLOCK_FREQUENCY); - } } diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp9Reader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp9Reader.java index 61081dd8c1..172588afb5 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp9Reader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpVp9Reader.java @@ -19,6 +19,7 @@ import static androidx.media3.common.util.Assertions.checkArgument; import static androidx.media3.common.util.Assertions.checkNotNull; import static androidx.media3.common.util.Assertions.checkState; import static androidx.media3.common.util.Assertions.checkStateNotNull; +import static androidx.media3.exoplayer.rtsp.reader.RtpReaderUtils.toSampleTimeUs; import androidx.media3.common.C; import androidx.media3.common.util.Log; @@ -39,7 +40,7 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; private static final String TAG = "RtpVp9Reader"; - private static final long MEDIA_CLOCK_FREQUENCY = 90_000; + private static final int MEDIA_CLOCK_FREQUENCY = 90_000; private static final int SCALABILITY_STRUCTURE_SIZE = 4; private final RtpPayloadFormat payloadFormat; @@ -123,7 +124,9 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; } else { fragmentedSampleSizeBytes += currentFragmentSizeBytes; } - fragmentedSampleTimeUs = toSampleUs(startTimeOffsetUs, timestamp, firstReceivedTimestamp); + fragmentedSampleTimeUs = + toSampleTimeUs( + startTimeOffsetUs, timestamp, firstReceivedTimestamp, MEDIA_CLOCK_FREQUENCY); if (rtpMarker) { outputSampleMetadataForFragmentedPackets(); @@ -271,13 +274,4 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; fragmentedSampleTimeUs = C.TIME_UNSET; gotFirstPacketOfVp9Frame = false; } - - private static long toSampleUs( - long startTimeOffsetUs, long rtpTimestamp, long firstReceivedRtpTimestamp) { - return startTimeOffsetUs - + Util.scaleLargeTimestamp( - (rtpTimestamp - firstReceivedRtpTimestamp), - /* multiplier= */ C.MICROS_PER_SECOND, - /* divisor= */ MEDIA_CLOCK_FREQUENCY); - } }