diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaTrack.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaTrack.java index 577ffe2e24..7146dc0033 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaTrack.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/RtspMediaTrack.java @@ -55,7 +55,7 @@ import com.google.common.collect.ImmutableMap; private static final String PARAMETER_H265_SPROP_VPS = "sprop-vps"; private static final String PARAMETER_H265_SPROP_MAX_DON_DIFF = "sprop-max-don-diff"; private static final String PARAMETER_MP4V_CONFIG = "config"; - private static final String PARAMETER_MP4A_CPRESENT = "cpresent"; + private static final String PARAMETER_MP4A_C_PRESENT = "cpresent"; /** Prefix for the RFC6381 codecs string for AAC formats. */ private static final String AAC_CODECS_PREFIX = "mp4a.40."; @@ -212,13 +212,13 @@ import com.google.common.collect.ImmutableMap; checkArgument(channelCount != C.INDEX_UNSET); checkArgument(!fmtpParameters.isEmpty()); if(mediaEncoding.equals(RtpPayloadFormat.RTP_MEDIA_MPEG4_AUDIO)) { - boolean isCPresent = true; - if (fmtpParameters.get(PARAMETER_MP4A_CPRESENT) != null && fmtpParameters.get( - PARAMETER_MP4A_CPRESENT).equals("0")) { - isCPresent = false; + boolean isConfigPresent = true; + if (fmtpParameters.get(PARAMETER_MP4A_C_PRESENT) != null && fmtpParameters.get( + PARAMETER_MP4A_C_PRESENT).equals("0")) { + isConfigPresent = false; } @Nullable String configInput = fmtpParameters.get(PARAMETER_MP4V_CONFIG); - if (!isCPresent && configInput != null && configInput.length() % 2 == 0) { + if (!isConfigPresent && configInput != null && configInput.length() % 2 == 0) { Pair configParameters = getSampleRateAndChannelCount(configInput); channelCount = configParameters.first; clockRate = configParameters.second; @@ -326,25 +326,22 @@ import com.google.common.collect.ImmutableMap; * configuration (ISO/IEC14496-3, Chapter 1.7.3). */ private static Pair getSampleRateAndChannelCount(String configInput) { - int channelCount = 0, sampleRate = 0; - byte[] configBuffer = Util.getBytesFromHexString(configInput); - ParsableBitArray scratchBits = new ParsableBitArray(configBuffer); - int audioMuxVersion = scratchBits.readBits(1); + ParsableBitArray config = new ParsableBitArray(Util.getBytesFromHexString(configInput)); + int audioMuxVersion = config .readBits(1); if (audioMuxVersion == 0) { - checkArgument(scratchBits.readBits(1) == 1, "Invalid allStreamsSameTimeFraming."); - scratchBits.readBits(6); - checkArgument(scratchBits.readBits(4) == 0, "Invalid numProgram."); - checkArgument(scratchBits.readBits(3) == 0, "Invalid numLayer."); + checkArgument(config .readBits(1) == 1, "Only supports one allStreamsSameTimeFraming."); + config .readBits(6); + checkArgument(config .readBits(4) == 0, "Only supports one program."); + checkArgument(config .readBits(3) == 0, "Only supports one numLayer."); @Nullable AacUtil.Config aacConfig = null; try { - aacConfig = AacUtil.parseAudioSpecificConfig(scratchBits, false); + aacConfig = AacUtil.parseAudioSpecificConfig(config , false); } catch (ParserException e) { throw new IllegalArgumentException(e); } - sampleRate = aacConfig.sampleRateHz; - channelCount = aacConfig.channelCount; + return Pair.create(aacConfig.channelCount, aacConfig.sampleRateHz); } - return Pair.create(channelCount, sampleRate); + throw new IllegalArgumentException ("Only support audio mux version 0"); } private static void processMPEG4FmtpAttribute( diff --git a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpMp4aReader.java b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpMp4aReader.java index 76e62b4585..23e850ecdf 100644 --- a/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpMp4aReader.java +++ b/libraries/exoplayer_rtsp/src/main/java/androidx/media3/exoplayer/rtsp/reader/RtpMp4aReader.java @@ -104,18 +104,14 @@ import org.checkerframework.checker.nullness.qual.MonotonicNonNull; * Each subframe starts with a variable length encoding. */ for (; audioPayloadOffset < data.bytesLeft(); audioPayloadOffset++) { - int payloadMuxLength = data.peekUnsignedByte(); + int payloadMuxLength = data.readUnsignedByte(); sampleLength += payloadMuxLength; if (payloadMuxLength != 0xff) { break; - } else { - data.setPosition(audioPayloadOffset + 1); } } - audioPayloadOffset++; - data.setPosition(audioPayloadOffset); - /* Write the audio sample */ + // Write the audio sample trackOutput.sampleData(data, sampleLength); audioPayloadOffset+= sampleLength; fragmentedSampleSizeBytes += sampleLength;