mirror of
https://github.com/androidx/media.git
synced 2025-04-30 06:46:50 +08:00
Remove saving unnecessary header extension data
This commit is contained in:
parent
5a8a250a1a
commit
84f8beb884
@ -63,15 +63,12 @@ public final class RtpPacket {
|
|||||||
/** Builder class for an {@link RtpPacket} */
|
/** Builder class for an {@link RtpPacket} */
|
||||||
public static final class Builder {
|
public static final class Builder {
|
||||||
private boolean padding;
|
private boolean padding;
|
||||||
private boolean extension;
|
|
||||||
private boolean marker;
|
private boolean marker;
|
||||||
private byte payloadType;
|
private byte payloadType;
|
||||||
private int sequenceNumber;
|
private int sequenceNumber;
|
||||||
private long timestamp;
|
private long timestamp;
|
||||||
private int ssrc;
|
private int ssrc;
|
||||||
private byte[] csrc = EMPTY;
|
private byte[] csrc = EMPTY;
|
||||||
private byte[] headerExtension = EMPTY;
|
|
||||||
private byte[] extensionPayload = EMPTY;
|
|
||||||
private byte[] payloadData = EMPTY;
|
private byte[] payloadData = EMPTY;
|
||||||
|
|
||||||
/** Sets the {@link RtpPacket#padding}. The default is false. */
|
/** Sets the {@link RtpPacket#padding}. The default is false. */
|
||||||
@ -81,13 +78,6 @@ public final class RtpPacket {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Sets the {@link RtpPacket#extension}. The default is false. */
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public Builder setExtension(boolean extension) {
|
|
||||||
this.extension = extension;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Sets {@link RtpPacket#marker}. The default is false. */
|
/** Sets {@link RtpPacket#marker}. The default is false. */
|
||||||
@CanIgnoreReturnValue
|
@CanIgnoreReturnValue
|
||||||
public Builder setMarker(boolean marker) {
|
public Builder setMarker(boolean marker) {
|
||||||
@ -132,26 +122,6 @@ public final class RtpPacket {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets {@link RtpPacket#headerExtension}. The default is an empty byte array.
|
|
||||||
*/
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public Builder setHeaderExtension(byte[] headerExtension) {
|
|
||||||
checkNotNull(headerExtension);
|
|
||||||
this.headerExtension = headerExtension;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets {@link RtpPacket#extensionPayload}. The default is an empty byte array.
|
|
||||||
*/
|
|
||||||
@CanIgnoreReturnValue
|
|
||||||
public Builder setExtensionPayload(byte[] extensionPayload) {
|
|
||||||
checkNotNull(extensionPayload);
|
|
||||||
this.extensionPayload = extensionPayload;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Sets {@link RtpPacket#payloadData}. The default is an empty byte array. */
|
/** Sets {@link RtpPacket#payloadData}. The default is an empty byte array. */
|
||||||
@CanIgnoreReturnValue
|
@CanIgnoreReturnValue
|
||||||
public Builder setPayloadData(byte[] payloadData) {
|
public Builder setPayloadData(byte[] payloadData) {
|
||||||
@ -173,7 +143,6 @@ public final class RtpPacket {
|
|||||||
public static final int MIN_SEQUENCE_NUMBER = 0;
|
public static final int MIN_SEQUENCE_NUMBER = 0;
|
||||||
public static final int MAX_SEQUENCE_NUMBER = 0xFFFF;
|
public static final int MAX_SEQUENCE_NUMBER = 0xFFFF;
|
||||||
public static final int CSRC_SIZE = 4;
|
public static final int CSRC_SIZE = 4;
|
||||||
public static final int HEADER_EXTENSION_SIZE = 4;
|
|
||||||
|
|
||||||
/** Returns the next sequence number of the {@code sequenceNumber}. */
|
/** Returns the next sequence number of the {@code sequenceNumber}. */
|
||||||
public static int getNextSequenceNumber(int sequenceNumber) {
|
public static int getNextSequenceNumber(int sequenceNumber) {
|
||||||
@ -217,12 +186,6 @@ public final class RtpPacket {
|
|||||||
/** The RTP CSRC fields (Optional, up to 15 items). */
|
/** The RTP CSRC fields (Optional, up to 15 items). */
|
||||||
public final byte[] csrc;
|
public final byte[] csrc;
|
||||||
|
|
||||||
/** The RTP header extension fields (Optional, 32 bits). */
|
|
||||||
public final byte[] headerExtension;
|
|
||||||
|
|
||||||
/** The RTP extension payload fields (Optional). */
|
|
||||||
public final byte[] extensionPayload;
|
|
||||||
|
|
||||||
public final byte[] payloadData;
|
public final byte[] payloadData;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -272,21 +235,13 @@ public final class RtpPacket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Extension.
|
//Extension.
|
||||||
byte[] headerExtension;
|
|
||||||
byte[] extensionPayload;
|
|
||||||
if (hasExtension) {
|
if (hasExtension) {
|
||||||
headerExtension = new byte[HEADER_EXTENSION_SIZE];
|
int headerExtensionProfileData = packetBuffer.readShort();
|
||||||
packetBuffer.readBytes(headerExtension, 0, HEADER_EXTENSION_SIZE);
|
int headerExtensionPayloadLength = packetBuffer.readShort();
|
||||||
int extensionPayloadLength = (headerExtension[2] & 0xFF) << 8 | (headerExtension[3] & 0xFF);
|
if (headerExtensionPayloadLength != 0) {
|
||||||
if (extensionPayloadLength != 0) {
|
byte[] extensionPayload = new byte[headerExtensionPayloadLength * 4];
|
||||||
extensionPayload = new byte[extensionPayloadLength * 4];
|
packetBuffer.readBytes(extensionPayload, 0, headerExtensionPayloadLength * 4);
|
||||||
packetBuffer.readBytes(extensionPayload, 0, extensionPayloadLength * 4);
|
|
||||||
}else {
|
|
||||||
extensionPayload = EMPTY;
|
|
||||||
}
|
}
|
||||||
}else {
|
|
||||||
headerExtension = EMPTY;
|
|
||||||
extensionPayload = EMPTY;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Everything else will be RTP payload.
|
// Everything else will be RTP payload.
|
||||||
@ -302,9 +257,6 @@ public final class RtpPacket {
|
|||||||
.setTimestamp(timestamp)
|
.setTimestamp(timestamp)
|
||||||
.setSsrc(ssrc)
|
.setSsrc(ssrc)
|
||||||
.setCsrc(csrc)
|
.setCsrc(csrc)
|
||||||
.setExtension(hasExtension)
|
|
||||||
.setHeaderExtension(headerExtension)
|
|
||||||
.setExtensionPayload(extensionPayload)
|
|
||||||
.setPayloadData(payloadData)
|
.setPayloadData(payloadData)
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
@ -323,7 +275,7 @@ public final class RtpPacket {
|
|||||||
|
|
||||||
private RtpPacket(Builder builder) {
|
private RtpPacket(Builder builder) {
|
||||||
this.padding = builder.padding;
|
this.padding = builder.padding;
|
||||||
this.extension = builder.extension;
|
this.extension = false;
|
||||||
this.marker = builder.marker;
|
this.marker = builder.marker;
|
||||||
this.payloadType = builder.payloadType;
|
this.payloadType = builder.payloadType;
|
||||||
this.sequenceNumber = builder.sequenceNumber;
|
this.sequenceNumber = builder.sequenceNumber;
|
||||||
@ -331,8 +283,6 @@ public final class RtpPacket {
|
|||||||
this.ssrc = builder.ssrc;
|
this.ssrc = builder.ssrc;
|
||||||
this.csrc = builder.csrc;
|
this.csrc = builder.csrc;
|
||||||
this.csrcCount = (byte) (this.csrc.length / CSRC_SIZE);
|
this.csrcCount = (byte) (this.csrc.length / CSRC_SIZE);
|
||||||
this.headerExtension = builder.headerExtension;
|
|
||||||
this.extensionPayload = builder.extensionPayload;
|
|
||||||
this.payloadData = builder.payloadData;
|
this.payloadData = builder.payloadData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -371,8 +321,6 @@ public final class RtpPacket {
|
|||||||
.putInt((int) timestamp)
|
.putInt((int) timestamp)
|
||||||
.putInt(ssrc)
|
.putInt(ssrc)
|
||||||
.put(csrc)
|
.put(csrc)
|
||||||
.put(headerExtension)
|
|
||||||
.put(extensionPayload)
|
|
||||||
.put(payloadData);
|
.put(payloadData);
|
||||||
return packetLength;
|
return packetLength;
|
||||||
}
|
}
|
||||||
|
@ -133,7 +133,7 @@ public final class RtpPacketTest {
|
|||||||
|
|
||||||
assertThat(packet.version).isEqualTo(RtpPacket.RTP_VERSION);
|
assertThat(packet.version).isEqualTo(RtpPacket.RTP_VERSION);
|
||||||
assertThat(packet.padding).isFalse();
|
assertThat(packet.padding).isFalse();
|
||||||
assertThat(packet.extension).isTrue();
|
assertThat(packet.extension).isFalse();
|
||||||
assertThat(packet.csrcCount).isEqualTo(0);
|
assertThat(packet.csrcCount).isEqualTo(0);
|
||||||
assertThat(packet.csrc).hasLength(0);
|
assertThat(packet.csrc).hasLength(0);
|
||||||
assertThat(packet.marker).isFalse();
|
assertThat(packet.marker).isFalse();
|
||||||
@ -228,28 +228,6 @@ public final class RtpPacketTest {
|
|||||||
assertThat(builtPacketBytes).isEqualTo(rtpDataWithLargeTimestamp);
|
assertThat(builtPacketBytes).isEqualTo(rtpDataWithLargeTimestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void buildRtpPacketWithHeaderExtension_matchesPacketData() {
|
|
||||||
RtpPacket builtPacket =
|
|
||||||
new RtpPacket.Builder()
|
|
||||||
.setPadding(false)
|
|
||||||
.setExtension(true)
|
|
||||||
.setMarker(false)
|
|
||||||
.setPayloadType((byte) 96)
|
|
||||||
.setSequenceNumber(61514)
|
|
||||||
.setTimestamp(2000000000)
|
|
||||||
.setSsrc(0x35ff2773)
|
|
||||||
.setHeaderExtension(Arrays.copyOfRange(rtpDataExtension, 0, RtpPacket.HEADER_EXTENSION_SIZE))
|
|
||||||
.setExtensionPayload(Arrays.copyOfRange(rtpDataExtension, RtpPacket.HEADER_EXTENSION_SIZE, rtpDataExtension.length))
|
|
||||||
.setPayloadData(rtpWithHeaderExtensionPayloadData)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
int packetSize = RtpPacket.MIN_HEADER_SIZE + rtpDataExtension.length + builtPacket.payloadData.length;
|
|
||||||
byte[] builtPacketBytes = new byte[packetSize];
|
|
||||||
builtPacket.writeToBuffer(builtPacketBytes, /* offset= */ 0, packetSize);
|
|
||||||
assertThat(builtPacketBytes).isEqualTo(rtpDataWithHeaderExtension);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getNextSequenceNumber_invokingAtWrapOver() {
|
public void getNextSequenceNumber_invokingAtWrapOver() {
|
||||||
assertThat(getNextSequenceNumber(65534)).isEqualTo(65535);
|
assertThat(getNextSequenceNumber(65534)).isEqualTo(65535);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user